PHP WebShell

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

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

import { networks } from 'bitcoinjs-lib';
import * as assert from 'assert';

import {
  createOutputScript2of3,
  createOutputScriptP2shP2pk,
  createPaymentP2tr,
  isSupportedScriptType,
  scriptTypes2Of3,
} from '../../src/bitgo/outputScripts';
import { ECPair, getNetworkName, getNetworkList } from '../../src';
import { getKeyTriple } from '../../src/testutil';

const keys = getKeyTriple('utxo');
const pubkeys = keys.map((k) => k.publicKey) as [Buffer, Buffer, Buffer];

describe('output script support', function () {
  it('has expected values for each network', function () {
    assert.deepStrictEqual(
      getNetworkList().map((n) => [getNetworkName(n), scriptTypes2Of3.filter((t) => isSupportedScriptType(n, t))]),
      [
        ['bitcoin', ['p2sh', 'p2shP2wsh', 'p2wsh', 'p2tr', 'p2trMusig2']],
        ['testnet', ['p2sh', 'p2shP2wsh', 'p2wsh', 'p2tr', 'p2trMusig2']],
        ['bitcoinPublicSignet', ['p2sh', 'p2shP2wsh', 'p2wsh', 'p2tr', 'p2trMusig2']],
        ['bitcoinTestnet4', ['p2sh', 'p2shP2wsh', 'p2wsh', 'p2tr', 'p2trMusig2']],
        ['bitcoinBitGoSignet', ['p2sh', 'p2shP2wsh', 'p2wsh', 'p2tr', 'p2trMusig2']],
        ['bitcoincash', ['p2sh']],
        ['bitcoincashTestnet', ['p2sh']],
        ['bitcoingold', ['p2sh', 'p2shP2wsh', 'p2wsh']],
        ['bitcoingoldTestnet', ['p2sh', 'p2shP2wsh', 'p2wsh']],
        ['bitcoinsv', ['p2sh']],
        ['bitcoinsvTestnet', ['p2sh']],
        ['dash', ['p2sh']],
        ['dashTest', ['p2sh']],
        ['dogecoin', ['p2sh']],
        ['dogecoinTest', ['p2sh']],
        ['ecash', ['p2sh']],
        ['ecashTest', ['p2sh']],
        ['litecoin', ['p2sh', 'p2shP2wsh', 'p2wsh']],
        ['litecoinTest', ['p2sh', 'p2shP2wsh', 'p2wsh']],
        ['zcash', ['p2sh']],
        ['zcashTest', ['p2sh']],
      ]
    );
  });

  it('does not allow unsupported scripts when network parameter is provided', function () {
    getNetworkList().forEach((n) => {
      scriptTypes2Of3
        .filter((t) => !isSupportedScriptType(n, t))
        .forEach((t) =>
          assert.throws(
            () => createOutputScript2of3(pubkeys, t, n),
            (err) => !!(err instanceof Error && err.message.match(/^unsupported script type/))
          )
        );
    });
  });
});

describe('createOutputScript2of3()', function () {
  const p2ms =
    '522103f1667be6e8b8eb0c980155dfcda742affeeb0b0ca10969c54152713185' +
    '6d65c9210305902cf20a0bbc9274e62414aa4afea8c96e3e83abb5233d72355c' +
    '27d7de660a2103c79183d6641585179d25bbc091b2a7fce86c9f15d311e5aca0' +
    'a020478d8f208753ae';
  const p2wsh = '002095ecaacb606b9ece3821c0111c0a1208dd1d35192809bf8cf6cbad4bbeaca67f';
  const p2tr = '5120a4ce7d122bdc05224b27415228728e5d5bf485961a07493d068ddbb4d4569059';
  const p2trMusig2 = '51207cd79799a4cf6183b018a29960ffe8351e90afdb2383b9b9dcd3ec07929c72e3';

  scriptTypes2Of3.forEach((scriptType) => {
    it(`creates output script (type=${scriptType})`, function () {
      const { scriptPubKey, redeemScript, witnessScript } = createOutputScript2of3(pubkeys, scriptType);

      switch (scriptType) {
        case 'p2sh':
          assert.strictEqual(scriptPubKey.toString('hex'), 'a91491590bed8198ea7ca57ba68ab7cbfabc656cbbaf87');
          assert.strictEqual(redeemScript && redeemScript.toString('hex'), p2ms);
          assert.strictEqual(witnessScript, undefined);
          break;
        case 'p2shP2wsh':
          assert.strictEqual(scriptPubKey.toString('hex'), 'a9140312dd6f801ab11d53c35f6a2bdac9c602a55d9d87');
          assert.strictEqual(redeemScript && redeemScript.toString('hex'), p2wsh);
          assert.strictEqual(witnessScript && witnessScript.toString('hex'), p2ms);
          break;
        case 'p2wsh':
          assert.strictEqual(scriptPubKey.toString('hex'), p2wsh);
          assert.strictEqual(redeemScript, undefined);
          assert.strictEqual(witnessScript && witnessScript.toString('hex'), p2ms);
          break;
        case 'p2tr':
          assert.strictEqual(scriptPubKey.toString('hex'), p2tr);
          // TODO: validate script control blocks once they are returned by payments.p2tr()
          break;
        case 'p2trMusig2':
          assert.strictEqual(scriptPubKey.toString('hex'), p2trMusig2);
          break;
        default:
          throw new Error(`unexpected type ${scriptType}`);
      }
    });
  });
});

describe('createOutputScriptP2shP2pk', function () {
  it('create output script p2shP2pk', function () {
    const keypair = ECPair.fromWIF('cTLxw4KC55LQfFj3eZz51NpWX1j2ja4WkbQFbHaTuaRkSFGeJ4yS', networks.testnet);
    const { scriptPubKey, redeemScript, witnessScript } = createOutputScriptP2shP2pk(keypair.publicKey);
    assert.strictEqual(scriptPubKey.toString('hex'), 'a914172dcc4e025361d951a9511c670973a4e3720c9887');
    assert.strictEqual(
      redeemScript?.toString('hex'),
      '210219da48412c2268865fe8c126327d1b12eee350a3b69eb09e3323cc9a11828945ac'
    );
    assert.strictEqual(witnessScript, undefined);
  });
});

describe('createPaymentP2tr', () => {
  const controlBlocks = [
    'c1aa3303d48847f4d54aa02a4ff97448f1f430b07eecd632c41f390e3f8431a166487df024a0eb38aeb56b5263cf22c84a2c9c7daad9a8e55cce2e3cac87c52a0a',
    'c1aa3303d48847f4d54aa02a4ff97448f1f430b07eecd632c41f390e3f8431a1660a75f62db677b9c1974741735aa4b0c2c8718796c82578b960e1fa0986d4f25cf0b2127669c12ad75a079c25502a5456764de23f30df1fcdb88418fe970834d7',
    'c1aa3303d48847f4d54aa02a4ff97448f1f430b07eecd632c41f390e3f8431a1669c039366a9ce89ad30c9935268a10110cb1a4b6357dcc2c651e9de38639c206af0b2127669c12ad75a079c25502a5456764de23f30df1fcdb88418fe970834d7',
  ];

  it('allows no redeemIndex', () => {
    const p2tr = createPaymentP2tr(pubkeys);
    assert.strictEqual(p2tr.controlBlock, undefined);
  });

  for (let i = 0; i < 3; i++) {
    it(`creates controlBlock for redeemIndex ${i}`, () => {
      const p2tr = createPaymentP2tr(pubkeys, i);
      assert.strictEqual(p2tr.controlBlock?.toString('hex'), controlBlocks[i]);
    });
  }
});

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


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