Skip to content

Commit a0250af

Browse files
committed
fix: update memoHex decoding v1 v2
1 parent 4ee9654 commit a0250af

File tree

2 files changed

+49
-9
lines changed

2 files changed

+49
-9
lines changed

main/api/chainport/vendor/metadata.ts

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,27 @@ export class ChainportMemoMetadata {
4949
* @param encodedHex - The encoded hex string
5050
* @returns A tuple containing the network id, address, and toIronfish flag
5151
*/
52-
public static decode(encodedHex: string): [number, string, boolean] {
52+
public static decodeV1(encodedHex: string): [number, string, boolean] {
53+
const hexInteger = BigInt("0x" + encodedHex);
54+
const encodedString = hexInteger.toString(2);
55+
const padded = encodedString.padStart(250, "0");
56+
const networkId = this.decodeNumberFrom10Bits(padded);
57+
58+
const toIronfish = padded[0] === "1";
59+
const addressCharacters = [];
60+
61+
for (let i = 10; i < padded.length; i += 6) {
62+
const j = i + 6;
63+
const charBits = padded.slice(i, j);
64+
addressCharacters.push(this.decodeCharFrom6Bits(charBits));
65+
}
66+
67+
const address = "0x" + addressCharacters.join("");
68+
69+
return [networkId, address.toLowerCase(), toIronfish];
70+
}
71+
72+
public static decodeV2(encodedHex: string): [number, string, boolean] {
5373
const bytes = Buffer.from(encodedHex, "hex");
5474
const networkId = bytes.readUInt8(0);
5575
const addressBytes = bytes.subarray(1, 21);

main/api/chainport/vendor/utils.ts

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ export const extractChainportDataFromTransaction = (
3636

3737
const getIncomingChainportTransactionData = (
3838
transaction: RpcWalletTransaction,
39-
config: { incomingAddresses: Set<string> },
39+
config: { incomingAddresses: Set<string>; bridgeFeeUpgrade: Date },
4040
): ChainportTransactionData => {
4141
const bridgeNote = transaction.notes?.[0];
4242

@@ -47,9 +47,19 @@ const getIncomingChainportTransactionData = (
4747
return undefined;
4848
}
4949

50-
const [sourceNetwork, address, _] = ChainportMemoMetadata.decode(
51-
bridgeNote.memoHex,
52-
);
50+
let sourceNetwork: number;
51+
let address: string;
52+
let _toIronfish: boolean;
53+
54+
if (new Date(transaction.timestamp) < config.bridgeFeeUpgrade) {
55+
[sourceNetwork, address, _toIronfish] = ChainportMemoMetadata.decodeV1(
56+
bridgeNote.memoHex,
57+
);
58+
} else {
59+
[sourceNetwork, address, _toIronfish] = ChainportMemoMetadata.decodeV2(
60+
bridgeNote.memoHex,
61+
);
62+
}
5363

5464
return {
5565
type: TransactionType.RECEIVE,
@@ -60,7 +70,7 @@ const getIncomingChainportTransactionData = (
6070

6171
const getOutgoingChainportTransactionData = (
6272
transaction: RpcWalletTransaction,
63-
config: { outgoingAddresses: Set<string> },
73+
config: { outgoingAddresses: Set<string>; bridgeFeeUpgrade: Date },
6474
): ChainportTransactionData => {
6575
if (!transaction.notes || transaction.notes.length < 2) {
6676
return undefined;
@@ -80,9 +90,19 @@ const getOutgoingChainportTransactionData = (
8090
return undefined;
8191
}
8292

83-
const [sourceNetwork, address, _] = ChainportMemoMetadata.decode(
84-
bridgeNote.memoHex,
85-
);
93+
let sourceNetwork: number;
94+
let address: string;
95+
let _toIronfish: boolean;
96+
97+
if (new Date(transaction.timestamp) < config.bridgeFeeUpgrade) {
98+
[sourceNetwork, address, _toIronfish] = ChainportMemoMetadata.decodeV1(
99+
bridgeNote.memoHex,
100+
);
101+
} else {
102+
[sourceNetwork, address, _toIronfish] = ChainportMemoMetadata.decodeV2(
103+
bridgeNote.memoHex,
104+
);
105+
}
86106

87107
return {
88108
type: TransactionType.SEND,

0 commit comments

Comments
 (0)