Merge pull request #964 from matiu/feature/renameHD

Feature/rename hd
This commit is contained in:
Gustavo Maximiliano Cortez 2014-07-29 15:57:48 -03:00
commit fc339f6472
16 changed files with 548 additions and 465 deletions

View file

@ -2,7 +2,7 @@
angular.module('copayApp.controllers').controller('UriPaymentController', function($rootScope, $scope, $routeParams, $timeout, $location) {
var data = decodeURIComponent($routeParams.data);
$rootScope.pendingPayment = copay.Structure.parseBitcoinURI($routeParams.data);
$rootScope.pendingPayment = copay.HDPath.parseBitcoinURI($routeParams.data);
$scope.protocol = $rootScope.pendingPayment.protocol;
$scope.address = $rootScope.pendingPayment.address;

View file

@ -1,99 +0,0 @@
'use strict';
var imports = require('soop').imports();
var preconditions = require('preconditions').singleton();
var Structure = require('./Structure');
function AddressIndex(opts) {
opts = opts || {};
this.cosigner = opts.cosigner
this.changeIndex = opts.changeIndex || 0;
this.receiveIndex = opts.receiveIndex || 0;
if (typeof this.cosigner === 'undefined') {
this.cosigner = Structure.SHARED_INDEX;
}
}
AddressIndex.init = function(totalCopayers) {
preconditions.shouldBeNumber(totalCopayers);
var indexes = [new AddressIndex()];
for (var i = 0 ; i < totalCopayers ; i++) {
indexes.push(new AddressIndex({cosigner: i}));
}
return indexes;
}
AddressIndex.fromList = function(indexes) {
return indexes.map(function(i) { return AddressIndex.fromObj(i); });
}
AddressIndex.fromObj = function(data) {
if (data instanceof AddressIndex) {
throw new Error('bad data format: Did you use .toObj()?');
}
return new AddressIndex(data);
};
AddressIndex.serialize = function(indexes) {
return indexes.map(function(i) { return i.toObj(); });
}
AddressIndex.update = function(shared, totalCopayers) {
var indexes = this.init(totalCopayers);
indexes[0].changeIndex = shared.changeIndex;
indexes[0].receiveIndex = shared.receiveIndex;
return this.serialize(indexes);
};
AddressIndex.prototype.toObj = function() {
return {
cosigner: this.cosigner,
changeIndex: this.changeIndex,
receiveIndex: this.receiveIndex
};
};
AddressIndex.prototype.checkRange = function(index, isChange) {
if ((isChange && index > this.changeIndex) ||
(!isChange && index > this.receiveIndex)) {
throw new Error('Out of bounds at index ' + index + ' isChange: ' + isChange);
}
};
AddressIndex.prototype.getChangeIndex = function() {
return this.changeIndex;
};
AddressIndex.prototype.getReceiveIndex = function() {
return this.receiveIndex;
};
AddressIndex.prototype.increment = function(isChange) {
if (isChange) {
this.changeIndex++;
} else {
this.receiveIndex++;
}
};
AddressIndex.prototype.merge = function(inAddressIndex) {
preconditions.shouldBeObject(inAddressIndex)
.checkArgument(this.cosigner == inAddressIndex.cosigner);
var hasChanged = false;
// Indexes
if (inAddressIndex.changeIndex > this.changeIndex) {
this.changeIndex = inAddressIndex.changeIndex;
hasChanged = true;
}
if (inAddressIndex.receiveIndex > this.receiveIndex) {
this.receiveIndex = inAddressIndex.receiveIndex;
hasChanged = true;
}
return hasChanged;
};
module.exports = require('soop')(AddressIndex);

View file

@ -0,0 +1,99 @@
'use strict';
var preconditions = require('preconditions').singleton();
var HDPath = require('./HDPath');
function HDParams(opts) {
opts = opts || {};
//opts.cosigner is for backwards compatibility only
this.copayerIndex = typeof opts.copayerIndex === 'undefined' ? opts.cosigner : opts.copayerIndex;
this.changeIndex = opts.changeIndex || 0;
this.receiveIndex = opts.receiveIndex || 0;
if (typeof this.copayerIndex === 'undefined') {
this.copayerIndex = HDPath.SHARED_INDEX;
}
}
HDParams.init = function(totalCopayers) {
preconditions.shouldBeNumber(totalCopayers);
var ret = [new HDParams()];
for (var i = 0 ; i < totalCopayers ; i++) {
ret.push(new HDParams({copayerIndex: i}));
}
return ret;
}
HDParams.fromList = function(hdParams) {
return hdParams.map(function(i) { return HDParams.fromObj(i); });
}
HDParams.fromObj = function(data) {
if (data instanceof HDParams) {
throw new Error('bad data format: Did you use .toObj()?');
}
return new HDParams(data);
};
HDParams.serialize = function(hdParams) {
return hdParams.map(function(i) { return i.toObj(); });
}
HDParams.update = function(shared, totalCopayers) {
var hdParams = this.init(totalCopayers);
hdParams[0].changeIndex = shared.changeIndex;
hdParams[0].receiveIndex = shared.receiveIndex;
return this.serialize(hdParams);
};
HDParams.prototype.toObj = function() {
return {
copayerIndex: this.copayerIndex,
changeIndex: this.changeIndex,
receiveIndex: this.receiveIndex
};
};
HDParams.prototype.checkRange = function(index, isChange) {
if ((isChange && index > this.changeIndex) ||
(!isChange && index > this.receiveIndex)) {
throw new Error('Out of bounds at index ' + index + ' isChange: ' + isChange);
}
};
HDParams.prototype.getChangeIndex = function() {
return this.changeIndex;
};
HDParams.prototype.getReceiveIndex = function() {
return this.receiveIndex;
};
HDParams.prototype.increment = function(isChange) {
if (isChange) {
this.changeIndex++;
} else {
this.receiveIndex++;
}
};
HDParams.prototype.merge = function(inHDParams) {
preconditions.shouldBeObject(inHDParams)
.checkArgument(this.copayerIndex == inHDParams.copayerIndex);
var hasChanged = false;
if (inHDParams.changeIndex > this.changeIndex) {
this.changeIndex = inHDParams.changeIndex;
hasChanged = true;
}
if (inHDParams.receiveIndex > this.receiveIndex) {
this.receiveIndex = inHDParams.receiveIndex;
hasChanged = true;
}
return hasChanged;
};
module.exports = HDParams;

75
js/models/core/HDPath.js Normal file
View file

@ -0,0 +1,75 @@
'use strict';
var preconditions = require('preconditions').singleton();
function HDPath() {}
/*
* Based on https://github.com/maraoz/bips/blob/master/bip-NNNN.mediawiki
* m / purpose' / copayerIndex / change / addressIndex
*/
var PURPOSE = 45;
var MAX_NON_HARDENED = 0x80000000 - 1;
var SHARED_INDEX = MAX_NON_HARDENED - 0;
var ID_INDEX = MAX_NON_HARDENED - 1;
var BIP45_PUBLIC_PREFIX = 'm/' + PURPOSE + '\'';
HDPath.BIP45_PUBLIC_PREFIX = BIP45_PUBLIC_PREFIX;
HDPath.Branch = function(addressIndex, isChange, copayerIndex) {
preconditions.shouldBeNumber(addressIndex);
preconditions.shouldBeBoolean(isChange);
var ret = 'm/' +
(typeof copayerIndex !== 'undefined' ? copayerIndex : SHARED_INDEX) + '/' +
(isChange ? 1 : 0) + '/' +
addressIndex;
return ret;
};
HDPath.FullBranch = function(addressIndex, isChange, copayerIndex) {
var sub = HDPath.Branch(addressIndex, isChange, copayerIndex);
sub = sub.substring(2);
return BIP45_PUBLIC_PREFIX + '/' + sub;
};
HDPath.indicesForPath = function(path) {
preconditions.shouldBeString(path);
var s = path.split('/');
return {
isChange: s[3] === '1',
index: parseInt(s[4]),
copayerIndex: parseInt(s[2])
};
};
HDPath.IdFullBranch = HDPath.FullBranch(0, false, ID_INDEX);
HDPath.IdBranch = HDPath.Branch(0, false, ID_INDEX);
HDPath.PURPOSE = PURPOSE;
HDPath.MAX_NON_HARDENED = MAX_NON_HARDENED;
HDPath.SHARED_INDEX = SHARED_INDEX;
HDPath.ID_INDEX = ID_INDEX;
HDPath.parseBitcoinURI = function(uri) {
var ret = {};
var data = decodeURIComponent(uri);
var splitDots = data.split(':');
ret.protocol = splitDots[0];
data = splitDots[1];
var splitQuestion = data.split('?');
ret.address = splitQuestion[0];
if (splitQuestion.length > 1) {
var search = splitQuestion[1];
data = JSON.parse('{"' + search.replace(/&/g, '","').replace(/=/g, '":"') + '"}',
function(key, value) {
return key === "" ? value : decodeURIComponent(value);
});
ret.amount = parseFloat(data.amount);
ret.message = data.message;
}
return ret;
};
module.exports = HDPath;

View file

@ -1,13 +1,12 @@
'use strict';
var imports = require('soop').imports();
var bitcore = require('bitcore');
var HK = bitcore.HierarchicalKey;
var WalletKey = bitcore.WalletKey;
var networks = bitcore.networks;
var util = bitcore.util;
var Structure = require('./Structure');
var HDPath = require('./HDPath');
function PrivateKey(opts) {
opts = opts || {};
@ -41,7 +40,7 @@ PrivateKey.prototype.getIdKey = function() {
};
PrivateKey.prototype.cacheId = function() {
var path = Structure.IdFullBranch;
var path = HDPath.IdFullBranch;
var idhk = this.bip.derive(path);
this.idkey = idhk.eckey;
this.id = idhk.eckey.public.toString('hex');
@ -50,7 +49,7 @@ PrivateKey.prototype.cacheId = function() {
PrivateKey.prototype.deriveBIP45Branch = function() {
if (!this.bip45Branch) {
this.bip45Branch = this.bip.derive(Structure.BIP45_PUBLIC_PREFIX);
this.bip45Branch = this.bip.derive(HDPath.BIP45_PUBLIC_PREFIX);
}
return this.bip45Branch;
}
@ -103,7 +102,7 @@ PrivateKey.prototype.getForPath = function(path) {
};
PrivateKey.prototype.get = function(index, isChange, cosigner) {
var path = Structure.FullBranch(index, isChange, cosigner);
var path = HDPath.FullBranch(index, isChange, cosigner);
return this.getForPath(path);
};
@ -123,4 +122,4 @@ PrivateKey.prototype.getAll = function(receiveIndex, changeIndex, cosigner) {
module.exports = require('soop')(PrivateKey);
module.exports = PrivateKey;

View file

@ -1,13 +1,12 @@
'use strict';
var imports = require('soop').imports();
var preconditions = require('preconditions').instance();
var bitcore = require('bitcore');
var HK = bitcore.HierarchicalKey;
var PrivateKey = require('./PrivateKey');
var Structure = require('./Structure');
var AddressIndex = require('./AddressIndex');
var HDPath = require('./HDPath');
var HDParams = require('./HDParams');
var Address = bitcore.Address;
var Script = bitcore.Script;
@ -24,14 +23,14 @@ function PublicKeyRing(opts) {
this.copayersHK = opts.copayersHK || [];
this.indexes = opts.indexes ? AddressIndex.fromList(opts.indexes)
: AddressIndex.init(this.totalCopayers);
this.indexes = opts.indexes ? HDParams.fromList(opts.indexes)
: HDParams.init(this.totalCopayers);
this.publicKeysCache = opts.publicKeysCache || {};
this.nicknameFor = opts.nicknameFor || {};
this.copayerIds = [];
this.copayersBackup = opts.copayersBackup || [];
this.addressToPath = {};
this.publicKeysCache = opts.publicKeysCache || {};
this.nicknameFor = opts.nicknameFor || {};
this.copayerIds = [];
this.copayersBackup = opts.copayersBackup || [];
this.addressToPath = {};
}
PublicKeyRing.fromObj = function(data) {
@ -41,7 +40,7 @@ PublicKeyRing.fromObj = function(data) {
// Support old indexes schema
if (!Array.isArray(data.indexes)) {
data.indexes = AddressIndex.update(data.indexes, data.totalCopayers);
data.indexes = HDParams.update(data.indexes, data.totalCopayers);
}
var ret = new PublicKeyRing(data);
@ -59,7 +58,7 @@ PublicKeyRing.prototype.toObj = function() {
networkName: this.network.name,
requiredCopayers: this.requiredCopayers,
totalCopayers: this.totalCopayers,
indexes: AddressIndex.serialize(this.indexes),
indexes: HDParams.serialize(this.indexes),
copayersBackup: this.copayersBackup,
copayersExtPubKeys: this.copayersHK.map(function(b) {
@ -103,14 +102,14 @@ PublicKeyRing.prototype._checkKeys = function() {
PublicKeyRing.prototype._newExtendedPublicKey = function() {
return new PrivateKey({
networkName: this.network.name
})
.deriveBIP45Branch()
.extendedPublicKeyString();
networkName: this.network.name
})
.deriveBIP45Branch()
.extendedPublicKeyString();
};
PublicKeyRing.prototype._updateBip = function(index) {
var hk = this.copayersHK[index].derive(Structure.IdBranch);
var hk = this.copayersHK[index].derive(HDPath.IdBranch);
this.copayerIds[index] = hk.eckey.public.toString('hex');
};
@ -149,10 +148,10 @@ PublicKeyRing.prototype.addCopayer = function(newEpk, nickname) {
return newEpk;
};
PublicKeyRing.prototype.getPubKeys = function(index, isChange, cosigner) {
PublicKeyRing.prototype.getPubKeys = function(index, isChange, copayerIndex) {
this._checkKeys();
var path = Structure.Branch(index, isChange, cosigner);
var path = HDPath.Branch(index, isChange, copayerIndex);
var pubKeys = this.publicKeysCache[path];
if (!pubKeys) {
pubKeys = [];
@ -175,26 +174,27 @@ PublicKeyRing.prototype.getPubKeys = function(index, isChange, cosigner) {
};
// TODO this could be cached
PublicKeyRing.prototype.getRedeemScript = function(index, isChange, cosigner) {
var pubKeys = this.getPubKeys(index, isChange, cosigner);
PublicKeyRing.prototype.getRedeemScript = function(index, isChange, copayerIndex) {
var pubKeys = this.getPubKeys(index, isChange, copayerIndex);
var script = Script.createMultisig(this.requiredCopayers, pubKeys);
return script;
};
// TODO this could be cached
PublicKeyRing.prototype.getAddress = function(index, isChange, id) {
var cosigner = this.getCosigner(id);
var script = this.getRedeemScript(index, isChange, cosigner);
var copayerIndex = this.getCosigner(id);
var script = this.getRedeemScript(index, isChange, copayerIndex);
var address = Address.fromScript(script, this.network.name);
this.addressToPath[address.toString()] = Structure.FullBranch(index, isChange, cosigner);
this.addressToPath[address.toString()] = HDPath.FullBranch(index, isChange, copayerIndex);
return address;
};
// Overloaded to receive a PubkeyString or a consigner index
PublicKeyRing.prototype.getIndex = function(id) {
var cosigner = this.getCosigner(id);
var index = this.indexes.filter(function(i) { return i.cosigner == cosigner });
if (index.length != 1) throw new Error('no index for cosigner');
PublicKeyRing.prototype.getHDParams = function(id) {
var copayerIndex = this.getCosigner(id);
var index = this.indexes.filter(function(i) { return i.copayerIndex == copayerIndex });
if (index.length != 1) throw new Error('no index for copayerIndex');
return index[0];
};
@ -206,18 +206,18 @@ PublicKeyRing.prototype.pathForAddress = function(address) {
// TODO this could be cached
PublicKeyRing.prototype.getScriptPubKeyHex = function(index, isChange, pubkey) {
var cosigner = this.getCosigner(pubkey);
var addr = this.getAddress(index, isChange, cosigner);
var copayerIndex = this.getCosigner(pubkey);
var addr = this.getAddress(index, isChange, copayerIndex);
return Script.createP2SH(addr.payload()).getBuffer().toString('hex');
};
//generate a new address, update index.
PublicKeyRing.prototype.generateAddress = function(isChange, pubkey) {
isChange = !!isChange;
var addrIndex = this.getIndex(pubkey);
var index = isChange ? addrIndex.getChangeIndex() : addrIndex.getReceiveIndex();
var ret = this.getAddress(index, isChange, addrIndex.cosigner);
addrIndex.increment(isChange);
var HDParams = this.getHDParams(pubkey);
var index = isChange ? HDParams.getChangeIndex() : HDParams.getReceiveIndex();
var ret = this.getAddress(index, isChange, HDParams.copayerIndex);
HDParams.increment(isChange);
return ret;
};
@ -228,7 +228,7 @@ PublicKeyRing.prototype.getAddresses = function(opts) {
};
PublicKeyRing.prototype.getCosigner = function(pubKey) {
if (typeof pubKey == 'undefined') return Structure.SHARED_INDEX;
if (typeof pubKey == 'undefined') return HDPath.SHARED_INDEX;
if (typeof pubKey == 'number') return pubKey;
var sorted = this.copayersHK.map(function(h, i){
@ -245,51 +245,51 @@ PublicKeyRing.prototype.getCosigner = function(pubKey) {
PublicKeyRing.prototype.getAddressesInfo = function(opts, pubkey) {
var ret = [];
var self = this;
var cosigner = pubkey && this.getCosigner(pubkey);
var copayerIndex = pubkey && this.getCosigner(pubkey);
this.indexes.forEach(function(index) {
ret = ret.concat(self.getAddressesInfoForIndex(index, opts, cosigner));
ret = ret.concat(self.getAddressesInfoForIndex(index, opts, copayerIndex));
});
return ret;
}
PublicKeyRing.prototype.getAddressesInfoForIndex = function(index, opts, cosigner) {
PublicKeyRing.prototype.getAddressesInfoForIndex = function(index, opts, copayerIndex) {
opts = opts || {};
var isOwned = index.cosigner == Structure.SHARED_INDEX
|| index.cosigner == cosigner;
var isOwned = index.copayerIndex == HDPath.SHARED_INDEX
|| index.copayerIndex == copayerIndex;
var ret = [];
if (!opts.excludeChange) {
for (var i = 0; i < index.changeIndex; i++) {
var a = this.getAddress(i, true, index.cosigner);
ret.unshift({
address: a,
addressStr: a.toString(),
isChange: true,
owned: isOwned
});
var ret = [];
if (!opts.excludeChange) {
for (var i = 0; i < index.changeIndex; i++) {
var a = this.getAddress(i, true, index.copayerIndex);
ret.unshift({
address: a,
addressStr: a.toString(),
isChange: true,
owned: isOwned
});
}
}
}
if (!opts.excludeMain) {
for (var i = 0; i < index.receiveIndex; i++) {
var a = this.getAddress(i, false, index.cosigner);
ret.unshift({
address: a,
addressStr: a.toString(),
isChange: false,
owned: isOwned
});
if (!opts.excludeMain) {
for (var i = 0; i < index.receiveIndex; i++) {
var a = this.getAddress(i, false, index.copayerIndex);
ret.unshift({
address: a,
addressStr: a.toString(),
isChange: false,
owned: isOwned
});
}
}
}
return ret;
return ret;
};
// TODO this could be cached
PublicKeyRing.prototype._addScriptMap = function(map, path) {
var p = Structure.indicesForPath(path);
var script = this.getRedeemScript(p.index, p.isChange, p.cosigner);
var p = HDPath.indicesForPath(path);
var script = this.getRedeemScript(p.index, p.isChange, p.copayerIndex);
map[Address.fromScript(script, this.network.name).toString()] = script.getBuffer().toString('hex');
};
@ -310,18 +310,18 @@ PublicKeyRing.prototype._checkInPKR = function(inPKR, ignoreId) {
if (this.network.name !== inPKR.network.name) {
throw new Error('Network mismatch. Should be ' + this.network.name +
' and found ' + inPKR.network.name);
' and found ' + inPKR.network.name);
}
if (
this.requiredCopayers && inPKR.requiredCopayers &&
(this.requiredCopayers !== inPKR.requiredCopayers))
throw new Error('inPKR requiredCopayers mismatch ' + this.requiredCopayers + '!=' + inPKR.requiredCopayers);
(this.requiredCopayers !== inPKR.requiredCopayers))
throw new Error('inPKR requiredCopayers mismatch ' + this.requiredCopayers + '!=' + inPKR.requiredCopayers);
if (
this.totalCopayers && inPKR.totalCopayers &&
(this.totalCopayers !== inPKR.totalCopayers))
throw new Error('inPKR totalCopayers mismatch' + this.totalCopayers + '!=' + inPKR.requiredCopayers);
if (
this.totalCopayers && inPKR.totalCopayers &&
(this.totalCopayers !== inPKR.totalCopayers))
throw new Error('inPKR totalCopayers mismatch' + this.totalCopayers + '!=' + inPKR.requiredCopayers);
};
@ -393,7 +393,7 @@ PublicKeyRing.prototype.mergeIndexes = function(indexes) {
var hasChanged = false;
indexes.forEach(function(theirs) {
var mine = self.getIndex(theirs.cosigner);
var mine = self.getHDParams(theirs.copayerIndex);
hasChanged |= mine.merge(theirs);
});
@ -414,4 +414,4 @@ PublicKeyRing.prototype.mergeBackups = function(backups) {
}
module.exports = require('soop')(PublicKeyRing);
module.exports = PublicKeyRing;

View file

@ -1,76 +0,0 @@
'use strict';
var imports = require('soop').imports();
var preconditions = require('preconditions').singleton();
function Structure() {}
/*
* Based on https://github.com/maraoz/bips/blob/master/bip-NNNN.mediawiki
* m / purpose' / cosigner_index / change / address_index
*/
var PURPOSE = 45;
var MAX_NON_HARDENED = 0x80000000 - 1;
var SHARED_INDEX = MAX_NON_HARDENED - 0;
var ID_INDEX = MAX_NON_HARDENED - 1;
var BIP45_PUBLIC_PREFIX = 'm/' + PURPOSE + '\'';
Structure.BIP45_PUBLIC_PREFIX = BIP45_PUBLIC_PREFIX;
Structure.Branch = function(address_index, isChange, cosigner_index) {
preconditions.shouldBeNumber(address_index);
preconditions.shouldBeBoolean(isChange);
var ret = 'm/' +
(typeof cosigner_index !== 'undefined' ? cosigner_index : SHARED_INDEX) + '/' +
(isChange ? 1 : 0) + '/' +
address_index;
return ret;
};
Structure.FullBranch = function(address_index, isChange, cosigner_index) {
var sub = Structure.Branch(address_index, isChange, cosigner_index);
sub = sub.substring(2);
return BIP45_PUBLIC_PREFIX + '/' + sub;
};
Structure.indicesForPath = function(path) {
preconditions.shouldBeString(path);
var s = path.split('/');
return {
isChange: s[3] === '1',
index: parseInt(s[4]),
cosigner: parseInt(s[2])
};
};
Structure.IdFullBranch = Structure.FullBranch(0, false, ID_INDEX);
Structure.IdBranch = Structure.Branch(0, false, ID_INDEX);
Structure.PURPOSE = PURPOSE;
Structure.MAX_NON_HARDENED = MAX_NON_HARDENED;
Structure.SHARED_INDEX = SHARED_INDEX;
Structure.ID_INDEX = ID_INDEX;
Structure.parseBitcoinURI = function(uri) {
var ret = {};
var data = decodeURIComponent(uri);
var splitDots = data.split(':');
ret.protocol = splitDots[0];
data = splitDots[1];
var splitQuestion = data.split('?');
ret.address = splitQuestion[0];
if (splitQuestion.length > 1) {
var search = splitQuestion[1];
data = JSON.parse('{"' + search.replace(/&/g, '","').replace(/=/g, '":"') + '"}',
function(key, value) {
return key === "" ? value : decodeURIComponent(value);
});
ret.amount = parseFloat(data.amount);
ret.message = data.message;
}
return ret;
};
module.exports = require('soop')(Structure);

View file

@ -15,7 +15,7 @@ var SecureRandom = bitcore.SecureRandom;
var Base58Check = bitcore.Base58.base58Check;
var Address = bitcore.Address;
var AddressIndex = require('./AddressIndex');
var HDParams = require('./HDParams');
var PublicKeyRing = require('./PublicKeyRing');
var TxProposals = require('./TxProposals');
var PrivateKey = require('./PrivateKey');
@ -93,7 +93,7 @@ Wallet.prototype.connectToAll = function() {
Wallet.prototype._handleIndexes = function(senderId, data, isInbound) {
this.log('RECV INDEXES:', data);
var inIndexes = AddressIndex.fromList(data.indexes);
var inIndexes = HDParams.fromList(data.indexes);
var hasChanged = this.publicKeyRing.mergeIndexes(inIndexes);
if (hasChanged) {
this.emit('publicKeyRingUpdated');
@ -132,8 +132,10 @@ Wallet.prototype._handlePublicKeyRing = function(senderId, data, isInbound) {
Wallet.prototype._handleTxProposal = function(senderId, data) {
this.log('RECV TXPROPOSAL: ', data);
var inTxp = TxProposals.TxProposal.fromObj(data.txProposal, Wallet.builderOpts);
var valid = inTxp.isValid();
if (!valid) {
var corruptEvent = {
@ -458,7 +460,7 @@ Wallet.prototype.sendPublicKeyRing = function(recipients) {
});
};
Wallet.prototype.sendIndexes = function(recipients) {
var indexes = AddressIndex.serialize(this.publicKeyRing.indexes);
var indexes = HDParams.serialize(this.publicKeyRing.indexes);
this.log('### INDEXES TO:', recipients || 'All', indexes);
this.send(recipients, {