From a5cd30b90f860626a419d8a943b192720ced23ef Mon Sep 17 00:00:00 2001 From: Kamlesh Mugdiya Date: Sat, 22 Nov 2025 13:32:03 +0530 Subject: [PATCH] fix(sdk-coin-vet): preserve precision for large value transactions Ticket: COIN-0000 --- .../src/lib/transaction/transaction.ts | 2 +- .../transactionBuilder/transferBuilder.ts | 38 +++++++++++++++++++ 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/modules/sdk-coin-vet/src/lib/transaction/transaction.ts b/modules/sdk-coin-vet/src/lib/transaction/transaction.ts index b9a3cc355e..962438ca85 100644 --- a/modules/sdk-coin-vet/src/lib/transaction/transaction.ts +++ b/modules/sdk-coin-vet/src/lib/transaction/transaction.ts @@ -292,7 +292,7 @@ export class Transaction extends BaseTransaction { // Set recipients from clauses this.recipients = body.clauses.map((clause) => ({ address: (clause.to || '0x0').toString().toLowerCase(), - amount: Number(clause.value).toString(), + amount: new BigNumber(clause.value).toFixed(), })); this.loadInputsAndOutputs(); diff --git a/modules/sdk-coin-vet/test/transactionBuilder/transferBuilder.ts b/modules/sdk-coin-vet/test/transactionBuilder/transferBuilder.ts index be906570be..dee4f65af6 100644 --- a/modules/sdk-coin-vet/test/transactionBuilder/transferBuilder.ts +++ b/modules/sdk-coin-vet/test/transactionBuilder/transferBuilder.ts @@ -166,6 +166,44 @@ describe('Vet Transfer Transaction', () => { should.equal(completelySignedTx.toBroadcastFormat(), testData.completeSignedSerializedHex); should.equal(completelySignedTx.id, '0xb988d614d3c24420cb2183239ab601b53e63ff4c81cea1e4888bc9d0aa6aad13'); }); + + it('should preserve full precision of large number values', async function () { + // A very large number that would normally be represented in scientific notation '2.332734928448876e+22 + const largeAmount = '23327349284488761096413'; + + const transaction = new Transaction(coins.get('tvet')); + const txBuilder = factory.getTransferBuilder(transaction); + + // Use the large amount in recipients + const recipients = [ + { + address: testData.addresses.validAddresses[1].toLowerCase(), + amount: largeAmount, + }, + ]; + + txBuilder.sender(testData.addresses.validAddresses[0]); + txBuilder.recipients(recipients); + txBuilder.gas(21000); + txBuilder.nonce('64248'); + txBuilder.blockRef('0x014ead140e77bbc1'); + txBuilder.addFeePayerAddress(testData.feePayer.address); + txBuilder.expiration(64); + txBuilder.gasPriceCoef(128); + + const tx = (await txBuilder.build()) as Transaction; + + // Verify that the value is preserved exactly as provided + should.equal(tx.outputs[0].value, largeAmount); + + // Create a serialized transaction and parse it back + const serializedTx = tx.toBroadcastFormat(); + const deserializedTxBuilder = factory.from(serializedTx); + const deserializedTx = await deserializedTxBuilder.build(); + + // Verify the value is still preserved after serialization/deserialization + should.equal(deserializedTx.outputs[0].value, largeAmount); + }); }); describe('Fail', () => {