fcoin/lib/wallet/walletkey.js
2017-01-06 09:57:55 -08:00

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;