UNPKG

hsd

Version:
191 lines (155 loc) 4 kB
/*! * walletkey.js - walletkey object for hsd * Copyright (c) 2017-2018, Christopher Jeffrey (MIT License). * https://github.com/handshake-org/hsd */ 'use strict'; const KeyRing = require('../primitives/keyring'); const Path = require('./path'); /** @typedef {import('../hd/private')} HDPrivateKey */ /** @typedef {import('../hd/public')} HDPublicKey */ /** @typedef {import('../protocol/network')} Network */ /** @typedef {import('./account')} Account */ /** * Wallet Key * Represents a key ring which amounts to an address. * @alias module:wallet.WalletKey * @extends KeyRing */ class WalletKey extends KeyRing { /** * Create a wallet key. * @constructor * @param {Object?} options */ constructor(options) { super(options); this.keyType = Path.types.HD; this.name = null; this.account = -1; this.branch = -1; this.index = -1; } /** * Convert an WalletKey to a more json-friendly object. * @param {Network} [network] * @returns {Object} */ getJSON(network) { return { name: this.name, account: this.account, branch: this.branch, index: this.index, publicKey: this.publicKey.toString('hex'), script: this.script ? this.script.toHex() : null, address: this.getAddress().toString(network) }; } /** * Inject properties from hd key. * @param {Account} account * @param {HDPrivateKey|HDPublicKey} key * @param {Number} branch * @param {Number} index * @returns {this} */ fromHD(account, key, branch, index) { this.keyType = Path.types.HD; this.name = account.name; this.account = account.accountIndex; this.branch = branch; this.index = index; if (key.privateKey) return this.fromPrivate(key.privateKey); return this.fromPublic(key.publicKey); } /** * Instantiate a wallet key from hd key. * @param {Account} account * @param {HDPrivateKey|HDPublicKey} key * @param {Number} branch * @param {Number} index * @returns {WalletKey} */ static fromHD(account, key, branch, index) { return new this().fromHD(account, key, branch, index); } /** * Inject properties from imported data. * @param {Account} account * @param {Buffer} data * @returns {WalletKey} */ fromImport(account, data) { this.keyType = Path.types.KEY; this.name = account.name; this.account = account.accountIndex; return this.decode(data); } /** * Instantiate a wallet key from imported data. * @param {Account} account * @param {Buffer} data * @returns {WalletKey} */ static fromImport(account, data) { return new this().fromImport(account, data); } /** * Inject properties from key. * @private * @param {Account} account * @param {KeyRing} ring * @returns {WalletKey} */ fromRing(account, ring) { this.keyType = Path.types.KEY; this.name = account.name; this.account = account.accountIndex; return this.fromOptions(ring); } /** * Instantiate a wallet key from regular key. * @param {Account} account * @param {KeyRing} ring * @returns {WalletKey} */ static fromRing(account, ring) { return new this().fromRing(account, ring); } /** * Convert wallet key to a path. * @returns {Path} */ toPath() { const path = new Path(); path.name = this.name; path.account = this.account; switch (this.keyType) { case Path.types.HD: path.branch = this.branch; path.index = this.index; break; case Path.types.KEY: path.data = this.encode(); break; } path.keyType = this.keyType; path.version = this.getVersion(); path.hash = this.getHash(); return path; } /** * Test whether an object is a WalletKey. * @param {Object} obj * @returns {Boolean} */ static isWalletKey(obj) { return obj instanceof WalletKey; } } /* * Expose */ module.exports = WalletKey;