PHP WebShell

Текущая директория: /opt/BitGoJS/modules/sdk-core/src/bitgo/staking

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

/**
 * @prettier
 */
import { BitGoBase } from '../bitgoBase';
import { IWallet, PrebuildTransactionResult } from '../wallet';
import {
  BaseGoStakeOptions,
  FrontTransferSendRequest,
  GoStakeFinalizeOptions,
  GoStakeOptions,
  GoStakingRequest,
  IGoStakingWallet,
  UnsignedGoStakingRequest,
} from './iGoStakingWallet';
import assert from 'assert';

export class GoStakingWallet implements IGoStakingWallet {
  private readonly bitgo: BitGoBase;

  public wallet: IWallet;

  constructor(wallet: IWallet) {
    this.wallet = wallet;
    this.bitgo = wallet.bitgo;
  }

  get accountId(): string {
    return this.wallet.id();
  }

  async stake(options: GoStakeOptions): Promise<GoStakingRequest> {
    // call preview
    const preview = await this.previewStake({
      amount: options.amount,
      clientId: options.clientId,
    } as BaseGoStakeOptions);

    // sign the transaction
    const halfSignedTransaction = (await this.wallet.prebuildAndSignTransaction({
      walletPassphrase: options.walletPassphrase,
      prebuildTx: {
        payload: preview.payload,
      } as PrebuildTransactionResult,
    })) as FrontTransferSendRequest;

    // call finalize to submit the go staking request to go staking service
    assert(halfSignedTransaction.halfSigned?.payload, 'missing payload in half signed transaction');
    const finalOptions: GoStakeFinalizeOptions = {
      amount: options.amount,
      clientId: options.clientId,
      frontTransferSendRequest: {
        halfSigned: {
          payload: halfSignedTransaction.halfSigned.payload,
        },
      },
    };
    return (await this.finalizeStake(finalOptions)) as GoStakingRequest;
  }

  /**
   * Unstake request
   * @param options
   */
  async unstake(options: BaseGoStakeOptions): Promise<GoStakingRequest> {
    return (await this.createGoStakingRequest(options, 'finalize', 'UNSTAKE')) as GoStakingRequest;
  }

  /**
   * Preview staking request
   * @param options
   */
  private async previewStake(options: BaseGoStakeOptions): Promise<UnsignedGoStakingRequest> {
    return (await this.createGoStakingRequest(options, 'preview', 'STAKE')) as UnsignedGoStakingRequest;
  }

  /**
   * Finalize staking request
   * will prepare the payload and sign the transaction
   * and submit it to the go-staking-service
   * @param options
   */
  private async finalizeStake(options: GoStakeFinalizeOptions): Promise<GoStakingRequest> {
    return (await this.createGoStakingRequest(options, 'finalize', 'STAKE')) as GoStakingRequest;
  }

  /**
   * Get go staking request
   * @param goStakingRequestId
   */
  async getGoStakingRequest(goStakingRequestId: string): Promise<GoStakingRequest> {
    return await this.bitgo.get(this.bitgo.microservicesUrl(this.getGoStakingRequestURL(goStakingRequestId))).result();
  }

  private async createGoStakingRequest(
    options: BaseGoStakeOptions | GoStakeFinalizeOptions,
    path: 'preview' | 'finalize',
    type: string
  ): Promise<GoStakingRequest | UnsignedGoStakingRequest> {
    return await this.bitgo
      .post(this.bitgo.microservicesUrl(`${this.goStakingRequestBaseURL()}/${path}`))
      .send({
        ...options,
        type: type,
      })
      .result();
  }

  private goStakingBaseURL() {
    return `/api/go-staking/v1`;
  }

  private goStakingRequestBaseURL() {
    return `${this.goStakingBaseURL()}/${this.wallet.baseCoin.getChain()}/accounts/${this.accountId}/requests`;
  }

  private getGoStakingRequestURL(stakingRequestId: string): string {
    return `${this.goStakingRequestBaseURL()}/${stakingRequestId}`;
  }
}

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


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