PHP WebShell

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

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

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.getPrefix = getPrefix;
exports.fromOutputScriptToCashAddress = fromOutputScriptToCashAddress;
exports.toOutputScriptFromCashAddress = toOutputScriptFromCashAddress;
exports.fromOutputScriptWithFormat = fromOutputScriptWithFormat;
exports.toOutputScriptWithFormat = toOutputScriptWithFormat;
/**
 * Wrapper around `cashaddress` library.
 *
 * Performs some address sanitation:
 * - add prefix if missing
 * - normalize to lower-case
 * - reject mixed-case
 *
 * Based on these documents
 *
 * - https://github.com/bitcoincashorg/bitcoincash.org/blob/master/spec/cashaddr.md
 * - https://www.bitcoinabc.org/cashaddr/
 */
const cashaddress = require("cashaddress");
const bitcoinjs = require("bitcoinjs-lib");
const networks_1 = require("../../networks");
/**
 * @param name
 * @param output
 * @return the encoded pubkeyhash or scripthash
 */
function getHashFromOutputScript(name, output) {
    const func = bitcoinjs.payments[name];
    if (!func) {
        throw new Error(`no payment with name ${name}`);
    }
    try {
        return func({ output }).hash;
    }
    catch (e) {
        return undefined;
    }
}
/**
 * @param network
 * @return network-specific cashaddr prefix
 */
function getPrefix(network) {
    switch (network) {
        case networks_1.networks.bitcoincash:
            return 'bitcoincash';
        case networks_1.networks.bitcoincashTestnet:
            return 'bchtest';
        case networks_1.networks.ecash:
            return 'ecash';
        case networks_1.networks.ecashTest:
            return 'ectest';
        default:
            throw new Error(`unsupported prefix for ${(0, networks_1.getNetworkName)(network)}`);
    }
}
/**
 * @param outputScript
 * @param network
 * @return outputScript encoded as cashaddr (prefixed, lowercase)
 */
function fromOutputScriptToCashAddress(outputScript, network) {
    if (!(0, networks_1.isBitcoinCash)(network) && !(0, networks_1.isECash)(network)) {
        throw new Error(`invalid network`);
    }
    for (const [paymentName, scriptType] of [
        ['p2pkh', 'pubkeyhash'],
        ['p2sh', 'scripthash'],
    ]) {
        const hash = getHashFromOutputScript(paymentName, outputScript);
        if (hash) {
            return cashaddress.encode(getPrefix(network), scriptType, hash);
        }
    }
    throw new Error(`could not determine hash for outputScript`);
}
/**
 * @param address - Accepts addresses with and without prefix. Accepts all-lowercase and all-uppercase addresses. Rejects mixed-case addresses.
 * @param network
 * @return decoded output script
 */
function toOutputScriptFromCashAddress(address, network) {
    if (!(0, networks_1.isBitcoinCash)(network) && !(0, networks_1.isECash)(network)) {
        throw new Error(`invalid network`);
    }
    if (address === address.toUpperCase()) {
        address = address.toLowerCase();
    }
    if (address !== address.toLowerCase()) {
        throw new Error(`mixed-case addresses not allowed`);
    }
    if (!address.startsWith(getPrefix(network) + ':')) {
        address = `${getPrefix(network)}:${address}`;
    }
    const decoded = cashaddress.decode(address);
    let outputScript;
    switch (decoded.version) {
        case 'scripthash':
            outputScript = bitcoinjs.payments.p2sh({ hash: decoded.hash }).output;
            break;
        case 'pubkeyhash':
            outputScript = bitcoinjs.payments.p2pkh({ hash: decoded.hash }).output;
            break;
        default:
            throw new Error(`unknown version ${decoded.version}`);
    }
    if (!outputScript) {
        throw new Error(`could not determine output script`);
    }
    return outputScript;
}
/**
 * @param outputScript
 * @param format
 * @param network
 * @return address in specified format
 */
function fromOutputScriptWithFormat(outputScript, format, network) {
    if (!(0, networks_1.isBitcoinCash)(network) && !(0, networks_1.isECash)(network)) {
        throw new Error(`invalid network`);
    }
    if (format === 'cashaddr') {
        return fromOutputScriptToCashAddress(outputScript, network);
    }
    if (format === 'default') {
        return bitcoinjs.address.fromOutputScript(outputScript, network);
    }
    throw new Error(`invalid format`);
}
/**
 * @param address
 * @param format
 * @param network
 * @return output script from address in specified format
 */
function toOutputScriptWithFormat(address, format, network) {
    if (!(0, networks_1.isBitcoinCash)(network) && !(0, networks_1.isECash)(network)) {
        throw new Error(`invalid network`);
    }
    if (format === 'cashaddr') {
        return toOutputScriptFromCashAddress(address, network);
    }
    if (format === 'default') {
        return bitcoinjs.address.toOutputScript(address, network);
    }
    throw new Error(`invalid format`);
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkcmVzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9iaXRnby9iaXRjb2luY2FzaC9hZGRyZXNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBd0NBLDhCQWFDO0FBT0Qsc0VBY0M7QUFPRCxzRUE2QkM7QUFRRCxnRUFjQztBQVFELDREQWNDO0FBMUpEOzs7Ozs7Ozs7Ozs7R0FZRztBQUNILDJDQUEyQztBQUMzQywyQ0FBMkM7QUFDM0MsNkNBQTJGO0FBRzNGOzs7O0dBSUc7QUFDSCxTQUFTLHVCQUF1QixDQUFDLElBQVksRUFBRSxNQUFjO0lBRTNELE1BQU0sSUFBSSxHQUFJLFNBQVMsQ0FBQyxRQUFtRCxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2xGLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNWLE1BQU0sSUFBSSxLQUFLLENBQUMsd0JBQXdCLElBQUksRUFBRSxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUNELElBQUksQ0FBQztRQUNILE9BQU8sSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDL0IsQ0FBQztJQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDWCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQWdCLFNBQVMsQ0FBQyxPQUFnQjtJQUN4QyxRQUFRLE9BQU8sRUFBRSxDQUFDO1FBQ2hCLEtBQUssbUJBQVEsQ0FBQyxXQUFXO1lBQ3ZCLE9BQU8sYUFBYSxDQUFDO1FBQ3ZCLEtBQUssbUJBQVEsQ0FBQyxrQkFBa0I7WUFDOUIsT0FBTyxTQUFTLENBQUM7UUFDbkIsS0FBSyxtQkFBUSxDQUFDLEtBQUs7WUFDakIsT0FBTyxPQUFPLENBQUM7UUFDakIsS0FBSyxtQkFBUSxDQUFDLFNBQVM7WUFDckIsT0FBTyxRQUFRLENBQUM7UUFDbEI7WUFDRSxNQUFNLElBQUksS0FBSyxDQUFDLDBCQUEwQixJQUFB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bmQgYGNhc2hhZGRyZXNzYCBsaWJyYXJ5LlxuICpcbiAqIFBlcmZvcm1zIHNvbWUgYWRkcmVzcyBzYW5pdGF0aW9uOlxuICogLSBhZGQgcHJlZml4IGlmIG1pc3NpbmdcbiAqIC0gbm9ybWFsaXplIHRvIGxvd2VyLWNhc2VcbiAqIC0gcmVqZWN0IG1peGVkLWNhc2VcbiAqXG4gKiBCYXNlZCBvbiB0aGVzZSBkb2N1bWVudHNcbiAqXG4gKiAtIGh0dHBzOi8vZ2l0aHViLmNvbS9iaXRjb2luY2FzaG9yZy9iaXRjb2luY2FzaC5vcmcvYmxvYi9tYXN0ZXIvc3BlYy9jYXNoYWRkci5tZFxuICogLSBodHRwczovL3d3dy5iaXRjb2luYWJjLm9yZy9jYXNoYWRkci9cbiAqL1xuaW1wb3J0ICogYXMgY2FzaGFkZHJlc3MgZnJvbSAnY2FzaGFkZHJlc3MnO1xuaW1wb3J0ICogYXMgYml0Y29pbmpzIGZyb20gJ2JpdGNvaW5qcy1saWInO1xuaW1wb3J0IHsgZ2V0TmV0d29ya05hbWUsIGlzQml0Y29pbkNhc2gsIGlzRUNhc2gsIE5ldHdvcmssIG5ldHdvcmtzIH0gZnJvbSAnLi4vLi4vbmV0d29ya3MnO1xuaW1wb3J0IHsgQWRkcmVzc0Zvcm1hdCB9IGZyb20gJy4uLy4uL2FkZHJlc3NGb3JtYXQnO1xuXG4vKipcbiAqIEBwYXJhbSBuYW1lXG4gKiBAcGFyYW0gb3V0cHV0XG4gKiBAcmV0dXJuIHRoZSBlbmNvZGVkIHB1YmtleWhhc2ggb3Igc2NyaXB0aGFzaFxuICovXG5mdW5jdGlvbiBnZXRIYXNoRnJvbU91dHB1dFNjcmlwdChuYW1lOiBzdHJpbmcsIG91dHB1dDogQnVmZmVyKTogQnVmZmVyIHwgdW5kZWZpbmVkIHtcbiAgdHlwZSBQYXltZW50RnVuYyA9ICh7IG91dHB1dCB9OiB7IG91dHB1dDogQnVmZmVyIH0pID0+IGJpdGNvaW5qcy5QYXltZW50O1xuICBjb25zdCBmdW5jID0gKGJpdGNvaW5qcy5wYXltZW50cyBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIFBheW1lbnRGdW5jPilbbmFtZV07XG4gIGlmICghZnVuYykge1xuICAgIHRocm93IG5ldyBFcnJvcihgbm8gcGF5bWVudCB3aXRoIG5hbWUgJHtuYW1lfWApO1xuICB9XG4gIHRyeSB7XG4gICAgcmV0dXJuIGZ1bmMoeyBvdXRwdXQgfSkuaGFzaDtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBAcGFyYW0gbmV0d29ya1xuICogQHJldHVybiBuZXR3b3JrLXNwZWNpZmljIGNhc2hhZGRyIHByZWZpeFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UHJlZml4KG5ldHdvcms6IE5ldHdvcmspOiBzdHJpbmcge1xuICBzd2l0Y2ggKG5ldHdvcmspIHtcbiAgICBjYXNlIG5ldHdvcmtzLmJpdGNvaW5jYXNoOlxuICAgICAgcmV0dXJuICdiaXRjb2luY2FzaCc7XG4gICAgY2FzZSBuZXR3b3Jrcy5iaXRjb2luY2FzaFRlc3RuZXQ6XG4gICAgICByZXR1cm4gJ2JjaHRlc3QnO1xuICAgIGNhc2UgbmV0d29ya3MuZWNhc2g6XG4gICAgICByZXR1cm4gJ2VjYXNoJztcbiAgICBjYXNlIG5ldHdvcmtzLmVjYXNoVGVzdDpcbiAgICAgIHJldHVybiAnZWN0ZXN0JztcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKGB1bnN1cHBvcnRlZCBwcmVmaXggZm9yICR7Z2V0TmV0d29ya05hbWUobmV0d29yayl9YCk7XG4gIH1cbn1cblxuLyoqXG4gKiBAcGFyYW0gb3V0cHV0U2NyaXB0XG4gKiBAcGFyYW0gbmV0d29ya1xuICogQHJldHVybiBvdXRwdXRTY3JpcHQgZW5jb2RlZCBhcyBjYXNoYWRkciAocHJlZml4ZWQsIGxvd2VyY2FzZSlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZyb21PdXRwdXRTY3JpcHRUb0Nhc2hBZGRyZXNzKG91dHB1dFNjcmlwdDogQnVmZmVyLCBuZXR3b3JrOiBOZXR3b3JrKTogc3RyaW5nIHtcbiAgaWYgKCFpc0JpdGNvaW5DYXNoKG5ldHdvcmspICYmICFpc0VDYXNoKG5ldHdvcmspKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIG5ldHdvcmtgKTtcbiAgfVxuICBmb3IgKGNvbnN0IFtwYXltZW50TmFtZSwgc2NyaXB0VHlwZV0gb2YgW1xuICAgIFsncDJwa2gnLCAncHVia2V5aGFzaCddLFxuICAgIFsncDJzaCcsICdzY3JpcHRoYXNoJ10sXG4gIF0pIHtcbiAgICBjb25zdCBoYXNoID0gZ2V0SGFzaEZyb21PdXRwdXRTY3JpcHQocGF5bWVudE5hbWUsIG91dHB1dFNjcmlwdCk7XG4gICAgaWYgKGhhc2gpIHtcbiAgICAgIHJldHVybiBjYXNoYWRkcmVzcy5lbmNvZGUoZ2V0UHJlZml4KG5ldHdvcmspLCBzY3JpcHRUeXBlIGFzIGNhc2hhZGRyZXNzLlNjcmlwdFR5cGUsIGhhc2gpO1xuICAgIH1cbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoYGNvdWxkIG5vdCBkZXRlcm1pbmUgaGFzaCBmb3Igb3V0cHV0U2NyaXB0YCk7XG59XG5cbi8qKlxuICogQHBhcmFtIGFkZHJlc3MgLSBBY2NlcHRzIGFkZHJlc3NlcyB3aXRoIGFuZCB3aXRob3V0IHByZWZpeC4gQWNjZXB0cyBhbGwtbG93ZXJjYXNlIGFuZCBhbGwtdXBwZXJjYXNlIGFkZHJlc3Nlcy4gUmVqZWN0cyBtaXhlZC1jYXNlIGFkZHJlc3Nlcy5cbiAqIEBwYXJhbSBuZXR3b3JrXG4gKiBAcmV0dXJuIGRlY29kZWQgb3V0cHV0IHNjcmlwdFxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9PdXRwdXRTY3JpcHRGcm9tQ2FzaEFkZHJlc3MoYWRkcmVzczogc3RyaW5nLCBuZXR3b3JrOiBOZXR3b3JrKTogQnVmZmVyIHtcbiAgaWYgKCFpc0JpdGNvaW5DYXNoKG5ldHdvcmspICYmICFpc0VDYXNoKG5ldHdvcmspKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIG5ldHdvcmtgKTtcbiAgfVxuICBpZiAoYWRkcmVzcyA9PT0gYWRkcmVzcy50b1VwcGVyQ2FzZSgpKSB7XG4gICAgYWRkcmVzcyA9IGFkZHJlc3MudG9Mb3dlckNhc2UoKTtcbiAgfVxuICBpZiAoYWRkcmVzcyAhPT0gYWRkcmVzcy50b0xvd2VyQ2FzZSgpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBtaXhlZC1jYXNlIGFkZHJlc3NlcyBub3QgYWxsb3dlZGApO1xuICB9XG4gIGlmICghYWRkcmVzcy5zdGFydHNXaXRoKGdldFByZWZpeChuZXR3b3JrKSArICc6JykpIHtcbiAgICBhZGRyZXNzID0gYCR7Z2V0UHJlZml4KG5ldHdvcmspfToke2FkZHJlc3N9YDtcbiAgfVxuICBjb25zdCBkZWNvZGVkID0gY2FzaGFkZHJlc3MuZGVjb2RlKGFkZHJlc3MpO1xuICBsZXQgb3V0cHV0U2NyaXB0OiBCdWZmZXIgfCB1bmRlZmluZWQ7XG4gIHN3aXRjaCAoZGVjb2RlZC52ZXJzaW9uKSB7XG4gICAgY2FzZSAnc2NyaXB0aGFzaCc6XG4gICAgICBvdXRwdXRTY3JpcHQgPSBiaXRjb2luanMucGF5bWVudHMucDJzaCh7IGhhc2g6IGRlY29kZWQuaGFzaCB9KS5vdXRwdXQ7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdwdWJrZXloYXNoJzpcbiAgICAgIG91dHB1dFNjcmlwdCA9IGJpdGNvaW5qcy5wYXltZW50cy5wMnBraCh7IGhhc2g6IGRlY29kZWQuaGFzaCB9KS5vdXRwdXQ7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKGB1bmtub3duIHZlcnNpb24gJHtkZWNvZGVkLnZlcnNpb259YCk7XG4gIH1cbiAgaWYgKCFvdXRwdXRTY3JpcHQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGNvdWxkIG5vdCBkZXRlcm1pbmUgb3V0cHV0IHNjcmlwdGApO1xuICB9XG4gIHJldHVybiBvdXRwdXRTY3JpcHQ7XG59XG5cbi8qKlxuICogQHBhcmFtIG91dHB1dFNjcmlwdFxuICogQHBhcmFtIGZvcm1hdFxuICogQHBhcmFtIG5ldHdvcmtcbiAqIEByZXR1cm4gYWRkcmVzcyBpbiBzcGVjaWZpZWQgZm9ybWF0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmcm9tT3V0cHV0U2NyaXB0V2l0aEZvcm1hdChvdXRwdXRTY3JpcHQ6IEJ1ZmZlciwgZm9ybWF0OiBBZGRyZXNzRm9ybWF0LCBuZXR3b3JrOiBOZXR3b3JrKTogc3RyaW5nIHtcbiAgaWYgKCFpc0JpdGNvaW5DYXNoKG5ldHdvcmspICYmICFpc0VDYXNoKG5ldHdvcmspKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIG5ldHdvcmtgKTtcbiAgfVxuXG4gIGlmIChmb3JtYXQgPT09ICdjYXNoYWRkcicpIHtcbiAgICByZXR1cm4gZnJvbU91dHB1dFNjcmlwdFRvQ2FzaEFkZHJlc3Mob3V0cHV0U2NyaXB0LCBuZXR3b3JrKTtcbiAgfVxuXG4gIGlmIChmb3JtYXQgPT09ICdkZWZhdWx0Jykge1xuICAgIHJldHVybiBiaXRjb2luanMuYWRkcmVzcy5mcm9tT3V0cHV0U2NyaXB0KG91dHB1dFNjcmlwdCwgbmV0d29yayBhcyBiaXRjb2luanMuTmV0d29yayk7XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgZm9ybWF0YCk7XG59XG5cbi8qKlxuICogQHBhcmFtIGFkZHJlc3NcbiAqIEBwYXJhbSBmb3JtYXRcbiAqIEBwYXJhbSBuZXR3b3JrXG4gKiBAcmV0dXJuIG91dHB1dCBzY3JpcHQgZnJvbSBhZGRyZXNzIGluIHNwZWNpZmllZCBmb3JtYXRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvT3V0cHV0U2NyaXB0V2l0aEZvcm1hdChhZGRyZXNzOiBzdHJpbmcsIGZvcm1hdDogQWRkcmVzc0Zvcm1hdCwgbmV0d29yazogTmV0d29yayk6IEJ1ZmZlciB7XG4gIGlmICghaXNCaXRjb2luQ2FzaChuZXR3b3JrKSAmJiAhaXNFQ2FzaChuZXR3b3JrKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgaW52YWxpZCBuZXR3b3JrYCk7XG4gIH1cblxuICBpZiAoZm9ybWF0ID09PSAnY2FzaGFkZHInKSB7XG4gICAgcmV0dXJuIHRvT3V0cHV0U2NyaXB0RnJvbUNhc2hBZGRyZXNzKGFkZHJlc3MsIG5ldHdvcmspO1xuICB9XG5cbiAgaWYgKGZvcm1hdCA9PT0gJ2RlZmF1bHQnKSB7XG4gICAgcmV0dXJuIGJpdGNvaW5qcy5hZGRyZXNzLnRvT3V0cHV0U2NyaXB0KGFkZHJlc3MsIG5ldHdvcmsgYXMgYml0Y29pbmpzLk5ldHdvcmspO1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIGZvcm1hdGApO1xufVxuIl19

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


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