@bitgo/utxo-bin
Version:
Command-line utility for BitGo UTXO transactions
138 lines • 16.9 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const assert = __importStar(require("assert"));
const fs = __importStar(require("fs/promises"));
const yargs_1 = __importDefault(require("yargs"));
const utxolib = __importStar(require("@bitgo/utxo-lib"));
const wasm_utxo_1 = require("@bitgo/wasm-utxo");
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((0, yargs_1.default)([])).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_utxo_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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY21kUHNidC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3Rlc3QvY21kUHNidC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLCtDQUFpQztBQUNqQyxnREFBa0M7QUFFbEMsa0RBQTBCO0FBQzFCLHlEQUEyQztBQUMzQyxnREFBOEM7QUFFOUMsOENBQTBDO0FBQzFDLHlDQUFpRTtBQUNqRSw2Q0FBNEM7QUFDNUMsOENBQTJDO0FBRTNDLEtBQUssVUFBVSxjQUFjLENBQUMsSUFBYztJQUMxQyxPQUFPLGtCQUFPLENBQUMsT0FBTyxDQUFDLElBQUEsZUFBSyxFQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUM1RSxDQUFDO0FBRUQsS0FBSyxVQUFVLGtCQUFrQixDQUFDLElBQVksRUFBRSxPQUFlLEVBQUUsT0FBTyxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTztJQUNqRyxNQUFNLE1BQU0sR0FBRyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQy9DLE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBQSwyQkFBZ0IsRUFBQyxzQkFBc0IsT0FBTyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDakYsTUFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDckMsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUM7UUFDL0IsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQztRQUNqRCxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQywyQkFBMkIsQ0FBQyxNQUFNLENBQUMsSUFB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RSxLQUFLO1FBQ2xCLE1BQU0sY0FBYyxDQUFDLENBQUMsVUFBVSxFQUFFLFFBQVEsRUFBRSxnQkFBZ0IsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQ3pFLE1BQU0sa0JBQWtCLENBQUMsZ0JBQWdCLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztJQUNoRSxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyxTQUFTLEVBQUUsS0FBSztRQUNqQixNQUFNLGNBQWMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxRQUFRLEVBQUUsZ0JBQWdCLEVBQUUsT0FBTyxFQUFFLGVBQWUsQ0FBQyxDQUFDLENBQUM7UUFDeEYsTUFBTSxrQkFBa0IsQ0FBQyxlQUFlLEVBQUUsZUFBZSxDQUFDLENBQUM7SUFDN0QsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMvcHJvbWlzZXMnO1xuXG5pbXBvcnQgeWFyZ3MgZnJvbSAneWFyZ3MnO1xuaW1wb3J0ICogYXMgdXR4b2xpYiBmcm9tICdAYml0Z28vdXR4by1saWInO1xuaW1wb3J0IHsgRGVzY3JpcHRvciB9IGZyb20gJ0BiaXRnby93YXNtLXV0eG8nO1xuXG5pbXBvcnQgeyBjbWRQc2J0IH0gZnJvbSAnLi4vc3JjL2NvbW1hbmRzJztcbmltcG9ydCB7IGZvcm1hdFRyZWVOb0NvbG9yLCBnZXRGaXh0dXJlU3RyaW5nIH0gZnJvbSAnLi9maXh0dXJlcyc7XG5pbXBvcnQgeyBnZXRLZXlUcmlwbGUgfSBmcm9tICcuL2JpcDMyLnV0aWwnO1xuaW1wb3J0IHsgVHhQYXJzZXIgfSBmcm9tICcuLi9zcmMvVHhQYXJzZXInO1xuXG5hc3luYyBmdW5jdGlvbiBydW5Qc2J0Q29tbWFuZChhcmdzOiBzdHJpbmdbXSkge1xuICByZXR1cm4gY21kUHNidC5idWlsZGVyKHlhcmdzKFtdKSkuc3RyaWN0KCkuZXhpdFByb2Nlc3MoZmFsc2UpLnBhcnNlKGFyZ3MpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBhc3NlcnRFcXVhbEZpeHR1cmUocGF0aDogc3RyaW5nLCBmaXh0dXJlOiBzdHJpbmcsIG5ldHdvcmsgPSB1dHhvbGliLm5ldHdvcmtzLmJpdGNvaW4pIHtcbiAgY29uc3QgYWN0dWFsID0gYXdhaXQgZnMucmVhZEZpbGUocGF0aCwgJ3V0ZjgnKTtcbiAgY29uc3QgZXhwZWN0ZWQgPSBhd2FpdCBnZXRGaXh0dXJlU3RyaW5nKGB0ZXN0L2ZpeHR1cmVzL3BzYnQvJHtmaXh0dXJlfWAsIGFjdHVhbCk7XG4gIGFzc2VydC5zdHJpY3RFcXVhbChhY3R1YWwsIGV4cGVjdGVkKTtcbiAgY29uc3QgdHggPSBwYXRoLmVuZHNXaXRoKCcucHNidCcpXG4gICAgPyB1dHhvbGliLmJpdGdvLmNyZWF0ZVBzYnREZWNvZGUoYWN0dWFsLCBuZXR3b3JrKVxuICAgIDogdXR4b2xpYi5iaXRnby5jcmVhdGVUcmFuc2FjdGlvbkZyb21CdWZmZXIoQnVmZmVyLmZyb20oYWN0dWFsLCAnaGV4JyksIG5ldHdvcmssIHsgYW1vdW50VHlwZTogJ2JpZ2ludCcgfSk7XG4gIGNvbnN0IHBhcnNlZCA9IG5ldyBUeFBhcnNlcihUeFBhcnNlci5QQVJTRV9BTEwpLnBhcnNlKHR4KTtcbiAgY29uc3QgZm9ybWF0ID0gZm9ybWF0VHJlZU5vQ29sb3IocGFyc2VkLCB7IHNob3dBbGw6IHRydWUgfSk7XG4gIGFzc2VydC5zdHJpY3RFcXVhbChmb3JtYXQsIGF3YWl0IGdldEZpeHR1cmVTdHJpbmcoYHRlc3QvZml4dHVyZXMvcHNidC8ke2ZpeHR1cmV9LnR4dGAsIGZvcm1hdCkpO1xufVxuXG5mdW5jdGlvbiBtdWx0aShuOiBudW1iZXIsIHhwdWJzOiBzdHJpbmdbXSwgcGF0aDogc3RyaW5nKSB7XG4gIHJldHVybiAnbXVsdGkoJyArIG4gKyAnLCcgKyB4cHVicy5tYXAoKHhwdWIpID0+IHhwdWIgKyBwYXRoKS5qb2luKCcsJykgKyAnKSc7XG59XG5cbmZ1bmN0aW9uIGdldEFkZHJlc3NGcm9tRGVzY3JpcHRvcihkZXNjcmlwdG9yOiBEZXNjcmlwdG9yLCBuZXR3b3JrOiB1dHhvbGliLk5ldHdvcmspIHtcbiAgcmV0dXJuIHV0eG9saWIuYWRkcmVzcy5mcm9tT3V0cHV0U2NyaXB0KEJ1ZmZlci5mcm9tKGRlc2NyaXB0b3Iuc2NyaXB0UHVia2V5KCkpLCBuZXR3b3JrKTtcbn1cblxuZGVzY3JpYmUoJ2NtZFBzYnQgY29tbWFuZHMnLCBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IGtleXMgPSBnZXRLZXlUcmlwbGUoJ2NtZFBzYnQnKTtcbiAgY29uc3QgeHB1YnMgPSBrZXlzLm1hcCgoaykgPT4gay5uZXV0ZXJlZCgpLnRvQmFzZTU4KCkpO1xuICBjb25zdCBkZXNjcmlwdG9yU3RyaW5nID0gYHdzaCgke211bHRpKDIsIHhwdWJzLCAnLyonKX0pYDtcbiAgY29uc3QgZGVzY3JpcHRvciA9IERlc2NyaXB0b3IuZnJvbVN0cmluZyhkZXNjcmlwdG9yU3RyaW5nLCAnZGVyaXZhYmxlJyk7XG5cbiAgaXQoJ2NyZWF0ZXMgZW1wdHkgcHNidCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBhd2FpdCBmcy5ybSgnL3RtcC90ZXN0LnBzYnQnLCB7IGZvcmNlOiB0cnVlIH0pO1xuICAgIGF3YWl0IHJ1blBzYnRDb21tYW5kKFsnY3JlYXRlJywgJy0tcGF0aCcsICcvdG1wL3Rlc3QucHNidCcsICctLWVkaXQnXSk7XG4gICAgYXdhaXQgYXNzZXJ0RXF1YWxGaXh0dXJlKCcvdG1wL3Rlc3QucHNidCcsICcxLmVtcHR5LnBzYnQnKTtcbiAgfSk7XG5cbiAgaXQoJ2FkZHMgZGVzY3JpcHRvciBpbnB1dCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBvdXRwdXRJZCA9IEJ1ZmZlci5hbGxvYygzMikuZmlsbCgxKS50b1N0cmluZygnaGV4JykgKyAnOjAnO1xuICAgIGF3YWl0IHJ1blBzYnRDb21tYW5kKFtcbiAgICAgICdhZGREZXNjcmlwdG9ySW5wdXQnLFxuICAgICAgJy0tcGF0aCcsXG4gICAgICAnL3RtcC90ZXN0LnBzYnQnLFxuICAgICAgJy0tZWRpdCcsXG4gICAgICAnLS1vdXRwdXRJZCcsXG4gICAgICBvdXRwdXRJZCxcbiAgICAgICctLXZhbHVlJyxcbiAgICAgICcxMDAwMDAwJyxcbiAgICAgICctLWRlc2NyaXB0b3InLFxuICAgICAgZGVzY3JpcHRvclN0cmluZyxcbiAgICAgICctLWRlc2NyaXB0b3JJbmRleCcsXG4gICAgICAnMCcsXG4gICAgXSk7XG4gICAgYXdhaXQgYXNzZXJ0RXF1YWxGaXh0dXJlKCcvdG1wL3Rlc3QucHNidCcsICcyLmFkZERlc2NyaXB0b3JJbnB1dC5wc2J0Jyk7XG4gIH0pO1xuXG4gIGl0KCdhZGQgb3V0cHV0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGF3YWl0IHJ1blBzYnRDb21tYW5kKFtcbiAgICAgICdhZGRPdXRwdXQnLFxuICAgICAgJy0tcGF0aCcsXG4gICAgICAnL3RtcC90ZXN0LnBzYnQnLFxuICAgICAgJy0tZWRpdCcsXG4gICAgICAnLS1hZGRyZXNzJyxcbiAgICAgIGdldEFkZHJlc3NGcm9tRGVzY3JpcHRvcihkZXNjcmlwdG9yLmF0RGVyaXZhdGlvbkluZGV4KDEpLCB1dHhvbGliLm5ldHdvcmtzLmJpdGNvaW4pLFxuICAgICAgJy0tYW1vdW50JyxcbiAgICAgICcxMTExJyxcbiAgICBdKTtcbiAgICBhd2FpdCBhc3NlcnRFcXVhbEZpeHR1cmUoJy90bXAvdGVzdC5wc2J0JywgJzMuYWRkT3V0cHV0LnBzYnQnKTtcbiAgfSk7XG5cbiAgaXQoJ2FkZCBtYXggb3V0cHV0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGF3YWl0IHJ1blBzYnRDb21tYW5kKFtcbiAgICAgICdhZGRPdXRwdXQnLFxuICAgICAgJy0tcGF0aCcsXG4gICAgICAnL3RtcC90ZXN0LnBzYnQnLFxuICAgICAgJy0tZWRpdCcsXG4gICAgICAnLS1hZGRyZXNzJyxcbiAgICAgIGdldEFkZHJlc3NGcm9tRGVzY3JpcHRvcihkZXNjcmlwdG9yLmF0RGVyaXZhdGlvbkluZGV4KDIpLCB1dHhvbGliLm5ldHdvcmtzLmJpdGNvaW4pLFxuICAgICAgJy0tYW1vdW50JyxcbiAgICAgICdtYXgnLFxuICAgICAgJy0tZmVlUmF0ZVNhdEInLFxuICAgICAgJzEwJyxcbiAgICBdKTtcblxuICAgIGF3YWl0IGFzc2VydEVxdWFsRml4dHVyZSgnL3RtcC90ZXN0LnBzYnQnLCAnNC5hZGRNYXhPdXRwdXQucHNidCcpO1xuICB9KTtcblxuICBpdCgnc2lnbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBhd2FpdCBydW5Qc2J0Q29tbWFuZChbJ3NpZ24nLCAnLS1wYXRoJywgJy90bXAvdGVzdC5wc2J0JywgJy0tZWRpdCcsICctLWtleScsIGtleXNbMF0udG9CYXNlNTgoKV0pO1xuICAgIGF3YWl0IHJ1blBzYnRDb21tYW5kKFsnc2lnbicsICctLXBhdGgnLCAnL3RtcC90ZXN0LnBzYnQnLCAnLS1lZGl0JywgJy0ta2V5Jywga2V5c1sxXS50b0Jhc2U1OCgpXSk7XG4gICAgYXdhaXQgYXNzZXJ0RXF1YWxGaXh0dXJlKCcvdG1wL3Rlc3QucHNidCcsICc1LnNpZ24ucHNidCcpO1xuICB9KTtcblxuICBpdCgnZmluYWxpemUnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgYXdhaXQgcnVuUHNidENvbW1hbmQoWydmaW5hbGl6ZScsICctLXBhdGgnLCAnL3RtcC90ZXN0LnBzYnQnLCAnLS1lZGl0J10pO1xuICAgIGF3YWl0IGFzc2VydEVxdWFsRml4dHVyZSgnL3RtcC90ZXN0LnBzYnQnLCAnNi5maW5hbGl6ZS5wc2J0Jyk7XG4gIH0pO1xuXG4gIGl0KCdleHRyYWN0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGF3YWl0IHJ1blBzYnRDb21tYW5kKFsnZXh0cmFjdCcsICctLXBhdGgnLCAnL3RtcC90ZXN0LnBzYnQnLCAnLS1vdXQnLCAnL3RtcC90ZXN0LmhleCddKTtcbiAgICBhd2FpdCBhc3NlcnRFcXVhbEZpeHR1cmUoJy90bXAvdGVzdC5oZXgnLCAnNy5leHRyYWN0LmhleCcpO1xuICB9KTtcbn0pO1xuIl19