UNPKG

@bitgo/utxo-lib

Version:

Client-side Bitcoin JavaScript library

104 lines 11.9 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.RootWalletKeys = exports.DerivedWalletKeys = exports.WalletKeys = void 0; exports.eqPublicKey = eqPublicKey; function eqPublicKey(a, b) { return a.publicKey.equals(b.publicKey); } /** * Base class for RootWalletKeys and DerivedWalletKeys. * Keys can be either public keys or private keys. */ class WalletKeys { /** * @param triple - bip32 key triple */ constructor(triple) { this.triple = triple; triple.forEach((a, i) => { triple.forEach((b, j) => { if (eqPublicKey(a, b) && i !== j) { throw new Error(`wallet keys must be distinct`); } }); }); this.publicKeys = this.triple.map((k) => k.publicKey); } get user() { return this.triple[0]; } get backup() { return this.triple[1]; } get bitgo() { return this.triple[2]; } } exports.WalletKeys = WalletKeys; /** * Set of WalletKeys derived from RootWalletKeys. Suitable for signing transaction inputs. * Contains reference to the RootWalletKeys this was derived from as well as the paths used * for derivation. */ class DerivedWalletKeys extends WalletKeys { /** * @param parent - wallet keys to derive from * @param paths - paths to derive with */ constructor(parent, paths) { super(parent.triple.map((k, i) => k.derivePath(paths[i]))); this.parent = parent; this.paths = paths; } } exports.DerivedWalletKeys = DerivedWalletKeys; /** * Set of root wallet keys, typically instantiated using the wallet xpub triple. */ class RootWalletKeys extends WalletKeys { /** * @param triple - bip32 key triple * @param derivationPrefixes - Certain v1 wallets or their migrated v2 counterparts * can have a nonstandard prefix. */ constructor(triple, derivationPrefixes = [ RootWalletKeys.defaultPrefix, RootWalletKeys.defaultPrefix, RootWalletKeys.defaultPrefix, ]) { super(triple); this.derivationPrefixes = derivationPrefixes; derivationPrefixes.forEach((p) => { if (p.startsWith('/') || p.endsWith('/')) { throw new Error(`derivation prefix must not start or end with a slash`); } }); } /** * @param key * @param chain * @param index * @return full derivation path for key, including key-specific prefix */ getDerivationPath(key, chain, index) { if (!this.derivationPrefixes) { throw new Error(`no derivation prefixes`); } const prefix = this.derivationPrefixes.find((prefix, i) => eqPublicKey(key, this.triple[i])); if (prefix === undefined) { throw new Error(`key not in walletKeys`); } return `${prefix}/${chain}/${index}`; } /** * @param chain * @param index * @return walletKeys for a particular address identified by (chain, index) */ deriveForChainAndIndex(chain, index) { return new DerivedWalletKeys(this, this.triple.map((k) => this.getDerivationPath(k, chain, index))); } } exports.RootWalletKeys = RootWalletKeys; RootWalletKeys.defaultPrefix = '0/0'; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiV2FsbGV0S2V5cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9iaXRnby93YWxsZXQvV2FsbGV0S2V5cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFpQkEsa0NBRUM7QUFGRCxTQUFnQixXQUFXLENBQUMsQ0FBaUIsRUFBRSxDQUFpQjtJQUM5RCxPQUFPLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUN6QyxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBYSxVQUFVO0lBR3JCOztPQUVHO0lBQ0gsWUFBNEIsTUFBOEI7UUFBOUIsV0FBTSxHQUFOLE1BQU0sQ0FBd0I7UUFDeEQsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUN0QixNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUN0QixJQUFJLFdBQVcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO29CQUNqQyxNQUFNLElBQUksS0FBSyxDQUFDLDhCQUE4QixDQUFDLENBQUM7Z0JBQ2xELENBQUM7WUFDSCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBbUIsQ0FBQztJQUMxRSxDQUFDO0lBRUQsSUFBSSxJQUFJO1FBQ04sT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3hCLENBQUM7SUFFRCxJQUFJLE1BQU07UUFDUixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDeEIsQ0FBQztJQUVELElBQUksS0FBSztRQUNQLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN4QixDQUFDO0NBQ0Y7QUE3QkQsZ0NBNkJDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQWEsaUJBQWtCLFNBQVEsVUFBVTtJQUMvQzs7O09BR0c7SUFDSCxZQUFtQixNQUFzQixFQUFTLEtBQXFCO1FBQ3JFLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQTJCLENBQUMsQ0FBQztRQURwRSxXQUFNLEdBQU4sTUFBTSxDQUFnQjtRQUFTLFVBQUssR0FBTCxLQUFLLENBQWdCO0lBRXZFLENBQUM7Q0FDRjtBQVJELDhDQVFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFhLGNBQWUsU0FBUSxVQUFVO0lBRzVDOzs7O09BSUc7SUFDSCxZQUNFLE1BQThCLEVBQ2QscUJBQXFDO1FBQ25ELGNBQWMsQ0FBQyxhQUFhO1FBQzVCLGNBQWMsQ0FBQyxhQUFhO1FBQzVCLGNBQWMsQ0FBQyxhQUFhO0tBQzdCO1FBRUQsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBTkUsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUlqQztRQUlELGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO1lBQy9CLElBQUksQ0FBQyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ3pDLE1BQU0sSUFBSSxLQUFLLENBQUMsc0RBQXNELENBQUMsQ0FBQztZQUMxRSxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxpQkFBaUIsQ0FBQyxHQUFtQixFQUFFLEtBQWEsRUFBRSxLQUFhO1FBQ2pFLElBQUksQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUM3QixNQUFNLElBQUksS0FBSyxDQUFDLHdCQUF3QixDQUFDLENBQUM7UUFDNUMsQ0FBQztRQUNELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzdGLElBQUksTUFBTSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3pCLE1BQU0sSUFBSSxLQUFLLENBQUMsdUJBQXVCLENBQUMsQ0FBQztRQUMzQyxDQUFDO1FBQ0QsT0FBTyxHQUFHLE1BQU0sSUFBSSxLQUFLLElBQUksS0FBSyxFQUFFLENBQUM7SUFDdkMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxzQkFBc0IsQ0FBQyxLQUFhLEVBQUUsS0FBYTtRQUNqRCxPQUFPLElBQUksaUJBQWlCLENBQzFCLElBQUksRUFDSixJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQW1CLENBQ2xGLENBQUM7SUFDSixDQUFDOztBQXBESCx3Q0FxREM7QUFwRGlCLDRCQUFhLEdBQUcsS0FBSyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDbGFzc2VzIGZvciBkZXJpdmluZyBrZXkgdHJpcGxlcyBmb3Igd2FsbGV0IGFkZHJlc3Nlcy5cbiAqXG4gKiBCeSBkZWZhdWx0LCBCaXRHbyB3YWxsZXRzIGNvbnNpc3Qgb2YgYSB0cmlwbGUgb2YgYmlwMzIgZXh0ZW5kIGtleXBhaXJzLlxuICogRXZlcnkgd2FsbGV0IGFkZHJlc3MgY2FuIGJlIGlkZW50aWZpZWQgYnkgXyhjaGFpbjogbnVtYmVyLCBpbmRleDogbnVtYmVyKV8uXG4gKiBUaGUga2V5IHNldCBmb3IgYSBwYXJ0aWN1bGFyIGFkZHJlc3MgY2FuIGJlIG9idGFpbmVkIGJ5IGRlcml2aW5nIHdpdGggdGhlIHBhdGhcbiAqIGAwLzAvJHtjaGFpbn0vJHtpbmRleH1gLiAoSW4gcmFyZSBjYXNlcyB0aGUgcHJlZml4IDAvMCBjYW4gYmUgZGlmZmVyZW50KVxuICpcbiAqIFNpbmNlIHdlIG5ldmVyIHVzZSBvdGhlciBkZXJpdmF0aW9ucyBmb3IgdXR4byBhZGRyZXNzIHNjcmlwdHMsIHRoZSBjbGFzc2VzIGRlZmluZWQgaGVyZSBvbmx5XG4gKiBhbGxvdyBleGFjdGx5IG9uZSBsZXZlbCBvZiBkZXJpdmF0aW9uLlxuICovXG5pbXBvcnQgeyBCSVAzMkludGVyZmFjZSB9IGZyb20gJ0BiaXRnby9zZWNwMjU2azEnO1xuXG5pbXBvcnQgeyBUcmlwbGUgfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCB0eXBlIEtleU5hbWUgPSAndXNlcicgfCAnYmFja3VwJyB8ICdiaXRnbyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBlcVB1YmxpY0tleShhOiBCSVAzMkludGVyZmFjZSwgYjogQklQMzJJbnRlcmZhY2UpOiBib29sZWFuIHtcbiAgcmV0dXJuIGEucHVibGljS2V5LmVxdWFscyhiLnB1YmxpY0tleSk7XG59XG5cbi8qKlxuICogQmFzZSBjbGFzcyBmb3IgUm9vdFdhbGxldEtleXMgYW5kIERlcml2ZWRXYWxsZXRLZXlzLlxuICogS2V5cyBjYW4gYmUgZWl0aGVyIHB1YmxpYyBrZXlzIG9yIHByaXZhdGUga2V5cy5cbiAqL1xuZXhwb3J0IGNsYXNzIFdhbGxldEtleXMge1xuICBwdWJsaWMgcmVhZG9ubHkgcHVibGljS2V5czogVHJpcGxlPEJ1ZmZlcj47XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB0cmlwbGUgLSBiaXAzMiBrZXkgdHJpcGxlXG4gICAqL1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgdHJpcGxlOiBUcmlwbGU8QklQMzJJbnRlcmZhY2U+KSB7XG4gICAgdHJpcGxlLmZvckVhY2goKGEsIGkpID0+IHtcbiAgICAgIHRyaXBsZS5mb3JFYWNoKChiLCBqKSA9PiB7XG4gICAgICAgIGlmIChlcVB1YmxpY0tleShhLCBiKSAmJiBpICE9PSBqKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB3YWxsZXQga2V5cyBtdXN0IGJlIGRpc3RpbmN0YCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgdGhpcy5wdWJsaWNLZXlzID0gdGhpcy50cmlwbGUubWFwKChrKSA9PiBrLnB1YmxpY0tleSkgYXMgVHJpcGxlPEJ1ZmZlcj47XG4gIH1cblxuICBnZXQgdXNlcigpOiBCSVAzMkludGVyZmFjZSB7XG4gICAgcmV0dXJuIHRoaXMudHJpcGxlWzBdO1xuICB9XG5cbiAgZ2V0IGJhY2t1cCgpOiBCSVAzMkludGVyZmFjZSB7XG4gICAgcmV0dXJuIHRoaXMudHJpcGxlWzFdO1xuICB9XG5cbiAgZ2V0IGJpdGdvKCk6IEJJUDMySW50ZXJmYWNlIHtcbiAgICByZXR1cm4gdGhpcy50cmlwbGVbMl07XG4gIH1cbn1cblxuLyoqXG4gKiBTZXQgb2YgV2FsbGV0S2V5cyBkZXJpdmVkIGZyb20gUm9vdFdhbGxldEtleXMuIFN1aXRhYmxlIGZvciBzaWduaW5nIHRyYW5zYWN0aW9uIGlucHV0cy5cbiAqIENvbnRhaW5zIHJlZmVyZW5jZSB0byB0aGUgUm9vdFdhbGxldEtleXMgdGhpcyB3YXMgZGVyaXZlZCBmcm9tIGFzIHdlbGwgYXMgdGhlIHBhdGhzIHVzZWRcbiAqIGZvciBkZXJpdmF0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgRGVyaXZlZFdhbGxldEtleXMgZXh0ZW5kcyBXYWxsZXRLZXlzIHtcbiAgLyoqXG4gICAqIEBwYXJhbSBwYXJlbnQgLSB3YWxsZXQga2V5cyB0byBkZXJpdmUgZnJvbVxuICAgKiBAcGFyYW0gcGF0aHMgLSBwYXRocyB0byBkZXJpdmUgd2l0aFxuICAgKi9cbiAgY29uc3RydWN0b3IocHVibGljIHBhcmVudDogUm9vdFdhbGxldEtleXMsIHB1YmxpYyBwYXRoczogVHJpcGxlPHN0cmluZz4pIHtcbiAgICBzdXBlcihwYXJlbnQudHJpcGxlLm1hcCgoaywgaSkgPT4gay5kZXJpdmVQYXRoKHBhdGhzW2ldKSkgYXMgVHJpcGxlPEJJUDMySW50ZXJmYWNlPik7XG4gIH1cbn1cblxuLyoqXG4gKiBTZXQgb2Ygcm9vdCB3YWxsZXQga2V5cywgdHlwaWNhbGx5IGluc3RhbnRpYXRlZCB1c2luZyB0aGUgd2FsbGV0IHhwdWIgdHJpcGxlLlxuICovXG5leHBvcnQgY2xhc3MgUm9vdFdhbGxldEtleXMgZXh0ZW5kcyBXYWxsZXRLZXlzIHtcbiAgc3RhdGljIHJlYWRvbmx5IGRlZmF1bHRQcmVmaXggPSAnMC8wJztcblxuICAvKipcbiAgICogQHBhcmFtIHRyaXBsZSAtIGJpcDMyIGtleSB0cmlwbGVcbiAgICogQHBhcmFtIGRlcml2YXRpb25QcmVmaXhlcyAtIENlcnRhaW4gdjEgd2FsbGV0cyBvciB0aGVpciBtaWdyYXRlZCB2MiBjb3VudGVycGFydHNcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbiBoYXZlIGEgbm9uc3RhbmRhcmQgcHJlZml4LlxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgdHJpcGxlOiBUcmlwbGU8QklQMzJJbnRlcmZhY2U+LFxuICAgIHB1YmxpYyByZWFkb25seSBkZXJpdmF0aW9uUHJlZml4ZXM6IFRyaXBsZTxzdHJpbmc+ID0gW1xuICAgICAgUm9vdFdhbGxldEtleXMuZGVmYXVsdFByZWZpeCxcbiAgICAgIFJvb3RXYWxsZXRLZXlzLmRlZmF1bHRQcmVmaXgsXG4gICAgICBSb290V2FsbGV0S2V5cy5kZWZhdWx0UHJlZml4LFxuICAgIF1cbiAgKSB7XG4gICAgc3VwZXIodHJpcGxlKTtcblxuICAgIGRlcml2YXRpb25QcmVmaXhlcy5mb3JFYWNoKChwKSA9PiB7XG4gICAgICBpZiAocC5zdGFydHNXaXRoKCcvJykgfHwgcC5lbmRzV2l0aCgnLycpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgZGVyaXZhdGlvbiBwcmVmaXggbXVzdCBub3Qgc3RhcnQgb3IgZW5kIHdpdGggYSBzbGFzaGApO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBrZXlcbiAgICogQHBhcmFtIGNoYWluXG4gICAqIEBwYXJhbSBpbmRleFxuICAgKiBAcmV0dXJuIGZ1bGwgZGVyaXZhdGlvbiBwYXRoIGZvciBrZXksIGluY2x1ZGluZyBrZXktc3BlY2lmaWMgcHJlZml4XG4gICAqL1xuICBnZXREZXJpdmF0aW9uUGF0aChrZXk6IEJJUDMySW50ZXJmYWNlLCBjaGFpbjogbnVtYmVyLCBpbmRleDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMuZGVyaXZhdGlvblByZWZpeGVzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYG5vIGRlcml2YXRpb24gcHJlZml4ZXNgKTtcbiAgICB9XG4gICAgY29uc3QgcHJlZml4ID0gdGhpcy5kZXJpdmF0aW9uUHJlZml4ZXMuZmluZCgocHJlZml4LCBpKSA9PiBlcVB1YmxpY0tleShrZXksIHRoaXMudHJpcGxlW2ldKSk7XG4gICAgaWYgKHByZWZpeCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYGtleSBub3QgaW4gd2FsbGV0S2V5c2ApO1xuICAgIH1cbiAgICByZXR1cm4gYCR7cHJlZml4fS8ke2NoYWlufS8ke2luZGV4fWA7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIGNoYWluXG4gICAqIEBwYXJhbSBpbmRleFxuICAgKiBAcmV0dXJuIHdhbGxldEtleXMgZm9yIGEgcGFydGljdWxhciBhZGRyZXNzIGlkZW50aWZpZWQgYnkgKGNoYWluLCBpbmRleClcbiAgICovXG4gIGRlcml2ZUZvckNoYWluQW5kSW5kZXgoY2hhaW46IG51bWJlciwgaW5kZXg6IG51bWJlcik6IERlcml2ZWRXYWxsZXRLZXlzIHtcbiAgICByZXR1cm4gbmV3IERlcml2ZWRXYWxsZXRLZXlzKFxuICAgICAgdGhpcyxcbiAgICAgIHRoaXMudHJpcGxlLm1hcCgoaykgPT4gdGhpcy5nZXREZXJpdmF0aW9uUGF0aChrLCBjaGFpbiwgaW5kZXgpKSBhcyBUcmlwbGU8c3RyaW5nPlxuICAgICk7XG4gIH1cbn1cbiJdfQ==