PHP WebShell
Текущая директория: /usr/lib/node_modules/bitgo/node_modules/@bitgo/utxo-lib/dist/src/payments
Просмотр файла: p2tr_ns.js
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.p2tr_ns = p2tr_ns;
const networks_1 = require("../networks");
const bitcoinjs_lib_1 = require("bitcoinjs-lib");
const OPS = bitcoinjs_lib_1.script.OPS;
const typef = require('typeforce');
const BITCOIN_NETWORK = networks_1.networks.bitcoin;
function stacksEqual(a, b) {
if (a.length !== b.length)
return false;
return a.every((x, i) => {
return x.equals(b[i]);
});
}
// input: [signatures ...]
// output: [pubKeys[0:n-1] OP_CHECKSIGVERIFY] pubKeys[n-1] OP_CHECKSIG
function p2tr_ns(a, opts) {
if (!a.input && !a.output && !(a.pubkeys && a.pubkeys.length) && !a.signatures) {
throw new TypeError('Not enough data');
}
opts = Object.assign({ validate: true }, opts || {});
if (!opts.eccLib)
throw new Error('ECC Library is required for p2tr_ns.');
const ecc = opts.eccLib;
function isAcceptableSignature(x) {
if (Buffer.isBuffer(x)) {
return (
// empty signatures may be represented as empty buffers
(opts && opts.allowIncomplete && x.length === 0) || bitcoinjs_lib_1.script.isCanonicalSchnorrSignature(x));
}
return !!(opts && opts.allowIncomplete && x === OPS.OP_0);
}
typef({
network: typef.maybe(typef.Object),
output: typef.maybe(typef.Buffer),
pubkeys: typef.maybe(typef.arrayOf(ecc.isXOnlyPoint)),
signatures: typef.maybe(typef.arrayOf(isAcceptableSignature)),
input: typef.maybe(typef.Buffer),
}, a);
const network = a.network || BITCOIN_NETWORK;
const o = { network };
const _chunks = bitcoinjs_lib_1.lazy.value(() => {
if (!a.output)
return;
return bitcoinjs_lib_1.script.decompile(a.output);
});
bitcoinjs_lib_1.lazy.prop(o, 'output', () => {
if (!a.pubkeys)
return;
return bitcoinjs_lib_1.script.compile([].concat(...a.pubkeys.map((pk, i, pks) => [pk, i === pks.length - 1 ? OPS.OP_CHECKSIG : OPS.OP_CHECKSIGVERIFY])));
});
bitcoinjs_lib_1.lazy.prop(o, 'n', () => {
if (!o.pubkeys)
return;
return o.pubkeys.length;
});
bitcoinjs_lib_1.lazy.prop(o, 'pubkeys', () => {
const chunks = _chunks();
if (!chunks)
return;
return chunks.filter((_, index) => index % 2 === 0);
});
bitcoinjs_lib_1.lazy.prop(o, 'signatures', () => {
if (!a.input)
return;
return bitcoinjs_lib_1.script.decompile(a.input)?.reverse();
});
bitcoinjs_lib_1.lazy.prop(o, 'input', () => {
if (!a.signatures)
return;
return bitcoinjs_lib_1.script.compile([...a.signatures].reverse());
});
bitcoinjs_lib_1.lazy.prop(o, 'witness', () => {
if (!o.input)
return;
return [];
});
bitcoinjs_lib_1.lazy.prop(o, 'name', () => {
if (!o.n)
return;
return `p2tr_ns(${o.n})`;
});
// extended validation
if (opts.validate) {
const chunks = _chunks();
if (chunks) {
if (chunks[chunks.length - 1] !== OPS.OP_CHECKSIG) {
throw new TypeError('Output ends with unexpected opcode');
}
if (chunks
.filter((_, index) => index % 2 === 1)
.slice(0, -1)
.some((op) => op !== OPS.OP_CHECKSIGVERIFY)) {
throw new TypeError('Output contains unexpected opcode');
}
if (o.n > 16 || o.n !== chunks.length / 2) {
throw new TypeError('Output contains too many pubkeys');
}
if (o.pubkeys.some((x) => !ecc.isXOnlyPoint(x))) {
throw new TypeError('Output contains invalid pubkey(s)');
}
if (a.pubkeys && !stacksEqual(a.pubkeys, o.pubkeys)) {
throw new TypeError('Pubkeys mismatch');
}
}
if (a.pubkeys && a.pubkeys.length) {
o.n = a.pubkeys.length;
}
if (a.signatures && o.n) {
if (a.signatures.length < o.n) {
throw new TypeError('Not enough signatures provided');
}
if (a.signatures.length > o.n) {
throw new TypeError('Too many signatures provided');
}
}
if (a.input) {
if (!o.signatures.every(isAcceptableSignature)) {
throw new TypeError('Input has invalid signature(s)');
}
if (a.signatures && !stacksEqual(a.signatures, o.signatures)) {
throw new TypeError('Signature mismatch');
}
if (o.n !== o.signatures.length) {
throw new TypeError(`Signature count mismatch (n: ${o.n}, signatures.length: ${o.signatures.length}`);
}
}
}
return Object.assign(o, a);
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicDJ0cl9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9wYXltZW50cy9wMnRyX25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBa0JBLDBCQWdJQztBQWxKRCwwQ0FBdUM7QUFDdkMsaURBQXFGO0FBRXJGLE1BQU0sR0FBRyxHQUFHLHNCQUFPLENBQUMsR0FBRyxDQUFDO0FBQ3hCLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUVuQyxNQUFNLGVBQWUsR0FBRyxtQkFBUSxDQUFDLE9BQU8sQ0FBQztBQUV6QyxTQUFTLFdBQVcsQ0FBQyxDQUFXLEVBQUUsQ0FBVztJQUMzQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLE1BQU07UUFBRSxPQUFPLEtBQUssQ0FBQztJQUV4QyxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDdEIsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3hCLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVELDBCQUEwQjtBQUMxQixzRUFBc0U7QUFDdEUsU0FBZ0IsT0FBTyxDQUFDLENBQVUsRUFBRSxJQUFrQjtJQUNwRCxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUMvRSxNQUFNLElBQUksU0FBUyxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFDekMsQ0FBQztJQUNELElBQUksR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxFQUFFLElBQUksSUFBSSxFQUFFLENB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QUM7SUFFRCxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQzdCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBuZXR3b3JrcyB9IGZyb20gJy4uL25ldHdvcmtzJztcbmltcG9ydCB7IHNjcmlwdCBhcyBic2NyaXB0LCBQYXltZW50LCBQYXltZW50T3B0cywgU3RhY2ssIGxhenkgfSBmcm9tICdiaXRjb2luanMtbGliJztcblxuY29uc3QgT1BTID0gYnNjcmlwdC5PUFM7XG5jb25zdCB0eXBlZiA9IHJlcXVpcmUoJ3R5cGVmb3JjZScpO1xuXG5jb25zdCBCSVRDT0lOX05FVFdPUksgPSBuZXR3b3Jrcy5iaXRjb2luO1xuXG5mdW5jdGlvbiBzdGFja3NFcXVhbChhOiBCdWZmZXJbXSwgYjogQnVmZmVyW10pOiBib29sZWFuIHtcbiAgaWYgKGEubGVuZ3RoICE9PSBiLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBhLmV2ZXJ5KCh4LCBpKSA9PiB7XG4gICAgcmV0dXJuIHguZXF1YWxzKGJbaV0pO1xuICB9KTtcbn1cblxuLy8gaW5wdXQ6IFtzaWduYXR1cmVzIC4uLl1cbi8vIG91dHB1dDogW3B1YktleXNbMDpuLTFdIE9QX0NIRUNLU0lHVkVSSUZZXSBwdWJLZXlzW24tMV0gT1BfQ0hFQ0tTSUdcbmV4cG9ydCBmdW5jdGlvbiBwMnRyX25zKGE6IFBheW1lbnQsIG9wdHM/OiBQYXltZW50T3B0cyk6IFBheW1lbnQge1xuICBpZiAoIWEuaW5wdXQgJiYgIWEub3V0cHV0ICYmICEoYS5wdWJrZXlzICYmIGEucHVia2V5cy5sZW5ndGgpICYmICFhLnNpZ25hdHVyZXMpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdOb3QgZW5vdWdoIGRhdGEnKTtcbiAgfVxuICBvcHRzID0gT2JqZWN0LmFzc2lnbih7IHZhbGlkYXRlOiB0cnVlIH0sIG9wdHMgfHwge30pO1xuXG4gIGlmICghb3B0cy5lY2NMaWIpIHRocm93IG5ldyBFcnJvcignRUNDIExpYnJhcnkgaXMgcmVxdWlyZWQgZm9yIHAydHJfbnMuJyk7XG4gIGNvbnN0IGVjYyA9IG9wdHMuZWNjTGliO1xuXG4gIGZ1bmN0aW9uIGlzQWNjZXB0YWJsZVNpZ25hdHVyZSh4OiBCdWZmZXIgfCBudW1iZXIpOiBib29sZWFuIHtcbiAgICBpZiAoQnVmZmVyLmlzQnVmZmVyKHgpKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICAvLyBlbXB0eSBzaWduYXR1cmVzIG1heSBiZSByZXByZXNlbnRlZCBhcyBlbXB0eSBidWZmZXJzXG4gICAgICAgIChvcHRzICYmIG9wdHMuYWxsb3dJbmNvbXBsZXRlICYmIHgubGVuZ3RoID09PSAwKSB8fCBic2NyaXB0LmlzQ2Fub25pY2FsU2Nobm9yclNpZ25hdHVyZSh4KVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuICEhKG9wdHMgJiYgb3B0cy5hbGxvd0luY29tcGxldGUgJiYgeCA9PT0gT1BTLk9QXzApO1xuICB9XG5cbiAgdHlwZWYoXG4gICAge1xuICAgICAgbmV0d29yazogdHlwZWYubWF5YmUodHlwZWYuT2JqZWN0KSxcbiAgICAgIG91dHB1dDogdHlwZWYubWF5YmUodHlwZWYuQnVmZmVyKSxcbiAgICAgIHB1YmtleXM6IHR5cGVmLm1heWJlKHR5cGVmLmFycmF5T2YoZWNjLmlzWE9ubHlQb2ludCkpLFxuXG4gICAgICBzaWduYXR1cmVzOiB0eXBlZi5tYXliZSh0eXBlZi5hcnJheU9mKGlzQWNjZXB0YWJsZVNpZ25hdHVyZSkpLFxuICAgICAgaW5wdXQ6IHR5cGVmLm1heWJlKHR5cGVmLkJ1ZmZlciksXG4gICAgfSxcbiAgICBhXG4gICk7XG5cbiAgY29uc3QgbmV0d29yayA9IGEubmV0d29yayB8fCBCSVRDT0lOX05FVFdPUks7XG4gIGNvbnN0IG86IFBheW1lbnQgPSB7IG5ldHdvcmsgfTtcblxuICBjb25zdCBfY2h1bmtzID0gbGF6eS52YWx1ZSgoKSA9PiB7XG4gICAgaWYgKCFhLm91dHB1dCkgcmV0dXJuO1xuICAgIHJldHVybiBic2NyaXB0LmRlY29tcGlsZShhLm91dHB1dCkgYXMgU3RhY2s7XG4gIH0pO1xuXG4gIGxhenkucHJvcChvLCAnb3V0cHV0JywgKCkgPT4ge1xuICAgIGlmICghYS5wdWJrZXlzKSByZXR1cm47XG4gICAgcmV0dXJuIGJzY3JpcHQuY29tcGlsZShcbiAgICAgIChbXSBhcyBTdGFjaykuY29uY2F0KFxuICAgICAgICAuLi5hLnB1YmtleXMubWFwKChwaywgaSwgcGtzKSA9PiBbcGssIGkgPT09IHBrcy5sZW5ndGggLSAxID8gT1BTLk9QX0NIRUNLU0lHIDogT1BTLk9QX0NIRUNLU0lHVkVSSUZZXSlcbiAgICAgIClcbiAgICApO1xuICB9KTtcbiAgbGF6eS5wcm9wKG8sICduJywgKCkgPT4ge1xuICAgIGlmICghby5wdWJrZXlzKSByZXR1cm47XG4gICAgcmV0dXJuIG8ucHVia2V5cy5sZW5ndGg7XG4gIH0pO1xuICBsYXp5LnByb3AobywgJ3B1YmtleXMnLCAoKSA9PiB7XG4gICAgY29uc3QgY2h1bmtzID0gX2NodW5rcygpO1xuICAgIGlmICghY2h1bmtzKSByZXR1cm47XG4gICAgcmV0dXJuIGNodW5rcy5maWx0ZXIoKF8sIGluZGV4KSA9PiBpbmRleCAlIDIgPT09IDApIGFzIEJ1ZmZlcltdO1xuICB9KTtcbiAgbGF6eS5wcm9wKG8sICdzaWduYXR1cmVzJywgKCkgPT4ge1xuICAgIGlmICghYS5pbnB1dCkgcmV0dXJuO1xuICAgIHJldHVybiBic2NyaXB0LmRlY29tcGlsZShhLmlucHV0KT8ucmV2ZXJzZSgpO1xuICB9KTtcbiAgbGF6eS5wcm9wKG8sICdpbnB1dCcsICgpID0+IHtcbiAgICBpZiAoIWEuc2lnbmF0dXJlcykgcmV0dXJuO1xuICAgIHJldHVybiBic2NyaXB0LmNvbXBpbGUoWy4uLmEuc2lnbmF0dXJlc10ucmV2ZXJzZSgpKTtcbiAgfSk7XG4gIGxhenkucHJvcChvLCAnd2l0bmVzcycsICgpID0+IHtcbiAgICBpZiAoIW8uaW5wdXQpIHJldHVybjtcbiAgICByZXR1cm4gW107XG4gIH0pO1xuICBsYXp5LnByb3AobywgJ25hbWUnLCAoKSA9PiB7XG4gICAgaWYgKCFvLm4pIHJldHVybjtcbiAgICByZXR1cm4gYHAydHJfbnMoJHtvLm59KWA7XG4gIH0pO1xuXG4gIC8vIGV4dGVuZGVkIHZhbGlkYXRpb25cbiAgaWYgKG9wdHMudmFsaWRhdGUpIHtcbiAgICBjb25zdCBjaHVua3MgPSBfY2h1bmtzKCk7XG4gICAgaWYgKGNodW5rcykge1xuICAgICAgaWYgKGNodW5rc1tjaHVua3MubGVuZ3RoIC0gMV0gIT09IE9QUy5PUF9DSEVDS1NJRykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdPdXRwdXQgZW5kcyB3aXRoIHVuZXhwZWN0ZWQgb3Bjb2RlJyk7XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIGNodW5rc1xuICAgICAgICAgIC5maWx0ZXIoKF8sIGluZGV4KSA9PiBpbmRleCAlIDIgPT09IDEpXG4gICAgICAgICAgLnNsaWNlKDAsIC0xKVxuICAgICAgICAgIC5zb21lKChvcCkgPT4gb3AgIT09IE9QUy5PUF9DSEVDS1NJR1ZFUklGWSlcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdPdXRwdXQgY29udGFpbnMgdW5leHBlY3RlZCBvcGNvZGUnKTtcbiAgICAgIH1cbiAgICAgIGlmIChvLm4hID4gMTYgfHwgby5uICE9PSBjaHVua3MubGVuZ3RoIC8gMikge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdPdXRwdXQgY29udGFpbnMgdG9vIG1hbnkgcHVia2V5cycpO1xuICAgICAgfVxuICAgICAgaWYgKG8ucHVia2V5cyEuc29tZSgoeCkgPT4gIWVjYy5pc1hPbmx5UG9pbnQoeCkpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ091dHB1dCBjb250YWlucyBpbnZhbGlkIHB1YmtleShzKScpO1xuICAgICAgfVxuXG4gICAgICBpZiAoYS5wdWJrZXlzICYmICFzdGFja3NFcXVhbChhLnB1YmtleXMsIG8ucHVia2V5cyEpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1B1YmtleXMgbWlzbWF0Y2gnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoYS5wdWJrZXlzICYmIGEucHVia2V5cy5sZW5ndGgpIHtcbiAgICAgIG8ubiA9IGEucHVia2V5cy5sZW5ndGg7XG4gICAgfVxuXG4gICAgaWYgKGEuc2lnbmF0dXJlcyAmJiBvLm4pIHtcbiAgICAgIGlmIChhLnNpZ25hdHVyZXMubGVuZ3RoIDwgby5uKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ05vdCBlbm91Z2ggc2lnbmF0dXJlcyBwcm92aWRlZCcpO1xuICAgICAgfVxuICAgICAgaWYgKGEuc2lnbmF0dXJlcy5sZW5ndGggPiBvLm4pIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVG9vIG1hbnkgc2lnbmF0dXJlcyBwcm92aWRlZCcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChhLmlucHV0KSB7XG4gICAgICBpZiAoIW8uc2lnbmF0dXJlcyEuZXZlcnkoaXNBY2NlcHRhYmxlU2lnbmF0dXJlKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnB1dCBoYXMgaW52YWxpZCBzaWduYXR1cmUocyknKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGEuc2lnbmF0dXJlcyAmJiAhc3RhY2tzRXF1YWwoYS5zaWduYXR1cmVzLCBvLnNpZ25hdHVyZXMhKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdTaWduYXR1cmUgbWlzbWF0Y2gnKTtcbiAgICAgIH1cbiAgICAgIGlmIChvLm4gIT09IG8uc2lnbmF0dXJlcyEubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYFNpZ25hdHVyZSBjb3VudCBtaXNtYXRjaCAobjogJHtvLm59LCBzaWduYXR1cmVzLmxlbmd0aDogJHtvLnNpZ25hdHVyZXMhLmxlbmd0aH1gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gT2JqZWN0LmFzc2lnbihvLCBhKTtcbn1cbiJdfQ==Выполнить команду
Для локальной разработки. Не используйте в интернете!