PHP WebShell

Текущая директория: /usr/lib/node_modules/bitgo/node_modules/@bitgo-forks/avalanchejs/src/vms/utils

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

import { isStakeableLockOut, isTransferOut } from '../../utils';
import {
  getStakeableLockedTransferableOutForTest,
  getTransferableOutForTest,
} from '../../fixtures/transactions';

import { consolidateOutputs } from './consolidateOutputs';

describe('consolidateOutputs', () => {
  it('consolidate eligible TransferOuts', () => {
    // GIVEN
    const a = getTransferableOutForTest(BigInt(100));
    const b = getTransferableOutForTest(BigInt(50));
    const c = getTransferableOutForTest(BigInt(50));

    // WHEN
    const consolidated = consolidateOutputs([a, b, c]);

    // THEN
    expect(consolidated.length).toEqual(1);
    const conslidatedOutput = consolidated[0];
    expect(conslidatedOutput.amount()).toEqual(BigInt(200));
    expect(conslidatedOutput.getAssetId()).toEqual(a.getAssetId());
    if (isTransferOut(conslidatedOutput.output) && isTransferOut(a.output)) {
      expect(
        conslidatedOutput.output.outputOwners.equals(a.output.outputOwners),
      ).toBeTruthy();
    } else {
      fail(
        'The consolidated output and first test output should both be transferOuts.',
      );
    }
  });
  it('consolidates eligible StakeableLockouts', () => {
    // GIVEN
    const a = getStakeableLockedTransferableOutForTest(BigInt(100), BigInt(0));
    const b = getStakeableLockedTransferableOutForTest(BigInt(200), BigInt(0));
    const c = getStakeableLockedTransferableOutForTest(BigInt(200), BigInt(0));

    // WHEN
    const consolidated = consolidateOutputs([a, b, c]);

    // THEN
    expect(consolidated.length).toEqual(1);
    const conslidatedOutput = consolidated[0];
    expect(conslidatedOutput.amount()).toEqual(BigInt(500));
    expect(conslidatedOutput.getAssetId()).toEqual(a.getAssetId());
    if (
      isStakeableLockOut(conslidatedOutput.output) &&
      isStakeableLockOut(a.output)
    ) {
      expect(conslidatedOutput.output.getLocktime()).toEqual(
        a.output.getLocktime(),
      );
      expect(
        conslidatedOutput.output
          .getOutputOwners()
          .equals(a.output.getOutputOwners()),
      ).toBeTruthy();
    } else {
      fail(
        'The consolidated output and first test output should both be stakeableLockouts.',
      );
    }
  });
  it('consolidates heterogenous inputs', () => {
    // GIVEN
    const tOutA = getTransferableOutForTest(BigInt(50));
    const tOutB = getTransferableOutForTest(BigInt(100));
    const stlOutA = getStakeableLockedTransferableOutForTest(
      BigInt(100),
      BigInt(0),
    );
    const stlOutB = getStakeableLockedTransferableOutForTest(
      BigInt(200),
      BigInt(0),
    );

    // WHEN
    const consolidated = consolidateOutputs([tOutA, tOutB, stlOutA, stlOutB]);

    // THEN
    expect(consolidated.length).toEqual(2);
    // THEN - TransferOut
    expect(consolidated[0].amount()).toEqual(BigInt(150));
    expect(consolidated[0].getAssetId()).toEqual(tOutA.getAssetId());
    if (isTransferOut(consolidated[0].output) && isTransferOut(tOutA.output)) {
      expect(
        consolidated[0].output.outputOwners.equals(tOutA.output.outputOwners),
      ).toBeTruthy();
    } else {
      fail(
        'The consolidated output and first test output should both be transferOuts.',
      );
    }
    // THEN - StakeableLockouts
    expect(consolidated[1].amount()).toEqual(BigInt(300));
    if (
      isStakeableLockOut(consolidated[1].output) &&
      isStakeableLockOut(stlOutA.output)
    ) {
      expect(consolidated[1].output.getLocktime()).toEqual(
        stlOutA.output.getLocktime(),
      );
      expect(
        consolidated[1].output
          .getOutputOwners()
          .equals(stlOutA.output.getOutputOwners()),
      ).toBeTruthy();
    } else {
      fail(
        'The consolidated output and third test output should both be stakeableLockouts.',
      );
    }
  });
  it('does not consolidate ineligible TransferOuts - locktime', () => {
    // GIVEN
    const a = getTransferableOutForTest(BigInt(50));
    const b = getTransferableOutForTest(BigInt(50), BigInt(100));

    // WHEN
    const consolidated = consolidateOutputs([a, b]);

    // THEN
    expect(consolidated.length).toEqual(2);
    expect(consolidated[0]).toBe(a);
    expect(consolidated[1]).toBe(b);
  });
  it('does not consolidate ineligible TransferOuts - threshold', () => {
    // GIVEN
    const a = getTransferableOutForTest(BigInt(50), BigInt(100), 2);
    const b = getTransferableOutForTest(BigInt(50), BigInt(100), 1);

    // WHEN
    const consolidated = consolidateOutputs([a, b]);

    // THEN
    expect(consolidated.length).toEqual(2);
    expect(consolidated[0]).toBe(a);
    expect(consolidated[1]).toBe(b);
  });
  it('does not consolidate ineligible StakeableLockouts - locktime', () => {
    // GIVEN
    const a = getStakeableLockedTransferableOutForTest(BigInt(100), BigInt(0));
    const b = getStakeableLockedTransferableOutForTest(
      BigInt(200),
      BigInt(100),
    );

    // WHEN
    const consolidated = consolidateOutputs([a, b]);

    // THEN
    expect(consolidated.length).toEqual(2);
    expect(consolidated[0]).toBe(a);
    expect(consolidated[1]).toBe(b);
  });
  it('handles empty arrays gracefully', () => {
    // WHEN
    const consolidated = consolidateOutputs([]);
    // THEN
    expect(consolidated.length).toEqual(0);
  });
  it('handles single output gracefully', () => {
    // GIVEN
    const a = getStakeableLockedTransferableOutForTest(BigInt(100), BigInt(0));

    // WHEN
    const consolidated = consolidateOutputs([a]);

    // THEN
    expect(consolidated.length).toEqual(1);
    expect(consolidated[0]).toBe(a);
  });
});

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


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