PHP WebShell

Текущая директория: /opt/BitGoJS/modules/sdk-coin-sui/test/local_fullnode

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

import util from 'util';
import axios, { AxiosError } from 'axios';
import buildDebug from 'debug';
import { SuiObjectData, SuiTransactionBlockResponse } from '../../src/lib/mystenlab/types';
import { DelegatedStake } from '../../src/lib/mystenlab/types/validator';

const debug = buildDebug('RpcClient');

function elideResponse(method: string): boolean {
  return method === 'sui_getProtocolConfig';
}

function unwrapResult<A>(method: string, v: { result: A } | { error: { code: number; message: string } }): A {
  if ('error' in v) {
    debug('< %s ERROR', method, v.error);
    throw new Error(JSON.stringify(v.error));
  }
  if (elideResponse(method)) {
    debug('< %s ...', method);
  } else {
    debug('< %s', method, util.inspect(v.result, { depth: 10 }));
  }
  return v.result;
}

export class RpcError extends Error {
  constructor(public rpcError: { code: number; message: string }) {
    super(`RPC error: ${rpcError.message} (code=${rpcError.code})`);
  }

  static isRpcErrorWithCode(e: Error, code: number): boolean {
    return e instanceof RpcError && e.rpcError.code === code;
  }
}

export type Coin = {
  coinType: string;
  coinObjectId: string;
  version: string;
  digest: string;
  balance: string;
  previousTransaction: string;
};

/** Wrapper around https://docs.sui.io/sui-jsonrpc */
export class RpcClient {
  // Running counter, increments every request
  id = 0;

  constructor(public url: string) {}

  static async createCheckedConnection(url: string): Promise<RpcClient> {
    const rpcClient = new RpcClient(url);
    const { protocolVersion } = await rpcClient.exec<{ protocolVersion: string }>('sui_getProtocolConfig');
    const chainId = await rpcClient.exec('sui_getChainIdentifier');
    debug('Connected to', url, 'protocolVersion', protocolVersion, 'chainId', chainId);
    return rpcClient;
  }

  async exec<T>(method: string, ...params: unknown[]): Promise<T> {
    params = params.filter((v) => v !== undefined);
    try {
      debug('>', this.url, method, params);
      const response = await axios.post(this.url, {
        jsonrpc: '2.0',
        method,
        params,
        id: `${this.id++}`,
      });
      return unwrapResult(method, response.data);
    } catch (e) {
      if (e.isAxiosError && e.response) {
        e = e as AxiosError;
        debug('< %s ERROR', method, e.response.statusText, util.inspect(e.response.data, { depth: 10 }));
        e = e as AxiosError;
        const { error = {} } = e.response.data;
        throw new RpcError(error);
      }

      throw e;
    }
  }

  /**
   * https://docs.sui.io/sui-jsonrpc#suix_getCoins
   */
  async getCoins(
    owner: string,
    coinType?: string,
    cursor?: string,
    limit?: number
  ): Promise<{
    data: Coin[];
    nextCursor?: string;
    hasNextPage?: boolean;
  }> {
    return this.exec('suix_getCoins', owner, coinType, cursor, limit);
  }

  async executeTransactionBlock(
    tx_bytes: string,
    signatures: string[],
    options?: unknown,
    request_type?: unknown
  ): Promise<SuiTransactionBlockResponse> {
    return this.exec(
      'sui_executeTransactionBlock',
      tx_bytes,
      signatures,
      {
        showInput: true,
        showRawInput: true,
        showEffects: true,
        showEvents: true,
        showObjectChanges: true,
        showBalanceChanges: true,
      },
      request_type
    );
  }

  /**
   * https://docs.sui.io/sui-jsonrpc#suix_getValidatorsApy
   * APY = Annual Percentage Yield
   */
  async getValidatorsApy(): Promise<{
    apys: { address: string; apy: string }[];
    epoch: string;
  }> {
    return this.exec('suix_getValidatorsApy');
  }

  /**
   * https://docs.sui.io/sui-jsonrpc#suix_getStakes
   */
  async getStakes(owner: string): Promise<DelegatedStake[]> {
    return this.exec('suix_getStakes', owner);
  }

  /**
   * https://docs.sui.io/sui-jsonrpc#sui_getObject
   */
  async getObject(object_id: string): Promise<{ data: SuiObjectData }> {
    return this.exec('sui_getObject', object_id, { showData: true });
  }
}

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


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