PHP WebShell

Текущая директория: /opt/BitGoJS/modules/sdk-coin-apt/src/lib/transaction

Просмотр файла: transferTransaction.ts

import { Transaction } from './transaction';
import { InvalidTransactionError, TransactionType } from '@bitgo/sdk-core';
import {
  AccountAddress,
  EntryFunctionABI,
  InputGenerateTransactionPayloadData,
  TransactionPayload,
  TransactionPayloadEntryFunction,
  TypeTagAddress,
  TypeTagU64,
  TypeTagVector,
} from '@aptos-labs/ts-sdk';

import { BaseCoin as CoinConfig } from '@bitgo/statics';
import { APTOS_COIN, COIN_BATCH_TRANSFER_FUNCTION, COIN_TRANSFER_FUNCTION } from '../constants';
import utils from '../utils';

export class TransferTransaction extends Transaction {
  constructor(coinConfig: Readonly<CoinConfig>) {
    super(coinConfig);
    this._type = TransactionType.Send;
    this._assetId = APTOS_COIN;
  }

  protected parseTransactionPayload(payload: TransactionPayload): void {
    if (!this.isValidPayload(payload)) {
      throw new InvalidTransactionError('Invalid transaction payload');
    }
    const entryFunction = (payload as TransactionPayloadEntryFunction).entryFunction;
    this._assetId = entryFunction.type_args[0].toString();
    const addressArg = entryFunction.args[0];
    const amountArg = entryFunction.args[1];
    this.recipients = utils.parseRecipients(addressArg, amountArg);
  }

  protected getTransactionPayloadData(): InputGenerateTransactionPayloadData {
    if (this.recipients.length > 1) {
      return {
        function: COIN_BATCH_TRANSFER_FUNCTION,
        typeArguments: [this.assetId],
        functionArguments: [
          this.recipients.map((recipient) => AccountAddress.fromString(recipient.address)),
          this.recipients.map((recipient) => recipient.amount),
        ],
        abi: this.batchCoinTransferAbi,
      };
    }
    return {
      function: COIN_TRANSFER_FUNCTION,
      typeArguments: [this.assetId],
      functionArguments: [AccountAddress.fromString(this.recipients[0].address), this.recipients[0].amount],
      abi: this.coinTransferAbi,
    };
  }

  private isValidPayload(payload: TransactionPayload): boolean {
    return (
      payload instanceof TransactionPayloadEntryFunction &&
      payload.entryFunction.args.length === 2 &&
      payload.entryFunction.type_args.length === 1 &&
      payload.entryFunction.type_args[0].toString().length > 0
    );
  }

  private coinTransferAbi: EntryFunctionABI = {
    typeParameters: [{ constraints: [] }],
    parameters: [new TypeTagAddress(), new TypeTagU64()],
  };

  private batchCoinTransferAbi: EntryFunctionABI = {
    typeParameters: [{ constraints: [] }],
    parameters: [new TypeTagVector(new TypeTagAddress()), new TypeTagVector(new TypeTagU64())],
  };
}

Выполнить команду


Для локальной разработки. Не используйте в интернете!