From 42b679280bcc2c04150812b1b9bf8e93da46b217 Mon Sep 17 00:00:00 2001 From: Alok Baltiyal Date: Tue, 28 Jan 2025 10:52:31 +0530 Subject: [PATCH] feat(sdk-coin-apt): addition of test cases for digital asset TICKET: COIN-2920 --- modules/sdk-coin-apt/src/lib/constants.ts | 4 +- ...nsaction.ts => digitalAssetTransaction.ts} | 10 +- ....ts => digitalAssestTransactionBuilder.ts} | 15 +- .../src/lib/transactionBuilderFactory.ts | 14 +- modules/sdk-coin-apt/src/lib/utils.ts | 4 +- modules/sdk-coin-apt/test/resources/apt.ts | 16 +- .../digitalAssestTransactionBuilder.ts | 144 ++++++++++++++ .../nonFungibleAssetTransactionBuilder.ts | 177 ------------------ 8 files changed, 181 insertions(+), 203 deletions(-) rename modules/sdk-coin-apt/src/lib/transaction/{nonFungibleAssetTransaction.ts => digitalAssetTransaction.ts} (85%) rename modules/sdk-coin-apt/src/lib/transactionBuilder/{nonFungibleAssetTransactionBuilder.ts => digitalAssestTransactionBuilder.ts} (78%) create mode 100644 modules/sdk-coin-apt/test/unit/transactionBuilder/digitalAssestTransactionBuilder.ts delete mode 100644 modules/sdk-coin-apt/test/unit/transactionBuilder/nonFungibleAssetTransactionBuilder.ts diff --git a/modules/sdk-coin-apt/src/lib/constants.ts b/modules/sdk-coin-apt/src/lib/constants.ts index 75a11ac692..9e7cdeb952 100644 --- a/modules/sdk-coin-apt/src/lib/constants.ts +++ b/modules/sdk-coin-apt/src/lib/constants.ts @@ -8,6 +8,6 @@ export const SECONDS_PER_WEEK = 7 * 24 * 60 * 60; // Days * Hours * Minutes * Se export const APTOS_COIN = '0x1::aptos_account::transfer_coins'; export const FUNGIBLE_ASSET = '0x1::primary_fungible_store::transfer'; -export const NON_FUNGIBLE_ASSET = '0x1::object::transfer'; +export const DIGITAL_ASSET = '0x1::object::transfer'; -export const NON_FUNGIBLE_ASSET_TRANSFER_SUPPLY_PER_TRANSACTION = '1'; +export const DIGITAL_ASSET_TRANSFER_SUPPLY_PER_TRANSACTION = '1'; diff --git a/modules/sdk-coin-apt/src/lib/transaction/nonFungibleAssetTransaction.ts b/modules/sdk-coin-apt/src/lib/transaction/digitalAssetTransaction.ts similarity index 85% rename from modules/sdk-coin-apt/src/lib/transaction/nonFungibleAssetTransaction.ts rename to modules/sdk-coin-apt/src/lib/transaction/digitalAssetTransaction.ts index 3a12e9d353..c26b3a279c 100644 --- a/modules/sdk-coin-apt/src/lib/transaction/nonFungibleAssetTransaction.ts +++ b/modules/sdk-coin-apt/src/lib/transaction/digitalAssetTransaction.ts @@ -15,9 +15,9 @@ import { } from '@aptos-labs/ts-sdk'; import { InvalidTransactionError, TransactionRecipient, TransactionType } from '@bitgo/sdk-core'; import { BaseCoin as CoinConfig, NetworkType } from '@bitgo/statics'; -import { NON_FUNGIBLE_ASSET_TRANSFER_SUPPLY_PER_TRANSACTION } from '../constants'; +import { DIGITAL_ASSET_TRANSFER_SUPPLY_PER_TRANSACTION } from '../constants'; -export class NonFungibleAssetTransaction extends Transaction { +export class DigitalAssetTransaction extends Transaction { constructor(coinConfig: Readonly) { super(coinConfig); this._type = TransactionType.SendNFT; @@ -34,7 +34,7 @@ export class NonFungibleAssetTransaction extends Transaction { } this._assetId = entryFunction.args[0].toString(); this._recipient.address = entryFunction.args[1].toString(); - this._recipient.amount = NON_FUNGIBLE_ASSET_TRANSFER_SUPPLY_PER_TRANSACTION; + this._recipient.amount = DIGITAL_ASSET_TRANSFER_SUPPLY_PER_TRANSACTION; } protected async buildRawTransaction(): Promise { @@ -42,7 +42,7 @@ export class NonFungibleAssetTransaction extends Transaction { const aptos = new Aptos(new AptosConfig({ network })); const senderAddress = AccountAddress.fromString(this._sender); const recipientAddress = AccountAddress.fromString(this._recipient.address); - const nonFungibleAssetAccountAddress = AccountAddress.fromString(this._assetId); + const digitalAssetAccountAddress = AccountAddress.fromString(this._assetId); const transferDigitalAssetAbi: EntryFunctionABI = { typeParameters: [{ constraints: [MoveAbility.KEY] }], @@ -54,7 +54,7 @@ export class NonFungibleAssetTransaction extends Transaction { data: { function: '0x1::object::transfer', typeArguments: ['0x4::token::Token'], - functionArguments: [nonFungibleAssetAccountAddress, recipientAddress], + functionArguments: [digitalAssetAccountAddress, recipientAddress], abi: transferDigitalAssetAbi, }, options: { diff --git a/modules/sdk-coin-apt/src/lib/transactionBuilder/nonFungibleAssetTransactionBuilder.ts b/modules/sdk-coin-apt/src/lib/transactionBuilder/digitalAssestTransactionBuilder.ts similarity index 78% rename from modules/sdk-coin-apt/src/lib/transactionBuilder/nonFungibleAssetTransactionBuilder.ts rename to modules/sdk-coin-apt/src/lib/transactionBuilder/digitalAssestTransactionBuilder.ts index 95196d86dd..aa1073ed4e 100644 --- a/modules/sdk-coin-apt/src/lib/transactionBuilder/nonFungibleAssetTransactionBuilder.ts +++ b/modules/sdk-coin-apt/src/lib/transactionBuilder/digitalAssestTransactionBuilder.ts @@ -1,16 +1,15 @@ import { TransactionBuilder } from './transactionBuilder'; import { BaseCoin as CoinConfig } from '@bitgo/statics'; -import { FungibleAssetTransaction } from '../transaction/fungibleAssetTransaction'; import { TransactionType } from '@bitgo/sdk-core'; import { Transaction } from '../transaction/transaction'; import utils from '../utils'; import { TransactionPayload, TransactionPayloadEntryFunction } from '@aptos-labs/ts-sdk'; -import { NonFungibleAssetTransaction } from '../transaction/nonFungibleAssetTransaction'; +import { DigitalAssetTransaction } from '../transaction/digitalAssetTransaction'; -export class NonFungibleAssetTransactionBuilder extends TransactionBuilder { +export class DigitalAssetTransactionBuilder extends TransactionBuilder { constructor(_coinConfig: Readonly) { super(_coinConfig); - this._transaction = new NonFungibleAssetTransaction(_coinConfig); + this._transaction = new DigitalAssetTransaction(_coinConfig); } protected get transactionType(): TransactionType { @@ -24,12 +23,12 @@ export class NonFungibleAssetTransactionBuilder extends TransactionBuilder { } /** @inheritdoc */ - initBuilder(tx: FungibleAssetTransaction): void { + initBuilder(tx: DigitalAssetTransaction): void { this._transaction = tx; } /** @inheritdoc */ - validateTransaction(transaction?: FungibleAssetTransaction): void { + validateTransaction(transaction?: DigitalAssetTransaction): void { if (!transaction) { throw new Error('transaction not defined'); } @@ -45,9 +44,9 @@ export class NonFungibleAssetTransactionBuilder extends TransactionBuilder { return false; } const entryFunction = payload.entryFunction; - const nonFungibleAssetAddress = entryFunction.args[0].toString(); + const digitalAssetAddress = entryFunction.args[0].toString(); const recipientAddress = entryFunction.args[1].toString(); - return utils.isValidAddress(recipientAddress) && utils.isValidAddress(nonFungibleAssetAddress); + return utils.isValidAddress(recipientAddress) && utils.isValidAddress(digitalAssetAddress); } catch (e) { console.error('invalid transaction payload', e); return false; diff --git a/modules/sdk-coin-apt/src/lib/transactionBuilderFactory.ts b/modules/sdk-coin-apt/src/lib/transactionBuilderFactory.ts index e7dddfa933..db39350ced 100644 --- a/modules/sdk-coin-apt/src/lib/transactionBuilderFactory.ts +++ b/modules/sdk-coin-apt/src/lib/transactionBuilderFactory.ts @@ -8,8 +8,8 @@ import { TransferTransaction } from './transaction/transferTransaction'; import { BaseCoin as CoinConfig } from '@bitgo/statics'; import { FungibleAssetTransaction } from './transaction/fungibleAssetTransaction'; import { FungibleAssetTransactionBuilder } from './transactionBuilder/fungibleAssetTransactionBuilder'; -import { NonFungibleAssetTransaction } from './transaction/nonFungibleAssetTransaction'; -import { NonFungibleAssetTransactionBuilder } from './transactionBuilder/nonFungibleAssetTransactionBuilder'; +import { DigitalAssetTransaction } from './transaction/digitalAssetTransaction'; +import { DigitalAssetTransactionBuilder } from './transactionBuilder/digitalAssestTransactionBuilder'; export class TransactionBuilderFactory extends BaseTransactionBuilderFactory { constructor(_coinConfig: Readonly) { @@ -31,9 +31,9 @@ export class TransactionBuilderFactory extends BaseTransactionBuilderFactory { fungibleTransferTokenTx.fromDeserializedSignedTransaction(signedTxn); return this.getFungibleAssetTransactionBuilder(fungibleTransferTokenTx); case TransactionType.SendNFT: - const nonFungibleTransferTokenTx = new NonFungibleAssetTransaction(this._coinConfig); - nonFungibleTransferTokenTx.fromDeserializedSignedTransaction(signedTxn); - return this.getNonFungibleAssetTransactionBuilder(nonFungibleTransferTokenTx); + const digitalAssetTransferTx = new DigitalAssetTransaction(this._coinConfig); + digitalAssetTransferTx.fromDeserializedSignedTransaction(signedTxn); + return this.getDigitalAssetTransactionBuilder(digitalAssetTransferTx); default: throw new InvalidTransactionError('Invalid transaction'); } @@ -58,8 +58,8 @@ export class TransactionBuilderFactory extends BaseTransactionBuilderFactory { } /** @inheritdoc */ - getNonFungibleAssetTransactionBuilder(tx?: Transaction): NonFungibleAssetTransactionBuilder { - return this.initializeBuilder(tx, new NonFungibleAssetTransactionBuilder(this._coinConfig)); + getDigitalAssetTransactionBuilder(tx?: Transaction): DigitalAssetTransactionBuilder { + return this.initializeBuilder(tx, new DigitalAssetTransactionBuilder(this._coinConfig)); } /** @inheritdoc */ diff --git a/modules/sdk-coin-apt/src/lib/utils.ts b/modules/sdk-coin-apt/src/lib/utils.ts index 0c50efab7c..4c02aa97a2 100644 --- a/modules/sdk-coin-apt/src/lib/utils.ts +++ b/modules/sdk-coin-apt/src/lib/utils.ts @@ -20,8 +20,8 @@ import { APT_SIGNATURE_LENGTH, APT_TRANSACTION_ID_LENGTH, APTOS_COIN, + DIGITAL_ASSET, FUNGIBLE_ASSET, - NON_FUNGIBLE_ASSET, } from './constants'; import BigNumber from 'bignumber.js'; @@ -82,7 +82,7 @@ export class Utils implements BaseUtils { return TransactionType.Send; case FUNGIBLE_ASSET: return TransactionType.SendToken; - case NON_FUNGIBLE_ASSET: + case DIGITAL_ASSET: return TransactionType.SendNFT; default: throw new InvalidTransactionError(`Invalid transaction: unable to fetch transaction type ${moduleIdentifier}`); diff --git a/modules/sdk-coin-apt/test/resources/apt.ts b/modules/sdk-coin-apt/test/resources/apt.ts index aeeb23e1ae..944944d9b0 100644 --- a/modules/sdk-coin-apt/test/resources/apt.ts +++ b/modules/sdk-coin-apt/test/resources/apt.ts @@ -46,6 +46,13 @@ export const fungibleTokenRecipients: Recipient[] = [ }, ]; +export const digitalTokenRecipients: Recipient[] = [ + { + address: addresses.validAddresses[0], + amount: '1', + }, +]; + export const invalidRecipients: Recipient[] = [ { address: addresses.invalidAddresses[0], @@ -67,6 +74,12 @@ export const TRANSFER = export const CHANGED_FUNCTION_TRANSFER = '0x1aed808916ab9b1b30b07abb53561afd46847285ce28651221d406173a37244992000000000000000200000000000000000000000000000000000000000000000000000000000000010d6170746f735f6163636f756e740e7472616e736665725f636f696e73010700000000000000000000000000000000000000000000000000000000000000010a6170746f735f636f696e094170746f73436f696e000220f7405c28a02cf5bab4ea4498240bb3579db45951794eb1c843bef0534c093ad908e803000000000000400d0300000000006400000000000000979390670000000002030020f73836f42257240e43d439552471fc9dbcc3f1af5bd0b4ed83f44b5f6614644240caeb90efd4b7ecd922c97bb3163e6a9de1fbb2ee0fc0d56af484f4af9b0015c5831341550af29b3686713b6657c821d894635fe13c7933f06ee043728f040b090000dbc87a1c816d9bcd06b683c37e80c7162e4d48da7812198b830e4d5d8e0629f200205223396c531f13e031a9f0cb26d459d799a52e51be9a1cb9e871afb4c31f91ff4013e7e8a1325ee5f656c93baa3d0206a1d9bd6da5abdc6f5d9b8bbbb0926ddac68f3e57a915dd217d2d43e776a6cc01af72f895ea712acc836d30349f29a3c606'; +export const FUNGIBLE_TOKEN_TRANSFER = + '0x1aed808916ab9b1b30b07abb53561afd46847285ce28651221d406173a372449a700000000000000020000000000000000000000000000000000000000000000000000000000000001167072696d6172795f66756e6769626c655f73746f7265087472616e73666572010700000000000000000000000000000000000000000000000000000000000000010e66756e6769626c655f6173736574084d65746164617461000320d5d0d561493ea2b9410f67da804653ae44e793c2423707d4f11edb2e3819205020f7405c28a02cf5bab4ea4498240bb3579db45951794eb1c843bef0534c093ad9080100000000000000400d0300000000006400000000000000e42696670000000002030020f73836f42257240e43d439552471fc9dbcc3f1af5bd0b4ed83f44b5f661464424029665cd4c94658a0d83907bbed7e761794b25bccc03fc87e6dd63a543accdddfd7a6f1e7a15e8681547ca437ff99b58c92f816e35a0f333d7f1fd1330c21ad0a0000dbc87a1c816d9bcd06b683c37e80c7162e4d48da7812198b830e4d5d8e0629f200205223396c531f13e031a9f0cb26d459d799a52e51be9a1cb9e871afb4c31f91ff40de7b0bb86ca346031942e9cf21ff9604c7c08c2c662e38a0afe3dd640512c0441396c0697cd8bbbcf39694d6f88e35f6bed9fb34bd209b0479b5e8bd0cf3eb0b'; + +export const DIGITAL_ASSET_TRANSFER = + '0x1aed808916ab9b1b30b07abb53561afd46847285ce28651221d406173a372449ab00000000000000020000000000000000000000000000000000000000000000000000000000000001066f626a656374087472616e736665720107000000000000000000000000000000000000000000000000000000000000000405746f6b656e05546f6b656e0002202e356062777469d39ca5d9b72512ce2d5713d7938ed6ca9193d4fc2016a819fd20f7405c28a02cf5bab4ea4498240bb3579db45951794eb1c843bef0534c093ad9400d0300000000006400000000000000526798670000000002030020f73836f42257240e43d439552471fc9dbcc3f1af5bd0b4ed83f44b5f66146442400c2c31eae495d22d1d31031b9756e8238a3df6e760515aa3e1108d93b3aec6aeb91684307e8365ad9dc44c0b5957e95a21a6f47d8d4a6e0eb3b145fb3d517f030000dbc87a1c816d9bcd06b683c37e80c7162e4d48da7812198b830e4d5d8e0629f200205223396c531f13e031a9f0cb26d459d799a52e51be9a1cb9e871afb4c31f91ff40dd6c064e44642819dec2f63d32d6daa4f889d62d06025ad99b42562c4c6cdef8b1437739115d7f38050078829efb9dd05528f53309bcab5b89fadb283423100d'; + export const INVALID_TRANSFER = 'AAAAAAAAAAAAA6e7361637469bc4a58e500b9e64cb6547ee9b403000000000000002064ba1fb2f2fbd2938a350015d601f4db89cd7e8e2370d0dd9ae3ac4f635c1581111b8a49f67370bc4a58e500b9e64cb6462e39b802000000000000002064ba1fb2f2fbd2938a350015d601f4db89cd7e8e2370d0dd9ae3ac47aa1ff81f01c4173a804406a365e69dfb297d4eaaf002546ebd016400000000000000cba4a48bb0f8b586c167e5dcefaa1c5e96ab3f0836d6ca08f2081732944d1e5b6b406a4a462e39b8030000000000000020b9490ede63215262c434e03f606d9799f3ba704523ceda184b386d47aa1ff81f01000000000000006400000000000000'; @@ -74,7 +87,6 @@ export const fungibleTokenAddress = { usdt: '0xd5d0d561493ea2b9410f67da804653ae44e793c2423707d4f11edb2e38192050', }; -export const FUNGIBLE_TOKEN_TRANSFER = - '0x1aed808916ab9b1b30b07abb53561afd46847285ce28651221d406173a372449a700000000000000020000000000000000000000000000000000000000000000000000000000000001167072696d6172795f66756e6769626c655f73746f7265087472616e73666572010700000000000000000000000000000000000000000000000000000000000000010e66756e6769626c655f6173736574084d65746164617461000320d5d0d561493ea2b9410f67da804653ae44e793c2423707d4f11edb2e3819205020f7405c28a02cf5bab4ea4498240bb3579db45951794eb1c843bef0534c093ad9080100000000000000400d0300000000006400000000000000e42696670000000002030020f73836f42257240e43d439552471fc9dbcc3f1af5bd0b4ed83f44b5f661464424029665cd4c94658a0d83907bbed7e761794b25bccc03fc87e6dd63a543accdddfd7a6f1e7a15e8681547ca437ff99b58c92f816e35a0f333d7f1fd1330c21ad0a0000dbc87a1c816d9bcd06b683c37e80c7162e4d48da7812198b830e4d5d8e0629f200205223396c531f13e031a9f0cb26d459d799a52e51be9a1cb9e871afb4c31f91ff40de7b0bb86ca346031942e9cf21ff9604c7c08c2c662e38a0afe3dd640512c0441396c0697cd8bbbcf39694d6f88e35f6bed9fb34bd209b0479b5e8bd0cf3eb0b'; +export const digitalAssetAddress = '0x2e356062777469d39ca5d9b72512ce2d5713d7938ed6ca9193d4fc2016a819fd'; export const LEGACY_COIN_ASSEST = '0x4fb379c10c763a13e724064ecfb7d946690bea519ba982c81b518d1c11dd23fe::fa_test::Coinz'; diff --git a/modules/sdk-coin-apt/test/unit/transactionBuilder/digitalAssestTransactionBuilder.ts b/modules/sdk-coin-apt/test/unit/transactionBuilder/digitalAssestTransactionBuilder.ts new file mode 100644 index 0000000000..c0ddc4e6d5 --- /dev/null +++ b/modules/sdk-coin-apt/test/unit/transactionBuilder/digitalAssestTransactionBuilder.ts @@ -0,0 +1,144 @@ +import { getBuilderFactory } from '../getBuilderFactory'; +import { coins } from '@bitgo/statics'; +import * as testData from '../../resources/apt'; +import { TransactionType } from '@bitgo/sdk-core'; +import should from 'should'; +import { DigitalAssetTransaction } from '../../../src/lib/transaction/digitalAssetTransaction'; + +describe('Apt Digital Asset Transfer Builder', () => { + const factory = getBuilderFactory('tapt'); + //TODO: change coin 'tapt' to digital asset (nft) when configured + it('should build a digital asset transfer', async function () { + const digitalAssetTransfer = new DigitalAssetTransaction(coins.get('tapt')); + const txBuilder = factory.getDigitalAssetTransactionBuilder(digitalAssetTransfer); + txBuilder.sender(testData.sender2.address); + txBuilder.recipient(testData.digitalTokenRecipients[0]); + txBuilder.gasData({ + maxGasAmount: 200000, + gasUnitPrice: 100, + }); + txBuilder.assetId(testData.digitalAssetAddress); + txBuilder.sequenceNumber(14); + txBuilder.expirationTime(1736246155); + txBuilder.addFeePayerAddress(testData.feePayer.address); + const tx = (await txBuilder.build()) as DigitalAssetTransaction; + should.equal(tx.sender, testData.sender2.address); + should.equal(tx.recipient.address, testData.digitalTokenRecipients[0].address); + should.equal(tx.assetId, testData.digitalAssetAddress); + 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.SendNFT); + tx.inputs.length.should.equal(1); + tx.inputs[0].should.deepEqual({ + address: testData.sender2.address, + value: testData.digitalTokenRecipients[0].amount, + coin: 'tapt', + }); + tx.outputs.length.should.equal(1); + tx.outputs[0].should.deepEqual({ + address: testData.digitalTokenRecipients[0].address, + value: testData.digitalTokenRecipients[0].amount, + coin: 'tapt', + }); + const rawTx = tx.toBroadcastFormat(); + should.equal(txBuilder.isValidRawTransaction(rawTx), true); + rawTx.should.equal( + '0x1aed808916ab9b1b30b07abb53561afd46847285ce28651221d406173a3724490e00000000000000020000000000000000000000000000000000000000000000000000000000000001066f626a656374087472616e736665720107000000000000000000000000000000000000000000000000000000000000000405746f6b656e05546f6b656e0002202e356062777469d39ca5d9b72512ce2d5713d7938ed6ca9193d4fc2016a819fd20f7405c28a02cf5bab4ea4498240bb3579db45951794eb1c843bef0534c093ad9400d03000000000064000000000000008b037d670000000002030020000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000dbc87a1c816d9bcd06b683c37e80c7162e4d48da7812198b830e4d5d8e0629f2002000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000' + ); + }); + + it('should build and send a signed tx', async function () { + const txBuilder = factory.from(testData.DIGITAL_ASSET_TRANSFER); + const tx = (await txBuilder.build()) as DigitalAssetTransaction; + should.equal(tx.type, TransactionType.SendNFT); + tx.inputs.length.should.equal(1); + tx.inputs[0].should.deepEqual({ + address: testData.sender2.address, + value: testData.digitalTokenRecipients[0].amount, + coin: 'tapt', + }); + tx.outputs.length.should.equal(1); + tx.outputs[0].should.deepEqual({ + address: testData.digitalTokenRecipients[0].address, + value: testData.digitalTokenRecipients[0].amount, + coin: 'tapt', + }); + should.equal(tx.id, '0xfb4f870c4ae1bc74f6ceff72d8ee92f109239be8e12ddb07ddf30d7e6bd30586'); + should.equal(tx.maxGasAmount, 200000); + should.equal(tx.gasUnitPrice, 100); + should.equal(tx.sequenceNumber, 171); + should.equal(tx.expirationTime, 1738041170); + should.equal(tx.type, TransactionType.SendNFT); + const rawTx = tx.toBroadcastFormat(); + should.equal(txBuilder.isValidRawTransaction(rawTx), true); + should.equal(rawTx, testData.DIGITAL_ASSET_TRANSFER); + }); + // + it('should succeed to validate a valid signablePayload', async function () { + const transaction = new DigitalAssetTransaction(coins.get('tapt')); + const txBuilder = factory.getDigitalAssetTransactionBuilder(transaction); + txBuilder.sender(testData.sender2.address); + txBuilder.recipient(testData.digitalTokenRecipients[0]); + txBuilder.gasData({ + maxGasAmount: 200000, + gasUnitPrice: 100, + }); + txBuilder.sequenceNumber(14); + txBuilder.expirationTime(1736246155); + txBuilder.assetId(testData.digitalAssetAddress); + txBuilder.addFeePayerAddress(testData.feePayer.address); + const tx = (await txBuilder.build()) as DigitalAssetTransaction; + const signablePayload = tx.signablePayload; + should.equal( + signablePayload.toString('hex'), + '5efa3c4f02f83a0f4b2d69fc95c607cc02825cc4e7be536ef0992df050d9e67c011aed808916ab9b1b30b07abb53561afd46847285ce28651221d406173a3724490e00000000000000020000000000000000000000000000000000000000000000000000000000000001066f626a656374087472616e736665720107000000000000000000000000000000000000000000000000000000000000000405746f6b656e05546f6b656e0002202e356062777469d39ca5d9b72512ce2d5713d7938ed6ca9193d4fc2016a819fd20f7405c28a02cf5bab4ea4498240bb3579db45951794eb1c843bef0534c093ad9400d03000000000064000000000000008b037d67000000000200dbc87a1c816d9bcd06b683c37e80c7162e4d48da7812198b830e4d5d8e0629f2' + ); + }); + + it('should build a unsigned tx and validate its toJson', async function () { + const transaction = new DigitalAssetTransaction(coins.get('tapt')); + const txBuilder = factory.getDigitalAssetTransactionBuilder(transaction); + txBuilder.sender(testData.sender2.address); + txBuilder.recipient(testData.digitalTokenRecipients[0]); + txBuilder.gasData({ + maxGasAmount: 200000, + gasUnitPrice: 100, + }); + txBuilder.sequenceNumber(14); + txBuilder.expirationTime(1736246155); + txBuilder.assetId(testData.digitalAssetAddress); + txBuilder.addFeePayerAddress(testData.feePayer.address); + const tx = (await txBuilder.build()) as DigitalAssetTransaction; + const toJson = tx.toJson(); + should.equal(toJson.sender, testData.sender2.address); + should.deepEqual(toJson.recipient, { + address: testData.digitalTokenRecipients[0].address, + amount: testData.digitalTokenRecipients[0].amount, + }); + should.equal(toJson.sequenceNumber, 14); + should.equal(tx.assetId, testData.digitalAssetAddress); + 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.DIGITAL_ASSET_TRANSFER); + const tx = (await txBuilder.build()) as DigitalAssetTransaction; + const toJson = tx.toJson(); + should.equal(toJson.id, '0xfb4f870c4ae1bc74f6ceff72d8ee92f109239be8e12ddb07ddf30d7e6bd30586'); + should.equal(toJson.sender, testData.sender2.address); + should.deepEqual(toJson.recipient, { + address: testData.digitalTokenRecipients[0].address, + amount: testData.digitalTokenRecipients[0].amount.toString(), + }); + should.equal(tx.assetId, testData.digitalAssetAddress); + should.equal(toJson.sequenceNumber, 171); + should.equal(toJson.maxGasAmount, 200000); + should.equal(toJson.gasUnitPrice, 100); + should.equal(toJson.expirationTime, 1738041170); + }); +}); diff --git a/modules/sdk-coin-apt/test/unit/transactionBuilder/nonFungibleAssetTransactionBuilder.ts b/modules/sdk-coin-apt/test/unit/transactionBuilder/nonFungibleAssetTransactionBuilder.ts deleted file mode 100644 index 435f71f80f..0000000000 --- a/modules/sdk-coin-apt/test/unit/transactionBuilder/nonFungibleAssetTransactionBuilder.ts +++ /dev/null @@ -1,177 +0,0 @@ -import { getBuilderFactory } from '../getBuilderFactory'; -import { coins } from '@bitgo/statics'; -import * as testData from '../../resources/apt'; -import { TransactionType } from '@bitgo/sdk-core'; -import should from 'should'; -import { FungibleAssetTransaction } from '../../../src/lib/transaction/fungibleAssetTransaction'; - -describe('Apt Token Transfer Builder', () => { - const factory = getBuilderFactory('tapt:usdt'); - - describe('Succeed', () => { - it('should build a nft token transfer', async function () { - const fungibleTokenTransfer = new FungibleAssetTransaction(coins.get('tapt:usdt')); - const txBuilder = factory.getFungibleAssetTransactionBuilder(fungibleTokenTransfer); - txBuilder.sender(testData.sender2.address); - txBuilder.recipient(testData.fungibleTokenRecipients[0]); - txBuilder.gasData({ - maxGasAmount: 200000, - gasUnitPrice: 100, - }); - txBuilder.assetId(testData.fungibleTokenAddress.usdt); - txBuilder.sequenceNumber(14); - txBuilder.expirationTime(1736246155); - txBuilder.addFeePayerAddress(testData.feePayer.address); - const tx = (await txBuilder.build()) as FungibleAssetTransaction; - should.equal(tx.sender, testData.sender2.address); - should.equal(tx.recipient.address, testData.fungibleTokenRecipients[0].address); - should.equal(tx.recipient.amount, testData.fungibleTokenRecipients[0].amount); - should.equal(tx.assetId, testData.fungibleTokenAddress.usdt); - 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.SendToken); - tx.inputs.length.should.equal(1); - tx.inputs[0].should.deepEqual({ - address: testData.sender2.address, - value: testData.fungibleTokenRecipients[0].amount, - coin: 'tapt:usdt', - }); - tx.outputs.length.should.equal(1); - tx.outputs[0].should.deepEqual({ - address: testData.fungibleTokenRecipients[0].address, - value: testData.fungibleTokenRecipients[0].amount, - coin: 'tapt:usdt', - }); - const rawTx = tx.toBroadcastFormat(); - should.equal(txBuilder.isValidRawTransaction(rawTx), true); - rawTx.should.equal( - '0x1aed808916ab9b1b30b07abb53561afd46847285ce28651221d406173a3724490e00000000000000020000000000000000000000000000000000000000000000000000000000000001167072696d6172795f66756e6769626c655f73746f7265087472616e73666572010700000000000000000000000000000000000000000000000000000000000000010e66756e6769626c655f6173736574084d65746164617461000320d5d0d561493ea2b9410f67da804653ae44e793c2423707d4f11edb2e3819205020f7405c28a02cf5bab4ea4498240bb3579db45951794eb1c843bef0534c093ad9080100000000000000400d03000000000064000000000000008b037d670000000002030020000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000dbc87a1c816d9bcd06b683c37e80c7162e4d48da7812198b830e4d5d8e0629f2002000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000' - ); - }); - - // it('should build and send a signed tx', async function () { - // const txBuilder = factory.from(testData.FUNGIBLE_TOKEN_TRANSFER); - // const tx = (await txBuilder.build()) as FungibleAssetTransaction; - // console.log('----- tx: ', tx); - // should.equal(tx.type, TransactionType.SendToken); - // tx.inputs.length.should.equal(1); - // tx.inputs[0].should.deepEqual({ - // address: testData.sender2.address, - // value: testData.fungibleTokenRecipients[0].amount, - // coin: 'tapt:usdt', - // }); - // tx.outputs.length.should.equal(1); - // tx.outputs[0].should.deepEqual({ - // address: testData.fungibleTokenRecipients[0].address, - // value: testData.fungibleTokenRecipients[0].amount, - // coin: 'tapt:usdt', - // }); - // should.equal(tx.id, '0x2dae2ecd096a212d6f565bd161c92f506cebb700aaf16c88bd3456b88d4c392a'); - // should.equal(tx.maxGasAmount, 200000); - // should.equal(tx.gasUnitPrice, 100); - // should.equal(tx.sequenceNumber, 167); - // should.equal(tx.expirationTime, 1737893604); - // should.equal(tx.type, TransactionType.SendToken); - // const rawTx = tx.toBroadcastFormat(); - // should.equal(txBuilder.isValidRawTransaction(rawTx), true); - // should.equal(rawTx, testData.FUNGIBLE_TOKEN_TRANSFER); - // }); - // - // it('should succeed to validate a valid signablePayload', async function () { - // const transaction = new FungibleAssetTransaction(coins.get('tapt')); - // const txBuilder = factory.getFungibleAssetTransactionBuilder(transaction); - // txBuilder.sender(testData.sender2.address); - // txBuilder.recipient(testData.fungibleTokenRecipients[0]); - // txBuilder.gasData({ - // maxGasAmount: 200000, - // gasUnitPrice: 100, - // }); - // txBuilder.sequenceNumber(14); - // txBuilder.expirationTime(1736246155); - // txBuilder.assetId(testData.fungibleTokenAddress.usdt); - // txBuilder.addFeePayerAddress(testData.feePayer.address); - // const tx = (await txBuilder.build()) as FungibleAssetTransaction; - // const signablePayload = tx.signablePayload; - // should.equal( - // signablePayload.toString('hex'), - // '5efa3c4f02f83a0f4b2d69fc95c607cc02825cc4e7be536ef0992df050d9e67c011aed808916ab9b1b30b07abb53561afd46847285ce28651221d406173a3724490e00000000000000020000000000000000000000000000000000000000000000000000000000000001167072696d6172795f66756e6769626c655f73746f7265087472616e73666572010700000000000000000000000000000000000000000000000000000000000000010e66756e6769626c655f6173736574084d65746164617461000320d5d0d561493ea2b9410f67da804653ae44e793c2423707d4f11edb2e3819205020f7405c28a02cf5bab4ea4498240bb3579db45951794eb1c843bef0534c093ad9080100000000000000400d03000000000064000000000000008b037d67000000000200dbc87a1c816d9bcd06b683c37e80c7162e4d48da7812198b830e4d5d8e0629f2' - // ); - // }); - // - // it('should build a unsigned tx and validate its toJson', async function () { - // const transaction = new FungibleAssetTransaction(coins.get('tapt')); - // const txBuilder = factory.getFungibleAssetTransactionBuilder(transaction); - // txBuilder.sender(testData.sender2.address); - // txBuilder.recipient(testData.fungibleTokenRecipients[0]); - // txBuilder.gasData({ - // maxGasAmount: 200000, - // gasUnitPrice: 100, - // }); - // txBuilder.sequenceNumber(14); - // txBuilder.expirationTime(1736246155); - // txBuilder.assetId(testData.fungibleTokenAddress.usdt); - // txBuilder.addFeePayerAddress(testData.feePayer.address); - // const tx = (await txBuilder.build()) as FungibleAssetTransaction; - // const toJson = tx.toJson(); - // should.equal(toJson.sender, testData.sender2.address); - // should.deepEqual(toJson.recipient, { - // address: testData.fungibleTokenRecipients[0].address, - // amount: testData.fungibleTokenRecipients[0].amount, - // }); - // should.equal(toJson.sequenceNumber, 14); - // should.equal(tx.assetId, testData.fungibleTokenAddress.usdt); - // 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.FUNGIBLE_TOKEN_TRANSFER); - // const tx = (await txBuilder.build()) as FungibleAssetTransaction; - // const toJson = tx.toJson(); - // should.equal(toJson.id, '0x2dae2ecd096a212d6f565bd161c92f506cebb700aaf16c88bd3456b88d4c392a'); - // should.equal(toJson.sender, testData.sender2.address); - // should.deepEqual(toJson.recipient, { - // address: testData.fungibleTokenRecipients[0].address, - // amount: testData.fungibleTokenRecipients[0].amount.toString(), - // }); - // should.equal(tx.assetId, testData.fungibleTokenAddress.usdt); - // should.equal(toJson.sequenceNumber, 167); - // should.equal(toJson.maxGasAmount, 200000); - // should.equal(toJson.gasUnitPrice, 100); - // should.equal(toJson.expirationTime, 1737893604); - // }); - }); - - // 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' - // ); - // }); - // it('should fail for invalid fungible token address', async function () { - // const transaction = new FungibleAssetTransaction(coins.get('tapt')); - // const txBuilder = factory.getFungibleAssetTransactionBuilder(transaction); - // should(() => txBuilder.assetId('randomString')).throwError('Invalid address randomString'); - // }); - // }); -});