UNPKG

@tomo-inc/ledger-bitcoin-babylon

Version:

Ledger Hardware Wallet Babylon Application Client

68 lines 4.81 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.DefaultWalletPolicy = exports.WalletPolicy = void 0; const bitcoinjs_lib_1 = require("bitcoinjs-lib"); const buffertools_1 = require("./buffertools"); const merkle_1 = require("./merkle"); const WALLET_POLICY_V2 = 2; /** * The Bitcon hardware app uses a descriptors-like thing to describe * how to construct output scripts from keys. A "Wallet Policy" consists * of a "Descriptor Template" and a list of "keys". A key is basically * a serialized BIP32 extended public key with some added derivation path * information. This is documented at * https://github.com/LedgerHQ/app-bitcoin-new/blob/master/doc/wallet.md */ class WalletPolicy { /** * Creates and instance of a wallet policy. * @param name an ascii string, up to 16 bytes long; it must be an empty string for default wallet policies * @param descriptorTemplate the wallet policy template * @param keys and array of the keys, with the key derivation information */ constructor(name, descriptorTemplate, keys) { this.name = name; this.descriptorTemplate = descriptorTemplate; this.keys = keys; } /** * Returns the unique 32-bytes id of this wallet policy. */ getId() { return bitcoinjs_lib_1.crypto.sha256(this.serialize()); } /** * Serializes the wallet policy for transmission via the hardware wallet protocol. * @returns the serialized wallet policy */ serialize() { const keyBuffers = this.keys.map((k) => { return Buffer.from(k, 'ascii'); }); const m = new merkle_1.Merkle(keyBuffers.map((k) => (0, merkle_1.hashLeaf)(k))); const buf = new buffertools_1.BufferWriter(); buf.writeUInt8(WALLET_POLICY_V2); // wallet version // length of wallet name, and wallet name buf.writeVarSlice(Buffer.from(this.name, 'ascii')); // length of descriptor template buf.writeVarInt(this.descriptorTemplate.length); // sha256 hash of descriptor template buf.writeSlice(bitcoinjs_lib_1.crypto.sha256(Buffer.from(this.descriptorTemplate))); // number of keys buf.writeVarInt(this.keys.length); // root of Merkle tree of keys buf.writeSlice(m.getRoot()); return buf.buffer(); } } exports.WalletPolicy = WalletPolicy; /** * Simplified class to handle default wallet policies that can be used without policy registration. */ class DefaultWalletPolicy extends WalletPolicy { constructor(descriptorTemplate, key) { super('', descriptorTemplate, [key]); } } exports.DefaultWalletPolicy = DefaultWalletPolicy; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9saWN5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9wb2xpY3kudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsaURBQXVDO0FBRXZDLCtDQUE2QztBQUM3QyxxQ0FBNEM7QUFFNUMsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLENBQUM7QUFFM0I7Ozs7Ozs7R0FPRztBQUNILE1BQWEsWUFBWTtJQUl2Qjs7Ozs7T0FLRztJQUNILFlBQ0UsSUFBWSxFQUNaLGtCQUEwQixFQUMxQixJQUF1QjtRQUV2QixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQixJQUFJLENBQUMsa0JBQWtCLEdBQUcsa0JBQWtCLENBQUM7UUFDN0MsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7SUFDbkIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSztRQUNILE9BQU8sc0JBQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVEOzs7T0FHRztJQUNILFNBQVM7UUFDUCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO1lBQ3JDLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDakMsQ0FBQyxDQUFDLENBQUM7UUFDSCxNQUFNLENBQUMsR0FBRyxJQUFJLGVBQU0sQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFBLGlCQUFRLEVBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXpELE1BQU0sR0FBRyxHQUFHLElBQUksMEJBQVksRUFBRSxDQUFDO1FBQy9CLEdBQUcsQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLGlCQUFpQjtRQUVuRCx5Q0FBeUM7UUFDekMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUVuRCxnQ0FBZ0M7UUFDaEMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDaEQscUNBQXFDO1FBQ3JDLEdBQUcsQ0FBQyxVQUFVLENBQUMsc0JBQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFcEUsaUJBQWlCO1FBQ2pCLEdBQUcsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNsQyw4QkFBOEI7UUFDOUIsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUM1QixPQUFPLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUN0QixDQUFDO0NBQ0Y7QUF0REQsb0NBc0RDO0FBUUQ7O0dBRUc7QUFDSCxNQUFhLG1CQUFvQixTQUFRLFlBQVk7SUFDbkQsWUFBWSxrQkFBNkMsRUFBRSxHQUFXO1FBQ3BFLEtBQUssQ0FBQyxFQUFFLEVBQUUsa0JBQWtCLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7Q0FDRjtBQUpELGtEQUlDIn0=