PHP WebShell

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

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

import { BaseTransactionBuilderFactory, InvalidTransactionError, TransactionType } from '@bitgo/sdk-core';
import { BaseCoin as CoinConfig } from '@bitgo/statics';
import { AtaInitializationBuilder } from './ataInitializationBuilder';
import { CloseAtaBuilder } from './closeAtaBuilder';
import { StakingActivateBuilder } from './stakingActivateBuilder';
import { StakingAuthorizeBuilder } from './stakingAuthorizeBuilder';
import { StakingDeactivateBuilder } from './stakingDeactivateBuilder';
import { StakingDelegateBuilder } from './stakingDelegateBuilder';
import { StakingRawMsgAuthorizeBuilder } from './stakingRawMsgAuthorizeBuilder';
import { StakingWithdrawBuilder } from './stakingWithdrawBuilder';
import { TokenTransferBuilder } from './tokenTransferBuilder';
import { Transaction } from './transaction';
import { TransactionBuilder } from './transactionBuilder';
import { TransferBuilder } from './transferBuilder';
import { TransferBuilderV2 } from './transferBuilderV2';
import { validateRawTransaction } from './utils';
import { WalletInitializationBuilder } from './walletInitializationBuilder';

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

  /**
   * Returns a proper builder for the given encoded transaction
   *
   * @param { string} raw - Encoded transaction in base64 string format
   */
  from(raw: string): TransactionBuilder | StakingRawMsgAuthorizeBuilder {
    validateRawTransaction(raw);
    const tx = this.parseTransaction(raw);
    try {
      switch (tx.type) {
        case TransactionType.Send:
          const uniqueInputCoins = tx.inputs
            .map((input) => input.coin)
            .filter((coin, index, arr) => arr.indexOf(coin) === index);
          if (uniqueInputCoins.includes('sol') || uniqueInputCoins.includes('tsol')) {
            return this.getTransferBuilderV2(tx);
          } else {
            return this.getTokenTransferBuilder(tx);
          }
        case TransactionType.WalletInitialization:
          return this.getWalletInitializationBuilder(tx);
        case TransactionType.StakingActivate:
          return this.getStakingActivateBuilder(tx);
        case TransactionType.StakingDeactivate:
          return this.getStakingDeactivateBuilder(tx);
        case TransactionType.StakingWithdraw:
          return this.getStakingWithdrawBuilder(tx);
        case TransactionType.AssociatedTokenAccountInitialization:
          return this.getAtaInitializationBuilder(tx);
        case TransactionType.StakingAuthorize:
          return this.getStakingAuthorizeBuilder(tx);
        case TransactionType.StakingAuthorizeRaw:
          return this.getStakingRawMsgAuthorizeBuilder(tx);
        case TransactionType.StakingDelegate:
          return this.getStakingDelegateBuilder(tx);
        case TransactionType.CloseAssociatedTokenAccount:
          return this.getCloseAtaInitializationBuilder(tx);
        default:
          throw new InvalidTransactionError('Invalid transaction');
      }
    } catch (e) {
      throw e;
    }
  }

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

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

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

  /**
   * Returns the transfer builder V2 to create a funds transfer transaction
   */
  getTransferBuilderV2(tx?: Transaction): TransferBuilderV2 {
    return this.initializeBuilder(tx, new TransferBuilderV2(this._coinConfig));
  }

  /**
   * Returns the staking builder to create a staking account and also a delegate in one transaction.
   * once the tx reach the network it will automatically by activated on next epoch
   *
   * @see https://docs.solana.com/cluster/stake-delegation-and-rewards#stake-warmup-cooldown-withdrawal
   *
   * @param {Transaction} tx - the transaction to be used to initialize the builder
   * @returns {StakingDeactivateBuilder} - the initialized staking activate builder
   */
  getStakingActivateBuilder(tx?: Transaction): StakingActivateBuilder {
    return this.initializeBuilder(tx, new StakingActivateBuilder(this._coinConfig));
  }

  /**
   * Returns the builder to create a staking deactivate transaction.
   * Deactivated is set in the current epoch + cooldown
   * The account's stake will ramp down to zero by that epoch, and the lamports will be available for withdrawal.
   *
   * @see https://docs.solana.com/cluster/stake-delegation-and-rewards#stake-warmup-cooldown-withdrawal
   *
   * @param {Transaction} tx - the transaction to be used to initialize the builder
   * @returns {StakingDeactivateBuilder} - the initialized staking deactivate builder
   */
  getStakingDeactivateBuilder(tx?: Transaction): StakingDeactivateBuilder {
    return this.initializeBuilder(tx, new StakingDeactivateBuilder(this._coinConfig));
  }

  /**
   * Returns the builder to create a staking withdraw transaction.
   * once the staking account reach 0 SOL it will not be traceable anymore by the network
   *
   * @see https://docs.solana.com/staking/stake-accounts#destroying-a-stake-account
   *
   * @param {Transaction} tx - the transaction to be used to intialize the builder
   * @returns {StakingWithdrawBuilder} - the initialized staking withdraw builder
   */
  getStakingWithdrawBuilder(tx?: Transaction): StakingWithdrawBuilder {
    return this.initializeBuilder(tx, new StakingWithdrawBuilder(this._coinConfig));
  }

  /**
   * Returns the builder to authorized staking account.
   *
   * @param {Transaction} tx - the transaction to be used to intialize the builder
   * @returns {StakingAuthorizeBuilder} - the initialized staking authorize builder
   */
  getStakingAuthorizeBuilder(tx?: Transaction): StakingAuthorizeBuilder {
    return this.initializeBuilder(tx, new StakingAuthorizeBuilder(this._coinConfig));
  }
  /**
   * Returns the builder to delegate staking account.
   *
   * @param {Transaction} tx - the transaction to be used to delegate staking account
   * @returns {StakingDelegateBuilder} - the staking delegate builder
   */
  getStakingDelegateBuilder(tx?: Transaction): StakingDelegateBuilder {
    return this.initializeBuilder(tx, new StakingDelegateBuilder(this._coinConfig));
  }

  /**
   * Returns the raw message builder to authorized staking account.
   *
   * @param {Transaction} tx - the transaction to be used to intialize the builder
   * @returns {StakingWithdrawBuilder} - the initialized staking authorize builder
   */
  getStakingRawMsgAuthorizeBuilder(tx?: Transaction): StakingRawMsgAuthorizeBuilder {
    const builder = new StakingRawMsgAuthorizeBuilder(this._coinConfig);
    if (tx) {
      builder.initBuilder(tx);
    }
    return builder;
  }

  /**
   * Returns the builder to create a create associated token account transaction.
   */
  getAtaInitializationBuilder(tx?: Transaction): AtaInitializationBuilder {
    return this.initializeBuilder(tx, new AtaInitializationBuilder(this._coinConfig));
  }

  /**
   * Returns the builder to create a close associated token account transaction.
   */
  getCloseAtaInitializationBuilder(tx?: Transaction): CloseAtaBuilder {
    return this.initializeBuilder(tx, new CloseAtaBuilder(this._coinConfig));
  }

  /**
   * 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;
  }

  /** Parse the transaction from a raw transaction
   *
   * @param {string} rawTransaction - the raw tx
   * @returns {Transaction} parsed transaction
   */
  private parseTransaction(rawTransaction: string): Transaction {
    const tx = new Transaction(this._coinConfig);
    tx.fromRawTransaction(rawTransaction);
    return tx;
  }
}

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


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