308 lines
6.9 KiB
JavaScript
308 lines
6.9 KiB
JavaScript
/*!
|
|
* walletkey.js - walletkey object for bcoin
|
|
* Copyright (c) 2014-2015, Fedor Indutny (MIT License)
|
|
* Copyright (c) 2014-2016, Christopher Jeffrey (MIT License).
|
|
* https://github.com/bcoin-org/bcoin
|
|
*/
|
|
|
|
'use strict';
|
|
|
|
var KeyRing = require('../primitives/keyring');
|
|
var util = require('../utils/util');
|
|
var Path = require('./path');
|
|
var Script = require('../script/script');
|
|
|
|
/**
|
|
* Represents a key ring which amounts to an address.
|
|
* @exports WalletKey
|
|
* @constructor
|
|
* @param {Object} options
|
|
*/
|
|
|
|
function WalletKey(options, network) {
|
|
if (!(this instanceof WalletKey))
|
|
return new WalletKey(options, network);
|
|
|
|
KeyRing.call(this, options, network);
|
|
|
|
this.keyType = Path.types.HD;
|
|
|
|
this.id = null;
|
|
this.wid = -1;
|
|
this.name = null;
|
|
this.account = -1;
|
|
this.branch = -1;
|
|
this.index = -1;
|
|
}
|
|
|
|
util.inherits(WalletKey, KeyRing);
|
|
|
|
/**
|
|
* Instantiate key ring from options.
|
|
* @param {Object} options
|
|
* @returns {WalletKey}
|
|
*/
|
|
|
|
WalletKey.fromOptions = function fromOptions(options) {
|
|
return new WalletKey().fromOptions(options);
|
|
};
|
|
|
|
/**
|
|
* Instantiate wallet key from a private key.
|
|
* @param {Buffer} key
|
|
* @param {Boolean?} compressed
|
|
* @param {(NetworkType|Network)} network
|
|
* @returns {WalletKey}
|
|
*/
|
|
|
|
WalletKey.fromPrivate = function fromPrivate(key, compressed, network) {
|
|
return new WalletKey().fromPrivate(key, compressed, network);
|
|
};
|
|
|
|
/**
|
|
* Generate a wallet key.
|
|
* @param {(Network|NetworkType)?} network
|
|
* @returns {WalletKey}
|
|
*/
|
|
|
|
WalletKey.generate = function(compressed, network) {
|
|
return new WalletKey().generate(compressed, network);
|
|
};
|
|
|
|
/**
|
|
* Instantiate wallet key from a public key.
|
|
* @param {Buffer} publicKey
|
|
* @param {(NetworkType|Network)} network
|
|
* @returns {WalletKey}
|
|
*/
|
|
|
|
WalletKey.fromPublic = function fromPublic(key, network) {
|
|
return new WalletKey().fromPublic(key, network);
|
|
};
|
|
|
|
/**
|
|
* Instantiate wallet key from a public key.
|
|
* @param {Buffer} publicKey
|
|
* @param {(NetworkType|Network)} network
|
|
* @returns {WalletKey}
|
|
*/
|
|
|
|
WalletKey.fromKey = function fromKey(key, compressed, network) {
|
|
return new WalletKey().fromKey(key, compressed, network);
|
|
};
|
|
|
|
/**
|
|
* Instantiate wallet key from script.
|
|
* @param {Buffer} key
|
|
* @param {Script} script
|
|
* @param {(NetworkType|Network)} network
|
|
* @returns {WalletKey}
|
|
*/
|
|
|
|
WalletKey.fromScript = function fromScript(key, script, compressed, network) {
|
|
return new WalletKey().fromScript(key, script, compressed, network);
|
|
};
|
|
|
|
/**
|
|
* Instantiate a wallet key from a serialized CBitcoinSecret.
|
|
* @param {Base58String} secret
|
|
* @returns {WalletKey}
|
|
*/
|
|
|
|
WalletKey.fromSecret = function fromSecret(data) {
|
|
return new WalletKey().fromSecret(data);
|
|
};
|
|
|
|
/**
|
|
* Convert an WalletKey to a more json-friendly object.
|
|
* @returns {Object}
|
|
*/
|
|
|
|
WalletKey.prototype.toJSON = function toJSON() {
|
|
return {
|
|
network: this.network.type,
|
|
wid: this.wid,
|
|
id: this.id,
|
|
name: this.name,
|
|
account: this.account,
|
|
branch: this.branch,
|
|
index: this.index,
|
|
witness: this.witness,
|
|
nested: this.nested,
|
|
publicKey: this.publicKey.toString('hex'),
|
|
script: this.script ? this.script.toRaw().toString('hex') : null,
|
|
program: this.witness ? this.getProgram().toRaw().toString('hex') : null,
|
|
type: Script.typesByVal[this.getType()].toLowerCase(),
|
|
address: this.getAddress('base58')
|
|
};
|
|
};
|
|
|
|
/**
|
|
* Instantiate an WalletKey from a jsonified transaction object.
|
|
* @param {Object} json - The jsonified transaction object.
|
|
* @returns {WalletKey}
|
|
*/
|
|
|
|
WalletKey.fromJSON = function fromJSON(json) {
|
|
return new WalletKey().fromJSON(json);
|
|
};
|
|
|
|
/**
|
|
* Instantiate a wallet key from serialized data.
|
|
* @param {Buffer} data
|
|
* @returns {WalletKey}
|
|
*/
|
|
|
|
WalletKey.fromRaw = function fromRaw(data) {
|
|
return new WalletKey().fromRaw(data);
|
|
};
|
|
|
|
/**
|
|
* Inject properties from hd key.
|
|
* @private
|
|
* @param {Account} account
|
|
* @param {HDPrivateKey|HDPublicKey} key
|
|
* @param {Number} branch
|
|
* @param {Number} index
|
|
* @returns {WalletKey}
|
|
*/
|
|
|
|
WalletKey.prototype.fromHD = function fromHD(account, key, branch, index) {
|
|
this.keyType = Path.types.HD;
|
|
this.id = account.id;
|
|
this.wid = account.wid;
|
|
this.name = account.name;
|
|
this.account = account.accountIndex;
|
|
this.branch = branch;
|
|
this.index = index;
|
|
this.witness = account.witness;
|
|
this.nested = branch === 2;
|
|
|
|
if (key.privateKey)
|
|
return this.fromPrivate(key.privateKey, account.network);
|
|
|
|
return this.fromPublic(key.publicKey, account.network);
|
|
};
|
|
|
|
/**
|
|
* Instantiate a wallet key from hd key.
|
|
* @param {Account} account
|
|
* @param {HDPrivateKey|HDPublicKey} key
|
|
* @param {Number} branch
|
|
* @param {Number} index
|
|
* @returns {WalletKey}
|
|
*/
|
|
|
|
WalletKey.fromHD = function fromHD(account, key, branch, index) {
|
|
return new WalletKey().fromHD(account, key, branch, index);
|
|
};
|
|
|
|
/**
|
|
* Inject properties from imported data.
|
|
* @private
|
|
* @param {Account} account
|
|
* @param {Buffer} data
|
|
* @returns {WalletKey}
|
|
*/
|
|
|
|
WalletKey.prototype.fromImport = function fromImport(account, data) {
|
|
this.keyType = Path.types.KEY;
|
|
this.id = account.id;
|
|
this.wid = account.wid;
|
|
this.name = account.name;
|
|
this.account = account.accountIndex;
|
|
this.witness = account.witness;
|
|
return this.fromRaw(data, account.network);
|
|
};
|
|
|
|
/**
|
|
* Instantiate a wallet key from imported data.
|
|
* @param {Account} account
|
|
* @param {Buffer} data
|
|
* @returns {WalletKey}
|
|
*/
|
|
|
|
WalletKey.fromImport = function fromImport(account, data) {
|
|
return new WalletKey().fromImport(account, data);
|
|
};
|
|
|
|
/**
|
|
* Inject properties from key.
|
|
* @private
|
|
* @param {Account} account
|
|
* @param {KeyRing} ring
|
|
* @returns {WalletKey}
|
|
*/
|
|
|
|
WalletKey.prototype.fromRing = function fromRing(account, ring) {
|
|
this.keyType = Path.types.KEY;
|
|
this.id = account.id;
|
|
this.wid = account.wid;
|
|
this.name = account.name;
|
|
this.account = account.accountIndex;
|
|
this.witness = account.witness;
|
|
return this.fromOptions(ring, ring.network);
|
|
};
|
|
|
|
/**
|
|
* Instantiate a wallet key from regular key.
|
|
* @param {Account} account
|
|
* @param {KeyRing} ring
|
|
* @returns {WalletKey}
|
|
*/
|
|
|
|
WalletKey.fromRing = function fromRing(account, ring) {
|
|
return new WalletKey().fromRing(account, ring);
|
|
};
|
|
|
|
/**
|
|
* Convert wallet key to a path.
|
|
* @returns {Path}
|
|
*/
|
|
|
|
WalletKey.prototype.toPath = function toPath() {
|
|
var path = new Path();
|
|
|
|
path.id = this.id;
|
|
path.wid = this.wid;
|
|
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.toRaw();
|
|
break;
|
|
}
|
|
|
|
path.keyType = this.keyType;
|
|
|
|
path.version = this.getVersion();
|
|
path.type = this.getType();
|
|
path.hash = this.getHash('hex');
|
|
|
|
return path;
|
|
};
|
|
|
|
/**
|
|
* Test whether an object is a WalletKey.
|
|
* @param {Object} obj
|
|
* @returns {Boolean}
|
|
*/
|
|
|
|
WalletKey.isWalletKey = function isWalletKey(obj) {
|
|
return obj
|
|
&& Buffer.isBuffer(obj.publicKey)
|
|
&& typeof obj.index === 'number'
|
|
&& typeof obj.toPath === 'function';
|
|
};
|
|
|
|
/*
|
|
* Expose
|
|
*/
|
|
|
|
module.exports = WalletKey;
|