PHP WebShell

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

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

import BigNumber from 'bignumber.js';
import { BaseCoin as CoinConfig } from '@bitgo/statics';
import { BaseKey, BaseTransaction, InvalidTransactionError } from '@bitgo/sdk-core';
import { Transaction } from './transaction';
import { Address } from './address';
import { TransactionBuilder } from './transactionBuilder';
import { KeyPair } from './keyPair';
import { decodeTransaction } from './utils';
import { ContractType } from './enum';
import { ContractCallBuilder } from './contractCallBuilder';
import { TransactionReceipt } from './iface';
import { TokenTransferBuilder } from './tokenTransferBuilder';

/**
 * Wrapped Builder class
 * This builder is created to maintain compatibility with the current uses of account-lib
 * It has an instance of Transaction Builder or Contract Call Builder as required.
 */
export class WrappedBuilder extends TransactionBuilder {
  private _builder: TransactionBuilder;

  constructor(_coinConfig: Readonly<CoinConfig>) {
    super(_coinConfig);
    // defaults to old builder
    this._builder = new TransactionBuilder(_coinConfig);
  }

  /**
   * Returns a specific builder to create a contract call transaction
   *
   * @param {Transaction} [tx] The transaction to initialize builder
   * @returns {ContractCallBuilder} The specific contract call builder
   */
  getContractCallBuilder(tx?: TransactionReceipt | string): ContractCallBuilder {
    return this.initializeBuilder(tx, new ContractCallBuilder(this._coinConfig));
  }

  getTransactionBuilder(tx?: TransactionReceipt | string): TransactionBuilder {
    return this.initializeBuilder(tx, new TransactionBuilder(this._coinConfig));
  }

  getTokenTransferBuilder(tx?: TransactionReceipt | string): TokenTransferBuilder {
    return this.initializeBuilder(tx, new TokenTransferBuilder(this._coinConfig));
  }

  private initializeBuilder<T extends TransactionBuilder>(tx: TransactionReceipt | string | undefined, builder: T): T {
    if (tx) {
      builder.initBuilder(tx);
    }
    return builder;
  }

  /** @inheritdoc */
  extendValidTo(extensionMs: number) {
    this._builder.extendValidTo(extensionMs);
  }

  /** @inheritdoc */
  sign(key: BaseKey) {
    this._builder.sign(key);
  }

  /** @inheritdoc */
  async build(): Promise<BaseTransaction> {
    return this._builder.build();
  }

  /** @inheritdoc */
  from(raw: any) {
    this.validateRawTransaction(raw);
    const rawDataHex = this.getTxReceipt(raw);
    const decodedTx = decodeTransaction(rawDataHex);
    const contractType = decodedTx.contractType;
    switch (contractType) {
      case ContractType.Transfer:
      case ContractType.AccountPermissionUpdate:
        this._builder = this.getTransactionBuilder(raw);
        return this._builder;
      case ContractType.TriggerSmartContract:
        return this.getContractCallBuilder(raw);
      default:
        throw new InvalidTransactionError('Invalid transaction type: ' + contractType);
    }
  }

  /**
   * Get the raw data hex from a raw transaction
   *
   * @param {string | { [key: string]: any }} raw the raw transaction as a string or as an object
   * @returns {string} the raw data hex
   */
  private getTxReceipt(raw: string | { [key: string]: any }): string {
    return raw['raw_data_hex'] || this.getTxReceipt(JSON.parse(raw as string));
  }

  /** @inheritdoc */
  validateAddress(address: Address): void {
    this._builder.validateAddress(address);
  }

  /** @inheritdoc */
  validateKey(key: BaseKey): void {
    try {
      new KeyPair({ prv: key.key });
    } catch (err) {
      throw new Error('The provided key is not valid');
    }
  }
  /** @inheritdoc */
  validateRawTransaction(rawTransaction: any): void {
    this._builder.validateRawTransaction(rawTransaction);
  }

  /** @inheritdoc */
  validateTransaction(transaction: Transaction): void {
    this._builder.validateTransaction(transaction);
  }

  /** @inheritdoc */
  validateValue(value: BigNumber): void {
    this._builder.validateValue(value);
  }
}

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


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