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