PHP WebShell
Текущая директория: /usr/lib/node_modules/bitgo/node_modules/@bitgo/abstract-utxo/dist/src/descriptor/builder
Просмотр файла: parse.js
"use strict";
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;
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.parseDescriptorNode = parseDescriptorNode;
exports.parseDescriptor = parseDescriptor;
const utxolib = __importStar(require("@bitgo/utxo-lib"));
const builder_1 = require("./builder");
function isUnaryNode(node, key) {
if (typeof node !== 'object' || node === null) {
return false;
}
const keys = Object.keys(node);
return keys.length === 1 && keys[0] === key;
}
function unwrapNode(node, path) {
let current = node;
for (const key of path) {
if (!isUnaryNode(current, key)) {
return undefined;
}
current = current[key];
}
return current;
}
function parseMulti(node) {
if (!Array.isArray(node)) {
throw new Error('Unexpected node');
}
const [threshold, ...keyNodes] = node;
if (typeof threshold !== 'number') {
throw new Error('Expected threshold number');
}
const keyWithPath = keyNodes.map((keyNode) => {
if (!isUnaryNode(keyNode, 'XPub')) {
throw new Error('Expected XPub node');
}
if (typeof keyNode.XPub !== 'string') {
throw new Error('Expected XPub string');
}
const parts = keyNode.XPub.split('/');
return { xpub: parts[0], path: parts.slice(1).join('/') };
});
const paths = keyWithPath.map((k) => k.path);
paths.forEach((path, i) => {
if (path !== paths[0]) {
throw new Error(`Expected all paths to be the same: ${path} !== ${paths[0]}`);
}
});
return {
threshold,
keys: keyWithPath.map((k) => utxolib.bip32.fromBase58(k.xpub)),
path: paths[0],
};
}
function parseWshMulti(node) {
const wshMsMulti = unwrapNode(node, ['Wsh', 'Ms', 'Multi']);
if (wshMsMulti) {
const { threshold, keys, path } = parseMulti(wshMsMulti);
let name;
if (threshold === 2 && keys.length === 2) {
name = 'Wsh2Of2';
}
else if (threshold === 2 && keys.length === 3) {
name = 'Wsh2Of3';
}
else {
throw new Error('Unexpected multisig');
}
return {
name,
keys,
path,
};
}
}
function parseCltvDrop(node, name, wrapping) {
const unwrapped = unwrapNode(node, wrapping);
if (!unwrapped) {
return;
}
if (Array.isArray(unwrapped) && unwrapped.length === 2) {
const [a, b] = unwrapped;
const dropAfterAbsLocktime = unwrapNode(a, ['Drop', 'After', 'absLockTime']);
if (typeof dropAfterAbsLocktime !== 'number') {
throw new Error('Expected absLockTime number');
}
if (!isUnaryNode(b, 'Multi')) {
throw new Error('Expected Multi node');
}
const multi = parseMulti(b.Multi);
if (multi.threshold === 2 && multi.keys.length === 3) {
return {
name,
locktime: dropAfterAbsLocktime,
keys: multi.keys,
path: multi.path,
};
}
}
}
function parseDescriptorNode(node) {
const parsed = parseWshMulti(node) ??
parseCltvDrop(node, 'ShWsh2Of3CltvDrop', ['Sh', 'Wsh', 'Ms', 'AndV']) ??
parseCltvDrop(node, 'Wsh2Of3CltvDrop', ['Wsh', 'Ms', 'AndV']);
if (!parsed) {
throw new Error('Failed to parse descriptor node');
}
return parsed;
}
function parseDescriptor(descriptor) {
const builder = parseDescriptorNode(descriptor.node());
if ((0, builder_1.getDescriptorFromBuilder)(builder).toString() !== descriptor.toString()) {
throw new Error('Failed to parse descriptor');
}
return builder;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZGVzY3JpcHRvci9idWlsZGVyL3BhcnNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBZ0hBLGtEQVNDO0FBRUQsMENBTUM7QUFoSUQseURBQTJDO0FBRzNDLHVDQUF3RTtBQUl4RSxTQUFTLFdBQVcsQ0FBc0IsSUFBYSxFQUFFLEdBQVM7SUFDaEUsSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLElBQUksSUFBSSxLQUFLLElBQUksRUFBRSxDQUFDO1FBQzlDLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUNELE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDL0IsT0FBTyxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDO0FBQzlDLENBQUM7QUFFRCxTQUFTLFVBQVUsQ0FBQyxJQUFhLEVBQUUsSUFBYztJQUMvQyxJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUM7SUFDbkIsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQy9CLE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7UUFDRCxPQUFPLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFDRCxPQUFPLE9BQU8sQ0FBQztBQUNqQixDQUFDO0FBRUQsU0FBUyxVQUFVLENBQUMsSUFBYTtJQUsvQixJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ3pCLE1BQU0sSUFBSSxLQUFLLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBQ0Qs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RSxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDckUsYUFBYSxDQUFDLElBQUksRUFBRSxpQkFBaUIsRUFBRSxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUNoRSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDWixNQUFNLElBQUksS0FBSyxDQUFDLGlDQUFpQyxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUNELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRCxTQUFnQixlQUFlLENBQUMsVUFBc0I7SUFDcEQsTUFBTSxPQUFPLEdBQUcsbUJBQW1CLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7SUFDdkQsSUFBSSxJQUFBLGtDQUF3QixFQUFDLE9BQU8sQ0FBQyxDQUFDLFFBQVEsRUFBRSxLQUFLLFVBQVUsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDO1FBQzNFLE1BQU0sSUFBSSxLQUFLLENBQUMsNEJBQTRCLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBQ0QsT0FBTyxPQUFPLENBQUM7QUFDakIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJJUDMySW50ZXJmYWNlIH0gZnJvbSAnQGJpdGdvL3V0eG8tbGliJztcbmltcG9ydCAqIGFzIHV0eG9saWIgZnJvbSAnQGJpdGdvL3V0eG8tbGliJztcbmltcG9ydCB7IERlc2NyaXB0b3IgfSBmcm9tICdAYml0Z28vd2FzbS1taW5pc2NyaXB0JztcblxuaW1wb3J0IHsgRGVzY3JpcHRvckJ1aWxkZXIsIGdldERlc2NyaXB0b3JGcm9tQnVpbGRlciB9IGZyb20gJy4vYnVpbGRlcic7XG5cbnR5cGUgTm9kZVVuYXJ5PEtleSBleHRlbmRzIHN0cmluZz4gPSB7IFtrIGluIEtleV06IHVua25vd24gfTtcblxuZnVuY3Rpb24gaXNVbmFyeU5vZGU8VEtleSBleHRlbmRzIHN0cmluZz4obm9kZTogdW5rbm93biwga2V5OiBUS2V5KTogbm9kZSBpcyBOb2RlVW5hcnk8VEtleT4ge1xuICBpZiAodHlwZW9mIG5vZGUgIT09ICdvYmplY3QnIHx8IG5vZGUgPT09IG51bGwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKG5vZGUpO1xuICByZXR1cm4ga2V5cy5sZW5ndGggPT09IDEgJiYga2V5c1swXSA9PT0ga2V5O1xufVxuXG5mdW5jdGlvbiB1bndyYXBOb2RlKG5vZGU6IHVua25vd24sIHBhdGg6IHN0cmluZ1tdKTogdW5rbm93biB7XG4gIGxldCBjdXJyZW50ID0gbm9kZTtcbiAgZm9yIChjb25zdCBrZXkgb2YgcGF0aCkge1xuICAgIGlmICghaXNVbmFyeU5vZGUoY3VycmVudCwga2V5KSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY3VycmVudCA9IGN1cnJlbnRba2V5XTtcbiAgfVxuICByZXR1cm4gY3VycmVudDtcbn1cblxuZnVuY3Rpb24gcGFyc2VNdWx0aShub2RlOiB1bmtub3duKToge1xuICB0aHJlc2hvbGQ6IG51bWJlcjtcbiAga2V5czogQklQMzJJbnRlcmZhY2VbXTtcbiAgcGF0aDogc3RyaW5nO1xufSB7XG4gIGlmICghQXJyYXkuaXNBcnJheShub2RlKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCBub2RlJyk7XG4gIH1cbiAgY29uc3QgW3RocmVzaG9sZCwgLi4ua2V5Tm9kZXNdID0gbm9kZTtcbiAgaWYgKHR5cGVvZiB0aHJlc2hvbGQgIT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCB0aHJlc2hvbGQgbnVtYmVyJyk7XG4gIH1cbiAgY29uc3Qga2V5V2l0aFBhdGggPSBrZXlOb2Rlcy5tYXAoKGtleU5vZGUpID0+IHtcbiAgICBpZiAoIWlzVW5hcnlOb2RlKGtleU5vZGUsICdYUHViJykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgWFB1YiBub2RlJyk7XG4gICAgfVxuICAgIGlmICh0eXBlb2Yga2V5Tm9kZS5YUHViICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBYUHViIHN0cmluZycpO1xuICAgIH1cbiAgICBjb25zdCBwYXJ0cyA9IGtleU5vZGUuWFB1Yi5zcGxpdCgnLycpO1xuICAgIHJldHVybiB7IHhwdWI6IHBhcnRzWzBdLCBwYXRoOiBwYXJ0cy5zbGljZSgxKS5qb2luKCcvJykgfTtcbiAgfSk7XG4gIGNvbnN0IHBhdGhzID0ga2V5V2l0aFBhdGgubWFwKChrKSA9PiBrLnBhdGgpO1xuICBwYXRocy5mb3JFYWNoKChwYXRoLCBpKSA9PiB7XG4gICAgaWYgKHBhdGggIT09IHBhdGhzWzBdKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGFsbCBwYXRocyB0byBiZSB0aGUgc2FtZTogJHtwYXRofSAhPT0gJHtwYXRoc1swXX1gKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4ge1xuICAgIHRocmVzaG9sZCxcbiAgICBrZXlzOiBrZXlXaXRoUGF0aC5tYXAoKGspID0+IHV0eG9saWIuYmlwMzIuZnJvbUJhc2U1OChrLnhwdWIpKSxcbiAgICBwYXRoOiBwYXRoc1swXSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gcGFyc2VXc2hNdWx0aShub2RlOiB1bmtub3duKTogRGVzY3JpcHRvckJ1aWxkZXIgfCB1bmRlZmluZWQge1xuICBjb25zdCB3c2hNc011bHRpID0gdW53cmFwTm9kZShub2RlLCBbJ1dzaCcsICdNcycsICdNdWx0aSddKTtcbiAgaWYgKHdzaE1zTXVsdGkpIHtcbiAgICBjb25zdCB7IHRocmVzaG9sZCwga2V5cywgcGF0aCB9ID0gcGFyc2VNdWx0aSh3c2hNc011bHRpKTtcbiAgICBsZXQgbmFtZTtcbiAgICBpZiAodGhyZXNob2xkID09PSAyICYmIGtleXMubGVuZ3RoID09PSAyKSB7XG4gICAgICBuYW1lID0gJ1dzaDJPZjInO1xuICAgIH0gZWxzZSBpZiAodGhyZXNob2xkID09PSAyICYmIGtleXMubGVuZ3RoID09PSAzKSB7XG4gICAgICBuYW1lID0gJ1dzaDJPZjMnO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgbXVsdGlzaWcnKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWUsXG4gICAgICBrZXlzLFxuICAgICAgcGF0aCxcbiAgICB9O1xuICB9XG59XG5cbmZ1bmN0aW9uIHBhcnNlQ2x0dkRyb3AoXG4gIG5vZGU6IHVua25vd24sXG4gIG5hbWU6ICdXc2gyT2YzQ2x0dkRyb3AnIHwgJ1NoV3NoMk9mM0NsdHZEcm9wJyxcbiAgd3JhcHBpbmc6IHN0cmluZ1tdXG4pOiBEZXNjcmlwdG9yQnVpbGRlciB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHVud3JhcHBlZCA9IHVud3JhcE5vZGUobm9kZSwgd3JhcHBpbmcpO1xuICBpZiAoIXVud3JhcHBlZCkge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoQXJyYXkuaXNBcnJheSh1bndyYXBwZWQpICYmIHVud3JhcHBlZC5sZW5ndGggPT09IDIpIHtcbiAgICBjb25zdCBbYSwgYl0gPSB1bndyYXBwZWQ7XG4gICAgY29uc3QgZHJvcEFmdGVyQWJzTG9ja3RpbWUgPSB1bndyYXBOb2RlKGEsIFsnRHJvcCcsICdBZnRlcicsICdhYnNMb2NrVGltZSddKTtcbiAgICBpZiAodHlwZW9mIGRyb3BBZnRlckFic0xvY2t0aW1lICE9PSAnbnVtYmVyJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBhYnNMb2NrVGltZSBudW1iZXInKTtcbiAgICB9XG4gICAgaWYgKCFpc1VuYXJ5Tm9kZShiLCAnTXVsdGknKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBNdWx0aSBub2RlJyk7XG4gICAgfVxuICAgIGNvbnN0IG11bHRpID0gcGFyc2VNdWx0aShiLk11bHRpKTtcbiAgICBpZiAobXVsdGkudGhyZXNob2xkID09PSAyICYmIG11bHRpLmtleXMubGVuZ3RoID09PSAzKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBuYW1lLFxuICAgICAgICBsb2NrdGltZTogZHJvcEFmdGVyQWJzTG9ja3RpbWUsXG4gICAgICAgIGtleXM6IG11bHRpLmtleXMsXG4gICAgICAgIHBhdGg6IG11bHRpLnBhdGgsXG4gICAgICB9O1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VEZXNjcmlwdG9yTm9kZShub2RlOiB1bmtub3duKTogRGVzY3JpcHRvckJ1aWxkZXIge1xuICBjb25zdCBwYXJzZWQgPVxuICAgIHBhcnNlV3NoTXVsdGkobm9kZSkgPz9cbiAgICBwYXJzZUNsdHZEcm9wKG5vZGUsICdTaFdzaDJPZjNDbHR2RHJvcCcsIFsnU2gnLCAnV3NoJywgJ01zJywgJ0FuZFYnXSkgPz9cbiAgICBwYXJzZUNsdHZEcm9wKG5vZGUsICdXc2gyT2YzQ2x0dkRyb3AnLCBbJ1dzaCcsICdNcycsICdBbmRWJ10pO1xuICBpZiAoIXBhcnNlZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIHBhcnNlIGRlc2NyaXB0b3Igbm9kZScpO1xuICB9XG4gIHJldHVybiBwYXJzZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZURlc2NyaXB0b3IoZGVzY3JpcHRvcjogRGVzY3JpcHRvcik6IERlc2NyaXB0b3JCdWlsZGVyIHtcbiAgY29uc3QgYnVpbGRlciA9IHBhcnNlRGVzY3JpcHRvck5vZGUoZGVzY3JpcHRvci5ub2RlKCkpO1xuICBpZiAoZ2V0RGVzY3JpcHRvckZyb21CdWlsZGVyKGJ1aWxkZXIpLnRvU3RyaW5nKCkgIT09IGRlc2NyaXB0b3IudG9TdHJpbmcoKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIHBhcnNlIGRlc2NyaXB0b3InKTtcbiAgfVxuICByZXR1cm4gYnVpbGRlcjtcbn1cbiJdfQ==Выполнить команду
Для локальной разработки. Не используйте в интернете!