PHP WebShell
Текущая директория: /opt/BitGoJS/modules/utxo-bin/dist/test
Просмотр файла: cmdPsbt.js
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const assert = require("assert");
const fs = require("fs/promises");
const yargs = require("yargs");
const utxolib = require("@bitgo/utxo-lib");
const wasm_miniscript_1 = require("@bitgo/wasm-miniscript");
const commands_1 = require("../src/commands");
const fixtures_1 = require("./fixtures");
const bip32_util_1 = require("./bip32.util");
const TxParser_1 = require("../src/TxParser");
async function runPsbtCommand(args) {
return commands_1.cmdPsbt.builder(yargs([])).strict().exitProcess(false).parse(args);
}
async function assertEqualFixture(path, fixture, network = utxolib.networks.bitcoin) {
const actual = await fs.readFile(path, 'utf8');
const expected = await (0, fixtures_1.getFixtureString)(`test/fixtures/psbt/${fixture}`, actual);
assert.strictEqual(actual, expected);
const tx = path.endsWith('.psbt')
? utxolib.bitgo.createPsbtDecode(actual, network)
: utxolib.bitgo.createTransactionFromBuffer(Buffer.from(actual, 'hex'), network, { amountType: 'bigint' });
const parsed = new TxParser_1.TxParser(TxParser_1.TxParser.PARSE_ALL).parse(tx);
const format = (0, fixtures_1.formatTreeNoColor)(parsed, { showAll: true });
assert.strictEqual(format, await (0, fixtures_1.getFixtureString)(`test/fixtures/psbt/${fixture}.txt`, format));
}
function multi(n, xpubs, path) {
return 'multi(' + n + ',' + xpubs.map((xpub) => xpub + path).join(',') + ')';
}
function getAddressFromDescriptor(descriptor, network) {
return utxolib.address.fromOutputScript(Buffer.from(descriptor.scriptPubkey()), network);
}
describe('cmdPsbt commands', function () {
const keys = (0, bip32_util_1.getKeyTriple)('cmdPsbt');
const xpubs = keys.map((k) => k.neutered().toBase58());
const descriptorString = `wsh(${multi(2, xpubs, '/*')})`;
const descriptor = wasm_miniscript_1.Descriptor.fromString(descriptorString, 'derivable');
it('creates empty psbt', async function () {
await fs.rm('/tmp/test.psbt', { force: true });
await runPsbtCommand(['create', '--path', '/tmp/test.psbt', '--edit']);
await assertEqualFixture('/tmp/test.psbt', '1.empty.psbt');
});
it('adds descriptor input', async function () {
const outputId = Buffer.alloc(32).fill(1).toString('hex') + ':0';
await runPsbtCommand([
'addDescriptorInput',
'--path',
'/tmp/test.psbt',
'--edit',
'--outputId',
outputId,
'--value',
'1000000',
'--descriptor',
descriptorString,
'--descriptorIndex',
'0',
]);
await assertEqualFixture('/tmp/test.psbt', '2.addDescriptorInput.psbt');
});
it('add output', async function () {
await runPsbtCommand([
'addOutput',
'--path',
'/tmp/test.psbt',
'--edit',
'--address',
getAddressFromDescriptor(descriptor.atDerivationIndex(1), utxolib.networks.bitcoin),
'--amount',
'1111',
]);
await assertEqualFixture('/tmp/test.psbt', '3.addOutput.psbt');
});
it('add max output', async function () {
await runPsbtCommand([
'addOutput',
'--path',
'/tmp/test.psbt',
'--edit',
'--address',
getAddressFromDescriptor(descriptor.atDerivationIndex(2), utxolib.networks.bitcoin),
'--amount',
'max',
'--feeRateSatB',
'10',
]);
await assertEqualFixture('/tmp/test.psbt', '4.addMaxOutput.psbt');
});
it('sign', async function () {
await runPsbtCommand(['sign', '--path', '/tmp/test.psbt', '--edit', '--key', keys[0].toBase58()]);
await runPsbtCommand(['sign', '--path', '/tmp/test.psbt', '--edit', '--key', keys[1].toBase58()]);
await assertEqualFixture('/tmp/test.psbt', '5.sign.psbt');
});
it('finalize', async function () {
await runPsbtCommand(['finalize', '--path', '/tmp/test.psbt', '--edit']);
await assertEqualFixture('/tmp/test.psbt', '6.finalize.psbt');
});
it('extract', async function () {
await runPsbtCommand(['extract', '--path', '/tmp/test.psbt', '--out', '/tmp/test.hex']);
await assertEqualFixture('/tmp/test.hex', '7.extract.hex');
});
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY21kUHNidC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3Rlc3QvY21kUHNidC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLGlDQUFpQztBQUNqQyxrQ0FBa0M7QUFFbEMsK0JBQStCO0FBQy9CLDJDQUEyQztBQUMzQyw0REFBb0Q7QUFFcEQsOENBQTBDO0FBQzFDLHlDQUFpRTtBQUNqRSw2Q0FBNEM7QUFDNUMsOENBQTJDO0FBRTNDLEtBQUssVUFBVSxjQUFjLENBQUMsSUFBYztJQUMxQyxPQUFPLGtCQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDNUUsQ0FBQztBQUVELEtBQUssVUFBVSxrQkFBa0IsQ0FBQyxJQUFZLEVBQUUsT0FBZSxFQUFFLE9BQU8sR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLE9BQU87SUFDakcsTUFBTSxNQUFNLEdBQUcsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztJQUMvQyxNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUEsMkJBQWdCLEVBQUMsc0JBQXNCLE9BQU8sRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ2pGLE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ3JDLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDO1FBQy9CLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUM7UUFDakQsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsMkJBQTJCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLEVBQUUsT0FBTyxFQUFF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RSxRQUFRLEVBQUUsZ0JBQWdCLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUN6RSxNQUFNLGtCQUFrQixDQUFDLGdCQUFnQixFQUFFLGlCQUFpQixDQUFDLENBQUM7SUFDaEUsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsU0FBUyxFQUFFLEtBQUs7UUFDakIsTUFBTSxjQUFjLENBQUMsQ0FBQyxTQUFTLEVBQUUsUUFBUSxFQUFFLGdCQUFnQixFQUFFLE9BQU8sRUFBRSxlQUFlLENBQUMsQ0FBQyxDQUFDO1FBQ3hGLE1BQU0sa0JBQWtCLENBQUMsZUFBZSxFQUFFLGVBQWUsQ0FBQyxDQUFDO0lBQzdELENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzL3Byb21pc2VzJztcblxuaW1wb3J0ICogYXMgeWFyZ3MgZnJvbSAneWFyZ3MnO1xuaW1wb3J0ICogYXMgdXR4b2xpYiBmcm9tICdAYml0Z28vdXR4by1saWInO1xuaW1wb3J0IHsgRGVzY3JpcHRvciB9IGZyb20gJ0BiaXRnby93YXNtLW1pbmlzY3JpcHQnO1xuXG5pbXBvcnQgeyBjbWRQc2J0IH0gZnJvbSAnLi4vc3JjL2NvbW1hbmRzJztcbmltcG9ydCB7IGZvcm1hdFRyZWVOb0NvbG9yLCBnZXRGaXh0dXJlU3RyaW5nIH0gZnJvbSAnLi9maXh0dXJlcyc7XG5pbXBvcnQgeyBnZXRLZXlUcmlwbGUgfSBmcm9tICcuL2JpcDMyLnV0aWwnO1xuaW1wb3J0IHsgVHhQYXJzZXIgfSBmcm9tICcuLi9zcmMvVHhQYXJzZXInO1xuXG5hc3luYyBmdW5jdGlvbiBydW5Qc2J0Q29tbWFuZChhcmdzOiBzdHJpbmdbXSkge1xuICByZXR1cm4gY21kUHNidC5idWlsZGVyKHlhcmdzKFtdKSkuc3RyaWN0KCkuZXhpdFByb2Nlc3MoZmFsc2UpLnBhcnNlKGFyZ3MpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBhc3NlcnRFcXVhbEZpeHR1cmUocGF0aDogc3RyaW5nLCBmaXh0dXJlOiBzdHJpbmcsIG5ldHdvcmsgPSB1dHhvbGliLm5ldHdvcmtzLmJpdGNvaW4pIHtcbiAgY29uc3QgYWN0dWFsID0gYXdhaXQgZnMucmVhZEZpbGUocGF0aCwgJ3V0ZjgnKTtcbiAgY29uc3QgZXhwZWN0ZWQgPSBhd2FpdCBnZXRGaXh0dXJlU3RyaW5nKGB0ZXN0L2ZpeHR1cmVzL3BzYnQvJHtmaXh0dXJlfWAsIGFjdHVhbCk7XG4gIGFzc2VydC5zdHJpY3RFcXVhbChhY3R1YWwsIGV4cGVjdGVkKTtcbiAgY29uc3QgdHggPSBwYXRoLmVuZHNXaXRoKCcucHNidCcpXG4gICAgPyB1dHhvbGliLmJpdGdvLmNyZWF0ZVBzYnREZWNvZGUoYWN0dWFsLCBuZXR3b3JrKVxuICAgIDogdXR4b2xpYi5iaXRnby5jcmVhdGVUcmFuc2FjdGlvbkZyb21CdWZmZXIoQnVmZmVyLmZyb20oYWN0dWFsLCAnaGV4JyksIG5ldHdvcmssIHsgYW1vdW50VHlwZTogJ2JpZ2ludCcgfSk7XG4gIGNvbnN0IHBhcnNlZCA9IG5ldyBUeFBhcnNlcihUeFBhcnNlci5QQVJTRV9BTEwpLnBhcnNlKHR4KTtcbiAgY29uc3QgZm9ybWF0ID0gZm9ybWF0VHJlZU5vQ29sb3IocGFyc2VkLCB7IHNob3dBbGw6IHRydWUgfSk7XG4gIGFzc2VydC5zdHJpY3RFcXVhbChmb3JtYXQsIGF3YWl0IGdldEZpeHR1cmVTdHJpbmcoYHRlc3QvZml4dHVyZXMvcHNidC8ke2ZpeHR1cmV9LnR4dGAsIGZvcm1hdCkpO1xufVxuXG5mdW5jdGlvbiBtdWx0aShuOiBudW1iZXIsIHhwdWJzOiBzdHJpbmdbXSwgcGF0aDogc3RyaW5nKSB7XG4gIHJldHVybiAnbXVsdGkoJyArIG4gKyAnLCcgKyB4cHVicy5tYXAoKHhwdWIpID0+IHhwdWIgKyBwYXRoKS5qb2luKCcsJykgKyAnKSc7XG59XG5cbmZ1bmN0aW9uIGdldEFkZHJlc3NGcm9tRGVzY3JpcHRvcihkZXNjcmlwdG9yOiBEZXNjcmlwdG9yLCBuZXR3b3JrOiB1dHhvbGliLk5ldHdvcmspIHtcbiAgcmV0dXJuIHV0eG9saWIuYWRkcmVzcy5mcm9tT3V0cHV0U2NyaXB0KEJ1ZmZlci5mcm9tKGRlc2NyaXB0b3Iuc2NyaXB0UHVia2V5KCkpLCBuZXR3b3JrKTtcbn1cblxuZGVzY3JpYmUoJ2NtZFBzYnQgY29tbWFuZHMnLCBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IGtleXMgPSBnZXRLZXlUcmlwbGUoJ2NtZFBzYnQnKTtcbiAgY29uc3QgeHB1YnMgPSBrZXlzLm1hcCgoaykgPT4gay5uZXV0ZXJlZCgpLnRvQmFzZTU4KCkpO1xuICBjb25zdCBkZXNjcmlwdG9yU3RyaW5nID0gYHdzaCgke211bHRpKDIsIHhwdWJzLCAnLyonKX0pYDtcbiAgY29uc3QgZGVzY3JpcHRvciA9IERlc2NyaXB0b3IuZnJvbVN0cmluZyhkZXNjcmlwdG9yU3RyaW5nLCAnZGVyaXZhYmxlJyk7XG5cbiAgaXQoJ2NyZWF0ZXMgZW1wdHkgcHNidCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBhd2FpdCBmcy5ybSgnL3RtcC90ZXN0LnBzYnQnLCB7IGZvcmNlOiB0cnVlIH0pO1xuICAgIGF3YWl0IHJ1blBzYnRDb21tYW5kKFsnY3JlYXRlJywgJy0tcGF0aCcsICcvdG1wL3Rlc3QucHNidCcsICctLWVkaXQnXSk7XG4gICAgYXdhaXQgYXNzZXJ0RXF1YWxGaXh0dXJlKCcvdG1wL3Rlc3QucHNidCcsICcxLmVtcHR5LnBzYnQnKTtcbiAgfSk7XG5cbiAgaXQoJ2FkZHMgZGVzY3JpcHRvciBpbnB1dCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBvdXRwdXRJZCA9IEJ1ZmZlci5hbGxvYygzMikuZmlsbCgxKS50b1N0cmluZygnaGV4JykgKyAnOjAnO1xuICAgIGF3YWl0IHJ1blBzYnRDb21tYW5kKFtcbiAgICAgICdhZGREZXNjcmlwdG9ySW5wdXQnLFxuICAgICAgJy0tcGF0aCcsXG4gICAgICAnL3RtcC90ZXN0LnBzYnQnLFxuICAgICAgJy0tZWRpdCcsXG4gICAgICAnLS1vdXRwdXRJZCcsXG4gICAgICBvdXRwdXRJZCxcbiAgICAgICctLXZhbHVlJyxcbiAgICAgICcxMDAwMDAwJyxcbiAgICAgICctLWRlc2NyaXB0b3InLFxuICAgICAgZGVzY3JpcHRvclN0cmluZyxcbiAgICAgICctLWRlc2NyaXB0b3JJbmRleCcsXG4gICAgICAnMCcsXG4gICAgXSk7XG4gICAgYXdhaXQgYXNzZXJ0RXF1YWxGaXh0dXJlKCcvdG1wL3Rlc3QucHNidCcsICcyLmFkZERlc2NyaXB0b3JJbnB1dC5wc2J0Jyk7XG4gIH0pO1xuXG4gIGl0KCdhZGQgb3V0cHV0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGF3YWl0IHJ1blBzYnRDb21tYW5kKFtcbiAgICAgICdhZGRPdXRwdXQnLFxuICAgICAgJy0tcGF0aCcsXG4gICAgICAnL3RtcC90ZXN0LnBzYnQnLFxuICAgICAgJy0tZWRpdCcsXG4gICAgICAnLS1hZGRyZXNzJyxcbiAgICAgIGdldEFkZHJlc3NGcm9tRGVzY3JpcHRvcihkZXNjcmlwdG9yLmF0RGVyaXZhdGlvbkluZGV4KDEpLCB1dHhvbGliLm5ldHdvcmtzLmJpdGNvaW4pLFxuICAgICAgJy0tYW1vdW50JyxcbiAgICAgICcxMTExJyxcbiAgICBdKTtcbiAgICBhd2FpdCBhc3NlcnRFcXVhbEZpeHR1cmUoJy90bXAvdGVzdC5wc2J0JywgJzMuYWRkT3V0cHV0LnBzYnQnKTtcbiAgfSk7XG5cbiAgaXQoJ2FkZCBtYXggb3V0cHV0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGF3YWl0IHJ1blBzYnRDb21tYW5kKFtcbiAgICAgICdhZGRPdXRwdXQnLFxuICAgICAgJy0tcGF0aCcsXG4gICAgICAnL3RtcC90ZXN0LnBzYnQnLFxuICAgICAgJy0tZWRpdCcsXG4gICAgICAnLS1hZGRyZXNzJyxcbiAgICAgIGdldEFkZHJlc3NGcm9tRGVzY3JpcHRvcihkZXNjcmlwdG9yLmF0RGVyaXZhdGlvbkluZGV4KDIpLCB1dHhvbGliLm5ldHdvcmtzLmJpdGNvaW4pLFxuICAgICAgJy0tYW1vdW50JyxcbiAgICAgICdtYXgnLFxuICAgICAgJy0tZmVlUmF0ZVNhdEInLFxuICAgICAgJzEwJyxcbiAgICBdKTtcblxuICAgIGF3YWl0IGFzc2VydEVxdWFsRml4dHVyZSgnL3RtcC90ZXN0LnBzYnQnLCAnNC5hZGRNYXhPdXRwdXQucHNidCcpO1xuICB9KTtcblxuICBpdCgnc2lnbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBhd2FpdCBydW5Qc2J0Q29tbWFuZChbJ3NpZ24nLCAnLS1wYXRoJywgJy90bXAvdGVzdC5wc2J0JywgJy0tZWRpdCcsICctLWtleScsIGtleXNbMF0udG9CYXNlNTgoKV0pO1xuICAgIGF3YWl0IHJ1blBzYnRDb21tYW5kKFsnc2lnbicsICctLXBhdGgnLCAnL3RtcC90ZXN0LnBzYnQnLCAnLS1lZGl0JywgJy0ta2V5Jywga2V5c1sxXS50b0Jhc2U1OCgpXSk7XG4gICAgYXdhaXQgYXNzZXJ0RXF1YWxGaXh0dXJlKCcvdG1wL3Rlc3QucHNidCcsICc1LnNpZ24ucHNidCcpO1xuICB9KTtcblxuICBpdCgnZmluYWxpemUnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgYXdhaXQgcnVuUHNidENvbW1hbmQoWydmaW5hbGl6ZScsICctLXBhdGgnLCAnL3RtcC90ZXN0LnBzYnQnLCAnLS1lZGl0J10pO1xuICAgIGF3YWl0IGFzc2VydEVxdWFsRml4dHVyZSgnL3RtcC90ZXN0LnBzYnQnLCAnNi5maW5hbGl6ZS5wc2J0Jyk7XG4gIH0pO1xuXG4gIGl0KCdleHRyYWN0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGF3YWl0IHJ1blBzYnRDb21tYW5kKFsnZXh0cmFjdCcsICctLXBhdGgnLCAnL3RtcC90ZXN0LnBzYnQnLCAnLS1vdXQnLCAnL3RtcC90ZXN0LmhleCddKTtcbiAgICBhd2FpdCBhc3NlcnRFcXVhbEZpeHR1cmUoJy90bXAvdGVzdC5oZXgnLCAnNy5leHRyYWN0LmhleCcpO1xuICB9KTtcbn0pO1xuIl19Выполнить команду
Для локальной разработки. Не используйте в интернете!