PHP WebShell

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

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

import { Transaction } from './transaction';
import {
  AccountAddress,
  EntryFunctionABI,
  InputGenerateTransactionPayloadData,
  parseTypeTag,
  TransactionPayload,
  TransactionPayloadEntryFunction,
  TypeTagAddress,
  TypeTagU64,
  TypeTagVector,
} from '@aptos-labs/ts-sdk';
import { InvalidTransactionError, TransactionType } from '@bitgo/sdk-core';
import { BaseCoin as CoinConfig } from '@bitgo/statics';
import {
  FUNGIBLE_ASSET_TYPE_ARGUMENT,
  FUNGIBLE_ASSET_TRANSFER_FUNCTION,
  FUNGIBLE_ASSET_BATCH_TRANSFER_FUNCTION,
  FUNBIGLE_ASSET_TYPE_TAG,
  BATCH_FUNGIBLE_ASSET_TYPE_TAG,
} from '../constants';
import utils from '../utils';

export class FungibleAssetTransfer extends Transaction {
  constructor(coinConfig: Readonly<CoinConfig>) {
    super(coinConfig);
    this._type = TransactionType.SendToken;
  }

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

  protected getTransactionPayloadData(): InputGenerateTransactionPayloadData {
    const fungibleTokenAddress = this._assetId;

    if (this.recipients.length > 1) {
      return {
        function: FUNGIBLE_ASSET_BATCH_TRANSFER_FUNCTION,
        typeArguments: [],
        functionArguments: [
          fungibleTokenAddress,
          this.recipients.map((recipient) => AccountAddress.fromString(recipient.address)),
          this.recipients.map((recipient) => recipient.amount),
        ],
        abi: this.batchFaTransferAbi,
      };
    }
    return {
      function: FUNGIBLE_ASSET_TRANSFER_FUNCTION,
      typeArguments: [FUNGIBLE_ASSET_TYPE_ARGUMENT],
      functionArguments: [
        fungibleTokenAddress,
        AccountAddress.fromString(this.recipients[0].address),
        this.recipients[0].amount,
      ],
      abi: this.faTransferAbi,
    };
  }

  private isValidPayload(payload: TransactionPayload) {
    return (
      payload instanceof TransactionPayloadEntryFunction &&
      payload.entryFunction.args.length === 3 &&
      (payload.entryFunction.type_args.length === 0 ||
        (payload.entryFunction.type_args.length === 1 &&
          FUNGIBLE_ASSET_TYPE_ARGUMENT === payload.entryFunction.type_args[0].toString()))
    );
  }
  private faTransferAbi: EntryFunctionABI = {
    typeParameters: [{ constraints: [] }],
    parameters: [parseTypeTag(FUNBIGLE_ASSET_TYPE_TAG), new TypeTagAddress(), new TypeTagU64()],
  };

  private batchFaTransferAbi: EntryFunctionABI = {
    typeParameters: [],
    parameters: [
      parseTypeTag(BATCH_FUNGIBLE_ASSET_TYPE_TAG),
      new TypeTagVector(new TypeTagAddress()),
      new TypeTagVector(new TypeTagU64()),
    ],
  };
}

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


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