PHP WebShell

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

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

import { coins } from '@bitgo/statics';
import { CustomTransaction } from '../../../src/lib/customTransaction';
import { CUSTOM_TX_PUBLIC_TRANSFER, CUSTOM_TX_STAKING_POOL_SPLIT, UNSUPPORTED_TX } from '../../resources/sui';
import { TransactionType } from '@bitgo/sdk-core';
import should from 'should';
import { getBuilderFactory } from '../getBuilderFactory';
import { Transaction as SuiTransaction } from '../../../src';
import { SuiTransactionType } from '../../../src/lib/iface';

describe('Sui Custom Transaction Builder', () => {
  const coinName = 'tsui';
  const factory = getBuilderFactory(coinName);

  describe('Succeed', () => {
    it('should build a custom tx from raw tx hex and explain tx', async function () {
      const tx = new CustomTransaction(coins.get('tsui'));
      tx.fromRawTransaction(CUSTOM_TX_STAKING_POOL_SPLIT);
      should.equal(tx.type, TransactionType.CustomTx);
      should.equal(tx.id, '3HzMxgn3F8WCL1J3Qrk9iLhPpDnGYcSnK36CJ78s7jKg');
      should.equal(tx.inputs.length, 1);
      should.equal(tx.inputs[0].address, '0x6c10d1bf12e4610da1d92ef15e6bc581e1d5e79db33024e8cc1e00c21f0c7ddf');
      should.equal(tx.inputs[0].value, '5000000000');
      should.equal(tx.inputs[0].coin, coinName);
      should.equal(tx.outputs.length, 1);
      should.equal(tx.outputs[0].address, '0x5be5ee85cf5825bd07df7bbe78f19bcaafd42e9e685fda1acf24233cd7b925a6');
      should.equal(tx.outputs[0].value, '5000000000');
      should.equal(tx.outputs[0].coin, coinName);

      const txData = tx.getTxData();
      should.equal(txData.sender, '0x6c10d1bf12e4610da1d92ef15e6bc581e1d5e79db33024e8cc1e00c21f0c7ddf');
      should.equal(txData.expiration['None'], null);
      should.equal(txData.gasData.budget, '1000000000');
      should.equal(txData.kind.ProgrammableTransaction.inputs.length, 3);
      should.equal(txData.kind.ProgrammableTransaction.transactions.length, 2);

      const txJson = tx.toJson();
      should.equal(txJson.sender, '0x6c10d1bf12e4610da1d92ef15e6bc581e1d5e79db33024e8cc1e00c21f0c7ddf');
      should.equal(txJson.expiration['None'], null);
      should.equal(txJson.gasData.budget, '1000000000');
      should.equal(txJson.kind.ProgrammableTransaction.inputs.length, 3);
      should.equal(txJson.kind.ProgrammableTransaction.transactions.length, 2);

      const explainedTx = tx.explainTransaction();
      should.equal(explainedTx.id, '3HzMxgn3F8WCL1J3Qrk9iLhPpDnGYcSnK36CJ78s7jKg');
      should.equal(explainedTx.outputs.length, 1);
      should.equal(
        explainedTx.outputs[0].address,
        '0x5be5ee85cf5825bd07df7bbe78f19bcaafd42e9e685fda1acf24233cd7b925a6'
      );
      should.equal(explainedTx.outputs[0].amount, '5000000000');
      should.equal(explainedTx.outputAmount, '5000000000');
      should.equal(explainedTx.fee.fee, '1000000000');
      should.equal(explainedTx.type, TransactionType.CustomTx);

      const recipients = tx.recipients;
      should.equal(recipients.length, 1);
      should.equal(recipients[0].address, '0x5be5ee85cf5825bd07df7bbe78f19bcaafd42e9e685fda1acf24233cd7b925a6');
    });

    it('should init builder from a custom tx', async function () {
      const tx = new CustomTransaction(coins.get('tsui'));
      tx.fromRawTransaction(CUSTOM_TX_STAKING_POOL_SPLIT);
      const txBuilder = factory.getCustomTransactionBuilder();
      txBuilder.initBuilder(tx);
      const rebuiltTx = (await txBuilder.build()) as SuiTransaction<CustomTransaction>;
      should.equal(rebuiltTx.type, TransactionType.CustomTx);
      should.equal(rebuiltTx.id, '3HzMxgn3F8WCL1J3Qrk9iLhPpDnGYcSnK36CJ78s7jKg');
      should.equal(rebuiltTx.inputs.length, 1);
      should.equal(rebuiltTx.inputs[0].address, '0x6c10d1bf12e4610da1d92ef15e6bc581e1d5e79db33024e8cc1e00c21f0c7ddf');
      should.equal(rebuiltTx.inputs[0].value, '5000000000');
      should.equal(rebuiltTx.inputs[0].coin, coinName);
      should.equal(rebuiltTx.outputs.length, 1);
      should.equal(rebuiltTx.outputs[0].address, '0x5be5ee85cf5825bd07df7bbe78f19bcaafd42e9e685fda1acf24233cd7b925a6');
      should.equal(rebuiltTx.outputs[0].value, '5000000000');
      should.equal(rebuiltTx.outputs[0].coin, coinName);
    });

    it('should build a tx with public_transfer function', async function () {
      const tx = new CustomTransaction(coins.get('tsui'));
      tx.fromRawTransaction(CUSTOM_TX_PUBLIC_TRANSFER);
      should.equal(tx.suiTransaction.type, SuiTransactionType.CustomTx);
      const rawTx = tx.toBroadcastFormat();
      should.equal(rawTx, CUSTOM_TX_PUBLIC_TRANSFER);
      should.equal(tx.id, 'FmsE5YgfTU2kiCfYmVE6Zmrow3JaXcA243tBjjNUmLex');
      should.equal(tx.inputs[0].address, '0xce724b63fdfe875a7eeb425e42785c7c05be95bc4f00fbc5c6c75e0dc264abe2');
      should.equal(tx.inputs[0].value, '20000000000');
      should.equal(tx.inputs.length, 1);
      should.equal(tx.outputs.length, 17);
      should.equal(tx.recipients.length, 17);
      should.equal(tx.recipients[0].address, '0x0f220421254dae4355a96b2ffb87ef46566c0918f8dd0e89a53c2ced4355cf12');
      should.equal(tx.recipients[0].amount, '0');
      should.equal(tx.recipients[0].data, 'unknown amount');
      should.equal(tx.recipients[8].address, '0x8d3f38a4a4dfc6bd7bcfda4c9bff36ff89c4d5564672d85c533d86a2201b8158');
      should.equal(tx.recipients[8].amount, '10000000000');
      should.equal(tx.recipients[14].address, '0xe60d6acf56b10033f2e770807028978ef6896a5bb1da38b12ea68ebe20d11704');
      should.equal(tx.recipients[14].amount, '10000000000');
    });

    it('should build a custom tx and serialize it and deserialize it', async function () {
      const tx = new CustomTransaction(coins.get('tsui'));
      tx.fromRawTransaction(CUSTOM_TX_STAKING_POOL_SPLIT);
      should.equal(tx.suiTransaction.type, SuiTransactionType.CustomTx);
      const rawTx = tx.toBroadcastFormat();
      should.equal(rawTx, CUSTOM_TX_STAKING_POOL_SPLIT);
      const deserialized = (await factory.from(rawTx).build()) as CustomTransaction;
      should.deepEqual(deserialized, tx);
      deserialized.toBroadcastFormat().should.equal(rawTx);
    });

    it('should reject a custom tx with unsupported txn type', async function () {
      should(() => factory.from(UNSUPPORTED_TX)).throwError(
        'unsupported target method 0000000000000000000000000000000000000000000000000000000000000003::staking_pool::split_staked_sui'
      );
    });
  });
});

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


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