Skip to content

Commit

Permalink
feat(sdk-coin-apt): test cases for legacy coin
Browse files Browse the repository at this point in the history
TICKET: COIN-2914
  • Loading branch information
baltiyal committed Jan 28, 2025
1 parent a071eee commit ae8a610
Show file tree
Hide file tree
Showing 2 changed files with 168 additions and 73 deletions.
2 changes: 2 additions & 0 deletions modules/sdk-coin-apt/test/resources/apt.ts
Original file line number Diff line number Diff line change
Expand Up @@ -76,3 +76,5 @@ export const fungibleTokenAddress = {

export const FUNGIBLE_TOKEN_TRANSFER =
'0x1aed808916ab9b1b30b07abb53561afd46847285ce28651221d406173a372449a700000000000000020000000000000000000000000000000000000000000000000000000000000001167072696d6172795f66756e6769626c655f73746f7265087472616e73666572010700000000000000000000000000000000000000000000000000000000000000010e66756e6769626c655f6173736574084d65746164617461000320d5d0d561493ea2b9410f67da804653ae44e793c2423707d4f11edb2e3819205020f7405c28a02cf5bab4ea4498240bb3579db45951794eb1c843bef0534c093ad9080100000000000000400d0300000000006400000000000000e42696670000000002030020f73836f42257240e43d439552471fc9dbcc3f1af5bd0b4ed83f44b5f661464424029665cd4c94658a0d83907bbed7e761794b25bccc03fc87e6dd63a543accdddfd7a6f1e7a15e8681547ca437ff99b58c92f816e35a0f333d7f1fd1330c21ad0a0000dbc87a1c816d9bcd06b683c37e80c7162e4d48da7812198b830e4d5d8e0629f200205223396c531f13e031a9f0cb26d459d799a52e51be9a1cb9e871afb4c31f91ff40de7b0bb86ca346031942e9cf21ff9604c7c08c2c662e38a0afe3dd640512c0441396c0697cd8bbbcf39694d6f88e35f6bed9fb34bd209b0479b5e8bd0cf3eb0b';

export const LEGACY_COIN_ASSEST = '0x4fb379c10c763a13e724064ecfb7d946690bea519ba982c81b518d1c11dd23fe::fa_test::Coinz';
239 changes: 166 additions & 73 deletions modules/sdk-coin-apt/test/unit/transactionBuilder/transferBuilder.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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);
Expand All @@ -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);
Expand All @@ -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);
Expand All @@ -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();
Expand All @@ -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'
);
});
});
});

0 comments on commit ae8a610

Please sign in to comment.