diff --git a/modules/sdk-coin-apt/src/lib/constants.ts b/modules/sdk-coin-apt/src/lib/constants.ts index f97881cdee..25654cba44 100644 --- a/modules/sdk-coin-apt/src/lib/constants.ts +++ b/modules/sdk-coin-apt/src/lib/constants.ts @@ -8,3 +8,7 @@ export const SECONDS_PER_WEEK = 7 * 24 * 60 * 60; // Days * Hours * Minutes * Se export const APTOS_ACCOUNT_MODULE = 'aptos_account'; export const FUNGIBLE_ASSET_MODULE = 'primary_fungible_store'; + +export const FUNGIBLE_ASSET = '0x1::primary_fungible_store::transfer'; + +export const FUNGIBLE_ASSET_TYPE_ARGS = '0x1::fungible_asset::Metadata'; diff --git a/modules/sdk-coin-apt/src/lib/iface.ts b/modules/sdk-coin-apt/src/lib/iface.ts index f653b59439..78ad1305c8 100644 --- a/modules/sdk-coin-apt/src/lib/iface.ts +++ b/modules/sdk-coin-apt/src/lib/iface.ts @@ -22,5 +22,5 @@ export interface TxData { gasUsed: number; expirationTime: number; feePayer: string; - assetId?: string; + assetId: string; } diff --git a/modules/sdk-coin-apt/src/lib/transaction/fungibleAssetTransaction.ts b/modules/sdk-coin-apt/src/lib/transaction/fungibleAssetTransaction.ts index a57f9ffb2f..8bc2233dcd 100644 --- a/modules/sdk-coin-apt/src/lib/transaction/fungibleAssetTransaction.ts +++ b/modules/sdk-coin-apt/src/lib/transaction/fungibleAssetTransaction.ts @@ -13,16 +13,20 @@ import { } from '@aptos-labs/ts-sdk'; import { InvalidTransactionError, TransactionRecipient, TransactionType } from '@bitgo/sdk-core'; import { BaseCoin as CoinConfig, NetworkType } from '@bitgo/statics'; +import { FUNGIBLE_ASSET, FUNGIBLE_ASSET_TYPE_ARGS } from '../constants'; export class FungibleAssetTransaction extends Transaction { constructor(coinConfig: Readonly) { super(coinConfig); this._type = TransactionType.SendToken; - this._assetId = AccountAddress.ZERO.toString(); } protected parseTransactionPayload(payload: TransactionPayload): void { - if (!(payload instanceof TransactionPayloadEntryFunction) || payload.entryFunction.args.length !== 3) { + if ( + !(payload instanceof TransactionPayloadEntryFunction) || + payload.entryFunction.args.length !== 3 || + FUNGIBLE_ASSET_TYPE_ARGS !== payload.entryFunction.type_args[0].toString() + ) { throw new InvalidTransactionError('Invalid transaction payload'); } const entryFunction = payload.entryFunction; @@ -50,8 +54,8 @@ export class FungibleAssetTransaction extends Transaction { const simpleTxn = await aptos.transaction.build.simple({ sender: senderAddress, data: { - function: '0x1::primary_fungible_store::transfer', - typeArguments: ['0x1::fungible_asset::Metadata'], + function: FUNGIBLE_ASSET, + typeArguments: [FUNGIBLE_ASSET_TYPE_ARGS], functionArguments: [fungibleTokenAddress, recipientAddress, this.recipient.amount], abi: faTransferAbi, }, diff --git a/modules/sdk-coin-apt/src/lib/transaction/transaction.ts b/modules/sdk-coin-apt/src/lib/transaction/transaction.ts index acc9d4980d..8e1b37809f 100644 --- a/modules/sdk-coin-apt/src/lib/transaction/transaction.ts +++ b/modules/sdk-coin-apt/src/lib/transaction/transaction.ts @@ -56,6 +56,7 @@ export abstract class Transaction extends BaseTransaction { this._expirationTime = Math.floor(Date.now() / 1e3) + SECONDS_PER_WEEK; this._sequenceNumber = 0; this._sender = AccountAddress.ZERO.toString(); + this._assetId = AccountAddress.ZERO.toString(); this._senderSignature = { publicKey: { pub: Hex.fromHexInput(Transaction.EMPTY_PUBLIC_KEY).toString(), diff --git a/modules/sdk-coin-apt/src/lib/transactionBuilder/fungibleAssetTransactionBuilder.ts b/modules/sdk-coin-apt/src/lib/transactionBuilder/fungibleAssetTransactionBuilder.ts index 4c60bdef53..9f496c357a 100644 --- a/modules/sdk-coin-apt/src/lib/transactionBuilder/fungibleAssetTransactionBuilder.ts +++ b/modules/sdk-coin-apt/src/lib/transactionBuilder/fungibleAssetTransactionBuilder.ts @@ -2,10 +2,10 @@ 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 BigNumber from 'bignumber.js'; import utils from '../utils'; import { TransactionPayload, TransactionPayloadEntryFunction } from '@aptos-labs/ts-sdk'; +import { FUNGIBLE_ASSET_TYPE_ARGS } from '../constants'; export class FungibleAssetTransactionBuilder extends TransactionBuilder { constructor(_coinConfig: Readonly) { @@ -17,11 +17,6 @@ export class FungibleAssetTransactionBuilder extends TransactionBuilder { return TransactionType.SendToken; } - /** @inheritdoc */ - initBuilder(tx: FungibleAssetTransaction): void { - this._transaction = tx; - } - /** @inheritdoc */ validateTransaction(transaction?: FungibleAssetTransaction): void { if (!transaction) { @@ -35,7 +30,11 @@ export class FungibleAssetTransactionBuilder extends TransactionBuilder { protected isValidTransactionPayload(payload: TransactionPayload) { try { - if (!(payload instanceof TransactionPayloadEntryFunction) || payload.entryFunction.args.length !== 3) { + if ( + !(payload instanceof TransactionPayloadEntryFunction) || + payload.entryFunction.args.length !== 3 || + FUNGIBLE_ASSET_TYPE_ARGS !== payload.entryFunction.type_args[0].toString() + ) { console.error('invalid transaction payload'); return false; } @@ -54,18 +53,4 @@ export class FungibleAssetTransactionBuilder extends TransactionBuilder { return false; } } - - /** @inheritdoc */ - protected fromImplementation(rawTransaction: string): Transaction { - this.transaction.fromRawTransaction(rawTransaction); - this.transaction.transactionType = this.transactionType; - return this.transaction; - } - - /** @inheritdoc */ - protected async buildImplementation(): Promise { - this.transaction.transactionType = this.transactionType; - await this.transaction.build(); - return this.transaction; - } } diff --git a/modules/sdk-coin-apt/src/lib/transactionBuilder/transactionBuilder.ts b/modules/sdk-coin-apt/src/lib/transactionBuilder/transactionBuilder.ts index 10ebbd0a40..e960d6c3e5 100644 --- a/modules/sdk-coin-apt/src/lib/transactionBuilder/transactionBuilder.ts +++ b/modules/sdk-coin-apt/src/lib/transactionBuilder/transactionBuilder.ts @@ -33,7 +33,9 @@ export abstract class TransactionBuilder extends BaseTransactionBuilder { * * @param {Transaction} tx the transaction data */ - abstract initBuilder(tx: Transaction): void; + initBuilder(tx: Transaction): void { + this._transaction = tx; + } /** @inheritdoc */ protected get transaction(): Transaction { @@ -45,8 +47,6 @@ export abstract class TransactionBuilder extends BaseTransactionBuilder { this._transaction = transaction; } - abstract validateTransaction(transaction?: Transaction): void; - /** * Sets the sender of this transaction. * @@ -104,6 +104,20 @@ export abstract class TransactionBuilder extends BaseTransactionBuilder { this.transaction.addFeePayerSignature(publicKey, signature); } + /** @inheritdoc */ + protected fromImplementation(rawTransaction: string): Transaction { + this.transaction.fromRawTransaction(rawTransaction); + this.transaction.transactionType = this.transactionType; + return this.transaction; + } + + /** @inheritdoc */ + protected async buildImplementation(): Promise { + this.transaction.transactionType = this.transactionType; + await this.transaction.build(); + return this.transaction; + } + // region Validators /** @inheritdoc */ validateAddress(address: BaseAddress, addressFormat?: string): void { diff --git a/modules/sdk-coin-apt/src/lib/transactionBuilder/transferBuilder.ts b/modules/sdk-coin-apt/src/lib/transactionBuilder/transferBuilder.ts index fd1d70de1e..b0dc090c6c 100644 --- a/modules/sdk-coin-apt/src/lib/transactionBuilder/transferBuilder.ts +++ b/modules/sdk-coin-apt/src/lib/transactionBuilder/transferBuilder.ts @@ -2,7 +2,6 @@ import { TransactionBuilder } from './transactionBuilder'; import { BaseCoin as CoinConfig } from '@bitgo/statics'; import { TransactionType } from '@bitgo/sdk-core'; import { TransferTransaction } from '../transaction/transferTransaction'; -import { Transaction } from '../transaction/transaction'; import BigNumber from 'bignumber.js'; import utils from '../utils'; import { TransactionPayload, TransactionPayloadEntryFunction } from '@aptos-labs/ts-sdk'; @@ -17,15 +16,6 @@ export class TransferBuilder extends TransactionBuilder { return TransactionType.Send; } - /** - * Initialize the transaction builder fields using the decoded transaction data - * - * @param {Transaction} tx the transaction data - */ - initBuilder(tx: TransferTransaction): void { - this._transaction = tx; - } - /** @inheritdoc */ validateTransaction(transaction?: TransferTransaction): void { if (!transaction) { @@ -52,18 +42,4 @@ export class TransferBuilder extends TransactionBuilder { return false; } } - - /** @inheritdoc */ - protected fromImplementation(rawTransaction: string): Transaction { - this.transaction.fromRawTransaction(rawTransaction); - this.transaction.transactionType = this.transactionType; - return this.transaction; - } - - /** @inheritdoc */ - protected async buildImplementation(): Promise { - this.transaction.transactionType = this.transactionType; - await this.transaction.build(); - return this.transaction; - } } diff --git a/modules/sdk-coin-apt/test/unit/transactionBuilder/fungibleTokenTransferBuilder.ts b/modules/sdk-coin-apt/test/unit/transactionBuilder/fungibleTokenTransferBuilder.ts index 2656c30b92..2b40cb9c3b 100644 --- a/modules/sdk-coin-apt/test/unit/transactionBuilder/fungibleTokenTransferBuilder.ts +++ b/modules/sdk-coin-apt/test/unit/transactionBuilder/fungibleTokenTransferBuilder.ts @@ -55,8 +55,6 @@ describe('Apt Token Transfer Builder', () => { 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,