@bitgo-beta/utxo-lib
Version:
Client-side Bitcoin JavaScript library
108 lines • 11.9 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.toCanonicalFormat = exports.toOutputScriptTryFormats = exports.toOutputScriptAndFormat = exports.toOutputScriptWithFormat = exports.fromOutputScriptWithFormat = exports.isSupportedAddressFormat = exports.addressFormats = void 0;
/**
* Implements methods for nonstandard (non-canonical) address formats.
*
* Use `toOutputScriptTryFormats()` instead of `toOutputScript()` to parse addresses in
* non-canonical formats
*/
const networks_1 = require("./networks");
const address_1 = require("./address");
const bitgo_1 = require("./bitgo");
exports.addressFormats = ['default', 'cashaddr'];
/**
* @param format
* @param network
* @return true iff format is supported for network
*/
function isSupportedAddressFormat(format, network) {
switch (format) {
case 'default':
return true;
case 'cashaddr':
return networks_1.getMainnet(network) === networks_1.networks.bitcoincash;
}
throw new Error(`unknown address format ${format}`);
}
exports.isSupportedAddressFormat = isSupportedAddressFormat;
/**
* @param outputScript
* @param format
* @param network
* @return address formatted using provided AddressFormat
*/
function fromOutputScriptWithFormat(outputScript, format, network) {
if (!isSupportedAddressFormat(format, network)) {
throw new Error(`unsupported address format ${format} for network ${networks_1.getNetworkName(network)}`);
}
switch (networks_1.getMainnet(network)) {
case networks_1.networks.bitcoincash:
return bitgo_1.bcashAddress.fromOutputScriptWithFormat(outputScript, format, network);
default:
return address_1.fromOutputScript(outputScript, network);
}
}
exports.fromOutputScriptWithFormat = fromOutputScriptWithFormat;
/**
* @param address
* @param format
* @param network
* @return output script parsed with provided AddressFormat
*/
function toOutputScriptWithFormat(address, format, network) {
if (!isSupportedAddressFormat(format, network)) {
throw new Error(`unsupported address format ${format} for network ${networks_1.getNetworkName(network)}`);
}
switch (networks_1.getMainnet(network)) {
case networks_1.networks.bitcoincash:
return bitgo_1.bcashAddress.toOutputScriptWithFormat(address, format, network);
default:
return address_1.toOutputScript(address, network);
}
}
exports.toOutputScriptWithFormat = toOutputScriptWithFormat;
/**
* Attempts to parse address with different address formats, returns first hit.
* @param address
* @param network
* @param formats - defaults to all supported address formats for network
* @return tuple with [AddressFormat, Buffer] containing format and parsed output script
*/
function toOutputScriptAndFormat(address, network, formats) {
if (!formats) {
formats = exports.addressFormats.filter((f) => isSupportedAddressFormat(f, network));
}
for (const format of formats) {
try {
return [format, toOutputScriptWithFormat(address, format, network)];
}
catch (e) {
// try next
}
}
throw new Error(`could not parse outputScript [formats=${formats}]`);
}
exports.toOutputScriptAndFormat = toOutputScriptAndFormat;
/**
* Same as `toOutputScriptAndFormat`, only returning script
* @param address - {@see toOutputScriptAndFormat}
* @param network - {@see toOutputScriptAndFormat}
* @param formats - {@see toOutputScriptAndFormat}
* @return parsed output script
*/
function toOutputScriptTryFormats(address, network, formats) {
const [, outputScript] = toOutputScriptAndFormat(address, network, formats);
return outputScript;
}
exports.toOutputScriptTryFormats = toOutputScriptTryFormats;
/**
* @param address
* @param network
* @return address in canonical format
*/
function toCanonicalFormat(address, network) {
return address_1.fromOutputScript(toOutputScriptTryFormats(address, network), network);
}
exports.toCanonicalFormat = toCanonicalFormat;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkcmVzc0Zvcm1hdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hZGRyZXNzRm9ybWF0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBOzs7OztHQUtHO0FBQ0gseUNBQTJFO0FBQzNFLHVDQUE2RDtBQUU3RCxtQ0FBdUM7QUFFMUIsUUFBQSxjQUFjLEdBQUcsQ0FBQyxTQUFTLEVBQUUsVUFBVSxDQUFVLENBQUM7QUFJL0Q7Ozs7R0FJRztBQUNILFNBQWdCLHdCQUF3QixDQUFDLE1BQXFCLEVBQUUsT0FBZ0I7SUFDOUUsUUFBUSxNQUFNLEVBQUU7UUFDZCxLQUFLLFNBQVM7WUFDWixPQUFPLElBQUksQ0FBQztRQUNkLEtBQUssVUFBVTtZQUNiLE9BQU8scUJBQVUsQ0FBQyxPQUFPLENBQUMsS0FBSyxtQkFBUSxDQUFDLFdBQVcsQ0FBQztLQUN2RDtJQUNELE1BQU0sSUFBSSxLQUFLLENBQUMsMEJBQTBCLE1BQU0sRUFBRSxDQUFDLENBQUM7QUFDdEQsQ0FBQztBQVJELDREQVFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFnQiwwQkFBMEIsQ0FBQyxZQUFvQixFQUFFLE1BQXFCLEVBQUUsT0FBZ0I7SUFDdEcsSUFBSSxDQUFDLHdCQUF3QixDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsRUFBRTtRQUM5QyxNQUFNLElBQUksS0FBSyxDQUFDLDhCQUE4QixNQUFNLGdCQUFnQix5QkFBYyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztLQUNoRztJQUVELFFBQVEscUJBQVUsQ0FBQyxPQUFPLENBQUMsRUFBRTtRQUMzQixLQUFLLG1CQUFRLENBQUMsV0FBVztZQUN2QixPQUFPLG9CQUFZLENBQUMsMEJBQTBCLENBQUMsWUFBWSxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNoRjtZQUNFLE9BQU8sMEJBQWdCLENBQUMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0tBQ2xEO0FBQ0gsQ0FBQztBQVhELGdFQVdDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFnQix3QkFBd0IsQ0FBQyxPQUFlLEVBQUUsTUFBcUIsRUFBRSxPQUFnQjtJQUMvRixJQUFJLENBQUMsd0JBQXdCLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxFQUFFO1FBQzlDLE1BQU0sSUFBSSxLQUFLLENBQUMsOEJBQThCLE1BQU0sZ0JBQWdCLHlCQUFjLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0tBQ2hHO0lBRUQsUUFBUSxxQkFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFO1FBQzNCLEtBQUssbUJBQVEsQ0FBQyxXQUFXO1lBQ3ZCLE9BQU8sb0JBQVksQ0FBQyx3QkFBd0IsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3pFO1lBQ0UsT0FBTyx3QkFBYyxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztLQUMzQztBQUNILENBQUM7QUFYRCw0REFXQztBQUVEOzs7Ozs7R0FNRztBQUNILFNBQWdCLHVCQUF1QixDQUNyQyxPQUFlLEVBQ2YsT0FBZ0IsRUFDaEIsT0FBeUI7SUFFekIsSUFBSSxDQUFDLE9BQU8sRUFBRTtRQUNaLE9BQU8sR0FBRyxzQkFBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7S0FDOUU7SUFFRCxLQUFLLE1BQU0sTUFBTSxJQUFJLE9BQU8sRUFBRTtRQUM1QixJQUFJO1lBQ0YsT0FBTyxDQUFDLE1BQU0sRUFBRSx3QkFBd0IsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7U0FDckU7UUFBQyxPQUFPLENBQUMsRUFBRTtZQUNWLFdBQVc7U0FDWjtLQUNGO0lBRUQsTUFBTSxJQUFJLEtBQUssQ0FBQyx5Q0FBeUMsT0FBTyxHQUFHLENBQUMsQ0FBQztBQUN2RSxDQUFDO0FBbEJELDBEQWtCQztBQUVEOzs7Ozs7R0FNRztBQUNILFNBQWdCLHdCQUF3QixDQUFDLE9BQWUsRUFBRSxPQUFnQixFQUFFLE9BQXlCO0lBQ25HLE1BQU0sQ0FBQyxFQUFFLFlBQVksQ0FBQyxHQUFHLHVCQUF1QixDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDNUUsT0FBTyxZQUFZLENBQUM7QUFDdEIsQ0FBQztBQUhELDREQUdDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQWdCLGlCQUFpQixDQUFDLE9BQWUsRUFBRSxPQUFnQjtJQUNqRSxPQUFPLDBCQUFnQixDQUFDLHdCQUF3QixDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUMvRSxDQUFDO0FBRkQsOENBRUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEltcGxlbWVudHMgbWV0aG9kcyBmb3Igbm9uc3RhbmRhcmQgKG5vbi1jYW5vbmljYWwpIGFkZHJlc3MgZm9ybWF0cy5cbiAqXG4gKiBVc2UgYHRvT3V0cHV0U2NyaXB0VHJ5Rm9ybWF0cygpYCBpbnN0ZWFkIG9mIGB0b091dHB1dFNjcmlwdCgpYCB0byBwYXJzZSBhZGRyZXNzZXMgaW5cbiAqIG5vbi1jYW5vbmljYWwgZm9ybWF0c1xuICovXG5pbXBvcnQgeyBnZXRNYWlubmV0LCBnZXROZXR3b3JrTmFtZSwgTmV0d29yaywgbmV0d29ya3MgfSBmcm9tICcuL25ldHdvcmtzJztcbmltcG9ydCB7IGZyb21PdXRwdXRTY3JpcHQsIHRvT3V0cHV0U2NyaXB0IH0gZnJvbSAnLi9hZGRyZXNzJztcblxuaW1wb3J0IHsgYmNhc2hBZGRyZXNzIH0gZnJvbSAnLi9iaXRnbyc7XG5cbmV4cG9ydCBjb25zdCBhZGRyZXNzRm9ybWF0cyA9IFsnZGVmYXVsdCcsICdjYXNoYWRkciddIGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBBZGRyZXNzRm9ybWF0ID0gdHlwZW9mIGFkZHJlc3NGb3JtYXRzW251bWJlcl07XG5cbi8qKlxuICogQHBhcmFtIGZvcm1hdFxuICogQHBhcmFtIG5ldHdvcmtcbiAqIEByZXR1cm4gdHJ1ZSBpZmYgZm9ybWF0IGlzIHN1cHBvcnRlZCBmb3IgbmV0d29ya1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNTdXBwb3J0ZWRBZGRyZXNzRm9ybWF0KGZvcm1hdDogQWRkcmVzc0Zvcm1hdCwgbmV0d29yazogTmV0d29yayk6IGJvb2xlYW4ge1xuICBzd2l0Y2ggKGZvcm1hdCkge1xuICAgIGNhc2UgJ2RlZmF1bHQnOlxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgY2FzZSAnY2FzaGFkZHInOlxuICAgICAgcmV0dXJuIGdldE1haW5uZXQobmV0d29yaykgPT09IG5ldHdvcmtzLmJpdGNvaW5jYXNoO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihgdW5rbm93biBhZGRyZXNzIGZvcm1hdCAke2Zvcm1hdH1gKTtcbn1cblxuLyoqXG4gKiBAcGFyYW0gb3V0cHV0U2NyaXB0XG4gKiBAcGFyYW0gZm9ybWF0XG4gKiBAcGFyYW0gbmV0d29ya1xuICogQHJldHVybiBhZGRyZXNzIGZvcm1hdHRlZCB1c2luZyBwcm92aWRlZCBBZGRyZXNzRm9ybWF0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmcm9tT3V0cHV0U2NyaXB0V2l0aEZvcm1hdChvdXRwdXRTY3JpcHQ6IEJ1ZmZlciwgZm9ybWF0OiBBZGRyZXNzRm9ybWF0LCBuZXR3b3JrOiBOZXR3b3JrKTogc3RyaW5nIHtcbiAgaWYgKCFpc1N1cHBvcnRlZEFkZHJlc3NGb3JtYXQoZm9ybWF0LCBuZXR3b3JrKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgdW5zdXBwb3J0ZWQgYWRkcmVzcyBmb3JtYXQgJHtmb3JtYXR9IGZvciBuZXR3b3JrICR7Z2V0TmV0d29ya05hbWUobmV0d29yayl9YCk7XG4gIH1cblxuICBzd2l0Y2ggKGdldE1haW5uZXQobmV0d29yaykpIHtcbiAgICBjYXNlIG5ldHdvcmtzLmJpdGNvaW5jYXNoOlxuICAgICAgcmV0dXJuIGJjYXNoQWRkcmVzcy5mcm9tT3V0cHV0U2NyaXB0V2l0aEZvcm1hdChvdXRwdXRTY3JpcHQsIGZvcm1hdCwgbmV0d29yayk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmcm9tT3V0cHV0U2NyaXB0KG91dHB1dFNjcmlwdCwgbmV0d29yayk7XG4gIH1cbn1cblxuLyoqXG4gKiBAcGFyYW0gYWRkcmVzc1xuICogQHBhcmFtIGZvcm1hdFxuICogQHBhcmFtIG5ldHdvcmtcbiAqIEByZXR1cm4gb3V0cHV0IHNjcmlwdCBwYXJzZWQgd2l0aCBwcm92aWRlZCBBZGRyZXNzRm9ybWF0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b091dHB1dFNjcmlwdFdpdGhGb3JtYXQoYWRkcmVzczogc3RyaW5nLCBmb3JtYXQ6IEFkZHJlc3NGb3JtYXQsIG5ldHdvcms6IE5ldHdvcmspOiBCdWZmZXIge1xuICBpZiAoIWlzU3VwcG9ydGVkQWRkcmVzc0Zvcm1hdChmb3JtYXQsIG5ldHdvcmspKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGB1bnN1cHBvcnRlZCBhZGRyZXNzIGZvcm1hdCAke2Zvcm1hdH0gZm9yIG5ldHdvcmsgJHtnZXROZXR3b3JrTmFtZShuZXR3b3JrKX1gKTtcbiAgfVxuXG4gIHN3aXRjaCAoZ2V0TWFpbm5ldChuZXR3b3JrKSkge1xuICAgIGNhc2UgbmV0d29ya3MuYml0Y29pbmNhc2g6XG4gICAgICByZXR1cm4gYmNhc2hBZGRyZXNzLnRvT3V0cHV0U2NyaXB0V2l0aEZvcm1hdChhZGRyZXNzLCBmb3JtYXQsIG5ldHdvcmspO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gdG9PdXRwdXRTY3JpcHQoYWRkcmVzcywgbmV0d29yayk7XG4gIH1cbn1cblxuLyoqXG4gKiBBdHRlbXB0cyB0byBwYXJzZSBhZGRyZXNzIHdpdGggZGlmZmVyZW50IGFkZHJlc3MgZm9ybWF0cywgcmV0dXJucyBmaXJzdCBoaXQuXG4gKiBAcGFyYW0gYWRkcmVzc1xuICogQHBhcmFtIG5ldHdvcmtcbiAqIEBwYXJhbSBmb3JtYXRzIC0gZGVmYXVsdHMgdG8gYWxsIHN1cHBvcnRlZCBhZGRyZXNzIGZvcm1hdHMgZm9yIG5ldHdvcmtcbiAqIEByZXR1cm4gdHVwbGUgd2l0aCBbQWRkcmVzc0Zvcm1hdCwgQnVmZmVyXSBjb250YWluaW5nIGZvcm1hdCBhbmQgcGFyc2VkIG91dHB1dCBzY3JpcHRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvT3V0cHV0U2NyaXB0QW5kRm9ybWF0KFxuICBhZGRyZXNzOiBzdHJpbmcsXG4gIG5ldHdvcms6IE5ldHdvcmssXG4gIGZvcm1hdHM/OiBBZGRyZXNzRm9ybWF0W11cbik6IFtBZGRyZXNzRm9ybWF0LCBCdWZmZXJdIHtcbiAgaWYgKCFmb3JtYXRzKSB7XG4gICAgZm9ybWF0cyA9IGFkZHJlc3NGb3JtYXRzLmZpbHRlcigoZikgPT4gaXNTdXBwb3J0ZWRBZGRyZXNzRm9ybWF0KGYsIG5ldHdvcmspKTtcbiAgfVxuXG4gIGZvciAoY29uc3QgZm9ybWF0IG9mIGZvcm1hdHMpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIFtmb3JtYXQsIHRvT3V0cHV0U2NyaXB0V2l0aEZvcm1hdChhZGRyZXNzLCBmb3JtYXQsIG5ldHdvcmspXTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyB0cnkgbmV4dFxuICAgIH1cbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihgY291bGQgbm90IHBhcnNlIG91dHB1dFNjcmlwdCBbZm9ybWF0cz0ke2Zvcm1hdHN9XWApO1xufVxuXG4vKipcbiAqIFNhbWUgYXMgYHRvT3V0cHV0U2NyaXB0QW5kRm9ybWF0YCwgb25seSByZXR1cm5pbmcgc2NyaXB0XG4gKiBAcGFyYW0gYWRkcmVzcyAtIHtAc2VlIHRvT3V0cHV0U2NyaXB0QW5kRm9ybWF0fVxuICogQHBhcmFtIG5ldHdvcmsgLSB7QHNlZSB0b091dHB1dFNjcmlwdEFuZEZvcm1hdH1cbiAqIEBwYXJhbSBmb3JtYXRzIC0ge0BzZWUgdG9PdXRwdXRTY3JpcHRBbmRGb3JtYXR9XG4gKiBAcmV0dXJuIHBhcnNlZCBvdXRwdXQgc2NyaXB0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b091dHB1dFNjcmlwdFRyeUZvcm1hdHMoYWRkcmVzczogc3RyaW5nLCBuZXR3b3JrOiBOZXR3b3JrLCBmb3JtYXRzPzogQWRkcmVzc0Zvcm1hdFtdKTogQnVmZmVyIHtcbiAgY29uc3QgWywgb3V0cHV0U2NyaXB0XSA9IHRvT3V0cHV0U2NyaXB0QW5kRm9ybWF0KGFkZHJlc3MsIG5ldHdvcmssIGZvcm1hdHMpO1xuICByZXR1cm4gb3V0cHV0U2NyaXB0O1xufVxuXG4vKipcbiAqIEBwYXJhbSBhZGRyZXNzXG4gKiBAcGFyYW0gbmV0d29ya1xuICogQHJldHVybiBhZGRyZXNzIGluIGNhbm9uaWNhbCBmb3JtYXRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvQ2Fub25pY2FsRm9ybWF0KGFkZHJlc3M6IHN0cmluZywgbmV0d29yazogTmV0d29yayk6IHN0cmluZyB7XG4gIHJldHVybiBmcm9tT3V0cHV0U2NyaXB0KHRvT3V0cHV0U2NyaXB0VHJ5Rm9ybWF0cyhhZGRyZXNzLCBuZXR3b3JrKSwgbmV0d29yayk7XG59XG4iXX0=