PHP WebShell

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

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

import assert from 'assert';
import * as should from 'should';
import { getBuilderFactory } from '../getBuilderFactory';
import { KeyPair } from '../../../src';
import * as testData from '../../resources/hbar';
import { TransactionType } from '@bitgo/sdk-core';
import { WalletInitializationBuilder } from '../../../src/lib/walletInitializationBuilder';

describe('HBAR Wallet initialization', () => {
  const factory = getBuilderFactory('thbar');

  const initTxBuilder = () => {
    const txBuilder = factory.getWalletInitializationBuilder();
    txBuilder.fee({ fee: '1000000000' });
    txBuilder.owner(testData.OWNER1);
    txBuilder.owner(testData.OWNER2);
    txBuilder.owner(testData.OWNER3);
    txBuilder.source({ address: testData.OPERATOR.accountId });
    txBuilder.sign({ key: testData.OPERATOR.privateKey });
    return txBuilder;
  };

  describe('should build ', () => {
    it('a valid raw tx for wallet init', async () => {
      const builder = initTxBuilder();
      const tx = await builder.build();
      const raw = tx.toBroadcastFormat();
      const builder2 = factory.from(raw);
      const tx2 = await builder2.build();
      should.deepEqual(tx.signature.length, 1);
      should.deepEqual(tx.toJson(), tx2.toJson());
      should.deepEqual(raw, tx2.toBroadcastFormat());
      tx.type.should.equal(TransactionType.WalletInitialization);
      tx2.type.should.equal(TransactionType.WalletInitialization);
    });

    it('an init transaction', async () => {
      const txBuilder = initTxBuilder();
      const tx = await txBuilder.build();
      const txJson = tx.toJson();
      txJson.fee.should.equal(1000000000);
      should.deepEqual(tx.signature.length, 1);
      should.equal(txJson.from, testData.OPERATOR.accountId);
      tx.type.should.equal(TransactionType.WalletInitialization);
    });

    it('offline signing init transaction', async () => {
      const txBuilder1 = factory.getWalletInitializationBuilder();
      txBuilder1.startTime('1596110493.372646570');
      txBuilder1.fee({ fee: '1000000000' });
      txBuilder1.owner(testData.OWNER1);
      txBuilder1.owner(testData.OWNER2);
      txBuilder1.owner(testData.OWNER3);
      txBuilder1.source({ address: testData.OPERATOR.accountId });
      const tx1 = await txBuilder1.build();
      const factory2 = getBuilderFactory('thbar');
      const txBuilder2 = factory2.from(tx1.toBroadcastFormat());
      txBuilder2.sign({ key: testData.OPERATOR.privateKey });
      const tx2 = await txBuilder2.build();

      const factory3 = getBuilderFactory('thbar');
      const txBuilder3 = factory3.from(tx2.toBroadcastFormat());
      txBuilder3.sign({ key: testData.ACCOUNT_1.prvKeyWithPrefix });
      const tx3 = await txBuilder3.build();

      should.deepEqual(tx2.signature.length, 1);
      should.deepEqual(tx3.signature.length, 2);
      should.deepEqual(tx2.toBroadcastFormat(), testData.WALLET_BUILDER_SIGNED_TRANSACTION);
      should.deepEqual(tx3.toBroadcastFormat(), testData.WALLET_BUILDER_SIGNED_TWICE_TRANSACTION);
    });

    it('initialize from invalid tx adding new fields', async () => {
      const txBuilder = factory.from(testData.WALLET_INIT_2_OWNERS) as WalletInitializationBuilder;
      txBuilder.owner(testData.OWNER3);
      txBuilder.sign({ key: testData.OPERATOR.privateKey });
      const tx = await txBuilder.build();

      should.deepEqual(tx.signature.length, 1);
      should.deepEqual(tx.toBroadcastFormat(), testData.WALLET_BUILDER_SIGNED_TRANSACTION);
    });

    it('an init transaction with external signature', async () => {
      const txBuilder = factory.getWalletInitializationBuilder();
      txBuilder.fee({ fee: '1000000000' });
      txBuilder.owner(testData.OWNER1);
      txBuilder.owner(testData.OWNER2);
      txBuilder.owner(testData.OWNER3);
      txBuilder.source({ address: testData.OPERATOR.accountId });
      txBuilder.signature(
        '20bc01a6da677b99974b17204de5ff6f34f8e5904f58d6df1ceb39b473e7295dccf60fcedaf4f' +
          'dc3f6bef93edcfbe2a7ec33cc94c893906a063383c27b014f09',
        new KeyPair({ pub: testData.ACCOUNT_1.pubKeyWithPrefix })
      );

      const tx = await txBuilder.build();
      const txJson = tx.toJson();
      should.equal(txJson.from, testData.OPERATOR.accountId);
    });

    it('an init transaction with external signature included twice', async () => {
      const txBuilder = factory.getWalletInitializationBuilder();
      txBuilder.fee({ fee: '1000000000' });
      txBuilder.owner(testData.OWNER1);
      txBuilder.owner(testData.OWNER2);
      txBuilder.owner(testData.OWNER3);
      txBuilder.source({ address: testData.OPERATOR.accountId });
      txBuilder.signature(
        '20bc01a6da677b99974b17204de5ff6f34f8e5904f58d6df1ceb39b473e7295dccf60fcedaf4f' +
          'dc3f6bef93edcfbe2a7ec33cc94c893906a063383c27b014f09',
        new KeyPair({ pub: testData.ACCOUNT_1.pubKeyWithPrefix })
      );
      txBuilder.signature(
        '20bc01a6da677b99974b17204de5ff6f34f8e5904f58d6df1ceb39b473e7295dccf60fcedaf4f' +
          'dc3f6bef93edcfbe2a7ec33cc94c893906a063383c27b014f09',
        new KeyPair({ pub: testData.ACCOUNT_1.pubKeyWithPrefix })
      );

      const tx = await txBuilder.build();
      const txJson = tx.toJson();
      should.equal(txJson.from, testData.OPERATOR.accountId);
    });
  });

  describe('should fail to build', () => {
    it('a transaction without fee', async () => {
      const txBuilder = factory.getWalletInitializationBuilder();
      txBuilder.owner(testData.OWNER1);
      txBuilder.owner(testData.OWNER2);
      txBuilder.owner(testData.OWNER3);
      txBuilder.source({ address: testData.OPERATOR.accountId });
      await txBuilder.build().should.be.rejectedWith('Invalid transaction: missing fee');
    });

    it('a wallet initialization the wrong number of owners', async () => {
      const txBuilder = factory.getWalletInitializationBuilder();
      txBuilder.fee({ fee: '1000000000' });
      txBuilder.owner(testData.OWNER1);
      txBuilder.owner(testData.OWNER2);
      txBuilder.source({ address: testData.OPERATOR.accountId });
      await txBuilder
        .build()
        .should.be.rejectedWith('Invalid transaction: wrong number of owners -- required: 3, found: 2');

      assert.throws(() => txBuilder.owner(testData.OWNER1), new RegExp('Repeated owner address: ' + testData.OWNER1));

      const newTxBuilder = factory.getWalletInitializationBuilder();
      newTxBuilder.fee({ fee: '1000000000' });
      newTxBuilder.source({ address: testData.OPERATOR.accountId });
      await newTxBuilder
        .build()
        .should.be.rejectedWith('Invalid transaction: wrong number of owners -- required: 3, found: 0');
    });

    it('a transaction with invalid source', async () => {
      const factory = getBuilderFactory('thbar');
      const txBuilder = factory.getWalletInitializationBuilder();
      txBuilder.fee({ fee: '1000000000' });
      txBuilder.owner(testData.OWNER1);
      txBuilder.owner(testData.OWNER2);
      txBuilder.owner(testData.OWNER3);
      await txBuilder.build().should.be.rejectedWith('Invalid transaction: missing source');
    });
  });

  describe('should validate', () => {
    it('an address', async () => {
      const txBuilder = factory.getWalletInitializationBuilder();
      txBuilder.validateAddress(testData.VALID_ADDRESS);
      assert.throws(
        () => txBuilder.validateAddress(testData.INVALID_ADDRESS),
        new RegExp('Invalid address ' + testData.INVALID_ADDRESS.address)
      );
    });

    it('value should be greater than zero', () => {
      const txBuilder = factory.getWalletInitializationBuilder();
      assert.throws(() => txBuilder.fee({ fee: '-10' }));
      should.doesNotThrow(() => txBuilder.fee({ fee: '10' }));
    });

    it('a private key', () => {
      const txBuilder = factory.getWalletInitializationBuilder();
      assert.throws(() => txBuilder.validateKey({ key: 'abc' }), /Invalid private key length/);
      should.doesNotThrow(() => txBuilder.validateKey({ key: testData.ACCOUNT_1.prvKeyWithPrefix }));
    });

    it('a raw transaction', async () => {
      const txBuilder = factory.getWalletInitializationBuilder();
      should.doesNotThrow(() => txBuilder.validateRawTransaction(testData.WALLET_INITIALIZATION));
      assert.throws(() => txBuilder.validateRawTransaction('0x00001000'));
      assert.throws(() => txBuilder.validateRawTransaction(''));
      assert.throws(() => txBuilder.validateRawTransaction('pqrs'));
      assert.throws(() => txBuilder.validateRawTransaction(1234));
    });

    it('a transaction to build', async () => {
      const txBuilder = factory.getWalletInitializationBuilder();
      assert.throws(() => txBuilder.validateTransaction(), /Invalid transaction: wrong number of owners/);
      txBuilder.fee({ fee: '10' });
      assert.throws(() => txBuilder.validateTransaction(), /Invalid transaction: wrong number of owners/);
      txBuilder.source(testData.VALID_ADDRESS);
      assert.throws(() => txBuilder.validateTransaction(), /wrong number of owners -- required: 3, found: 0/);
      txBuilder.owner(testData.OWNER1);
      assert.throws(() => txBuilder.validateTransaction(), /wrong number of owners -- required: 3, found: 1/);
      txBuilder.owner(testData.OWNER2);
      assert.throws(() => txBuilder.validateTransaction(), /wrong number of owners -- required: 3, found: 2/);
      txBuilder.owner(testData.OWNER3);
      should.doesNotThrow(() => txBuilder.validateTransaction());
    });
  });
});

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


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