UNPKG

@bitgo-beta/utxo-lib

Version:

Client-side Bitcoin JavaScript library

93 lines 10.6 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.isSegwit = exports.isInternalChainCode = exports.isExternalChainCode = exports.getInternalChainCode = exports.getExternalChainCode = exports.scriptTypeForChain = exports.toChainPair = exports.isChainCode = exports.chainCodes = exports.chainCodesP2tr = exports.chainCodesP2wsh = exports.chainCodesP2shP2wsh = exports.chainCodesP2sh = void 0; /** * All valid chain codes */ exports.chainCodesP2sh = [0, 1]; exports.chainCodesP2shP2wsh = [10, 11]; exports.chainCodesP2wsh = [20, 21]; exports.chainCodesP2tr = [30, 31]; exports.chainCodes = [...exports.chainCodesP2sh, ...exports.chainCodesP2shP2wsh, ...exports.chainCodesP2wsh, ...exports.chainCodesP2tr]; function isChainCode(n) { return exports.chainCodes.includes(n); } exports.isChainCode = isChainCode; const map = new Map([ ['p2sh', exports.chainCodesP2sh], ['p2shP2wsh', exports.chainCodesP2shP2wsh], ['p2wsh', exports.chainCodesP2wsh], ['p2tr', exports.chainCodesP2tr], ].map(([k, v]) => [k, Object.freeze(v)])); const pairs = [...map.values()]; /** * @return ChainCodePair for input */ function toChainPair(v) { let pair; if (Array.isArray(v)) { if (pairs.includes(v)) { pair = v; } } if (typeof v === 'string') { pair = map.get(v); } if (typeof v === 'number') { pair = pairs.find((p) => p.includes(v)); } if (!pair) { throw new Error(`no pair for input ${v}`); } return pair; } exports.toChainPair = toChainPair; /** * @return ScriptType2Of3 for input */ function scriptTypeForChain(chain) { for (const [scriptType, pair] of map.entries()) { if (pair.includes(chain)) { return scriptType; } } throw new Error(`invalid chain ${chain}`); } exports.scriptTypeForChain = scriptTypeForChain; /** * @return chain code intended for external addresses */ function getExternalChainCode(v) { return toChainPair(v)[0]; } exports.getExternalChainCode = getExternalChainCode; /** * @return chain code intended for change outputs */ function getInternalChainCode(v) { return toChainPair(v)[1]; } exports.getInternalChainCode = getInternalChainCode; /** * @return true iff chain code is external */ function isExternalChainCode(v) { return toChainPair(v).indexOf(v) === 0; } exports.isExternalChainCode = isExternalChainCode; /** * @return true iff chain code is internal */ function isInternalChainCode(v) { return toChainPair(v).indexOf(v) === 1; } exports.isInternalChainCode = isInternalChainCode; /** * @return true iff chain code is a segwit address */ function isSegwit(v) { const segwitCodes = [...exports.chainCodesP2shP2wsh, ...exports.chainCodesP2wsh, ...exports.chainCodesP2tr]; return segwitCodes.includes(v); } exports.isSegwit = isSegwit; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhaW5zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2JpdGdvL3dhbGxldC9jaGFpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBYUE7O0dBRUc7QUFDVSxRQUFBLGNBQWMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQVUsQ0FBQztBQUNqQyxRQUFBLG1CQUFtQixHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBVSxDQUFDO0FBQ3hDLFFBQUEsZUFBZSxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBVSxDQUFDO0FBQ3BDLFFBQUEsY0FBYyxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBVSxDQUFDO0FBQ25DLFFBQUEsVUFBVSxHQUFHLENBQUMsR0FBRyxzQkFBYyxFQUFFLEdBQUcsMkJBQW1CLEVBQUUsR0FBRyx1QkFBZSxFQUFFLEdBQUcsc0JBQWMsQ0FBQyxDQUFDO0FBRTdHLFNBQWdCLFdBQVcsQ0FBQyxDQUFVO0lBQ3BDLE9BQU8sa0JBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBYyxDQUFDLENBQUM7QUFDN0MsQ0FBQztBQUZELGtDQUVDO0FBUUQsTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQ2pCO0lBQ0UsQ0FBQyxNQUFNLEVBQUUsc0JBQWMsQ0FBQztJQUN4QixDQUFDLFdBQVcsRUFBRSwyQkFBbUIsQ0FBQztJQUNsQyxDQUFDLE9BQU8sRUFBRSx1QkFBZSxDQUFDO0lBQzFCLENBQUMsTUFBTSxFQUFFLHNCQUFjLENBQUM7Q0FDekIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFtQixFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFrQixDQUFDLENBQUMsQ0FDNUUsQ0FBQztBQUVGLE1BQU0sS0FBSyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztBQUVoQzs7R0FFRztBQUNILFNBQWdCLFdBQVcsQ0FBQyxDQUE2QztJQUN2RSxJQUFJLElBQUksQ0FBQztJQUNULElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtRQUNwQixJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBa0IsQ0FBQyxFQUFFO1lBQ3RDLElBQUksR0FBRyxDQUFDLENBQUM7U0FDVjtLQUNGO0lBQ0QsSUFBSSxPQUFPLENBQUMsS0FBSyxRQUFRLEVBQUU7UUFDekIsSUFBSSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDbkI7SUFDRCxJQUFJLE9BQU8sQ0FBQyxLQUFLLFFBQVEsRUFBRTtRQUN6QixJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQ3pDO0lBQ0QsSUFBSSxDQUFDLElBQUksRUFBRTtRQUNULE1BQU0sSUFBSSxLQUFLLENBQUMscUJBQXFCLENBQUMsRUFBRSxDQUFDLENBQUM7S0FDM0M7SUFDRCxPQUFPLElBQXFCLENBQUM7QUFDL0IsQ0FBQztBQWpCRCxrQ0FpQkM7QUFFRDs7R0FFRztBQUNILFNBQWdCLGtCQUFrQixDQUFDLEtBQWdCO0lBQ2pELEtBQUssTUFBTSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsT0FBTyxFQUFFLEVBQUU7UUFDOUMsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ3hCLE9BQU8sVUFBVSxDQUFDO1NBQ25CO0tBQ0Y7SUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLGlCQUFpQixLQUFLLEVBQUUsQ0FBQyxDQUFDO0FBQzVDLENBQUM7QUFQRCxnREFPQztBQUVEOztHQUVHO0FBQ0gsU0FBZ0Isb0JBQW9CLENBQUMsQ0FBNkM7SUFDaEYsT0FBTyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDM0IsQ0FBQztBQUZELG9EQUVDO0FBRUQ7O0dBRUc7QUFDSCxTQUFnQixvQkFBb0IsQ0FBQyxDQUE2QztJQUNoRixPQUFPLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMzQixDQUFDO0FBRkQsb0RBRUM7QUFFRDs7R0FFRztBQUNILFNBQWdCLG1CQUFtQixDQUFDLENBQVk7SUFDOUMsT0FBTyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUN6QyxDQUFDO0FBRkQsa0RBRUM7QUFFRDs7R0FFRztBQUNILFNBQWdCLG1CQUFtQixDQUFDLENBQVk7SUFDOUMsT0FBTyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUN6QyxDQUFDO0FBRkQsa0RBRUM7QUFFRDs7R0FFRztBQUNILFNBQWdCLFFBQVEsQ0FBQyxDQUFZO0lBQ25DLE1BQU0sV0FBVyxHQUFnQixDQUFDLEdBQUcsMkJBQW1CLEVBQUUsR0FBRyx1QkFBZSxFQUFFLEdBQUcsc0JBQWMsQ0FBQyxDQUFDO0lBQ2pHLE9BQU8sV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQyxDQUFDO0FBSEQsNEJBR0MiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIERlZmluZXMgQml0R28gbWFwcGluZ3MgYmV0d2VlbiBiaXAzMiBkZXJpdmF0aW9uIHBhdGggYW5kIHNjcmlwdCB0eXBlLlxuICpcbiAqIFRoZSBzY3JpcHRzIGZvciBhIEJpdEdvIHdhbGxldCBhZGRyZXNzIGFyZSBkZWZpbmVkIGJ5IHRoZWlyIGRlcml2YXRpb24gcGF0aC5cbiAqXG4gKiBUaGUgZGVyaXZhdGlvbiBwYXRoIGhhcyB0aGUgZm9ybWF0IGAwLzAvJHtjaGFpbn0vJHtpbmRleH1gIChpbiByYXJlIGNhc2VzIHRoZSBwcmVmaXggaXMgbm90IDAvMClcbiAqXG4gKiBUaGUgYWRkcmVzcyBzY3JpcHQgdHlwZSAoU2NyaXB0VHlwZTJPZjMpIGlzIGRlZmluZWQgYnkgdGhlIGBjaGFpbmAgcGFyYW1ldGVyLlxuICpcbiAqIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBtYXBwaW5nIGJldHdlZW4gY2hhaW4gcGFyYW1ldGVyIGFuZCBhZGRyZXNzIHR5cGUuXG4gKi9cbmltcG9ydCB7IFNjcmlwdFR5cGUyT2YzIH0gZnJvbSAnLi4vb3V0cHV0U2NyaXB0cyc7XG5cbi8qKlxuICogQWxsIHZhbGlkIGNoYWluIGNvZGVzXG4gKi9cbmV4cG9ydCBjb25zdCBjaGFpbkNvZGVzUDJzaCA9IFswLCAxXSBhcyBjb25zdDtcbmV4cG9ydCBjb25zdCBjaGFpbkNvZGVzUDJzaFAyd3NoID0gWzEwLCAxMV0gYXMgY29uc3Q7XG5leHBvcnQgY29uc3QgY2hhaW5Db2Rlc1Ayd3NoID0gWzIwLCAyMV0gYXMgY29uc3Q7XG5leHBvcnQgY29uc3QgY2hhaW5Db2Rlc1AydHIgPSBbMzAsIDMxXSBhcyBjb25zdDtcbmV4cG9ydCBjb25zdCBjaGFpbkNvZGVzID0gWy4uLmNoYWluQ29kZXNQMnNoLCAuLi5jaGFpbkNvZGVzUDJzaFAyd3NoLCAuLi5jaGFpbkNvZGVzUDJ3c2gsIC4uLmNoYWluQ29kZXNQMnRyXTtcbmV4cG9ydCB0eXBlIENoYWluQ29kZSA9IHR5cGVvZiBjaGFpbkNvZGVzW251bWJlcl07XG5leHBvcnQgZnVuY3Rpb24gaXNDaGFpbkNvZGUobjogdW5rbm93bik6IG4gaXMgQ2hhaW5Db2RlIHtcbiAgcmV0dXJuIGNoYWluQ29kZXMuaW5jbHVkZXMobiBhcyBDaGFpbkNvZGUpO1xufVxuXG4vKipcbiAqIEEgc2NyaXB0IHR5cGUgbWFwcyB0byB0d28gQ2hhaW5Db2RlczpcbiAqIEV4dGVybmFsIGFkZHJlc3NlcyBhcmUgaW50ZW5kZWQgZm9yIGRlcG9zaXRzLCBpbnRlcm5hbCBhZGRyZXNzZXMgYXJlIGludGVuZGVkIGZvciBjaGFuZ2Ugb3V0cHV0cy5cbiAqL1xuZXhwb3J0IHR5cGUgQ2hhaW5Db2RlUGFpciA9IFJlYWRvbmx5PFtleHRlcm5hbDogQ2hhaW5Db2RlLCBpbnRlcm5hbDogQ2hhaW5Db2RlXT47XG5cbmNvbnN0IG1hcCA9IG5ldyBNYXA8U2NyaXB0VHlwZTJPZjMsIENoYWluQ29kZVBhaXI+KFxuICBbXG4gICAgWydwMnNoJywgY2hhaW5Db2Rlc1Ayc2hdLFxuICAgIFsncDJzaFAyd3NoJywgY2hhaW5Db2Rlc1Ayc2hQMndzaF0sXG4gICAgWydwMndzaCcsIGNoYWluQ29kZXNQMndzaF0sXG4gICAgWydwMnRyJywgY2hhaW5Db2Rlc1AydHJdLFxuICBdLm1hcCgoW2ssIHZdKSA9PiBbayBhcyBTY3JpcHRUeXBlMk9mMywgT2JqZWN0LmZyZWV6ZSh2KSBhcyBDaGFpbkNvZGVQYWlyXSlcbik7XG5cbmNvbnN0IHBhaXJzID0gWy4uLm1hcC52YWx1ZXMoKV07XG5cbi8qKlxuICogQHJldHVybiBDaGFpbkNvZGVQYWlyIGZvciBpbnB1dFxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9DaGFpblBhaXIodjogQ2hhaW5Db2RlUGFpciB8IENoYWluQ29kZSB8IFNjcmlwdFR5cGUyT2YzKTogQ2hhaW5Db2RlUGFpciB7XG4gIGxldCBwYWlyO1xuICBpZiAoQXJyYXkuaXNBcnJheSh2KSkge1xuICAgIGlmIChwYWlycy5pbmNsdWRlcyh2IGFzIENoYWluQ29kZVBhaXIpKSB7XG4gICAgICBwYWlyID0gdjtcbiAgICB9XG4gIH1cbiAgaWYgKHR5cGVvZiB2ID09PSAnc3RyaW5nJykge1xuICAgIHBhaXIgPSBtYXAuZ2V0KHYpO1xuICB9XG4gIGlmICh0eXBlb2YgdiA9PT0gJ251bWJlcicpIHtcbiAgICBwYWlyID0gcGFpcnMuZmluZCgocCkgPT4gcC5pbmNsdWRlcyh2KSk7XG4gIH1cbiAgaWYgKCFwYWlyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBubyBwYWlyIGZvciBpbnB1dCAke3Z9YCk7XG4gIH1cbiAgcmV0dXJuIHBhaXIgYXMgQ2hhaW5Db2RlUGFpcjtcbn1cblxuLyoqXG4gKiBAcmV0dXJuIFNjcmlwdFR5cGUyT2YzIGZvciBpbnB1dFxuICovXG5leHBvcnQgZnVuY3Rpb24gc2NyaXB0VHlwZUZvckNoYWluKGNoYWluOiBDaGFpbkNvZGUpOiBTY3JpcHRUeXBlMk9mMyB7XG4gIGZvciAoY29uc3QgW3NjcmlwdFR5cGUsIHBhaXJdIG9mIG1hcC5lbnRyaWVzKCkpIHtcbiAgICBpZiAocGFpci5pbmNsdWRlcyhjaGFpbikpIHtcbiAgICAgIHJldHVybiBzY3JpcHRUeXBlO1xuICAgIH1cbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgY2hhaW4gJHtjaGFpbn1gKTtcbn1cblxuLyoqXG4gKiBAcmV0dXJuIGNoYWluIGNvZGUgaW50ZW5kZWQgZm9yIGV4dGVybmFsIGFkZHJlc3Nlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RXh0ZXJuYWxDaGFpbkNvZGUodjogQ2hhaW5Db2RlUGFpciB8IFNjcmlwdFR5cGUyT2YzIHwgQ2hhaW5Db2RlKTogQ2hhaW5Db2RlIHtcbiAgcmV0dXJuIHRvQ2hhaW5QYWlyKHYpWzBdO1xufVxuXG4vKipcbiAqIEByZXR1cm4gY2hhaW4gY29kZSBpbnRlbmRlZCBmb3IgY2hhbmdlIG91dHB1dHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEludGVybmFsQ2hhaW5Db2RlKHY6IENoYWluQ29kZVBhaXIgfCBTY3JpcHRUeXBlMk9mMyB8IENoYWluQ29kZSk6IENoYWluQ29kZSB7XG4gIHJldHVybiB0b0NoYWluUGFpcih2KVsxXTtcbn1cblxuLyoqXG4gKiBAcmV0dXJuIHRydWUgaWZmIGNoYWluIGNvZGUgaXMgZXh0ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRXh0ZXJuYWxDaGFpbkNvZGUodjogQ2hhaW5Db2RlKTogYm9vbGVhbiB7XG4gIHJldHVybiB0b0NoYWluUGFpcih2KS5pbmRleE9mKHYpID09PSAwO1xufVxuXG4vKipcbiAqIEByZXR1cm4gdHJ1ZSBpZmYgY2hhaW4gY29kZSBpcyBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNJbnRlcm5hbENoYWluQ29kZSh2OiBDaGFpbkNvZGUpOiBib29sZWFuIHtcbiAgcmV0dXJuIHRvQ2hhaW5QYWlyKHYpLmluZGV4T2YodikgPT09IDE7XG59XG5cbi8qKlxuICogQHJldHVybiB0cnVlIGlmZiBjaGFpbiBjb2RlIGlzIGEgc2Vnd2l0IGFkZHJlc3NcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU2Vnd2l0KHY6IENoYWluQ29kZSk6IGJvb2xlYW4ge1xuICBjb25zdCBzZWd3aXRDb2RlczogQ2hhaW5Db2RlW10gPSBbLi4uY2hhaW5Db2Rlc1Ayc2hQMndzaCwgLi4uY2hhaW5Db2Rlc1Ayd3NoLCAuLi5jaGFpbkNvZGVzUDJ0cl07XG4gIHJldHVybiBzZWd3aXRDb2Rlcy5pbmNsdWRlcyh2KTtcbn1cbiJdfQ==