From ae8a6107296a0bfd4ac612515fe6b01cd7645a19 Mon Sep 17 00:00:00 2001 From: Alok Baltiyal Date: Tue, 28 Jan 2025 09:09:57 +0530 Subject: [PATCH] feat(sdk-coin-apt): test cases for legacy coin TICKET: COIN-2914 --- modules/sdk-coin-apt/test/resources/apt.ts | 2 + .../transactionBuilder/transferBuilder.ts | 239 ++++++++++++------ 2 files changed, 168 insertions(+), 73 deletions(-) diff --git a/modules/sdk-coin-apt/test/resources/apt.ts b/modules/sdk-coin-apt/test/resources/apt.ts index 8dee233a9f..aeeb23e1ae 100644 --- a/modules/sdk-coin-apt/test/resources/apt.ts +++ b/modules/sdk-coin-apt/test/resources/apt.ts @@ -76,3 +76,5 @@ export const fungibleTokenAddress = { export const FUNGIBLE_TOKEN_TRANSFER = '0x1aed808916ab9b1b30b07abb53561afd46847285ce28651221d406173a372449a700000000000000020000000000000000000000000000000000000000000000000000000000000001167072696d6172795f66756e6769626c655f73746f7265087472616e73666572010700000000000000000000000000000000000000000000000000000000000000010e66756e6769626c655f6173736574084d65746164617461000320d5d0d561493ea2b9410f67da804653ae44e793c2423707d4f11edb2e3819205020f7405c28a02cf5bab4ea4498240bb3579db45951794eb1c843bef0534c093ad9080100000000000000400d0300000000006400000000000000e42696670000000002030020f73836f42257240e43d439552471fc9dbcc3f1af5bd0b4ed83f44b5f661464424029665cd4c94658a0d83907bbed7e761794b25bccc03fc87e6dd63a543accdddfd7a6f1e7a15e8681547ca437ff99b58c92f816e35a0f333d7f1fd1330c21ad0a0000dbc87a1c816d9bcd06b683c37e80c7162e4d48da7812198b830e4d5d8e0629f200205223396c531f13e031a9f0cb26d459d799a52e51be9a1cb9e871afb4c31f91ff40de7b0bb86ca346031942e9cf21ff9604c7c08c2c662e38a0afe3dd640512c0441396c0697cd8bbbcf39694d6f88e35f6bed9fb34bd209b0479b5e8bd0cf3eb0b'; + +export const LEGACY_COIN_ASSEST = '0x4fb379c10c763a13e724064ecfb7d946690bea519ba982c81b518d1c11dd23fe::fa_test::Coinz'; diff --git a/modules/sdk-coin-apt/test/unit/transactionBuilder/transferBuilder.ts b/modules/sdk-coin-apt/test/unit/transactionBuilder/transferBuilder.ts index fab07c39d2..7c8fdbcab7 100644 --- a/modules/sdk-coin-apt/test/unit/transactionBuilder/transferBuilder.ts +++ b/modules/sdk-coin-apt/test/unit/transactionBuilder/transferBuilder.ts @@ -7,8 +7,165 @@ import should from 'should'; describe('Apt Transfer Transaction', () => { const factory = new TransactionBuilderFactory(coins.get('tapt')); - describe('Succeed', () => { - it('should build a transfer tx', async function () { + describe('Aptos Coin Transfer Transaction', () => { + describe('Succeed', () => { + it('should build a transfer tx', async function () { + const transaction = new TransferTransaction(coins.get('tapt')); + const txBuilder = factory.getTransferBuilder(transaction); + txBuilder.sender(testData.sender2.address); + txBuilder.recipient(testData.recipients[0]); + txBuilder.gasData({ + maxGasAmount: 200000, + gasUnitPrice: 100, + }); + txBuilder.sequenceNumber(14); + txBuilder.expirationTime(1736246155); + txBuilder.addFeePayerAddress(testData.feePayer.address); + const tx = (await txBuilder.build()) as TransferTransaction; + should.equal(tx.sender, testData.sender2.address); + should.equal(tx.recipient.address, testData.recipients[0].address); + should.equal(tx.recipient.amount, testData.recipients[0].amount); + should.equal(tx.maxGasAmount, 200000); + should.equal(tx.gasUnitPrice, 100); + should.equal(tx.sequenceNumber, 14); + should.equal(tx.expirationTime, 1736246155); + should.equal(tx.type, TransactionType.Send); + tx.inputs.length.should.equal(1); + tx.inputs[0].should.deepEqual({ + address: testData.sender2.address, + value: testData.recipients[0].amount, + coin: 'tapt', + }); + tx.outputs.length.should.equal(1); + tx.outputs[0].should.deepEqual({ + address: testData.recipients[0].address, + value: testData.recipients[0].amount, + coin: 'tapt', + }); + const rawTx = tx.toBroadcastFormat(); + should.equal(txBuilder.isValidRawTransaction(rawTx), true); + rawTx.should.equal( + '0x1aed808916ab9b1b30b07abb53561afd46847285ce28651221d406173a3724490e000000000000000200000000000000000000000000000000000000000000000000000000000000010d6170746f735f6163636f756e740e7472616e736665725f636f696e73010700000000000000000000000000000000000000000000000000000000000000010a6170746f735f636f696e094170746f73436f696e000220f7405c28a02cf5bab4ea4498240bb3579db45951794eb1c843bef0534c093ad908e803000000000000400d03000000000064000000000000008b037d670000000002030020000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000dbc87a1c816d9bcd06b683c37e80c7162e4d48da7812198b830e4d5d8e0629f2002000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000' + ); + }); + + it('should build and send a signed tx', async function () { + const txBuilder = factory.from(testData.TRANSFER); + const tx = (await txBuilder.build()) as TransferTransaction; + should.equal(tx.type, TransactionType.Send); + tx.inputs.length.should.equal(1); + tx.inputs[0].should.deepEqual({ + address: testData.sender2.address, + value: testData.recipients[0].amount, + coin: 'tapt', + }); + tx.outputs.length.should.equal(1); + tx.outputs[0].should.deepEqual({ + address: testData.recipients[0].address, + value: testData.recipients[0].amount, + coin: 'tapt', + }); + should.equal(tx.id, '0x80a52dd5d4f712a80b77ad7b4a12a8e61b76243a546099b0ab9acfef4e9a4e31'); + should.equal(tx.maxGasAmount, 200000); + should.equal(tx.gasUnitPrice, 100); + should.equal(tx.sequenceNumber, 146); + should.equal(tx.expirationTime, 1737528215); + should.equal(tx.type, TransactionType.Send); + const rawTx = tx.toBroadcastFormat(); + should.equal(txBuilder.isValidRawTransaction(rawTx), true); + should.equal(rawTx, testData.CHANGED_FUNCTION_TRANSFER); + }); + + it('should succeed to validate a valid signablePayload', async function () { + const transaction = new TransferTransaction(coins.get('tapt')); + const txBuilder = factory.getTransferBuilder(transaction); + txBuilder.sender(testData.sender2.address); + txBuilder.recipient(testData.recipients[0]); + txBuilder.gasData({ + maxGasAmount: 200000, + gasUnitPrice: 100, + }); + txBuilder.sequenceNumber(14); + txBuilder.expirationTime(1736246155); + txBuilder.addFeePayerAddress(testData.feePayer.address); + const tx = (await txBuilder.build()) as TransferTransaction; + const signablePayload = tx.signablePayload; + should.equal( + signablePayload.toString('hex'), + '5efa3c4f02f83a0f4b2d69fc95c607cc02825cc4e7be536ef0992df050d9e67c011aed808916ab9b1b30b07abb53561afd46847285ce28651221d406173a3724490e000000000000000200000000000000000000000000000000000000000000000000000000000000010d6170746f735f6163636f756e740e7472616e736665725f636f696e73010700000000000000000000000000000000000000000000000000000000000000010a6170746f735f636f696e094170746f73436f696e000220f7405c28a02cf5bab4ea4498240bb3579db45951794eb1c843bef0534c093ad908e803000000000000400d03000000000064000000000000008b037d67000000000200dbc87a1c816d9bcd06b683c37e80c7162e4d48da7812198b830e4d5d8e0629f2' + ); + }); + + it('should build a unsigned tx and validate its toJson', async function () { + const transaction = new TransferTransaction(coins.get('tapt')); + const txBuilder = factory.getTransferBuilder(transaction); + txBuilder.sender(testData.sender2.address); + txBuilder.recipient(testData.recipients[0]); + txBuilder.gasData({ + maxGasAmount: 200000, + gasUnitPrice: 100, + }); + txBuilder.sequenceNumber(14); + txBuilder.expirationTime(1736246155); + txBuilder.addFeePayerAddress(testData.feePayer.address); + const tx = (await txBuilder.build()) as TransferTransaction; + const toJson = tx.toJson(); + should.equal(toJson.sender, testData.sender2.address); + should.deepEqual(toJson.recipient, { + address: testData.recipients[0].address, + amount: testData.recipients[0].amount, + }); + should.equal(toJson.sequenceNumber, 14); + should.equal(toJson.maxGasAmount, 200000); + should.equal(toJson.gasUnitPrice, 100); + should.equal(toJson.expirationTime, 1736246155); + should.equal(toJson.feePayer, testData.feePayer.address); + }); + + it('should build a signed tx and validate its toJson', async function () { + const txBuilder = factory.from(testData.TRANSFER); + const tx = (await txBuilder.build()) as TransferTransaction; + const toJson = tx.toJson(); + should.equal(toJson.id, '0x80a52dd5d4f712a80b77ad7b4a12a8e61b76243a546099b0ab9acfef4e9a4e31'); + should.equal(toJson.sender, '0x1aed808916ab9b1b30b07abb53561afd46847285ce28651221d406173a372449'); + should.deepEqual(toJson.recipient, { + address: '0xf7405c28a02cf5bab4ea4498240bb3579db45951794eb1c843bef0534c093ad9', + amount: '1000', + }); + should.equal(toJson.sequenceNumber, 146); + should.equal(toJson.maxGasAmount, 200000); + should.equal(toJson.gasUnitPrice, 100); + should.equal(toJson.expirationTime, 1737528215); + }); + }); + + describe('Fail', () => { + it('should fail for invalid sender', async function () { + const transaction = new TransferTransaction(coins.get('tapt')); + const builder = factory.getTransferBuilder(transaction); + should(() => builder.sender('randomString')).throwError('Invalid address randomString'); + }); + + it('should fail for invalid recipient', async function () { + const builder = factory.getTransferBuilder(); + should(() => builder.recipient(testData.invalidRecipients[0])).throwError('Invalid address randomString'); + should(() => builder.recipient(testData.invalidRecipients[1])).throwError('Value cannot be less than zero'); + should(() => builder.recipient(testData.invalidRecipients[2])).throwError('Invalid amount format'); + }); + it('should fail for invalid gas amount', async function () { + const builder = factory.getTransferBuilder(); + should(() => builder.gasData({ maxGasAmount: -1, gasUnitPrice: 100 })).throwError( + 'Value cannot be less than zero' + ); + should(() => builder.gasData({ maxGasAmount: 200000, gasUnitPrice: -1 })).throwError( + 'Value cannot be less than zero' + ); + }); + }); + }); + + describe('Legacy Coin Transfer Transaction', () => { + it('should build a coinz (legacy coin) transfer tx', async function () { const transaction = new TransferTransaction(coins.get('tapt')); const txBuilder = factory.getTransferBuilder(transaction); txBuilder.sender(testData.sender2.address); @@ -19,6 +176,7 @@ describe('Apt Transfer Transaction', () => { }); txBuilder.sequenceNumber(14); txBuilder.expirationTime(1736246155); + txBuilder.assetId(testData.LEGACY_COIN_ASSEST); txBuilder.addFeePayerAddress(testData.feePayer.address); const tx = (await txBuilder.build()) as TransferTransaction; should.equal(tx.sender, testData.sender2.address); @@ -44,38 +202,11 @@ describe('Apt Transfer Transaction', () => { const rawTx = tx.toBroadcastFormat(); should.equal(txBuilder.isValidRawTransaction(rawTx), true); rawTx.should.equal( - '0x1aed808916ab9b1b30b07abb53561afd46847285ce28651221d406173a3724490e000000000000000200000000000000000000000000000000000000000000000000000000000000010d6170746f735f6163636f756e740e7472616e736665725f636f696e73010700000000000000000000000000000000000000000000000000000000000000010a6170746f735f636f696e094170746f73436f696e000220f7405c28a02cf5bab4ea4498240bb3579db45951794eb1c843bef0534c093ad908e803000000000000400d03000000000064000000000000008b037d670000000002030020000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000dbc87a1c816d9bcd06b683c37e80c7162e4d48da7812198b830e4d5d8e0629f2002000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000' + '0x1aed808916ab9b1b30b07abb53561afd46847285ce28651221d406173a3724490e000000000000000200000000000000000000000000000000000000000000000000000000000000010d6170746f735f6163636f756e740e7472616e736665725f636f696e7301074fb379c10c763a13e724064ecfb7d946690bea519ba982c81b518d1c11dd23fe0766615f7465737405436f696e7a000220f7405c28a02cf5bab4ea4498240bb3579db45951794eb1c843bef0534c093ad908e803000000000000400d03000000000064000000000000008b037d670000000002030020000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000dbc87a1c816d9bcd06b683c37e80c7162e4d48da7812198b830e4d5d8e0629f2002000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000' ); }); - it('should build and send a signed tx', async function () { - const txBuilder = factory.from(testData.TRANSFER); - const tx = (await txBuilder.build()) as TransferTransaction; - should.equal(tx.type, TransactionType.Send); - tx.inputs.length.should.equal(1); - tx.inputs[0].should.deepEqual({ - address: testData.sender2.address, - value: testData.recipients[0].amount, - coin: 'tapt', - }); - tx.outputs.length.should.equal(1); - tx.outputs[0].should.deepEqual({ - address: testData.recipients[0].address, - value: testData.recipients[0].amount, - coin: 'tapt', - }); - should.equal(tx.id, '0x80a52dd5d4f712a80b77ad7b4a12a8e61b76243a546099b0ab9acfef4e9a4e31'); - should.equal(tx.maxGasAmount, 200000); - should.equal(tx.gasUnitPrice, 100); - should.equal(tx.sequenceNumber, 146); - should.equal(tx.expirationTime, 1737528215); - should.equal(tx.type, TransactionType.Send); - const rawTx = tx.toBroadcastFormat(); - should.equal(txBuilder.isValidRawTransaction(rawTx), true); - should.equal(rawTx, testData.CHANGED_FUNCTION_TRANSFER); - }); - - it('should succeed to validate a valid signablePayload', async function () { + it('should succeed to validate a valid signablePayload for coinz (legacy coin)', async function () { const transaction = new TransferTransaction(coins.get('tapt')); const txBuilder = factory.getTransferBuilder(transaction); txBuilder.sender(testData.sender2.address); @@ -86,16 +217,17 @@ describe('Apt Transfer Transaction', () => { }); txBuilder.sequenceNumber(14); txBuilder.expirationTime(1736246155); + txBuilder.assetId(testData.LEGACY_COIN_ASSEST); txBuilder.addFeePayerAddress(testData.feePayer.address); const tx = (await txBuilder.build()) as TransferTransaction; const signablePayload = tx.signablePayload; should.equal( signablePayload.toString('hex'), - '5efa3c4f02f83a0f4b2d69fc95c607cc02825cc4e7be536ef0992df050d9e67c011aed808916ab9b1b30b07abb53561afd46847285ce28651221d406173a3724490e000000000000000200000000000000000000000000000000000000000000000000000000000000010d6170746f735f6163636f756e740e7472616e736665725f636f696e73010700000000000000000000000000000000000000000000000000000000000000010a6170746f735f636f696e094170746f73436f696e000220f7405c28a02cf5bab4ea4498240bb3579db45951794eb1c843bef0534c093ad908e803000000000000400d03000000000064000000000000008b037d67000000000200dbc87a1c816d9bcd06b683c37e80c7162e4d48da7812198b830e4d5d8e0629f2' + '5efa3c4f02f83a0f4b2d69fc95c607cc02825cc4e7be536ef0992df050d9e67c011aed808916ab9b1b30b07abb53561afd46847285ce28651221d406173a3724490e000000000000000200000000000000000000000000000000000000000000000000000000000000010d6170746f735f6163636f756e740e7472616e736665725f636f696e7301074fb379c10c763a13e724064ecfb7d946690bea519ba982c81b518d1c11dd23fe0766615f7465737405436f696e7a000220f7405c28a02cf5bab4ea4498240bb3579db45951794eb1c843bef0534c093ad908e803000000000000400d03000000000064000000000000008b037d67000000000200dbc87a1c816d9bcd06b683c37e80c7162e4d48da7812198b830e4d5d8e0629f2' ); }); - it('should build a unsigned tx and validate its toJson', async function () { + it('should build a coinz (legacy coin) unsigned tx and validate its toJson', async function () { const transaction = new TransferTransaction(coins.get('tapt')); const txBuilder = factory.getTransferBuilder(transaction); txBuilder.sender(testData.sender2.address); @@ -106,6 +238,7 @@ describe('Apt Transfer Transaction', () => { }); txBuilder.sequenceNumber(14); txBuilder.expirationTime(1736246155); + txBuilder.assetId(testData.LEGACY_COIN_ASSEST); txBuilder.addFeePayerAddress(testData.feePayer.address); const tx = (await txBuilder.build()) as TransferTransaction; const toJson = tx.toJson(); @@ -120,45 +253,5 @@ describe('Apt Transfer Transaction', () => { should.equal(toJson.expirationTime, 1736246155); should.equal(toJson.feePayer, testData.feePayer.address); }); - - it('should build a signed tx and validate its toJson', async function () { - const txBuilder = factory.from(testData.TRANSFER); - const tx = (await txBuilder.build()) as TransferTransaction; - const toJson = tx.toJson(); - should.equal(toJson.id, '0x80a52dd5d4f712a80b77ad7b4a12a8e61b76243a546099b0ab9acfef4e9a4e31'); - should.equal(toJson.sender, '0x1aed808916ab9b1b30b07abb53561afd46847285ce28651221d406173a372449'); - should.deepEqual(toJson.recipient, { - address: '0xf7405c28a02cf5bab4ea4498240bb3579db45951794eb1c843bef0534c093ad9', - amount: '1000', - }); - should.equal(toJson.sequenceNumber, 146); - should.equal(toJson.maxGasAmount, 200000); - should.equal(toJson.gasUnitPrice, 100); - should.equal(toJson.expirationTime, 1737528215); - }); - }); - - describe('Fail', () => { - it('should fail for invalid sender', async function () { - const transaction = new TransferTransaction(coins.get('tapt')); - const builder = factory.getTransferBuilder(transaction); - should(() => builder.sender('randomString')).throwError('Invalid address randomString'); - }); - - it('should fail for invalid recipient', async function () { - const builder = factory.getTransferBuilder(); - should(() => builder.recipient(testData.invalidRecipients[0])).throwError('Invalid address randomString'); - should(() => builder.recipient(testData.invalidRecipients[1])).throwError('Value cannot be less than zero'); - should(() => builder.recipient(testData.invalidRecipients[2])).throwError('Invalid amount format'); - }); - it('should fail for invalid gas amount', async function () { - const builder = factory.getTransferBuilder(); - should(() => builder.gasData({ maxGasAmount: -1, gasUnitPrice: 100 })).throwError( - 'Value cannot be less than zero' - ); - should(() => builder.gasData({ maxGasAmount: 200000, gasUnitPrice: -1 })).throwError( - 'Value cannot be less than zero' - ); - }); }); });