Skip to content

Commit 90abed6

Browse files
committed
ntt_solana_watcher: normalize TrimmedAmount
Signed-off-by: bingyuyap <bingyu.yap.21@gmail.com>
1 parent 548a8a9 commit 90abed6

File tree

3 files changed

+46
-8
lines changed

3 files changed

+46
-8
lines changed

watcher/src/watchers/NTTPayloads.ts

+10
Original file line numberDiff line numberDiff line change
@@ -227,6 +227,16 @@ export class TrimmedAmount {
227227
buffer.writeBigUInt64BE(amount.amount, 1);
228228
return buffer;
229229
}
230+
231+
normalize(targetDecimals: number): bigint {
232+
if (this.decimals === targetDecimals) {
233+
return this.amount;
234+
} else if (this.decimals > targetDecimals) {
235+
return this.amount / BigInt(10 ** (this.decimals - targetDecimals));
236+
} else {
237+
return this.amount * BigInt(10 ** (targetDecimals - this.decimals));
238+
}
239+
}
230240
}
231241

232242
// Another TransceiverMessage struct found in the TransceiverMessageAccount used in some instructions:

watcher/src/watchers/NTTSolanaWatcher.ts

+9-8
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ import {
4141
import {
4242
NativeTokenTransfer,
4343
NttManagerMessage,
44+
TrimmedAmount,
4445
ValidatedTransceiverMessage,
4546
WormholeTransceiverMessage,
4647
} from './NTTPayloads';
@@ -194,10 +195,10 @@ export class NTTSolanaWatcher extends SolanaWatcher {
194195
sender: outboxItemAccount.sender.toBuffer(),
195196
payload: {
196197
sourceToken: config.mint.toBuffer(),
197-
trimmedAmount: {
198-
amount: BigInt(outboxItemAccount.amount.amount.toString()),
199-
decimals: outboxItemAccount.amount.decimals,
200-
},
198+
trimmedAmount: new TrimmedAmount(
199+
BigInt(outboxItemAccount.amount.amount.toString()),
200+
outboxItemAccount.amount.decimals
201+
),
201202
recipientChain: outboxItemAccount.recipientChain.id,
202203
recipientAddress: Buffer.from(outboxItemAccount.recipientAddress),
203204
},
@@ -213,7 +214,7 @@ export class NTTSolanaWatcher extends SolanaWatcher {
213214
srcChainId: coalesceChainId(this.chain),
214215
destChainId: coalesceChainId(nttManagerMessage.payload.recipientChain as ChainId),
215216
sourceToken: config.mint.toBuffer().toString('hex'),
216-
tokenAmount: BigInt(outboxItemAccount.amount.amount.toString()),
217+
tokenAmount: nttManagerMessage.payload.trimmedAmount.normalize(8),
217218
transferSentTxhash: '',
218219
transferBlockHeight: 0n,
219220
nttTransferKey: `${this.programId}/${nttManagerMessage.payload.recipientAddress.toString(
@@ -276,7 +277,7 @@ export class NTTSolanaWatcher extends SolanaWatcher {
276277
srcChainId: transceiverMessage.chainId,
277278
destChainId: coalesceChainId(this.chain),
278279
sourceToken: transceiverMessage.ntt_managerPayload.payload.sourceToken.toString('hex'),
279-
tokenAmount: transceiverMessage.ntt_managerPayload.payload.trimmedAmount.amount,
280+
tokenAmount: transceiverMessage.ntt_managerPayload.payload.trimmedAmount.normalize(8),
280281
transferSentTxhash: '',
281282
transferBlockHeight: 0n,
282283
nttTransferKey: '',
@@ -398,7 +399,7 @@ export class NTTSolanaWatcher extends SolanaWatcher {
398399
transceiverMessage.ntt_managerPayload.payload.recipientChain as ChainId
399400
),
400401
sourceToken: transceiverMessage.ntt_managerPayload.payload.sourceToken.toString('hex'),
401-
tokenAmount: transceiverMessage.ntt_managerPayload.payload.trimmedAmount.amount,
402+
tokenAmount: transceiverMessage.ntt_managerPayload.payload.trimmedAmount.normalize(8),
402403
transferSentTxhash: '',
403404
transferBlockHeight: 0n,
404405
nttTransferKey: `${
@@ -455,7 +456,7 @@ export class NTTSolanaWatcher extends SolanaWatcher {
455456
transceiverMessage.ntt_managerPayload.payload.recipientChain as ChainId
456457
),
457458
sourceToken: transceiverMessage.ntt_managerPayload.payload.sourceToken.toString('hex'),
458-
tokenAmount: transceiverMessage.ntt_managerPayload.payload.trimmedAmount.amount,
459+
tokenAmount: transceiverMessage.ntt_managerPayload.payload.trimmedAmount.normalize(8),
459460
transferSentTxhash: transaction.transaction.signatures[0],
460461
transferBlockHeight: BigInt(transaction.slot),
461462
nttTransferKey: `${this.programId}/${recipient}/${seq}`,

watcher/src/watchers/__tests__/NTTSolanaWatcher.test.ts

+27
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { NTTSolanaWatcher } from '../NTTSolanaWatcher';
33
import {
44
NativeTokenTransfer,
55
NttManagerMessage,
6+
TrimmedAmount,
67
ValidatedTransceiverMessage,
78
} from '../NTTPayloads';
89

@@ -234,3 +235,29 @@ test.skip('parseRequestRelay', async () => {
234235
message = await watcher.parseInstruction(txs[0]!, ix);
235236
expect(message?.digest).toBe(digests[0]);
236237
});
238+
239+
test('normalizeToDecimals', () => {
240+
const testCases: { name: string; trimmedAmount: TrimmedAmount; expectedAmount: bigint }[] = [
241+
{
242+
name: 'currentDecimals < targetDecimals',
243+
trimmedAmount: new TrimmedAmount(BigInt(1000), 6),
244+
expectedAmount: 100000n,
245+
},
246+
{
247+
name: 'currentDecimals > targetDecimals',
248+
trimmedAmount: new TrimmedAmount(BigInt(1000000000), 10),
249+
expectedAmount: 10000000n,
250+
},
251+
{
252+
name: 'currentDecimals = targetDecimals',
253+
trimmedAmount: new TrimmedAmount(BigInt(100000000), 8),
254+
expectedAmount: 100000000n,
255+
},
256+
];
257+
258+
for (const testCase of testCases) {
259+
const { trimmedAmount, expectedAmount } = testCase;
260+
const normalizedAmount = trimmedAmount.normalize(8);
261+
expect(normalizedAmount).toBe(expectedAmount);
262+
}
263+
});

0 commit comments

Comments
 (0)