PHP WebShell

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

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

import { BaseCoin as CoinConfig } from '@bitgo/statics';
import {
  BaseTransactionBuilderFactory,
  InvalidTransactionError,
  ParseTransactionError,
  TransactionType,
} from '@bitgo/sdk-core';
import { WalletInitializationBuilder } from './walletInitializationBuilder';
import { CoinTransferBuilder } from './coinTransferBuilder';
import { TransactionBuilder } from './transactionBuilder';
import { Transaction } from './transaction';
import { isTokenTransfer, isValidRawTransactionFormat } from './utils';
import { TokenAssociateBuilder } from './tokenAssociateBuilder';
import { TokenTransferBuilder } from './tokenTransferBuilder';

export class TransactionBuilderFactory extends BaseTransactionBuilderFactory {
  constructor(_coinConfig: Readonly<CoinConfig>) {
    super(_coinConfig);
  }

  /** @inheritdoc */
  getWalletInitializationBuilder(tx?: Transaction): WalletInitializationBuilder {
    return this.initializeBuilder(tx, new WalletInitializationBuilder(this._coinConfig));
  }

  /** @inheritDoc */
  getTransferBuilder(tx?: Transaction): CoinTransferBuilder {
    return this.initializeBuilder(tx, new CoinTransferBuilder(this._coinConfig));
  }

  /**
   * Returns a specific builder to create a funds token transfer transaction
   */
  getTokenTransferBuilder(tx?: Transaction): TokenTransferBuilder {
    return this.initializeBuilder(tx, new TokenTransferBuilder(this._coinConfig));
  }

  /**
   * Returns a builder to create a token association transaction
   */
  getTokenAssociateBuilder(tx?: Transaction): TokenAssociateBuilder {
    return this.initializeBuilder(tx, new TokenAssociateBuilder(this._coinConfig));
  }

  /** @inheritDoc */
  from(raw: Uint8Array | string): TransactionBuilder {
    this.validateRawTransaction(raw);
    const tx = this.parseRawTransaction(raw);
    switch (tx.type) {
      case TransactionType.Send:
        return isTokenTransfer(tx.txBody.cryptoTransfer!)
          ? this.getTokenTransferBuilder(tx)
          : this.getTransferBuilder(tx);
      case TransactionType.WalletInitialization:
        return this.getWalletInitializationBuilder(tx);
      case TransactionType.AssociatedTokenAccountInitialization:
        return this.getTokenAssociateBuilder(tx);
      default:
        throw new InvalidTransactionError('Invalid transaction ' + tx.txBody.data);
    }
  }

  /**
   * Initialize the builder with the given transaction
   *
   * @param {Transaction | undefined} tx - the transaction used to initialize the builder
   * @param {TransactionBuilder} builder - the builder to be initialized
   * @returns {TransactionBuilder} the builder initialized
   */
  private initializeBuilder<T extends TransactionBuilder>(tx: Transaction | undefined, builder: T): T {
    if (tx) {
      builder.initBuilder(tx);
    }
    return builder;
  }

  /**
   * Returns a transaction instance from the encoded value
   *
   * @param {Uint8Array | string} rawTransaction - encoded transaction
   * @returns {Transaction} the parsed transaction instance
   */
  private parseRawTransaction(rawTransaction: Uint8Array | string): Transaction {
    const tx = new Transaction(this._coinConfig);
    tx.fromRawTransaction(rawTransaction);
    return tx;
  }

  /**
   * Check the raw transaction has a valid format in the blockchain context, throw otherwise.
   *
   * @param {any} rawTransaction - Transaction in any format
   */
  private validateRawTransaction(rawTransaction: Uint8Array | string) {
    if (!isValidRawTransactionFormat(rawTransaction)) {
      throw new ParseTransactionError('Invalid raw transaction');
    }
  }
}

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


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