@bitgo-beta/utxo-lib
Version:
Client-side Bitcoin JavaScript library
104 lines • 11.8 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.RootWalletKeys = exports.DerivedWalletKeys = exports.WalletKeys = exports.eqPublicKey = void 0;
function eqPublicKey(a, b) {
return a.publicKey.equals(b.publicKey);
}
exports.eqPublicKey = eqPublicKey;
/**
* 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiV2FsbGV0S2V5cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9iaXRnby93YWxsZXQvV2FsbGV0S2V5cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFlQSxTQUFnQixXQUFXLENBQUMsQ0FBaUIsRUFBRSxDQUFpQjtJQUM5RCxPQUFPLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUN6QyxDQUFDO0FBRkQsa0NBRUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFhLFVBQVU7SUFHckI7O09BRUc7SUFDSCxZQUE0QixNQUE4QjtRQUE5QixXQUFNLEdBQU4sTUFBTSxDQUF3QjtRQUN4RCxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3RCLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ3RCLElBQUksV0FBVyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFO29CQUNoQyxNQUFNLElBQUksS0FBSyxDQUFDLDhCQUE4QixDQUFDLENBQUM7aUJBQ2pEO1lBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQW1CLENBQUM7SUFDMUUsQ0FBQztJQUVELElBQUksSUFBSTtRQUNOLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN4QixDQUFDO0lBRUQsSUFBSSxNQUFNO1FBQ1IsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3hCLENBQUM7SUFFRCxJQUFJLEtBQUs7UUFDUCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDeEIsQ0FBQztDQUNGO0FBN0JELGdDQTZCQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFhLGlCQUFrQixTQUFRLFVBQVU7SUFDL0M7OztPQUdHO0lBQ0gsWUFBbUIsTUFBc0IsRUFBUyxLQUFxQjtRQUNyRSxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUEyQixDQUFDLENBQUM7UUFEcEUsV0FBTSxHQUFOLE1BQU0sQ0FBZ0I7UUFBUyxVQUFLLEdBQUwsS0FBSyxDQUFnQjtJQUV2RSxDQUFDO0NBQ0Y7QUFSRCw4Q0FRQztBQUVEOztHQUVHO0FBQ0gsTUFBYSxjQUFlLFNBQVEsVUFBVTtJQUc1Qzs7OztPQUlHO0lBQ0gsWUFDRSxNQUE4QixFQUNkLHFCQUFxQztRQUNuRCxjQUFjLENBQUMsYUFBYTtRQUM1QixjQUFjLENBQUMsYUFBYTtRQUM1QixjQUFjLENBQUMsYUFBYTtLQUM3QjtRQUVELEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztRQU5FLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FJakM7UUFJRCxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtZQUMvQixJQUFJLENBQUMsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDeEMsTUFBTSxJQUFJLEtBQUssQ0FBQyxzREFBc0QsQ0FBQyxDQUFDO2FBQ3pFO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxpQkFBaUIsQ0FBQyxHQUFtQixFQUFFLEtBQWEsRUFBRSxLQUFhO1FBQ2pFLElBQUksQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUU7WUFDNUIsTUFBTSxJQUFJLEtBQUssQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO1NBQzNDO1FBQ0QsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0YsSUFBSSxNQUFNLEtBQUssU0FBUyxFQUFFO1lBQ3hCLE1BQU0sSUFBSSxLQUFLLENBQUMsdUJBQXVCLENBQUMsQ0FBQztTQUMxQztRQUNELE9BQU8sR0FBRyxNQUFNLElBQUksS0FBSyxJQUFJLEtBQUssRUFBRSxDQUFDO0lBQ3ZDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsc0JBQXNCLENBQUMsS0FBYSxFQUFFLEtBQWE7UUFDakQsT0FBTyxJQUFJLGlCQUFpQixDQUMxQixJQUFJLEVBQ0osSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFtQixDQUNsRixDQUFDO0lBQ0osQ0FBQzs7QUFwREgsd0NBcURDO0FBcERpQiw0QkFBYSxHQUFHLEtBQUssQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ2xhc3NlcyBmb3IgZGVyaXZpbmcga2V5IHRyaXBsZXMgZm9yIHdhbGxldCBhZGRyZXNzZXMuXG4gKlxuICogQnkgZGVmYXVsdCwgQml0R28gd2FsbGV0cyBjb25zaXN0IG9mIGEgdHJpcGxlIG9mIGJpcDMyIGV4dGVuZCBrZXlwYWlycy5cbiAqIEV2ZXJ5IHdhbGxldCBhZGRyZXNzIGNhbiBiZSBpZGVudGlmaWVkIGJ5IF8oY2hhaW46IG51bWJlciwgaW5kZXg6IG51bWJlcilfLlxuICogVGhlIGtleSBzZXQgZm9yIGEgcGFydGljdWxhciBhZGRyZXNzIGNhbiBiZSBvYnRhaW5lZCBieSBkZXJpdmluZyB3aXRoIHRoZSBwYXRoXG4gKiBgMC8wLyR7Y2hhaW59LyR7aW5kZXh9YC4gKEluIHJhcmUgY2FzZXMgdGhlIHByZWZpeCAwLzAgY2FuIGJlIGRpZmZlcmVudClcbiAqXG4gKiBTaW5jZSB3ZSBuZXZlciB1c2Ugb3RoZXIgZGVyaXZhdGlvbnMgZm9yIHV0eG8gYWRkcmVzcyBzY3JpcHRzLCB0aGUgY2xhc3NlcyBkZWZpbmVkIGhlcmUgb25seVxuICogYWxsb3cgZXhhY3RseSBvbmUgbGV2ZWwgb2YgZGVyaXZhdGlvbi5cbiAqL1xuaW1wb3J0IHsgQklQMzJJbnRlcmZhY2UgfSBmcm9tICdiaXAzMic7XG5cbmltcG9ydCB7IFRyaXBsZSB9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGVxUHVibGljS2V5KGE6IEJJUDMySW50ZXJmYWNlLCBiOiBCSVAzMkludGVyZmFjZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gYS5wdWJsaWNLZXkuZXF1YWxzKGIucHVibGljS2V5KTtcbn1cblxuLyoqXG4gKiBCYXNlIGNsYXNzIGZvciBSb290V2FsbGV0S2V5cyBhbmQgRGVyaXZlZFdhbGxldEtleXMuXG4gKiBLZXlzIGNhbiBiZSBlaXRoZXIgcHVibGljIGtleXMgb3IgcHJpdmF0ZSBrZXlzLlxuICovXG5leHBvcnQgY2xhc3MgV2FsbGV0S2V5cyB7XG4gIHB1YmxpYyByZWFkb25seSBwdWJsaWNLZXlzOiBUcmlwbGU8QnVmZmVyPjtcblxuICAvKipcbiAgICogQHBhcmFtIHRyaXBsZSAtIGJpcDMyIGtleSB0cmlwbGVcbiAgICovXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSB0cmlwbGU6IFRyaXBsZTxCSVAzMkludGVyZmFjZT4pIHtcbiAgICB0cmlwbGUuZm9yRWFjaCgoYSwgaSkgPT4ge1xuICAgICAgdHJpcGxlLmZvckVhY2goKGIsIGopID0+IHtcbiAgICAgICAgaWYgKGVxUHVibGljS2V5KGEsIGIpICYmIGkgIT09IGopIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHdhbGxldCBrZXlzIG11c3QgYmUgZGlzdGluY3RgKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnB1YmxpY0tleXMgPSB0aGlzLnRyaXBsZS5tYXAoKGspID0+IGsucHVibGljS2V5KSBhcyBUcmlwbGU8QnVmZmVyPjtcbiAgfVxuXG4gIGdldCB1c2VyKCk6IEJJUDMySW50ZXJmYWNlIHtcbiAgICByZXR1cm4gdGhpcy50cmlwbGVbMF07XG4gIH1cblxuICBnZXQgYmFja3VwKCk6IEJJUDMySW50ZXJmYWNlIHtcbiAgICByZXR1cm4gdGhpcy50cmlwbGVbMV07XG4gIH1cblxuICBnZXQgYml0Z28oKTogQklQMzJJbnRlcmZhY2Uge1xuICAgIHJldHVybiB0aGlzLnRyaXBsZVsyXTtcbiAgfVxufVxuXG4vKipcbiAqIFNldCBvZiBXYWxsZXRLZXlzIGRlcml2ZWQgZnJvbSBSb290V2FsbGV0S2V5cy4gU3VpdGFibGUgZm9yIHNpZ25pbmcgdHJhbnNhY3Rpb24gaW5wdXRzLlxuICogQ29udGFpbnMgcmVmZXJlbmNlIHRvIHRoZSBSb290V2FsbGV0S2V5cyB0aGlzIHdhcyBkZXJpdmVkIGZyb20gYXMgd2VsbCBhcyB0aGUgcGF0aHMgdXNlZFxuICogZm9yIGRlcml2YXRpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBEZXJpdmVkV2FsbGV0S2V5cyBleHRlbmRzIFdhbGxldEtleXMge1xuICAvKipcbiAgICogQHBhcmFtIHBhcmVudCAtIHdhbGxldCBrZXlzIHRvIGRlcml2ZSBmcm9tXG4gICAqIEBwYXJhbSBwYXRocyAtIHBhdGhzIHRvIGRlcml2ZSB3aXRoXG4gICAqL1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgcGFyZW50OiBSb290V2FsbGV0S2V5cywgcHVibGljIHBhdGhzOiBUcmlwbGU8c3RyaW5nPikge1xuICAgIHN1cGVyKHBhcmVudC50cmlwbGUubWFwKChrLCBpKSA9PiBrLmRlcml2ZVBhdGgocGF0aHNbaV0pKSBhcyBUcmlwbGU8QklQMzJJbnRlcmZhY2U+KTtcbiAgfVxufVxuXG4vKipcbiAqIFNldCBvZiByb290IHdhbGxldCBrZXlzLCB0eXBpY2FsbHkgaW5zdGFudGlhdGVkIHVzaW5nIHRoZSB3YWxsZXQgeHB1YiB0cmlwbGUuXG4gKi9cbmV4cG9ydCBjbGFzcyBSb290V2FsbGV0S2V5cyBleHRlbmRzIFdhbGxldEtleXMge1xuICBzdGF0aWMgcmVhZG9ubHkgZGVmYXVsdFByZWZpeCA9ICcwLzAnO1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gdHJpcGxlIC0gYmlwMzIga2V5IHRyaXBsZVxuICAgKiBAcGFyYW0gZGVyaXZhdGlvblByZWZpeGVzIC0gQ2VydGFpbiB2MSB3YWxsZXRzIG9yIHRoZWlyIG1pZ3JhdGVkIHYyIGNvdW50ZXJwYXJ0c1xuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuIGhhdmUgYSBub25zdGFuZGFyZCBwcmVmaXguXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICB0cmlwbGU6IFRyaXBsZTxCSVAzMkludGVyZmFjZT4sXG4gICAgcHVibGljIHJlYWRvbmx5IGRlcml2YXRpb25QcmVmaXhlczogVHJpcGxlPHN0cmluZz4gPSBbXG4gICAgICBSb290V2FsbGV0S2V5cy5kZWZhdWx0UHJlZml4LFxuICAgICAgUm9vdFdhbGxldEtleXMuZGVmYXVsdFByZWZpeCxcbiAgICAgIFJvb3RXYWxsZXRLZXlzLmRlZmF1bHRQcmVmaXgsXG4gICAgXVxuICApIHtcbiAgICBzdXBlcih0cmlwbGUpO1xuXG4gICAgZGVyaXZhdGlvblByZWZpeGVzLmZvckVhY2goKHApID0+IHtcbiAgICAgIGlmIChwLnN0YXJ0c1dpdGgoJy8nKSB8fCBwLmVuZHNXaXRoKCcvJykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBkZXJpdmF0aW9uIHByZWZpeCBtdXN0IG5vdCBzdGFydCBvciBlbmQgd2l0aCBhIHNsYXNoYCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIGtleVxuICAgKiBAcGFyYW0gY2hhaW5cbiAgICogQHBhcmFtIGluZGV4XG4gICAqIEByZXR1cm4gZnVsbCBkZXJpdmF0aW9uIHBhdGggZm9yIGtleSwgaW5jbHVkaW5nIGtleS1zcGVjaWZpYyBwcmVmaXhcbiAgICovXG4gIGdldERlcml2YXRpb25QYXRoKGtleTogQklQMzJJbnRlcmZhY2UsIGNoYWluOiBudW1iZXIsIGluZGV4OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5kZXJpdmF0aW9uUHJlZml4ZXMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgbm8gZGVyaXZhdGlvbiBwcmVmaXhlc2ApO1xuICAgIH1cbiAgICBjb25zdCBwcmVmaXggPSB0aGlzLmRlcml2YXRpb25QcmVmaXhlcy5maW5kKChwcmVmaXgsIGkpID0+IGVxUHVibGljS2V5KGtleSwgdGhpcy50cmlwbGVbaV0pKTtcbiAgICBpZiAocHJlZml4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihga2V5IG5vdCBpbiB3YWxsZXRLZXlzYCk7XG4gICAgfVxuICAgIHJldHVybiBgJHtwcmVmaXh9LyR7Y2hhaW59LyR7aW5kZXh9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0gY2hhaW5cbiAgICogQHBhcmFtIGluZGV4XG4gICAqIEByZXR1cm4gd2FsbGV0S2V5cyBmb3IgYSBwYXJ0aWN1bGFyIGFkZHJlc3MgaWRlbnRpZmllZCBieSAoY2hhaW4sIGluZGV4KVxuICAgKi9cbiAgZGVyaXZlRm9yQ2hhaW5BbmRJbmRleChjaGFpbjogbnVtYmVyLCBpbmRleDogbnVtYmVyKTogRGVyaXZlZFdhbGxldEtleXMge1xuICAgIHJldHVybiBuZXcgRGVyaXZlZFdhbGxldEtleXMoXG4gICAgICB0aGlzLFxuICAgICAgdGhpcy50cmlwbGUubWFwKChrKSA9PiB0aGlzLmdldERlcml2YXRpb25QYXRoKGssIGNoYWluLCBpbmRleCkpIGFzIFRyaXBsZTxzdHJpbmc+XG4gICAgKTtcbiAgfVxufVxuIl19