PHP WebShell

Текущая директория: /opt/BitGoJS/modules/utxo-lib/test

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

import * as assert from 'assert';
import {
  getMainnet,
  getNetworkList,
  getNetworkName,
  getTestnet,
  isBitcoin,
  isBitcoinCash,
  isECash,
  isBitcoinGold,
  isBitcoinSV,
  isDogecoin,
  isLitecoin,
  isMainnet,
  isSameCoin,
  isTestnet,
  isValidNetwork,
  isZcash,
  Network,
  networks,
  supportsSegwit,
  supportsTaproot,
} from '../src/networks';

describe('networks', function () {
  // Ideally, all properties for all coins should be distinct.
  // However, there are some exceptions and some networks share the same properties.

  // Here we define some groups of networks that are allowed to share properties.
  const bitcoinSharedMessagePrefix = (network) => isBitcoin(network) || isBitcoinCash(network) || isBitcoinSV(network);

  const bitcoinMainnetSharedPubkeyPrefix = (network) =>
    isMainnet(network) && (isBitcoin(network) || isBitcoinCash(network) || isECash(network) || isBitcoinSV(network));

  const bitcoinMainnetSharedScriptPrefix = (network) => bitcoinMainnetSharedPubkeyPrefix(network);

  const bitcoinTestnetSharedPubkeyPrefix = (network) =>
    isTestnet(network) &&
    (isBitcoin(network) ||
      isBitcoinCash(network) ||
      isECash(network) ||
      isBitcoinGold(network) ||
      isBitcoinSV(network) ||
      isLitecoin(network));

  const bitcoinTestnetSharedScriptPrefix = (network) =>
    isTestnet(network) &&
    (isBitcoin(network) ||
      isBitcoinCash(network) ||
      isECash(network) ||
      isBitcoinGold(network) ||
      isBitcoinSV(network) ||
      isDogecoin(network));

  const bitcoinMainnetSharedWIFPrefix = (network) =>
    isMainnet(network) &&
    (isBitcoin(network) ||
      isBitcoinCash(network) ||
      isECash(network) ||
      isBitcoinGold(network) ||
      isBitcoinSV(network) ||
      isZcash(network));

  const bitcoinTestnetSharedWIFPrefix = (network) => isTestnet(network) && !isDogecoin(network);

  const bech32Coins = (network) => isBitcoin(network) || isBitcoinGold(network) || isLitecoin(network);

  const sameGroup = (group, network, otherNetwork) => group(network) && group(otherNetwork);

  describe('getNetworkList()', function () {
    it('mainnets are sorted alphabetically', function () {
      const mainnets = getNetworkList().filter(isMainnet);
      const sortedMainnets = [...mainnets].sort((a, b) =>
        (getNetworkName(a) as string).localeCompare(getNetworkName(b) as string)
      );
      assert.deepStrictEqual(mainnets, sortedMainnets);
    });

    it('testnet(s) follow mainnets', function () {
      const list = getNetworkList();
      while (list.length > 0) {
        // first element is a mainnet
        const mainnet = list.shift();
        assert.strict(mainnet);
        assert.strictEqual(isMainnet(mainnet), true);

        // subsequent entries are testnets
        while (list.length > 0 && isTestnet(list[0])) {
          assert.strictEqual(getMainnet(list[0]), mainnet);
          list.shift();
        }
      }
    });
  });

  describe('Features', function () {
    it('have expected values for networks', function () {
      assert.deepStrictEqual(
        getNetworkList().map((n) => [getNetworkName(n), supportsSegwit(n), supportsTaproot(n)]),
        [
          ['bitcoin', true, true],
          ['testnet', true, true],
          ['bitcoinPublicSignet', true, true],
          ['bitcoinTestnet4', true, true],
          ['bitcoinBitGoSignet', true, true],
          ['bitcoincash', false, false],
          ['bitcoincashTestnet', false, false],
          ['bitcoingold', true, false],
          ['bitcoingoldTestnet', true, false],
          ['bitcoinsv', false, false],
          ['bitcoinsvTestnet', false, false],
          ['dash', false, false],
          ['dashTest', false, false],
          ['dogecoin', false, false],
          ['dogecoinTest', false, false],
          ['ecash', false, false],
          ['ecashTest', false, false],
          ['litecoin', true, false],
          ['litecoinTest', true, false],
          ['zcash', false, false],
          ['zcashTest', false, false],
        ]
      );
    });
  });

  for (const name in networks) {
    const network: Network = networks[name];

    describe(`networks.${name}`, function () {
      it('is valid network', function () {
        assert(isValidNetwork(network));
      });

      it('getNetworkName() returns network name', function () {
        assert.strictEqual(name, getNetworkName(network));
      });

      it('has corresponding testnet/mainnet', function () {
        if (isMainnet(network)) {
          assert.strictEqual(isTestnet(network), false);
          assert.strictEqual(getMainnet(network), network);
          assert.strictEqual(typeof getTestnet(network), 'object');
        } else {
          assert.strictEqual(isMainnet(network), false);
          assert.strictEqual(getTestnet(network), network);
          assert.notStrictEqual(getMainnet(network), network);
          assert.strictEqual(typeof getMainnet(network), 'object');
        }
      });

      it('has expected properties', function () {
        assert.strictEqual(typeof network, 'object');
        assert.strictEqual(typeof network.messagePrefix, 'string');
        assert.strictEqual(typeof (network as any).bech32, bech32Coins(network) ? 'string' : 'undefined');
        assert.strictEqual(typeof network.bip32, 'object');
        assert.strictEqual(typeof network.pubKeyHash, 'number');
        assert.strictEqual(typeof network.scriptHash, 'number');
        assert.strictEqual(typeof network.wif, 'number');
        assert.strictEqual(typeof network.coin, 'string');

        if (isMainnet(network)) {
          assert.strictEqual(network.bip32.public, networks.bitcoin.bip32.public);
          assert.strictEqual(network.bip32.private, networks.bitcoin.bip32.private);
        } else {
          assert.strictEqual(network.bip32.public, networks.testnet.bip32.public);
          assert.strictEqual(network.bip32.private, networks.testnet.bip32.private);
        }
      });

      for (const otherName in networks) {
        const otherNetwork = networks[otherName];

        const alternateBtcTestnets = ['bitcoinPublicSignet', 'bitcoinTestnet4', 'bitcoinBitGoSignet'];
        if (
          (alternateBtcTestnets.includes(name) && otherName === 'testnet') ||
          alternateBtcTestnets.includes(otherName)
        ) {
          continue;
        }

        it('isSameCoin() returns true testnet/mainnet variants', function () {
          assert.strictEqual(
            isSameCoin(network, otherNetwork),
            otherNetwork === getMainnet(network) || otherNetwork === getTestnet(network)
          );

          assert.strictEqual(name === otherName, network === otherNetwork);
        });

        if (network === otherNetwork) {
          continue;
        }

        it(`has distinct properties with ${otherName}`, function () {
          assert.strictEqual(
            network.messagePrefix === otherNetwork.messagePrefix,
            isSameCoin(network, otherNetwork) || sameGroup(bitcoinSharedMessagePrefix, network, otherNetwork)
          );

          assert.strictEqual(
            network.pubKeyHash === otherNetwork.pubKeyHash,
            sameGroup(bitcoinMainnetSharedPubkeyPrefix, network, otherNetwork) ||
              sameGroup(bitcoinTestnetSharedPubkeyPrefix, network, otherNetwork)
          );

          assert.strictEqual(
            network.scriptHash === otherNetwork.scriptHash,
            sameGroup(bitcoinMainnetSharedScriptPrefix, network, otherNetwork) ||
              sameGroup(bitcoinTestnetSharedScriptPrefix, network, otherNetwork)
          );

          assert.strictEqual(
            network.wif === otherNetwork.wif,
            sameGroup(bitcoinMainnetSharedWIFPrefix, network, otherNetwork) ||
              sameGroup(bitcoinTestnetSharedWIFPrefix, network, otherNetwork)
          );
        });
      }
    });
  }
});

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


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