diff --git a/backend/src/api/bitcoin/bitcoin.routes.ts b/backend/src/api/bitcoin/bitcoin.routes.ts index 1d766a407..4e9a83d2c 100644 --- a/backend/src/api/bitcoin/bitcoin.routes.ts +++ b/backend/src/api/bitcoin/bitcoin.routes.ts @@ -573,7 +573,9 @@ class BitcoinRoutes { } try { - const addressData = await bitcoinApi.$getScriptHash(req.params.scripthash); + // electrum expects scripthashes in little-endian + const electrumScripthash = req.params.scripthash.match(/../g)?.reverse().join('') ?? ''; + const addressData = await bitcoinApi.$getScriptHash(electrumScripthash); res.json(addressData); } catch (e) { if (e instanceof Error && e.message && (e.message.indexOf('too long') > 0 || e.message.indexOf('confirmed status') > 0)) { @@ -590,11 +592,13 @@ class BitcoinRoutes { } try { + // electrum expects scripthashes in little-endian + const electrumScripthash = req.params.scripthash.match(/../g)?.reverse().join('') ?? ''; let lastTxId: string = ''; if (req.query.after_txid && typeof req.query.after_txid === 'string') { lastTxId = req.query.after_txid; } - const transactions = await bitcoinApi.$getScriptHashTransactions(req.params.scripthash, lastTxId); + const transactions = await bitcoinApi.$getScriptHashTransactions(electrumScripthash, lastTxId); res.json(transactions); } catch (e) { if (e instanceof Error && e.message && (e.message.indexOf('too long') > 0 || e.message.indexOf('confirmed status') > 0)) { diff --git a/contributors/ncois.txt b/contributors/ncois.txt new file mode 100644 index 000000000..04a436613 --- /dev/null +++ b/contributors/ncois.txt @@ -0,0 +1,3 @@ +I hereby accept the terms of the Contributor License Agreement in the CONTRIBUTING.md file of the mempool/mempool git repository as of November 16, 2023. + +Signed: ncois diff --git a/contributors/shubhamkmr04.txt b/contributors/shubhamkmr04.txt new file mode 100644 index 000000000..ab7e49e0b --- /dev/null +++ b/contributors/shubhamkmr04.txt @@ -0,0 +1,3 @@ +I hereby accept the terms of the Contributor License Agreement in the CONTRIBUTING.md file of the mempool/mempool git repository as of November 15, 2023. + +Signed: shubhamkmr04 \ No newline at end of file diff --git a/frontend/src/app/components/about/about.component.html b/frontend/src/app/components/about/about.component.html index cde3972d8..a5d79f285 100644 --- a/frontend/src/app/components/about/about.component.html +++ b/frontend/src/app/components/about/about.component.html @@ -299,9 +299,9 @@ Blixt - + - Zeus + ZEUS diff --git a/frontend/src/app/components/transactions-list/transactions-list.component.ts b/frontend/src/app/components/transactions-list/transactions-list.component.ts index d066d3583..da9bdfe04 100644 --- a/frontend/src/app/components/transactions-list/transactions-list.component.ts +++ b/frontend/src/app/components/transactions-list/transactions-list.component.ts @@ -156,17 +156,45 @@ export class TransactionsListComponent implements OnInit, OnChanges { } if (this.address) { - const addressIn = tx.vout - .filter((v: Vout) => v.scriptpubkey_address === this.address) - .map((v: Vout) => v.value || 0) - .reduce((a: number, b: number) => a + b, 0); + const isP2PKUncompressed = this.address.length === 130; + const isP2PKCompressed = this.address.length === 66; + if (isP2PKCompressed) { + const addressIn = tx.vout + .filter((v: Vout) => v.scriptpubkey === '21' + this.address + 'ac') + .map((v: Vout) => v.value || 0) + .reduce((a: number, b: number) => a + b, 0); - const addressOut = tx.vin - .filter((v: Vin) => v.prevout && v.prevout.scriptpubkey_address === this.address) - .map((v: Vin) => v.prevout.value || 0) - .reduce((a: number, b: number) => a + b, 0); + const addressOut = tx.vin + .filter((v: Vin) => v.prevout && v.prevout.scriptpubkey === '21' + this.address + 'ac') + .map((v: Vin) => v.prevout.value || 0) + .reduce((a: number, b: number) => a + b, 0); - tx['addressValue'] = addressIn - addressOut; + tx['addressValue'] = addressIn - addressOut; + } else if (isP2PKUncompressed) { + const addressIn = tx.vout + .filter((v: Vout) => v.scriptpubkey === '41' + this.address + 'ac') + .map((v: Vout) => v.value || 0) + .reduce((a: number, b: number) => a + b, 0); + + const addressOut = tx.vin + .filter((v: Vin) => v.prevout && v.prevout.scriptpubkey === '41' + this.address + 'ac') + .map((v: Vin) => v.prevout.value || 0) + .reduce((a: number, b: number) => a + b, 0); + + tx['addressValue'] = addressIn - addressOut; + } else { + const addressIn = tx.vout + .filter((v: Vout) => v.scriptpubkey_address === this.address) + .map((v: Vout) => v.value || 0) + .reduce((a: number, b: number) => a + b, 0); + + const addressOut = tx.vin + .filter((v: Vin) => v.prevout && v.prevout.scriptpubkey_address === this.address) + .map((v: Vin) => v.prevout.value || 0) + .reduce((a: number, b: number) => a + b, 0); + + tx['addressValue'] = addressIn - addressOut; + } } this.priceService.getBlockPrice$(tx.status.block_time).pipe( diff --git a/frontend/src/app/dashboard/dashboard.component.html b/frontend/src/app/dashboard/dashboard.component.html index fdd2131fe..2e2e4bccc 100644 --- a/frontend/src/app/dashboard/dashboard.component.html +++ b/frontend/src/app/dashboard/dashboard.component.html @@ -237,7 +237,7 @@
 
-
/
+
/
diff --git a/frontend/src/app/shared/pipes/bytes-pipe/bytes.pipe.ts b/frontend/src/app/shared/pipes/bytes-pipe/bytes.pipe.ts index f8ea4d4b6..83fc2433d 100644 --- a/frontend/src/app/shared/pipes/bytes-pipe/bytes.pipe.ts +++ b/frontend/src/app/shared/pipes/bytes-pipe/bytes.pipe.ts @@ -1,6 +1,6 @@ /* tslint:disable */ import { Pipe, PipeTransform } from '@angular/core'; -import { isNumberFinite, isPositive, isInteger, toDecimal } from './utils'; +import { isNumberFinite, isPositive, isInteger, toDecimal, toSigFigs } from './utils'; export type ByteUnit = 'B' | 'kB' | 'MB' | 'GB' | 'TB'; @@ -17,7 +17,7 @@ export class BytesPipe implements PipeTransform { 'TB': {max: Number.MAX_SAFE_INTEGER, prev: 'GB'} }; - transform(input: any, decimal: number = 0, from: ByteUnit = 'B', to?: ByteUnit): any { + transform(input: any, decimal: number = 0, from: ByteUnit = 'B', to?: ByteUnit, sigfigs?: number): any { if (!(isNumberFinite(input) && isNumberFinite(decimal) && @@ -33,10 +33,14 @@ export class BytesPipe implements PipeTransform { unit = BytesPipe.formats[unit].prev!; } + let numberFormat = sigfigs == null ? + (number) => toDecimal(number, decimal).toString() : + (number) => toSigFigs(number, sigfigs); + if (to) { const format = BytesPipe.formats[to]; - const result = toDecimal(BytesPipe.calculateResult(format, bytes), decimal); + const result = numberFormat(BytesPipe.calculateResult(format, bytes)); return BytesPipe.formatResult(result, to); } @@ -45,14 +49,14 @@ export class BytesPipe implements PipeTransform { const format = BytesPipe.formats[key]; if (bytes < format.max) { - const result = toDecimal(BytesPipe.calculateResult(format, bytes), decimal); + const result = numberFormat(BytesPipe.calculateResult(format, bytes)); return BytesPipe.formatResult(result, key); } } } - static formatResult(result: number, unit: string): string { + static formatResult(result: string, unit: string): string { return `${result} ${unit}`; } diff --git a/frontend/src/app/shared/pipes/bytes-pipe/utils.ts b/frontend/src/app/shared/pipes/bytes-pipe/utils.ts index 2700be45d..7c88c83bc 100644 --- a/frontend/src/app/shared/pipes/bytes-pipe/utils.ts +++ b/frontend/src/app/shared/pipes/bytes-pipe/utils.ts @@ -54,6 +54,10 @@ export function toDecimal(value: number, decimal: number): number { return Math.round(value * Math.pow(10, decimal)) / Math.pow(10, decimal); } +export function toSigFigs(value: number, sigFigs: number): string { + return value >= Math.pow(10, sigFigs - 1) ? Math.round(value).toString() : value.toPrecision(sigFigs); +} + export function upperFirst(value: string): string { return value.slice(0, 1).toUpperCase() + value.slice(1); } diff --git a/frontend/src/resources/profile/zeus.png b/frontend/src/resources/profile/zeus.png index de7f54f55..363b93b66 100644 Binary files a/frontend/src/resources/profile/zeus.png and b/frontend/src/resources/profile/zeus.png differ