Skip to content

Commit 38bd9b4

Browse files
committed
feat: update memoHex decoding v1 v2
1 parent 502ee0f commit 38bd9b4

File tree

3 files changed

+40
-8
lines changed

3 files changed

+40
-8
lines changed

ironfish-cli/src/utils/chainport/metadata.test.ts

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,16 +38,22 @@ describe('ChainportMemoMetadata', () => {
3838

3939
test('decode decodes encoded hex string correctly', () => {
4040
expect(
41-
ChainportMemoMetadata.decode(
41+
ChainportMemoMetadata.decodeV1(
4242
'000214d3c11c03c10481c50cc28e24228a30220620a08c08530c2c614220f24a',
4343
),
4444
).toEqual([2, '0x5DF170F118753CaE92aaC2868A2C25Ccb6528f9a'.toLowerCase(), false])
4545

4646
expect(
47-
ChainportMemoMetadata.decode(
47+
ChainportMemoMetadata.decodeV1(
4848
'02161ca1882c130f04f04638f2092851863c518018c0012ca1093c438b10200a',
4949
),
5050
).toEqual([22, '0x7A68B1Cf1F16Ef89A566F5606C01BA49F4Eb420A'.toLowerCase(), true])
51+
52+
expect(
53+
ChainportMemoMetadata.decodeV2(
54+
'01742d35cc6634c0532925a3b8d4c9db96c4b4d8b668775c9100000000000000',
55+
),
56+
).toEqual([1, '0x742d35cc6634c0532925a3b8d4c9db96c4b4d8b6'.toLowerCase(), false])
5157
})
5258

5359
test('encode and decode are reversible', () => {
@@ -56,7 +62,7 @@ describe('ChainportMemoMetadata', () => {
5662
const toIronfish = false
5763

5864
const encoded = ChainportMemoMetadata.encode(networkId, address, toIronfish)
59-
const decoded = ChainportMemoMetadata.decode(encoded)
65+
const decoded = ChainportMemoMetadata.decodeV1(encoded)
6066

6167
expect(decoded).toEqual([networkId, '0x' + address.toLowerCase(), toIronfish])
6268
})

ironfish-cli/src/utils/chainport/metadata.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ export class ChainportMemoMetadata {
6363
return hexString.padStart(64, '0')
6464
}
6565

66-
public static decode(encodedHex: string): [number, string, boolean] {
66+
public static decodeV1(encodedHex: string): [number, string, boolean] {
6767
const hexInteger = BigInt('0x' + encodedHex)
6868
const encodedString = hexInteger.toString(2)
6969
const padded = encodedString.padStart(250, '0')
@@ -82,4 +82,14 @@ export class ChainportMemoMetadata {
8282

8383
return [networkId, address.toLowerCase(), toIronfish]
8484
}
85+
86+
public static decodeV2(encodedHex: string): [number, string, boolean] {
87+
const bytes = Buffer.from(encodedHex, 'hex')
88+
const networkId = bytes.readUInt8(0)
89+
const addressBytes = bytes.subarray(1, 21)
90+
const address = '0x' + addressBytes.toString('hex')
91+
const toIronfish = (bytes[21] & 0x80) !== 0
92+
93+
return [networkId, address.toLowerCase(), toIronfish]
94+
}
8595
}

ironfish-cli/src/utils/chainport/utils.ts

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,15 +43,23 @@ export const extractChainportDataFromTransaction = (
4343

4444
const getIncomingChainportTransactionData = (
4545
transaction: RpcWalletTransaction,
46-
config: { incomingAddresses: Set<string> },
46+
config: { incomingAddresses: Set<string>; bridgeFeeUpgrade: Date },
4747
): ChainportTransactionData => {
4848
const bridgeNote = transaction.notes?.[0]
4949

5050
if (!bridgeNote || !isAddressInSet(bridgeNote.sender, config.incomingAddresses)) {
5151
return undefined
5252
}
5353

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

5664
return {
5765
type: TransactionType.RECEIVE,
@@ -62,7 +70,7 @@ const getIncomingChainportTransactionData = (
6270

6371
const getOutgoingChainportTransactionData = (
6472
transaction: RpcWalletTransaction,
65-
config: { outgoingAddresses: Set<string> },
73+
config: { outgoingAddresses: Set<string>; bridgeFeeUpgrade: Date },
6674
): ChainportTransactionData => {
6775
if (!transaction.notes || transaction.notes.length < 2) {
6876
return undefined
@@ -80,7 +88,15 @@ const getOutgoingChainportTransactionData = (
8088
return undefined
8189
}
8290

83-
const [sourceNetwork, address, _] = ChainportMemoMetadata.decode(bridgeNote.memoHex)
91+
let sourceNetwork: number
92+
let address: string
93+
let _toIronFish: boolean
94+
95+
if (new Date(transaction.timestamp) < config.bridgeFeeUpgrade) {
96+
;[sourceNetwork, address, _toIronFish] = ChainportMemoMetadata.decodeV1(bridgeNote.memoHex)
97+
} else {
98+
;[sourceNetwork, address, _toIronFish] = ChainportMemoMetadata.decodeV2(bridgeNote.memoHex)
99+
}
84100

85101
return {
86102
type: TransactionType.SEND,

0 commit comments

Comments
 (0)