This commit is contained in:
Christopher Jeffrey 2016-05-28 21:31:47 -07:00
parent 1002c222a6
commit 663e62639d
No known key found for this signature in database
GPG Key ID: 8962AB9DE6666BBD
2 changed files with 109 additions and 6 deletions

View File

@ -860,7 +860,10 @@ HDPrivateKey.generate = function generate(options, network) {
*/
HDPrivateKey.parseBase58 = function parseBase58(xkey) {
var raw = utils.fromBase58(xkey);
return HDPrivateKey.parseRaw(utils.fromBase58(xkey));
};
HDPrivateKey.parseRaw = function parseRaw(raw) {
var p = new BufferReader(raw, true);
var data = {};
var i, type, prefix;
@ -896,7 +899,11 @@ HDPrivateKey.parseBase58 = function parseBase58(xkey) {
*/
HDPrivateKey.prototype.toBase58 = function toBase58(network) {
var p = new BufferWriter();
return utils.toBase58(this.toRaw(network));
};
HDPrivateKey.prototype.toRaw = function toRaw(network, writer) {
var p = new BufferWriter(writer);
if (!network)
network = this.network;
@ -912,7 +919,10 @@ HDPrivateKey.prototype.toBase58 = function toBase58(network) {
p.writeBytes(this.privateKey);
p.writeChecksum();
return utils.toBase58(p.render());
if (!writer)
p = p.render();
return p;
};
/**
@ -1309,7 +1319,10 @@ HDPublicKey.isExtended = function isExtended(data) {
*/
HDPublicKey.parseBase58 = function parseBase58(xkey) {
var raw = utils.fromBase58(xkey);
return HDPublicKey.parseRaw(utils.fromBase58(xkey));
};
HDPublicKey.parseRaw = function parseRaw(raw) {
var p = new BufferReader(raw, true);
var data = {};
var i, type, prefix;
@ -1344,7 +1357,11 @@ HDPublicKey.parseBase58 = function parseBase58(xkey) {
*/
HDPublicKey.prototype.toBase58 = function toBase58(network) {
var p = new BufferWriter();
return utils.toBase58(this.toRaw(network));
};
HDPublicKey.prototype.toRaw = function toRaw(network, writer) {
var p = new BufferWriter(writer);
if (!network)
network = this.network;
@ -1359,7 +1376,10 @@ HDPublicKey.prototype.toBase58 = function toBase58(network) {
p.writeBytes(this.publicKey);
p.writeChecksum();
return utils.toBase58(p.render());
if (!writer)
p = p.render();
return p;
};
/**

View File

@ -1572,6 +1572,89 @@ Wallet.prototype.toJSON = function toJSON() {
};
};
Wallet.prototype.toRaw = function toRaw(writer) {
var p = new BufferWriter(writer);
var i;
p.writeU32(this.network.magic);
p.writeVarString(this.id, 'ascii');
p.writeU8(this.type === 'pubkeyhash' ? 0 : 1);
p.writeU8(this.m);
p.writeU8(this.n);
p.writeU8(this.witness ? 1 : 0);
p.writeU8(this.derivation === 'bip44' ? 44 : 45);
p.writeU8(this.copayBIP45 ? 1 : 0);
p.writeU32(this.accountIndex);
p.writeU32(this.receiveDepth);
p.writeU32(this.changeDepth);
p.writeVarBytes(this.master.toRaw());
p.writeBytes(this.accountKey.toRaw()); // 82 bytes
p.writeVarint(this.keys.length);
for (i = 0; i < this.keys.length; i++)
p.writeBytes(this.keys[i].toRaw());
if (!writer)
p = p.render();
return p;
};
Wallet.fromRaw = function fromRaw(data) {
return new Wallet(Wallet.parseRaw(data));
};
Wallet.parseRaw = function parseRaw(data) {
var networks = bcoin.protocol.network;
var p = new BufferReader(data);
var magic = p.readU32();
var id = this.readVarString('ascii');
var type = p.readU8() === 0 ? 'pubkeyhash' : 'multisig';
var m = p.readU8();
var n = p.readU8();
var witness = p.readU8() === 1;
var derivation = p.readU8() === 44 ? 'bip44' : 'bip45';
var copayBIP45 = p.readU8() === 1;
var accountIndex = p.readU32();
var receiveDepth = p.readU32();
var changeDepth = p.readU32();
var master = MasterKey.fromRaw(p.readVarBytes());
var accountKey = bcoin.hd.PublicKey.fromRaw(p.readBytes(82));
var count = p.readVarint();
var keys = [];
var i, type, network;
for (i = 0; i < count; i++)
keys.push(bcoin.hd.PublicKey.fromRaw(p.readBytes(82)));
for (i = 0; i < networks.types.length; i++) {
type = networks.types[i];
if (magic === networks[type].magic) {
network = type;
break;
}
}
assert(network, 'Network not found.');
return {
network: network,
id: id,
type: type,
m: m,
n: n,
witness: witness,
derivation: derivation,
copayBIP45: copayBIP45,
accountIndex: accountIndex,
receiveDepth: receiveDepth,
changeDepth: changeDepth,
master: master,
accountKey: accountKey,
keys: keys
};
};
/**
* Handle a deserialized JSON wallet object.
* @returns {Object} A "naked" wallet (a