PHP WebShell
Текущая директория: /opt/BitGoJS/modules/utxo-lib/dist/test/bitgo/wallet
Просмотр файла: WalletOutput.js
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const assert = require("assert");
const WalletOutput_1 = require("../../../src/bitgo/wallet/WalletOutput");
const keys_1 = require("../../../src/testutil/keys");
describe('WalletOutput', function () {
describe('getScriptIdFromOutput', function () {
const rootWalletKeys = (0, keys_1.getDefaultWalletKeys)();
it('should extract script id from output created with getPsbtBip32DerivationOutputUpdate for non-taproot', function () {
// Create a derived wallet keys for chain 10, index 20
const walletKeys = rootWalletKeys.deriveForChainAndIndex(10, 20);
// Get derivation data using the function we want to test against
const update = (0, WalletOutput_1.getPsbtBip32DerivationOutputUpdate)(rootWalletKeys, walletKeys, 'p2sh');
// Extract script id from the output
const scriptId = (0, WalletOutput_1.getScriptIdFromOutput)(update);
// Verify the extracted script id matches what we expect
assert.strictEqual(scriptId.chain, 10);
assert.strictEqual(scriptId.index, 20);
});
it('should extract script id from output created with getPsbtBip32DerivationOutputUpdate for taproot', function () {
// Create a derived wallet keys for chain 11, index 22
const walletKeys = rootWalletKeys.deriveForChainAndIndex(11, 22);
// Create a mock payment object with redeems property
const mockPayment = {
redeems: [
{
output: Buffer.alloc(32),
pubkeys: [walletKeys.triple[0].publicKey, walletKeys.triple[1].publicKey],
},
],
};
// Get derivation data using the function we want to test against
const update = (0, WalletOutput_1.getPsbtBip32DerivationOutputUpdate)(rootWalletKeys, walletKeys, 'p2tr', mockPayment);
// Extract script id from the output
const scriptId = (0, WalletOutput_1.getScriptIdFromOutput)(update);
// Verify the extracted script id matches what we expect
assert.strictEqual(scriptId.chain, 11);
assert.strictEqual(scriptId.index, 22);
});
it('should extract script id from output with bip32Derivation', function () {
const output = {
bip32Derivation: [{ path: 'm/0/0' }, { path: 'm/0/0' }, { path: 'm/0/0' }],
};
const scriptId = (0, WalletOutput_1.getScriptIdFromOutput)(output);
assert.strictEqual(scriptId.chain, 0);
assert.strictEqual(scriptId.index, 0);
});
it('should extract script id from output with tapBip32Derivation', function () {
const output = {
tapBip32Derivation: [{ path: 'm/0/123' }, { path: 'm/0/123' }, { path: 'm/0/123' }],
};
const scriptId = (0, WalletOutput_1.getScriptIdFromOutput)(output);
assert.strictEqual(scriptId.chain, 0);
assert.strictEqual(scriptId.index, 123);
});
it('should throw error when output has both bip32Derivation and tapBip32Derivation', function () {
const output = {
bip32Derivation: [{ path: 'm/0/0' }],
tapBip32Derivation: [{ path: 'm/0/0' }],
};
assert.throws(() => {
(0, WalletOutput_1.getScriptIdFromOutput)(output);
}, /cannot get script id from output with both bip32Derivation and tapBip32Derivation/);
});
it('should throw error when output has neither bip32Derivation nor tapBip32Derivation', function () {
const output = {};
assert.throws(() => {
(0, WalletOutput_1.getScriptIdFromOutput)(output);
}, /cannot get script id from output without bip32Derivation or tapBip32Derivation/);
});
it('should throw error when paths have mismatched chain', function () {
const output = {
bip32Derivation: [{ path: 'm/0/0' }, { path: 'm/1/0' }, { path: 'm/0/0' }],
};
assert.throws(() => {
(0, WalletOutput_1.getScriptIdFromOutput)(output);
}, /chain mismatch/);
});
it('should throw error when paths have mismatched index', function () {
const output = {
bip32Derivation: [{ path: 'm/0/0' }, { path: 'm/0/1' }, { path: 'm/0/0' }],
};
assert.throws(() => {
(0, WalletOutput_1.getScriptIdFromOutput)(output);
}, /index mismatch/);
});
it('should throw error when derivation array is empty', function () {
const output = {
bip32Derivation: [],
};
assert.throws(() => {
(0, WalletOutput_1.getScriptIdFromOutput)(output);
}, /cannot fold empty script ids/);
});
});
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiV2FsbGV0T3V0cHV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC9iaXRnby93YWxsZXQvV2FsbGV0T3V0cHV0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsaUNBQWlDO0FBRWpDLHlFQUFtSDtBQUNuSCxxREFBa0U7QUFFbEUsUUFBUSxDQUFDLGNBQWMsRUFBRTtJQUN2QixRQUFRLENBQUMsdUJBQXVCLEVBQUU7UUFDaEMsTUFBTSxjQUFjLEdBQUcsSUFBQSwyQkFBb0IsR0FBRSxDQUFDO1FBRTlDLEVBQUUsQ0FBQyxzR0FBc0csRUFBRTtZQUN6RyxzREFBc0Q7WUFDdEQsTUFBTSxVQUFVLEdBQUcsY0FBYyxDQUFDLHNCQUFzQixDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUVqRSxpRUFBaUU7WUFDakUsTUFBTSxNQUFNLEdBQUcsSUFBQSxpREFBa0MsRUFBQyxjQUFjLEVBQUUsVUFBVSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBRXRGLG9DQUFvQztZQUNwQyxNQUFNLFFBQVEsR0FBRyxJQUFBLG9DQUFxQixFQUFDLE1BQU0sQ0FBQyxDQUFDO1lBRS9DLHdEQUF3RDtZQUN4RCxNQUFNLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDdkMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3pDLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLGtHQUFrRyxFQUFFO1lBQ3JHLHNEQUFzRDtZQUN0RCxNQUFNLFVBQVUsR0FBRyxjQUFjLENBQUMsc0JBQXNCLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBRWpFLHFEQUFxRDtZQUNyRCxNQUFNLFdBQVcsR0FBRztnQkFDbEIsT0FBTyxFQUFFO29CQUNQO3dCQUNFLE1BQU0sRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FB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QUFJLEVBQUUsT0FBTyxFQUFFLENBQUM7YUFDM0UsQ0FBQztZQUVGLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFO2dCQUNqQixJQUFBLG9DQUFxQixFQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ2hDLENBQUMsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3ZCLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLHFEQUFxRCxFQUFFO1lBQ3hELE1BQU0sTUFBTSxHQUFHO2dCQUNiLGVBQWUsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxDQUFDO2FBQzNFLENBQUM7WUFFRixNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRTtnQkFDakIsSUFBQSxvQ0FBcUIsRUFBQyxNQUFNLENBQUMsQ0FBQztZQUNoQyxDQUFDLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztRQUN2QixDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxtREFBbUQsRUFBRTtZQUN0RCxNQUFNLE1BQU0sR0FBRztnQkFDYixlQUFlLEVBQUUsRUFBRTthQUNwQixDQUFDO1lBRUYsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUU7Z0JBQ2pCLElBQUEsb0NBQXFCLEVBQUMsTUFBTSxDQUFDLENBQUM7WUFDaEMsQ0FBQyxFQUFFLDhCQUE4QixDQUFDLENBQUM7UUFDckMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5cbmltcG9ydCB7IGdldFNjcmlwdElkRnJvbU91dHB1dCwgZ2V0UHNidEJpcDMyRGVyaXZhdGlvbk91dHB1dFVwZGF0ZSB9IGZyb20gJy4uLy4uLy4uL3NyYy9iaXRnby93YWxsZXQvV2FsbGV0T3V0cHV0JztcbmltcG9ydCB7IGdldERlZmF1bHRXYWxsZXRLZXlzIH0gZnJvbSAnLi4vLi4vLi4vc3JjL3Rlc3R1dGlsL2tleXMnO1xuXG5kZXNjcmliZSgnV2FsbGV0T3V0cHV0JywgZnVuY3Rpb24gKCkge1xuICBkZXNjcmliZSgnZ2V0U2NyaXB0SWRGcm9tT3V0cHV0JywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHJvb3RXYWxsZXRLZXlzID0gZ2V0RGVmYXVsdFdhbGxldEtleXMoKTtcblxuICAgIGl0KCdzaG91bGQgZXh0cmFjdCBzY3JpcHQgaWQgZnJvbSBvdXRwdXQgY3JlYXRlZCB3aXRoIGdldFBzYnRCaXAzMkRlcml2YXRpb25PdXRwdXRVcGRhdGUgZm9yIG5vbi10YXByb290JywgZnVuY3Rpb24gKCkge1xuICAgICAgLy8gQ3JlYXRlIGEgZGVyaXZlZCB3YWxsZXQga2V5cyBmb3IgY2hhaW4gMTAsIGluZGV4IDIwXG4gICAgICBjb25zdCB3YWxsZXRLZXlzID0gcm9vdFdhbGxldEtleXMuZGVyaXZlRm9yQ2hhaW5BbmRJbmRleCgxMCwgMjApO1xuXG4gICAgICAvLyBHZXQgZGVyaXZhdGlvbiBkYXRhIHVzaW5nIHRoZSBmdW5jdGlvbiB3ZSB3YW50IHRvIHRlc3QgYWdhaW5zdFxuICAgICAgY29uc3QgdXBkYXRlID0gZ2V0UHNidEJpcDMyRGVyaXZhdGlvbk91dHB1dFVwZGF0ZShyb290V2FsbGV0S2V5cywgd2FsbGV0S2V5cywgJ3Ayc2gnKTtcblxuICAgICAgLy8gRXh0cmFjdCBzY3JpcHQgaWQgZnJvbSB0aGUgb3V0cHV0XG4gICAgICBjb25zdCBzY3JpcHRJZCA9IGdldFNjcmlwdElkRnJvbU91dHB1dCh1cGRhdGUpO1xuXG4gICAgICAvLyBWZXJpZnkgdGhlIGV4dHJhY3RlZCBzY3JpcHQgaWQgbWF0Y2hlcyB3aGF0IHdlIGV4cGVjdFxuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHNjcmlwdElkLmNoYWluLCAxMCk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoc2NyaXB0SWQuaW5kZXgsIDIwKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZXh0cmFjdCBzY3JpcHQgaWQgZnJvbSBvdXRwdXQgY3JlYXRlZCB3aXRoIGdldFBzYnRCaXAzMkRlcml2YXRpb25PdXRwdXRVcGRhdGUgZm9yIHRhcHJvb3QnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBDcmVhdGUgYSBkZXJpdmVkIHdhbGxldCBrZXlzIGZvciBjaGFpbiAxMSwgaW5kZXggMjJcbiAgICAgIGNvbnN0IHdhbGxldEtleXMgPSByb290V2FsbGV0S2V5cy5kZXJpdmVGb3JDaGFpbkFuZEluZGV4KDExLCAyMik7XG5cbiAgICAgIC8vIENyZWF0ZSBhIG1vY2sgcGF5bWVudCBvYmplY3Qgd2l0aCByZWRlZW1zIHByb3BlcnR5XG4gICAgICBjb25zdCBtb2NrUGF5bWVudCA9IHtcbiAgICAgICAgcmVkZWVtczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG91dHB1dDogQnVmZmVyLmFsbG9jKDMyKSxcbiAgICAgICAgICAgIHB1YmtleXM6IFt3YWxsZXRLZXlzLnRyaXBsZVswXS5wdWJsaWNLZXksIHdhbGxldEtleXMudHJpcGxlWzFdLnB1YmxpY0tleV0sXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH07XG5cbiAgICAgIC8vIEdldCBkZXJpdmF0aW9uIGRhdGEgdXNpbmcgdGhlIGZ1bmN0aW9uIHdlIHdhbnQgdG8gdGVzdCBhZ2FpbnN0XG4gICAgICBjb25zdCB1cGRhdGUgPSBnZXRQc2J0QmlwMzJEZXJpdmF0aW9uT3V0cHV0VXBkYXRlKHJvb3RXYWxsZXRLZXlzLCB3YWxsZXRLZXlzLCAncDJ0cicsIG1vY2tQYXltZW50KTtcblxuICAgICAgLy8gRXh0cmFjdCBzY3JpcHQgaWQgZnJvbSB0aGUgb3V0cHV0XG4gICAgICBjb25zdCBzY3JpcHRJZCA9IGdldFNjcmlwdElkRnJvbU91dHB1dCh1cGRhdGUpO1xuXG4gICAgICAvLyBWZXJpZnkgdGhlIGV4dHJhY3RlZCBzY3JpcHQgaWQgbWF0Y2hlcyB3aGF0IHdlIGV4cGVjdFxuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHNjcmlwdElkLmNoYWluLCAxMSk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoc2NyaXB0SWQuaW5kZXgsIDIyKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZXh0cmFjdCBzY3JpcHQgaWQgZnJvbSBvdXRwdXQgd2l0aCBiaXAzMkRlcml2YXRpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBvdXRwdXQgPSB7XG4gICAgICAgIGJpcDMyRGVyaXZhdGlvbjogW3sgcGF0aDogJ20vMC8wJyB9LCB7IHBhdGg6ICdtLzAvMCcgfSwgeyBwYXRoOiAnbS8wLzAnIH1dLFxuICAgICAgfTtcblxuICAgICAgY29uc3Qgc2NyaXB0SWQgPSBnZXRTY3JpcHRJZEZyb21PdXRwdXQob3V0cHV0KTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChzY3JpcHRJZC5jaGFpbiwgMCk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoc2NyaXB0SWQuaW5kZXgsIDApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBleHRyYWN0IHNjcmlwdCBpZCBmcm9tIG91dHB1dCB3aXRoIHRhcEJpcDMyRGVyaXZhdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG91dHB1dCA9IHtcbiAgICAgICAgdGFwQmlwMzJEZXJpdmF0aW9uOiBbeyBwYXRoOiAnbS8wLzEyMycgfSwgeyBwYXRoOiAnbS8wLzEyMycgfSwgeyBwYXRoOiAnbS8wLzEyMycgfV0sXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBzY3JpcHRJZCA9IGdldFNjcmlwdElkRnJvbU91dHB1dChvdXRwdXQpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHNjcmlwdElkLmNoYWluLCAwKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChzY3JpcHRJZC5pbmRleCwgMTIzKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgZXJyb3Igd2hlbiBvdXRwdXQgaGFzIGJvdGggYmlwMzJEZXJpdmF0aW9uIGFuZCB0YXBCaXAzMkRlcml2YXRpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBvdXRwdXQgPSB7XG4gICAgICAgIGJpcDMyRGVyaXZhdGlvbjogW3sgcGF0aDogJ20vMC8wJyB9XSxcbiAgICAgICAgdGFwQmlwMzJEZXJpdmF0aW9uOiBbeyBwYXRoOiAnbS8wLzAnIH1dLFxuICAgICAgfTtcblxuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiB7XG4gICAgICAgIGdldFNjcmlwdElkRnJvbU91dHB1dChvdXRwdXQpO1xuICAgICAgfSwgL2Nhbm5vdCBnZXQgc2NyaXB0IGlkIGZyb20gb3V0cHV0IHdpdGggYm90aCBiaXAzMkRlcml2YXRpb24gYW5kIHRhcEJpcDMyRGVyaXZhdGlvbi8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBlcnJvciB3aGVuIG91dHB1dCBoYXMgbmVpdGhlciBiaXAzMkRlcml2YXRpb24gbm9yIHRhcEJpcDMyRGVyaXZhdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG91dHB1dCA9IHt9O1xuXG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHtcbiAgICAgICAgZ2V0U2NyaXB0SWRGcm9tT3V0cHV0KG91dHB1dCk7XG4gICAgICB9LCAvY2Fubm90IGdldCBzY3JpcHQgaWQgZnJvbSBvdXRwdXQgd2l0aG91dCBiaXAzMkRlcml2YXRpb24gb3IgdGFwQmlwMzJEZXJpdmF0aW9uLyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGVycm9yIHdoZW4gcGF0aHMgaGF2ZSBtaXNtYXRjaGVkIGNoYWluJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgb3V0cHV0ID0ge1xuICAgICAgICBiaXAzMkRlcml2YXRpb246IFt7IHBhdGg6ICdtLzAvMCcgfSwgeyBwYXRoOiAnbS8xLzAnIH0sIHsgcGF0aDogJ20vMC8wJyB9XSxcbiAgICAgIH07XG5cbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4ge1xuICAgICAgICBnZXRTY3JpcHRJZEZyb21PdXRwdXQob3V0cHV0KTtcbiAgICAgIH0sIC9jaGFpbiBtaXNtYXRjaC8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBlcnJvciB3aGVuIHBhdGhzIGhhdmUgbWlzbWF0Y2hlZCBpbmRleCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG91dHB1dCA9IHtcbiAgICAgICAgYmlwMzJEZXJpdmF0aW9uOiBbeyBwYXRoOiAnbS8wLzAnIH0sIHsgcGF0aDogJ20vMC8xJyB9LCB7IHBhdGg6ICdtLzAvMCcgfV0sXG4gICAgICB9O1xuXG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHtcbiAgICAgICAgZ2V0U2NyaXB0SWRGcm9tT3V0cHV0KG91dHB1dCk7XG4gICAgICB9LCAvaW5kZXggbWlzbWF0Y2gvKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgZXJyb3Igd2hlbiBkZXJpdmF0aW9uIGFycmF5IGlzIGVtcHR5JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgb3V0cHV0ID0ge1xuICAgICAgICBiaXAzMkRlcml2YXRpb246IFtdLFxuICAgICAgfTtcblxuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiB7XG4gICAgICAgIGdldFNjcmlwdElkRnJvbU91dHB1dChvdXRwdXQpO1xuICAgICAgfSwgL2Nhbm5vdCBmb2xkIGVtcHR5IHNjcmlwdCBpZHMvKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==Выполнить команду
Для локальной разработки. Не используйте в интернете!