190 lines
3.9 KiB
JavaScript
190 lines
3.9 KiB
JavaScript
/*!
|
|
* 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;
|