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Выполнить команду
Для локальной разработки. Не используйте в интернете!