PHP WebShell

Текущая директория: /opt/BitGoJS/modules/utxo-bin/dist/src

Просмотр файла: ScriptParser.js

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.ScriptParser = void 0;
const utxolib = require("@bitgo/utxo-lib");
const wasm_miniscript_1 = require("@bitgo/wasm-miniscript");
const Parser_1 = require("./Parser");
const parseUnknown_1 = require("./parseUnknown");
const paymentTypes = ['p2sh', 'p2shP2wsh', 'p2pkh', 'p2wpkh', 'p2wsh', 'p2ms'];
function parsePaymentWithType(script, type, network) {
    switch (type) {
        case 'p2sh':
            return utxolib.payments.p2sh({ redeem: { output: script }, network });
        case 'p2shP2wsh':
            return utxolib.payments.p2sh({
                redeem: { output: utxolib.payments.p2wsh({ redeem: { output: script }, network }).output },
                network,
            });
        case 'p2pkh':
            return utxolib.payments.p2pkh({ output: script, network });
        case 'p2wpkh':
            return utxolib.payments.p2wpkh({ output: script, network });
        case 'p2wsh':
            return utxolib.payments.p2wsh({ output: script, network });
        case 'p2ms':
            return utxolib.payments.p2ms({ output: script, network });
    }
}
function asMiniscript(script) {
    const contexts = ['tap', 'segwitv0', 'legacy'];
    for (const ctx of contexts) {
        try {
            return wasm_miniscript_1.Miniscript.fromBitcoinScript(script, ctx);
        }
        catch (e) {
            continue;
        }
    }
    throw new Error('failed to parse as miniscript');
}
class ScriptParser extends Parser_1.Parser {
    constructor({ network }) {
        super();
        this.network = network;
    }
    static toASM(script, { insertNewlines = true } = {}) {
        let parsed;
        try {
            parsed = utxolib.script.toASM(script);
        }
        catch (e) {
            return 'error';
        }
        if (parsed) {
            return insertNewlines ? ['', ...parsed.split(' ')].join('\n') : parsed;
        }
    }
    static classify(script, witness) {
        return {
            input: script ? utxolib.classify.input(script, /* allowIncomplete */ true) : undefined,
            output: script ? utxolib.classify.output(script) : undefined,
            witness: witness ? utxolib.classify.witness(witness) : undefined,
        };
    }
    parsePayment(type, payment) {
        return (0, parseUnknown_1.parseUnknown)(this, `payment: ${type}`, { name: payment.name, ...payment }, {
            omit: ['network'],
        });
    }
    parseBufferAsPayment(script) {
        return paymentTypes.flatMap((type) => {
            try {
                return [this.parsePayment(type, parsePaymentWithType(script, type, this.network))];
            }
            catch (e) {
                return [];
            }
        });
    }
    parse(script) {
        const classification = ScriptParser.classify(script, undefined);
        const decompiled = utxolib.script.decompile(script);
        return this.node('script', `length ${script.length} bytes`, [
            this.nodeCatchError('miniscript', () => asMiniscript(script)?.toString()),
            this.node('classification', undefined, [
                this.node('input', classification.input),
                this.node('output', classification.output),
                this.node('witness', classification.witness),
            ]),
            this.node('asm', ScriptParser.toASM(script)),
            this.node('decompiled', undefined, decompiled ? decompiled.map((v, i) => this.node(i, v)) : undefined),
            ...this.parseBufferAsPayment(script),
        ]);
    }
}
exports.ScriptParser = ScriptParser;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2NyaXB0UGFyc2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL1NjcmlwdFBhcnNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwyQ0FBMkM7QUFDM0MsNERBQW9EO0FBRXBELHFDQUE4QztBQUM5QyxpREFBOEM7QUFFOUMsTUFBTSxZQUFZLEdBQUcsQ0FBQyxNQUFNLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBVSxDQUFDO0FBR3hGLFNBQVMsb0JBQW9CLENBQUMsTUFBYyxFQUFFLElBQWlCLEVBQUUsT0FBeUI7SUFDeEYsUUFBUSxJQUFJLEVBQUUsQ0FBQztRQUNiLEtBQUssTUFBTTtZQUNULE9BQU8sT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUN4RSxLQUFLLFdBQVc7WUFDZCxPQUFPLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO2dCQUMzQixNQUFNLEVBQUUsRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRSxNQUFNLEVBQUUsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUU7Z0JBQzFGLE9BQU87YUFDUixDQUFDLENBQUM7UUFDTCxLQUFLLE9BQU87WUFDVixPQUFPLE9BQU8sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQzdELEtBQUssUUFBUTtZQUNYLE9BQU8sT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDOUQsS0FBSyxPQUFPO1lBQ1Ys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LEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQ3RHLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQztTQUNyQyxDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0Y7QUF2RUQsb0NBdUVDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgdXR4b2xpYiBmcm9tICdAYml0Z28vdXR4by1saWInO1xuaW1wb3J0IHsgTWluaXNjcmlwdCB9IGZyb20gJ0BiaXRnby93YXNtLW1pbmlzY3JpcHQnO1xuXG5pbXBvcnQgeyBQYXJzZXIsIFBhcnNlck5vZGUgfSBmcm9tICcuL1BhcnNlcic7XG5pbXBvcnQgeyBwYXJzZVVua25vd24gfSBmcm9tICcuL3BhcnNlVW5rbm93bic7XG5cbmNvbnN0IHBheW1lbnRUeXBlcyA9IFsncDJzaCcsICdwMnNoUDJ3c2gnLCAncDJwa2gnLCAncDJ3cGtoJywgJ3Ayd3NoJywgJ3AybXMnXSBhcyBjb25zdDtcbnR5cGUgUGF5bWVudFR5cGUgPSAodHlwZW9mIHBheW1lbnRUeXBlcylbbnVtYmVyXTtcblxuZnVuY3Rpb24gcGFyc2VQYXltZW50V2l0aFR5cGUoc2NyaXB0OiBCdWZmZXIsIHR5cGU6IFBheW1lbnRUeXBlLCBuZXR3b3JrPzogdXR4b2xpYi5OZXR3b3JrKTogdXR4b2xpYi5QYXltZW50IHtcbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSAncDJzaCc6XG4gICAgICByZXR1cm4gdXR4b2xpYi5wYXltZW50cy5wMnNoKHsgcmVkZWVtOiB7IG91dHB1dDogc2NyaXB0IH0sIG5ldHdvcmsgfSk7XG4gICAgY2FzZSAncDJzaFAyd3NoJzpcbiAgICAgIHJldHVybiB1dHhvbGliLnBheW1lbnRzLnAyc2goe1xuICAgICAgICByZWRlZW06IHsgb3V0cHV0OiB1dHhvbGliLnBheW1lbnRzLnAyd3NoKHsgcmVkZWVtOiB7IG91dHB1dDogc2NyaXB0IH0sIG5ldHdvcmsgfSkub3V0cHV0IH0sXG4gICAgICAgIG5ldHdvcmssXG4gICAgICB9KTtcbiAgICBjYXNlICdwMnBraCc6XG4gICAgICByZXR1cm4gdXR4b2xpYi5wYXltZW50cy5wMnBraCh7IG91dHB1dDogc2NyaXB0LCBuZXR3b3JrIH0pO1xuICAgIGNhc2UgJ3Ayd3BraCc6XG4gICAgICByZXR1cm4gdXR4b2xpYi5wYXltZW50cy5wMndwa2goeyBvdXRwdXQ6IHNjcmlwdCwgbmV0d29yayB9KTtcbiAgICBjYXNlICdwMndzaCc6XG4gICAgICByZXR1cm4gdXR4b2xpYi5wYXltZW50cy5wMndzaCh7IG91dHB1dDogc2NyaXB0LCBuZXR3b3JrIH0pO1xuICAgIGNhc2UgJ3AybXMnOlxuICAgICAgcmV0dXJuIHV0eG9saWIucGF5bWVudHMucDJtcyh7IG91dHB1dDogc2NyaXB0LCBuZXR3b3JrIH0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGFzTWluaXNjcmlwdChzY3JpcHQ6IEJ1ZmZlcik6IE1pbmlzY3JpcHQgfCB1bmRlZmluZWQge1xuICBjb25zdCBjb250ZXh0cyA9IFsndGFwJywgJ3NlZ3dpdHYwJywgJ2xlZ2FjeSddIGFzIGNvbnN0O1xuICBmb3IgKGNvbnN0IGN0eCBvZiBjb250ZXh0cykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gTWluaXNjcmlwdC5mcm9tQml0Y29pblNjcmlwdChzY3JpcHQsIGN0eCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICB9XG4gIHRocm93IG5ldyBFcnJvcignZmFpbGVkIHRvIHBhcnNlIGFzIG1pbmlzY3JpcHQnKTtcbn1cblxuZXhwb3J0IGNsYXNzIFNjcmlwdFBhcnNlciBleHRlbmRzIFBhcnNlciB7XG4gIG5ldHdvcms6IHV0eG9saWIuTmV0d29yaztcbiAgY29uc3RydWN0b3IoeyBuZXR3b3JrIH06IHsgbmV0d29yazogdXR4b2xpYi5OZXR3b3JrIH0pIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMubmV0d29yayA9IG5ldHdvcms7XG4gIH1cblxuICBzdGF0aWMgdG9BU00oc2NyaXB0OiBCdWZmZXIsIHsgaW5zZXJ0TmV3bGluZXMgPSB0cnVlIH0gPSB7fSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IHBhcnNlZDtcbiAgICB0cnkge1xuICAgICAgcGFyc2VkID0gdXR4b2xpYi5zY3JpcHQudG9BU00oc2NyaXB0KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gJ2Vycm9yJztcbiAgICB9XG5cbiAgICBpZiAocGFyc2VkKSB7XG4gICAgICByZXR1cm4gaW5zZXJ0TmV3bGluZXMgPyBbJycsIC4uLnBhcnNlZC5zcGxpdCgnICcpXS5qb2luKCdcXG4nKSA6IHBhcnNlZDtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgY2xhc3NpZnkoXG4gICAgc2NyaXB0OiBCdWZmZXIgfCB1bmRlZmluZWQsXG4gICAgd2l0bmVzczogQnVmZmVyW10gfCB1bmRlZmluZWRcbiAgKToge1xuICAgIGlucHV0OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgb3V0cHV0OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgd2l0bmVzczogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICB9IHtcbiAgICByZXR1cm4ge1xuICAgICAgaW5wdXQ6IHNjcmlwdCA/IHV0eG9saWIuY2xhc3NpZnkuaW5wdXQoc2NyaXB0LCAvKiBhbGxvd0luY29tcGxldGUgKi8gdHJ1ZSkgOiB1bmRlZmluZWQsXG4gICAgICBvdXRwdXQ6IHNjcmlwdCA/IHV0eG9saWIuY2xhc3NpZnkub3V0cHV0KHNjcmlwdCkgOiB1bmRlZmluZWQsXG4gICAgICB3aXRuZXNzOiB3aXRuZXNzID8gdXR4b2xpYi5jbGFzc2lmeS53aXRuZXNzKHdpdG5lc3MpIDogdW5kZWZpbmVkLFxuICAgIH07XG4gIH1cblxuICBwYXJzZVBheW1lbnQodHlwZTogUGF5bWVudFR5cGUsIHBheW1lbnQ6IHV0eG9saWIuUGF5bWVudCk6IFBhcnNlck5vZGUge1xuICAgIHJldHVybiBwYXJzZVVua25vd24oXG4gICAgICB0aGlzLFxuICAgICAgYHBheW1lbnQ6ICR7dHlwZX1gLFxuICAgICAgeyBuYW1lOiBwYXltZW50Lm5hbWUsIC4uLnBheW1lbnQgfSxcbiAgICAgIHtcbiAgICAgICAgb21pdDogWyduZXR3b3JrJ10sXG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIHBhcnNlQnVmZmVyQXNQYXltZW50KHNjcmlwdDogQnVmZmVyKTogUGFyc2VyTm9kZVtdIHtcbiAgICByZXR1cm4gcGF5bWVudFR5cGVzLmZsYXRNYXAoKHR5cGUpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBbdGhpcy5wYXJzZVBheW1lbnQodHlwZSwgcGFyc2VQYXltZW50V2l0aFR5cGUoc2NyaXB0LCB0eXBlLCB0aGlzLm5ldHdvcmspKV07XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHBhcnNlKHNjcmlwdDogQnVmZmVyKTogUGFyc2VyTm9kZSB7XG4gICAgY29uc3QgY2xhc3NpZmljYXRpb24gPSBTY3JpcHRQYXJzZXIuY2xhc3NpZnkoc2NyaXB0LCB1bmRlZmluZWQpO1xuICAgIGNvbnN0IGRlY29tcGlsZWQgPSB1dHhvbGliLnNjcmlwdC5kZWNvbXBpbGUoc2NyaXB0KTtcbiAgICByZXR1cm4gdGhpcy5ub2RlKCdzY3JpcHQnLCBgbGVuZ3RoICR7c2NyaXB0Lmxlbmd0aH0gYnl0ZXNgLCBbXG4gICAgICB0aGlzLm5vZGVDYXRjaEVycm9yKCdtaW5pc2NyaXB0JywgKCkgPT4gYXNNaW5pc2NyaXB0KHNjcmlwdCk/LnRvU3RyaW5nKCkpLFxuICAgICAgdGhpcy5ub2RlKCdjbGFzc2lmaWNhdGlvbicsIHVuZGVmaW5lZCwgW1xuICAgICAgICB0aGlzLm5vZGUoJ2lucHV0JywgY2xhc3NpZmljYXRpb24uaW5wdXQpLFxuICAgICAgICB0aGlzLm5vZGUoJ291dHB1dCcsIGNsYXNzaWZpY2F0aW9uLm91dHB1dCksXG4gICAgICAgIHRoaXMubm9kZSgnd2l0bmVzcycsIGNsYXNzaWZpY2F0aW9uLndpdG5lc3MpLFxuICAgICAgXSksXG4gICAgICB0aGlzLm5vZGUoJ2FzbScsIFNjcmlwdFBhcnNlci50b0FTTShzY3JpcHQpKSxcbiAgICAgIHRoaXMubm9kZSgnZGVjb21waWxlZCcsIHVuZGVmaW5lZCwgZGVjb21waWxlZCA/IGRlY29tcGlsZWQubWFwKCh2LCBpKSA9PiB0aGlzLm5vZGUoaSwgdikpIDogdW5kZWZpbmVkKSxcbiAgICAgIC4uLnRoaXMucGFyc2VCdWZmZXJBc1BheW1lbnQoc2NyaXB0KSxcbiAgICBdKTtcbiAgfVxufVxuIl19

Выполнить команду


Для локальной разработки. Не используйте в интернете!