add wallet.id to debug logs

This commit is contained in:
Matias Alejo Garcia 2014-10-07 18:33:55 -03:00
commit 622c3da68c
10 changed files with 299 additions and 160 deletions

View file

@ -44,11 +44,9 @@ angular.module('copayApp.controllers').controller('CreateController',
networkName: $scope.networkName,
};
$rootScope.iden.createWallet(opts, function(err, w) {
$rootScope.iden.closeWallet($rootScope.wallet.id, function() {
$scope.loading = false;
$rootScope.wallet = w;
controllerUtils.bindWallet(w, $scope);
});
$scope.loading = false;
$rootScope.wallet = w;
controllerUtils.bindWallet(w, $scope);
});
};
});

View file

@ -139,11 +139,9 @@ angular.module('copayApp.controllers').controller('JoinController',
notification.error('Unknown error');
controllerUtils.onErrorDigest();
} else {
$rootScope.iden.closeWallet($rootScope.wallet.id, function() {
$scope.loading = false;
$rootScope.wallet = w;
controllerUtils.bindWallet(w, $scope);
});
$scope.loading = false;
$rootScope.wallet = w;
controllerUtils.bindWallet(w, $scope);
}
});
}

View file

@ -19,15 +19,16 @@ function Network(opts) {
this.secretNumber = opts.secretNumber;
this.cleanUp();
this.socketOptions = {
this.socketOptions = {
reconnection: true,
'force new connection': true,
'secure': this.url.indexOf('https') === 0,
};
if (opts.transports) {
this.socketOptions['transports'] = opts.transports;
}
if (opts.transports) {
this.socketOptions['transports'] = opts.transports;
}
this.socket = this.createSocket();
}
nodeUtil.inherits(Network, EventEmitter);
@ -262,9 +263,11 @@ Network.prototype._setupConnectionHandlers = function(opts, cb) {
self.socket.on('no messages', self.emit.bind(self, 'no messages'));
var pubkey = self.getKey().public.toString('hex');
self.socket.on('connect', function() {
var pubkey = self.getKey().public.toString('hex');
log.debug('Async subscribing to:pubkey:',pubkey);
log.debug('Async subscribing to pubkey:', pubkey);
self.socket.emit('subscribe', pubkey);
@ -322,7 +325,6 @@ Network.prototype.start = function(opts, openCallback) {
preconditions.checkArgument(opts);
preconditions.checkArgument(opts.privkey);
preconditions.checkArgument(opts.copayerId);
preconditions.checkState(this.connectedPeers && this.connectedPeers.length === 0);
if (this.started) {
@ -333,13 +335,11 @@ Network.prototype.start = function(opts, openCallback) {
this.privkey = opts.privkey;
this.setCopayerId(opts.copayerId);
this.maxPeers = opts.maxPeers || this.maxPeers;
this.socket = this.createSocket();
this._setupConnectionHandlers(opts, openCallback);
};
Network.prototype.createSocket = function() {
log.debug('Async: Connecting to socket:', this.url, this.socketOptions);
log.debug('Async: Connecting to socket:', this.url, this.socketOptions);
return io.connect(this.url, this.socketOptions);
};

View file

@ -46,13 +46,13 @@ function Identity(email, password, opts) {
this.storage = Identity._newStorage(storageOpts);
this.storage.setPassword(password);
this.networks = {
'livenet': Identity._newAsync(opts.network.livenet),
'testnet': Identity._newAsync(opts.network.testnet),
this.networkOpts = {
'livenet': opts.network.livenet,
'testnet': opts.network.testnet,
};
this.blockchains = {
'livenet': Identity._newInsight(opts.network.livenet),
'testnet': Identity._newInsight(opts.network.testnet),
this.blockchainOpts = {
'livenet': opts.network.livenet,
'testnet': opts.network.testnet,
};
this.walletDefaults = opts.walletDefaults || {};
@ -68,14 +68,6 @@ Identity._createProfile = function(email, password, storage, cb) {
Profile.create(email, password, storage, cb);
};
Identity._newInsight = function(opts) {
return new Insight(opts);
};
Identity._newAsync = function(opts) {
return new Async(opts);
};
Identity._newStorage = function(opts) {
@ -90,8 +82,8 @@ Identity._walletFromObj = function(o, s, n, b, skip) {
return Wallet.fromObj(o, s, n, b, skip);
};
Identity._walletRead = function(id, s, n, b, skip, cb) {
return Wallet.read(id, s, n, b, skip, cb);
Identity._walletRead = function(id, r, cb) {
return Wallet.read(id, r, cb);
};
Identity._walletDelete = function(id, s, cb) {
@ -103,6 +95,12 @@ Identity._openProfile = function(email, password, storage, cb) {
Profile.open(email, password, storage, cb);
};
/* for stubbing */
Identity._newAsync = function(opts) {
return new Async(opts);
};
/**
@ -237,13 +235,7 @@ Identity.prototype.store = function(opts, cb) {
Identity.prototype._cleanUp = function() {
log.info('Cleaning Network connections')
var self = this;
_.each(['livenet', 'testnet'], function(n) {
self.networks[n].cleanUp();
self.blockchains[n].destroy();
});
// NOP
};
/**
@ -261,10 +253,8 @@ Identity.prototype.close = function(cb) {
var self = this;
_.each(this.openWallets, function(w) {
w.close(function(err) {
console.log('[Identity.js.239:err:]', err); //TODO
if (err) return cb(err);
console.log('[Identity.js.241]', i, l); //TODO
if (++i == l) {
self._cleanUp();
if (cb) return cb();
@ -289,8 +279,7 @@ Identity.prototype.importWallet = function(base64, password, skipFields, cb) {
var obj = this.storage.decrypt(base64);
if (!obj) return false;
var networkName = Wallet.obtainNetworkName(obj);
var w = Identity._walletFromObj(obj, this.storage, this.networks[networkName], this.blockchains[networkName]);
var w = Identity._walletFromObj(obj, this.storage, this.networkOpts, this.blockchainOpts);
this._checkVersion(w.version);
this.addWallet(w, function(err) {
if (err) return cb(err);
@ -374,8 +363,8 @@ Identity.prototype.createWallet = function(opts, cb) {
opts.storage = this.storage;
opts.network = this.networks[opts.networkName];
opts.blockchain = this.blockchains[opts.networkName];
opts.networkOpts = this.networkOpts;
opts.blockchainOpts = this.blockchainOpts;
opts.spendUnconfirmed = opts.spendUnconfirmed || this.walletDefaults.spendUnconfirmed;
opts.reconnectDelay = opts.reconnectDelay || this.walletDefaults.reconnectDelay;
@ -383,7 +372,7 @@ Identity.prototype.createWallet = function(opts, cb) {
opts.totalCopayers = totalCopayers;
opts.version = opts.version || this.version;
if (opts.password)
if (opts.password && !this.storage.hasPassphrase())
this.storage.setPassword(opts.password);
var self = this;
@ -393,6 +382,7 @@ Identity.prototype.createWallet = function(opts, cb) {
self.openWallets.push(w);
self.profile.setLastOpenedTs(w.id, function(err) {
w.netStart();
return cb(err, w);
});
});
@ -451,13 +441,18 @@ Identity.prototype.openWallet = function(walletId, password, cb) {
preconditions.checkArgument(cb);
var self = this;
if (password)
if (password && !this.storage.hasPassphrase())
self.storage.setPassword(password);
// TODO
// self.migrateWallet(walletId, password, function() {
//
Identity._walletRead(walletId, self.storage, self.networks, self.blockchains, [], function(err, w) {
Identity._walletRead(walletId, {
storage: self.storage,
networkOpts: this.networkOpts,
blockchainOpts: this.blockchainOpts
}, function(err, w) {
if (err) return cb(err);
self.openWallets.push(w);
@ -552,8 +547,8 @@ Identity.prototype.joinWallet = function(opts, cb) {
secretNumber: decodedSecret.secretNumber,
};
var joinNetwork = this.networks[decodedSecret.networkName];
joinNetwork.cleanUp();
var joinNetwork = Identity._newAsync(this.networkOpts[decodedSecret.networkName]);
// This is a hack to reconize if the connection was rejected or the peer wasn't there.
var connectedOnce = false;
@ -569,6 +564,7 @@ Identity.prototype.joinWallet = function(opts, cb) {
return cb('joinError');
});
console.log('[Identity.js.566:joinOpts:]',joinOpts); //TODO
joinNetwork.start(joinOpts, function() {
joinNetwork.greet(decodedSecret.pubKey, joinOpts.secretNumber);
@ -589,7 +585,6 @@ Identity.prototype.joinWallet = function(opts, cb) {
walletOpts.password = opts.password;
self.createWallet(walletOpts, function(err, w) {
if (w) {
w.sendWalletReady(decodedSecret.pubKey);
} else {

View file

@ -203,7 +203,6 @@ Insight.prototype.subscribe = function(addresses) {
return function(txid) {
// verify the address is still subscribed
if (!self.subscribed[address]) return;
log.debug('insight tx event');
self.emit('tx', {
address: address,

View file

@ -2,7 +2,6 @@
var EventEmitter = require('events').EventEmitter;
var _ = require('underscore');
var async = require('async');
var preconditions = require('preconditions').singleton();
var inherits = require('inherits');
var events = require('events');
@ -25,6 +24,8 @@ var TxProposal = require('./TxProposal');
var TxProposals = require('./TxProposals');
var PrivateKey = require('./PrivateKey');
var WalletLock = require('./WalletLock');
var Async = require('./Async');
var Insight = module.exports.Insight = require('./Insight');
var copayConfig = require('../../config');
/**
@ -61,6 +62,12 @@ function Wallet(opts) {
opts.reconnectDelay = opts.reconnectDelay || 500;
var networkName = Wallet.obtainNetworkName(opts);
preconditions.checkState( (opts.network && opts.blockchain) || networkName);
opts.network = opts.network || Wallet._newAsync(opts.networkOpts[networkName]);
opts.blockchain = opts.blockchain || Wallet._newInsight(opts.blockchainOpts[networkName]);;
//required params
['storage', 'network', 'blockchain',
'requiredCopayers', 'totalCopayers', 'spendUnconfirmed',
@ -83,7 +90,7 @@ function Wallet(opts) {
this.registeredPeerIds = [];
this.addressBook = opts.addressBook || {};
this.publicKey = this.privateKey.publicHex;
this.lastTimestamp = opts.lastTimestamp || undefined;
this.lastTimestamp = opts.lastTimestamp || 0;
this.lastMessageFrom = {};
//to avoid confirmation of copayer's backups if is imported from a file
@ -96,8 +103,6 @@ function Wallet(opts) {
this.paymentRequests = opts.paymentRequests || {};
var networkName = Wallet.obtainNetworkName(opts);
this.network = networkName && this.network[networkName] ? this.network[networkName] : this.network;
this.blockchain = networkName && this.blockchain[networkName] ? this.blockchain[networkName] : this.blockchain;
preconditions.checkArgument(this.network.setHexNonce, 'Incorrect network parameter');
preconditions.checkArgument(this.blockchain.getTransaction, 'Incorrect blockchain parameter');
@ -160,6 +165,16 @@ Wallet.COPAYER_PAIR_LIMITS = {
12: 1,
};
/* for stubbing */
Wallet._newInsight = function(opts) {
return new Insight(opts);
};
/* for stubbing */
Wallet._newAsync = function(opts) {
return new Async(opts);
};
/**
* @desc Retrieve a random id for the wallet
* @TODO: Discuss changing to a UUID
@ -213,16 +228,17 @@ Wallet.delete = function(walletId, storage, cb) {
* @desc Retrieve a wallet from storage
*
* @param {string} walletId - the wallet id
* @param storage
* @param network
* @param blockchain
* @param {string[]} skipFields - parameters to ignore when importing
* @param readOpts (see fromObj)
* @param {function} callback - {err, Wallet}
* @return {undefined}
*/
Wallet.read = function(walletId, storage, network, blockchain, skipFields, cb) {
Wallet.read = function(walletId, readOpts, cb) {
preconditions.checkArgument(readOpts);
preconditions.checkArgument(readOpts.storage);
preconditions.checkArgument(readOpts.storage.setPassword);
preconditions.checkArgument(cb);
preconditions.checkArgument(storage.setPassword);
var storage = readOpts.storage;
var self = this,
err;
@ -242,7 +258,7 @@ Wallet.read = function(walletId, storage, network, blockchain, skipFields, cb) {
obj.id = walletId;
try {
log.debug('## OPENING Wallet: ' + walletId);
w = self.fromObj(obj, storage, network, blockchain, skipFields);
w = self.fromObj(obj, readOpts);
} catch (e) {
log.debug("ERROR: ", e.message);
if (e && e.message && e.message.indexOf('MISSOPTS')) {
@ -266,7 +282,7 @@ Wallet.read = function(walletId, storage, network, blockchain, skipFields, cb) {
Wallet.obtainNetworkName = function(obj) {
return obj.networkName ||
(obj.opts ? obj.opts.networkName : null) ||
(obj.publicKeyRing ? obj.publicKeyRing.networkName : null) ||
(obj.publicKeyRing ? (obj.publicKeyRing.networkName || obj.publicKeyRing.network.name) : null) ||
(obj.privateKey ? obj.privateKey.networkName : null);
};
@ -293,7 +309,7 @@ Wallet.prototype.seedCopayer = function(pubKey) {
* @emits publicKeyRingUpdated
*/
Wallet.prototype._onIndexes = function(senderId, data) {
log.debug('RECV INDEXES:', data);
log.debug('Wallet:' + this.id + ' RECV INDEXES:', data);
var inIndexes = HDParams.fromList(data.indexes);
var hasChanged = this.publicKeyRing.mergeIndexes(inIndexes);
if (hasChanged) {
@ -339,7 +355,7 @@ Wallet.prototype.changeSettings = function(settings) {
* @emits connectionError
*/
Wallet.prototype._onPublicKeyRing = function(senderId, data) {
log.debug('RECV PUBLICKEYRING:', data);
log.debug('Wallet:' + this.id +' RECV PUBLICKEYRING:', data);
var inPKR = PublicKeyRing.fromObj(data.publicKeyRing);
var wasIncomplete = !this.publicKeyRing.isComplete();
@ -348,7 +364,7 @@ Wallet.prototype._onPublicKeyRing = function(senderId, data) {
try {
hasChanged = this.publicKeyRing.merge(inPKR, true);
} catch (e) {
log.debug('## WALLET ERROR', e);
log.debug('Wallet:' + this.id +'## WALLET ERROR', e);
this.emit('connectionError', e.message);
return;
}
@ -477,7 +493,7 @@ Wallet.prototype._checkSentTx = function(ntxid, cb) {
*/
Wallet.prototype._onTxProposal = function(senderId, data) {
var self = this;
log.debug('RECV TXPROPOSAL: ', data);
log.debug('Wallet:' + this.id +' RECV TXPROPOSAL: ', data);
var m;
try {
@ -530,7 +546,7 @@ Wallet.prototype._onTxProposal = function(senderId, data) {
*/
Wallet.prototype._onReject = function(senderId, data) {
preconditions.checkState(data.ntxid);
log.debug('RECV REJECT:', data);
log.debug('Wallet:' + this.id +' RECV REJECT:', data);
var txp = this.txProposals.get(data.ntxid);
@ -563,7 +579,7 @@ Wallet.prototype._onReject = function(senderId, data) {
*/
Wallet.prototype._onSeen = function(senderId, data) {
preconditions.checkState(data.ntxid);
log.debug('RECV SEEN:', data);
log.debug('Wallet:' + this.id +' RECV SEEN:', data);
var txp = this.txProposals.get(data.ntxid);
txp.setSeen(senderId);
@ -591,7 +607,7 @@ Wallet.prototype._onSeen = function(senderId, data) {
*/
Wallet.prototype._onAddressBook = function(senderId, data) {
preconditions.checkState(data.addressBook);
log.debug('RECV ADDRESSBOOK:', data);
log.debug('Wallet:' + this.id +' RECV ADDRESSBOOK:', data);
var rcv = data.addressBook;
var hasChange;
for (var key in rcv) {
@ -617,7 +633,7 @@ Wallet.prototype.updateTimestamp = function(ts) {
preconditions.checkArgument(ts);
preconditions.checkArgument(_.isNumber(ts));
this.lastTimestamp = ts;
this.store();
// we dont store here
};
/**
@ -625,8 +641,9 @@ Wallet.prototype.updateTimestamp = function(ts) {
* Triggers a call to {@link Wallet#sendWalletReady}
*/
Wallet.prototype._onNoMessages = function() {
log.debug('No messages at the server. Requesting peer sync from: ' + this.lastTimestamp + 1); //TODO
log.debug('Wallet:' + this.id +' No messages at the server. Requesting peer sync from: ' + (this.lastTimestamp + 1));
this.sendWalletReady(null, parseInt((this.lastTimestamp + 1) / 1000));
this.updateTimestamp(parseInt(Date.now() / 1000));
};
/**
@ -644,14 +661,18 @@ Wallet.prototype._onData = function(senderId, data, ts) {
preconditions.checkArgument(data.type);
preconditions.checkArgument(ts);
preconditions.checkArgument(_.isNumber(ts));
log.debug('RECV', senderId, data);
log.debug('Wallet:' + this.id +' RECV', senderId, data);
console.log('[Wallet.js.635]'); //TODO
this.updateTimestamp(ts);
console.log('[Wallet.js.638]'); //TODO
if (data.type !== 'walletId' && this.id !== data.walletId) {
log.debug('Received corrupt message:', data)
log.debug('Wallet:' + this.id +' Received corrupt message:', data)
this.emit('corrupt', senderId);
this.updateTimestamp(ts);
return;
}
console.log('[Wallet.js.644]'); //TODO
switch (data.type) {
// This handler is repeaded on WalletFactory (#join). TODO
@ -659,8 +680,12 @@ Wallet.prototype._onData = function(senderId, data, ts) {
this.sendWalletReady(senderId);
break;
case 'walletReady':
console.log('[Wallet.js.653]', this.lastMessageFrom[senderId] ); //TODO
if (this.lastMessageFrom[senderId] !== 'walletReady') {
log.debug('peer Sync received. since: ' + (data.sinceTs || 0));
console.log('[Wallet.js.656]'); //TODO
log.debug('Wallet:' + this.id +' peer Sync received. since: ' + (data.sinceTs || 0));
this.sendPublicKeyRing(senderId);
this.sendAddressBook(senderId);
this.sendAllTxProposals(senderId, data.sinceTs); // send old txps
@ -691,9 +716,8 @@ Wallet.prototype._onData = function(senderId, data, ts) {
default:
throw new Error('unknown message type received: ' + data.type + ' from: ' + senderId)
}
this.lastMessageFrom[senderId] = data.type;
this.updateTimestamp(ts);
};
/**
@ -703,10 +727,11 @@ Wallet.prototype._onData = function(senderId, data, ts) {
*/
Wallet.prototype._onConnect = function(newCopayerId) {
if (newCopayerId) {
log.debug('#### Setting new COPAYER:', newCopayerId);
log.debug('Wallet:' + this.id +'#### Setting new COPAYER:', newCopayerId);
this.sendWalletId(newCopayerId);
}
var peerID = this.network.peerFromCopayer(newCopayerId)
var peerID = this.network.peerFromCopayer(newCopayerId);
this.emit('connect', peerID);
};
@ -828,16 +853,16 @@ Wallet.prototype._setBlockchainListeners = function() {
this.blockchain.removeAllListeners();
this.blockchain.on('reconnect', function(attempts) {
log.debug('blockchain reconnect event');
log.debug('Wallet:' + this.id +'blockchain reconnect event');
self.emit('insightReconnected');
});
this.blockchain.on('disconnect', function() {
log.debug('blockchain disconnect event');
log.debug('Wallet:' + this.id +'blockchain disconnect event');
self.emit('insightError');
});
this.blockchain.on('tx', function(tx) {
log.debug('blockchain tx event');
log.debug('Wallet:' + this.id +'blockchain tx event');
var addresses = self.getAddressesInfo();
var addr = _.findWhere(addresses, {
addressStr: tx.address
@ -870,7 +895,7 @@ Wallet.prototype.netStart = function() {
var net = this.network;
if (net.started) {
log.debug('Wallet networking was ready')
log.debug('Wallet:' + self.id +' Wallet networking was ready')
self.emit('ready', net.getPeer());
return;
}
@ -899,9 +924,9 @@ Wallet.prototype.netStart = function() {
self.emit('connectionError');
});
log.debug('Wallet: Starting networking');
log.debug('Wallet:' + self.id + ' Starting networking: ' + startOpts.copayerId);
net.start(startOpts, function() {
log.debug('Wallet: Networking ready');
log.debug('Wallet:' + self.id + ' Networking ready:', net.copayerId);
self._setBlockchainListeners();
self.emit('ready', net.getPeer());
setTimeout(function() {
@ -979,7 +1004,7 @@ Wallet.prototype.store = function(cb) {
var val = this.toObj();
var key = 'wallet::' + this.id + ((val.opts && val.opts.name) ? '_' + val.opts.name : '');
this.storage.set(key, val, function(err) {
log.debug('Wallet stored');
log.debug('Wallet:' + self.id +' stored');
if (cb)
cb(err);
});
@ -1023,12 +1048,22 @@ Wallet.prototype.toObj = function() {
* @param {number} o.lastTimestamp - last time this wallet object was deserialized
* @param {Object} o.txProposals - TxProposals to be deserialized by {@link TxProposals#fromObj}
* @param {string} o.nickname - user's nickname
* @param {Storage} storage - a Storage instance to store the data of the wallet
* @param {Network} network - a Network instance to communicate with peers
* @param {Blockchain} blockchain - a Blockchain instance to retrieve state from the blockchain
* @param skipFields
* @param readOpts.storage
* @param readOpts.network
* @param readOpts.blockchain
* @param readOpts.{string[]} skipFields - parameters to ignore when importing
*/
Wallet.fromObj = function(o, storage, network, blockchain, skipFields) {
Wallet.fromObj = function(o, readOpts) {
preconditions.checkArgument(readOpts.networkOpts);
preconditions.checkArgument(readOpts.blockchainOpts);
preconditions.checkArgument(readOpts.storage.setPassword);
var storage = readOpts.storage;
var networkOpts = readOpts.networkOpts;
var blockchainOpts = readOpts.blockchainOpts;
var skipFields = readOpts.skipFields || [];
if (skipFields) {
_.each(skipFields, function(k) {
@ -1085,9 +1120,9 @@ Wallet.fromObj = function(o, storage, network, blockchain, skipFields) {
opts.lastTimestamp = o.lastTimestamp || 0;
opts.storage = storage;
opts.network = network;
opts.blockchain = blockchain;
opts.isImported = true;
opts.blockchainOpts = readOpts.blockchainOpts;
opts.networkOpts = readOpts.networkOpts;
return new Wallet(opts);
};
@ -1129,7 +1164,7 @@ Wallet.prototype.sendAllTxProposals = function(recipients, sinceTs) {
*/
Wallet.prototype.sendTxProposal = function(ntxid, recipients) {
preconditions.checkArgument(ntxid);
log.debug('### SENDING txProposal ' + ntxid + ' TO:', recipients || 'All', this.txProposals);
log.debug('Wallet:' + this.id +' ### SENDING txProposal ' + ntxid + ' TO:', recipients || 'All', this.txProposals);
this.send(recipients, {
type: 'txProposal',
txProposal: this.txProposals.get(ntxid).toObjTrim(),
@ -1143,7 +1178,7 @@ Wallet.prototype.sendTxProposal = function(ntxid, recipients) {
*/
Wallet.prototype.sendSeen = function(ntxid) {
preconditions.checkArgument(ntxid);
log.debug('### SENDING seen: ' + ntxid + ' TO: All');
log.debug('Wallet:' + this.id +' ### SENDING seen: ' + ntxid + ' TO: All');
this.send(null, {
type: 'seen',
ntxid: ntxid,
@ -1157,7 +1192,7 @@ Wallet.prototype.sendSeen = function(ntxid) {
*/
Wallet.prototype.sendReject = function(ntxid) {
preconditions.checkArgument(ntxid);
log.debug('### SENDING reject: ' + ntxid + ' TO: All');
log.debug('Wallet:' + this.id +' ### SENDING reject: ' + ntxid + ' TO: All');
this.send(null, {
type: 'reject',
ntxid: ntxid,
@ -1170,7 +1205,7 @@ Wallet.prototype.sendReject = function(ntxid) {
* @param {string[]} [recipients] - the pubkeys of the recipients
*/
Wallet.prototype.sendWalletReady = function(recipients, sinceTs) {
log.debug('### SENDING WalletReady TO:', recipients || 'All');
log.debug('Wallet:' + this.id +' ### SENDING WalletReady TO:', recipients || 'All');
this.send(recipients, {
type: 'walletReady',
@ -1185,7 +1220,7 @@ Wallet.prototype.sendWalletReady = function(recipients, sinceTs) {
* @param {string[]} [recipients] - the pubkeys of the recipients
*/
Wallet.prototype.sendWalletId = function(recipients) {
log.debug('### SENDING walletId TO:', recipients || 'All', this.id);
log.debug('Wallet:' + this.id +' ### SENDING walletId TO:', recipients || 'All', this.id);
this.send(recipients, {
type: 'walletId',
@ -1200,7 +1235,7 @@ Wallet.prototype.sendWalletId = function(recipients) {
* @param {string[]} [recipients] - the pubkeys of the recipients
*/
Wallet.prototype.sendPublicKeyRing = function(recipients) {
log.debug('### SENDING publicKeyRing TO:', recipients || 'All', this.publicKeyRing.toObj());
log.debug('Wallet:' + this.id +' ### SENDING publicKeyRing TO:', recipients || 'All', this.publicKeyRing.toObj());
var publicKeyRing = this.publicKeyRing.toObj();
this.send(recipients, {
@ -1216,7 +1251,7 @@ Wallet.prototype.sendPublicKeyRing = function(recipients) {
*/
Wallet.prototype.sendIndexes = function(recipients) {
var indexes = HDParams.serialize(this.publicKeyRing.indexes);
log.debug('### INDEXES TO:', recipients || 'All', indexes);
log.debug('Wallet:' + this.id +' ### INDEXES TO:', recipients || 'All', indexes);
this.send(recipients, {
type: 'indexes',
@ -1230,7 +1265,7 @@ Wallet.prototype.sendIndexes = function(recipients) {
* @param {string[]} recipients - the pubkeys of the recipients
*/
Wallet.prototype.sendAddressBook = function(recipients) {
log.debug('### SENDING addressBook TO:', recipients || 'All', this.addressBook);
log.debug('Wallet:' + this.id +' ### SENDING addressBook TO:', recipients || 'All', this.addressBook);
this.send(recipients, {
type: 'addressbook',
addressBook: this.addressBook,
@ -1391,23 +1426,23 @@ Wallet.prototype.sendTx = function(ntxid, cb) {
var tx = txp.builder.build();
if (!tx.isComplete())
throw new Error('Tx is not complete. Can not broadcast');
log.debug('Broadcasting Transaction');
log.debug('Wallet:' + this.id +' Broadcasting Transaction');
var scriptSig = tx.ins[0].getScript();
var size = scriptSig.serialize().length;
var txHex = tx.serialize().toString('hex');
log.debug('Raw transaction: ', txHex);
log.debug('Wallet:' + this.id +' Raw transaction: ', txHex);
var self = this;
this.blockchain.broadcast(txHex, function(err, txid) {
log.debug('BITCOIND txid:', txid);
log.debug('Wallet:' + self.id +' BITCOIND txid:', txid);
if (txid) {
self.txProposals.get(ntxid).setSent(txid);
self.sendTxProposal(ntxid);
self.store();
return cb(txid);
} else {
log.debug('Sent failed. Checking if the TX was sent already');
log.debug('Wallet:' + self.id +' Sent failed. Checking if the TX was sent already');
self._checkSentTx(ntxid, function(txid) {
if (txid)
self.store();
@ -1651,7 +1686,6 @@ Wallet.prototype.sendPaymentTx = function(ntxid, options, cb) {
options = {};
}
console.log('[Wallet.js.1613:ntxid:]',ntxid); //TODO
var txp = this.txProposals.get(ntxid);
if (!txp) return;
@ -2427,7 +2461,7 @@ Wallet.prototype.createTxSync = function(toAddress, amountSatStr, comment, utxos
*/
Wallet.prototype.updateIndexes = function(callback) {
var self = this;
log.debug('Updating indexes...');
log.debug('Wallet:' + this.id +' Updating indexes...');
var tasks = this.publicKeyRing.indexes.map(function(index) {
return function(callback) {
@ -2437,7 +2471,7 @@ Wallet.prototype.updateIndexes = function(callback) {
async.parallel(tasks, function(err) {
if (err) callback(err);
log.debug('Indexes updated');
log.debug('Wallet:' + self.id +' Indexes updated');
self.emit('publicKeyRingUpdated');
self.store();
callback();
@ -2544,8 +2578,9 @@ Wallet.prototype.indexDiscovery = function(start, change, copayerIndex, gap, cb)
* @desc Closes the wallet and disconnects all services
*/
Wallet.prototype.close = function(cb) {
var self = this;
this.network.cleanUp();
this.blockchain.destroy();
log.debug('## CLOSING Wallet: ' + this.id);
this.lock.release(function() {
if (cb) return cb();

View file

@ -186,10 +186,10 @@ angular.module('copayApp.services')
root.bindWallet = function(w, $scope) {
root.setupRootVariables();
root.unbindWallet(w);
root.installWalletHandlers(w, $scope);
root.updateAddressList();
notification.enableHtml5Mode(); // for chrome: if support, enable it
w.netStart();
};
// TODO movie this to wallet

View file

@ -83,12 +83,12 @@ describe('PayPro (in Wallet) model', function() {
c.networkName = walletConfig.networkName;
c.version = '0.0.1';
c.network = sinon.stub();
c.network.setHexNonce = sinon.stub();
c.network.setHexNonces = sinon.stub();
c.network.getHexNonce = sinon.stub();
c.network.getHexNonces = sinon.stub();
c.network.send = sinon.stub();
c.network = sinon.stub();
c.network.setHexNonce = sinon.stub();
c.network.setHexNonces = sinon.stub();
c.network.getHexNonce = sinon.stub();
c.network.getHexNonces = sinon.stub();
c.network.send = sinon.stub();
return new Wallet(c);
@ -130,7 +130,15 @@ describe('PayPro (in Wallet) model', function() {
cachedW2obj = cachedW2.toObj();
cachedW2obj.opts.reconnectDelay = 100;
}
var w = Wallet.fromObj(cachedW2obj, cachedW2.storage, cachedW2.network, cachedW2.blockchain);
Wallet._newAsync = sinon.stub().returns(new Network(walletConfig.network));
Wallet._newInsight = sinon.stub().returns(new Blockchain(walletConfig.blockchain));
var w = Wallet.fromObj(cachedW2obj, {
storage: cachedW2.storage,
blockchainOpts: {},
networkOpts: {},
});
return w;
};
@ -745,7 +753,10 @@ describe('PayPro (in Wallet) model', function() {
uri = address.split(/\s+/)[1];
}
w.createPaymentTx({ uri: uri, memo: commentText }, function(err, ntxid, merchantData) {
w.createPaymentTx({
uri: uri,
memo: commentText
}, function(err, ntxid, merchantData) {
should.equal(err, null);
if (w.isShared()) {
should.exist(ntxid);
@ -767,7 +778,10 @@ describe('PayPro (in Wallet) model', function() {
should.exist(w);
var address = 'bitcoin:2NBzZdFBoQymDgfzH2Pmnthser1E71MmU47?amount=0.00003&r=' + server.uri + '/request';
var commentText = 'Hello, server. I\'d like to make a payment.';
w.createPaymentTx({ uri: address, memo: commentText }, function(err, ntxid, merchantData) {
w.createPaymentTx({
uri: address,
memo: commentText
}, function(err, ntxid, merchantData) {
should.equal(err, null);
if (w.isShared()) {
should.exist(ntxid);
@ -788,7 +802,10 @@ describe('PayPro (in Wallet) model', function() {
should.exist(w);
var address = 'bitcoin:2NBzZdFBoQymDgfzH2Pmnthser1E71MmU47?amount=0.00003&r=' + server.uri + '/request';
var commentText = 'Hello, server. I\'d like to make a payment.';
w.createPaymentTx({ uri: address, memo: commentText }, function(err, ntxid, merchantData) {
w.createPaymentTx({
uri: address,
memo: commentText
}, function(err, ntxid, merchantData) {
should.equal(err, null);
should.exist(ntxid);
should.exist(merchantData);
@ -825,7 +842,10 @@ describe('PayPro (in Wallet) model', function() {
should.exist(w);
var address = 'bitcoin:2NBzZdFBoQymDgfzH2Pmnthser1E71MmU47?amount=0.00003&r=' + server.uri + '/request';
var commentText = 'Hello, server. I\'d like to make a payment.';
w.createPaymentTx({ uri: address, memo: commentText }, function(err, ntxid, merchantData) {
w.createPaymentTx({
uri: address,
memo: commentText
}, function(err, ntxid, merchantData) {
should.equal(err, null);
should.exist(ntxid);
should.exist(merchantData);
@ -853,7 +873,10 @@ describe('PayPro (in Wallet) model', function() {
should.exist(w);
var address = 'bitcoin:2NBzZdFBoQymDgfzH2Pmnthser1E71MmU47?amount=0.00003&r=' + server.uri + '/request';
var commentText = 'Hello, server. I\'d like to make a payment.';
w.createPaymentTx({ uri: address, memo: commentText }, function(err, ntxid, merchantData) {
w.createPaymentTx({
uri: address,
memo: commentText
}, function(err, ntxid, merchantData) {
should.equal(err, null);
should.exist(ntxid);
should.exist(merchantData);
@ -880,7 +903,10 @@ describe('PayPro (in Wallet) model', function() {
should.exist(w);
var address = 'bitcoin:2NBzZdFBoQymDgfzH2Pmnthser1E71MmU47?amount=0.00003&r=' + server.uri + '/request';
var commentText = 'Hello, server. I\'d like to make a payment.';
w.createPaymentTx({ uri: address, memo: commentText }, function(err, ntxid, merchantData) {
w.createPaymentTx({
uri: address,
memo: commentText
}, function(err, ntxid, merchantData) {
should.equal(err, null);
should.exist(ntxid);
should.exist(merchantData);

View file

@ -27,8 +27,23 @@ var walletConfig = {
reconnectDelay: 100,
networkName: 'testnet',
storage: requireMock('FakeLocalStorage').storageParams,
// network layer config
networkOpts: {
testnet: {
url: 'https://test-insight.bitpay.com:443',
transports: ['polling'],
},
livenet: {
url: 'https://insight.bitpay.com:443',
transports: ['polling'],
},
},
};
walletConfig.blockchainOpts = walletConfig.networkOpts;
var getNewEpk = function() {
return new PrivateKey({
networkName: walletConfig.networkName,
@ -81,11 +96,19 @@ describe('Wallet model', function() {
var storage = new Storage(walletConfig.storage);
storage._setPassphrase('xxx');
var network = new Network(walletConfig.network);
var blockchain = new Blockchain(walletConfig.blockchain);
c.blockchain = new Blockchain(walletConfig.blockchain);
c.storage = storage;
c.network = network;
c.blockchain = blockchain;
c.network = sinon.stub();
c.network.setHexNonce = sinon.stub();
c.network.setHexNonces = sinon.stub();
c.network.getHexNonce = sinon.stub();
c.network.getHexNonces = sinon.stub();
c.network.peerFromCopayer = sinon.stub().returns('xxxx');
c.network.send = sinon.stub();
c.addressBook = {
'2NFR2kzH9NUdp8vsXTB4wWQtTtzhpKxsyoJ': {
@ -105,7 +128,6 @@ describe('Wallet model', function() {
c.networkName = walletConfig.networkName;
c.version = '0.0.1';
return new Wallet(c);
}
@ -117,7 +139,14 @@ describe('Wallet model', function() {
cachedWobj = cachedW.toObj();
cachedWobj.opts.reconnectDelay = 100;
}
var w = Wallet.fromObj(cachedWobj, cachedW.storage, cachedW.network, cachedW.blockchain);
Wallet._newAsync = sinon.stub().returns(new Network(walletConfig.network));
Wallet._newInsight = sinon.stub().returns(new Blockchain(walletConfig.blockchain));
var w = Wallet.fromObj(cachedWobj, {
storage: cachedW.storage,
blockchainOpts: {},
networkOpts: {},
});
return w;
};
@ -183,10 +212,18 @@ describe('Wallet model', function() {
cachedW2obj = cachedW2.toObj();
cachedW2obj.opts.reconnectDelay = 100;
}
var w = Wallet.fromObj(cachedW2obj, cachedW2.storage, cachedW2.network, cachedW2.blockchain);
Wallet._newAsync = sinon.stub().returns(new Network(walletConfig.network));
Wallet._newInsight = sinon.stub().returns(new Blockchain(walletConfig.blockchain));
var w = Wallet.fromObj(cachedW2obj, {
storage: cachedW2.storage,
blockchainOpts: {},
networkOpts: {},
});
return w;
};
it('#create, fail for network', function() {
var w = cachedCreateW2();
@ -343,10 +380,11 @@ describe('Wallet model', function() {
var s = new Storage(walletConfig.storage);
s._setPassphrase('xxx');
var w2 = Wallet.fromObj(o,
s,
new Network(walletConfig.network),
new Blockchain(walletConfig.blockchain));
var w2 = Wallet.fromObj(o, {
storage: s,
blockchainOpts: {},
networkOpts: {},
});
should.exist(w2);
w2.publicKeyRing.requiredCopayers.should.equal(w.publicKeyRing.requiredCopayers);
should.exist(w2.publicKeyRing.getCopayerId);
@ -613,8 +651,10 @@ describe('Wallet model', function() {
var newId = '00bacacafe';
it('handle new connections', function(done) {
var w = createW();
w.sendWalletId = sinon.stub();
w.on('connect', function(id) {
id.should.equal(newId);
id.should.equal('xxxx');
done();
});
w._onConnect(newId);
@ -1849,7 +1889,12 @@ describe('Wallet model', function() {
var blockchain = new Blockchain(walletConfig.blockchain);
it('Import backup using old copayerIndex', function() {
var w = Wallet.fromObj(JSON.parse(o), storage, network, blockchain);
var w = Wallet.fromObj(JSON.parse(o), {
storage: storage,
blockchainOpts: {},
networkOpts: {},
});
should.exist(w);
w.id.should.equal("dbfe10c3fae71cea");
@ -1860,7 +1905,12 @@ describe('Wallet model', function() {
});
it('#fromObj, skipping fields', function() {
var w = Wallet.fromObj(JSON.parse(o), storage, network, blockchain, ['publicKeyRing']);
var w = Wallet.fromObj(JSON.parse(o), {
storage: storage,
networkOpts: {},
blockchainOpts: {},
skipFields: ['publicKeyRing'],
});
should.exist(w);
w.id.should.equal("dbfe10c3fae71cea");
@ -1876,7 +1926,11 @@ describe('Wallet model', function() {
var o = '{"opts":{"id":"dbfe10c3fae71cea","spendUnconfirmed":1,"requiredCopayers":3,"totalCopayers":5,"version":"0.0.5"},"networkNonce":"0000000000000001","networkNonces":[],"publicKeyRing":{"walletId":"dbfe10c3fae71cea","networkName":"testnet","requiredCopayers":3,"totalCopayers":5,"indexes":{"changeIndex":0,"receiveIndex":0},"copayersBackup":[],"copayersExtPubKeys":["tpubD6NzVbkrYhZ4YGK8ZhZ8WVeBXNAAoTYjjpw9twCPiNGrGQYFktP3iVQkKmZNiFnUcAFMJRxJVJF6Nq9MDv2kiRceExJaHFbxUCGUiRhmy97","tpubD6NzVbkrYhZ4YKGDJkzWdQsQV3AcFemaQKiwNhV4RL8FHnBFvinidGdQtP8RKj3h34E65RkdtxjrggZYqsEwJ8RhhN2zz9VrjLnrnwbXYNc","tpubD6NzVbkrYhZ4YkDiewjb32Pp3Sz9WK2jpp37KnL7RCrHAyPpnLfgdfRnTdpn6DTWmPS7niywfgWiT42aJb1J6CjWVNmkgsMCxuw7j9DaGKB","tpubD6NzVbkrYhZ4XEtUAz4UUTWbprewbLTaMhR8NUvSJUEAh4Sidxr6rRPFdqqVRR73btKf13wUjds2i8vVCNo8sbKrAnyoTr3o5Y6QSbboQjk","tpubD6NzVbkrYhZ4Yj9AAt6xUVuGPVd8jXCrEE6V2wp7U3PFh8jYYvVad31b4VUXEYXzSnkco4fktu8r4icBsB2t3pCR3WnhVLedY2hxGcPFLKD"],"nicknameFor":{}},"txProposals":{"txps":[],"walletId":"dbfe10c3fae71cea","networkName":"testnet"},"privateKey":{"extendedPrivateKeyString":"tprv8ZgxMBicQKsPeoHLg3tY75z4xLeEe8MqAXLNcRA6J6UTRvHV8VZTXznt9eoTmSk1fwSrwZtMhY3XkNsceJ14h6sCXHSWinRqMSSbY8tfhHi","networkName":"testnet"},"addressBook":{}}';
var o2 = '{"opts":{"id":"dbfe10c3fae71cea","spendUnconfirmed":1,"requiredCopayers":3,"totalCopayers":5,"version":"0.0.5","networkName":"testnet"},"networkNonce":"0000000000000001","networkNonces":[],"publicKeyRing":{"walletId":"dbfe10c3fae71cea","networkName":"testnet","requiredCopayers":3,"totalCopayers":5,"indexes":[{"copayerIndex":2147483647,"changeIndex":0,"receiveIndex":0},{"copayerIndex":0,"changeIndex":0,"receiveIndex":0},{"copayerIndex":1,"changeIndex":0,"receiveIndex":0},{"copayerIndex":2,"changeIndex":0,"receiveIndex":0},{"copayerIndex":3,"changeIndex":0,"receiveIndex":0},{"copayerIndex":4,"changeIndex":0,"receiveIndex":0}],"copayersBackup":[],"copayersExtPubKeys":["tpubD6NzVbkrYhZ4YGK8ZhZ8WVeBXNAAoTYjjpw9twCPiNGrGQYFktP3iVQkKmZNiFnUcAFMJRxJVJF6Nq9MDv2kiRceExJaHFbxUCGUiRhmy97","tpubD6NzVbkrYhZ4YKGDJkzWdQsQV3AcFemaQKiwNhV4RL8FHnBFvinidGdQtP8RKj3h34E65RkdtxjrggZYqsEwJ8RhhN2zz9VrjLnrnwbXYNc","tpubD6NzVbkrYhZ4YkDiewjb32Pp3Sz9WK2jpp37KnL7RCrHAyPpnLfgdfRnTdpn6DTWmPS7niywfgWiT42aJb1J6CjWVNmkgsMCxuw7j9DaGKB","tpubD6NzVbkrYhZ4XEtUAz4UUTWbprewbLTaMhR8NUvSJUEAh4Sidxr6rRPFdqqVRR73btKf13wUjds2i8vVCNo8sbKrAnyoTr3o5Y6QSbboQjk","tpubD6NzVbkrYhZ4Yj9AAt6xUVuGPVd8jXCrEE6V2wp7U3PFh8jYYvVad31b4VUXEYXzSnkco4fktu8r4icBsB2t3pCR3WnhVLedY2hxGcPFLKD"],"nicknameFor":{}},"txProposals":{"txps":[],"walletId":"dbfe10c3fae71cea","networkName":"testnet"},"privateKey":{"extendedPrivateKeyString":"tprv8ZgxMBicQKsPeoHLg3tY75z4xLeEe8MqAXLNcRA6J6UTRvHV8VZTXznt9eoTmSk1fwSrwZtMhY3XkNsceJ14h6sCXHSWinRqMSSbY8tfhHi","networkName":"testnet"},"addressBook":{}}';
var w = Wallet.fromObj(JSON.parse(o), storage, network, blockchain);
var w = Wallet.fromObj(JSON.parse(o), {
storage: storage,
networkOpts: {},
blockchainOpts: {},
});
should.exist(w);
w.id.should.equal("dbfe10c3fae71cea");
@ -1889,18 +1943,25 @@ describe('Wallet model', function() {
});
describe('#read', function() {
var storage, network, blockchain;
var s = function() {};
var storage = new s();
var network = new Network(walletConfig.network);
var blockchain = new Blockchain(walletConfig.blockchain);
storage.setPassword = sinon.stub();
beforeEach(function() {
var s = function() {};
storage = new s();
network = new Network(walletConfig.network);
blockchain = new Blockchain(walletConfig.blockchain);
storage.setPassword = sinon.stub();
});
it('should fail to read an unexisting wallet', function(done) {
storage.getFirst = sinon.stub().yields(null);
Wallet.read('123', storage, network, blockchain, [], function(err, w) {
Wallet.read('123', {
storage: storage,
networkOpts: {},
blockchainOpts: {},
}, function(err, w) {
err.toString().should.contain('WNOTFOUND');
done();
});
@ -1910,7 +1971,11 @@ describe('Wallet model', function() {
storage.getFirst = sinon.stub().yields(null, '{hola:1}');
Wallet.read('123', storage, network, blockchain, [], function(err, w) {
Wallet.read('123', {
storage: storage,
networkOpts: {},
blockchainOpts: {},
}, function(err, w) {
err.toString().should.contain('WERROR');
done();
});
@ -1918,7 +1983,11 @@ describe('Wallet model', function() {
it('should read a wallet', function(done) {
storage.getFirst = sinon.stub().yields(null, JSON.parse(o));
Wallet.read('123', storage, network, blockchain, [], function(err, w) {
Wallet.read('123', {
storage: storage,
networkOpts: {},
blockchainOpts: {},
}, function(err, w) {
should.not.exist(err);
done();
});
@ -1926,7 +1995,11 @@ describe('Wallet model', function() {
it('should be able to import unencrypted legacy wallet TxProposal: v0', function(done) {
storage.getFirst = sinon.stub().yields(null, JSON.parse(legacyO));
Wallet.read('123', storage, network, blockchain, [], function(err, w) {
Wallet.read('123', {
storage: storage,
networkOpts: {},
blockchainOpts: {},
}, function(err, w) {
should.exist(w);
w.id.should.equal('55d4bd062d32f90a');
should.exist(w.publicKeyRing.getCopayerId);
@ -1939,7 +2012,11 @@ describe('Wallet model', function() {
it('should be able to import simple 1-of-1 encrypted legacy testnet wallet', function(done) {
storage.getFirst = sinon.stub().yields(null, JSON.parse(legacy1));
Wallet.read('123', storage, network, blockchain, [], function(err, w) {
Wallet.read('123', {
storage: storage,
networkOpts: {},
blockchainOpts: {},
}, function(err, w) {
should.exist(w);
w.isReady().should.equal(true);
var wo = w.toObj();

View file

@ -6,7 +6,6 @@ var chai = chai || require('chai');
var should = chai.should();
var FakeNetwork = requireMock('FakeNetwork');
var FakeBlockchain = requireMock('FakeBlockchain');
var FakeStorage = function FakeStorage() {};
var Identity = copay.Identity;
@ -338,7 +337,8 @@ describe('Identity model', function() {
};
it('should yield bad network error', function(done) {
var net = iden.networks['testnet'];
var net = sinon.stub();
net.greet = sinon.stub();
net.cleanUp = sinon.stub();
net.start = sinon.stub().yields(null);
@ -348,6 +348,8 @@ describe('Identity model', function() {
networkName: 'aWeirdNetworkName',
opts: {},
});
Identity._newAsync = function() { return net; };
opts.privHex = undefined;
iden.joinWallet(opts, function(err, w) {
err.should.equal('badNetwork');
@ -358,7 +360,7 @@ describe('Identity model', function() {
it('should yield to join error', function(done) {
opts.privHex = undefined;
var net = iden.networks['testnet'];
var net = sinon.stub();
net.greet = sinon.stub();
net.cleanUp = sinon.stub();
net.start = sinon.stub().yields(null);
@ -369,6 +371,8 @@ describe('Identity model', function() {
type: 'walletId',
networkName: iden.networkName,
});
Identity._newAsync = function() { return net; };
iden.joinWallet(opts, function(err, w) {
err.should.equal('joinError');
done();
@ -378,7 +382,7 @@ describe('Identity model', function() {
it('should call network.start / create', function(done) {
opts.privHex = undefined;
var net = iden.networks['testnet'];
var net = sinon.stub();
net.cleanUp = sinon.spy();
net.greet = sinon.spy();
net.start = sinon.stub().yields(null);
@ -390,6 +394,7 @@ describe('Identity model', function() {
networkName: 'testnet',
opts: {},
});
Identity._newAsync = function() { return net; };
var w = sinon.stub();
w.sendWalletReady = sinon.spy();
@ -407,7 +412,7 @@ describe('Identity model', function() {
it('should return walletFull', function(done) {
opts.privHex = undefined;
var net = iden.networks['testnet'];
var net = sinon.stub();
net.cleanUp = sinon.spy();
net.greet = sinon.spy();
net.start = sinon.stub().yields(null);
@ -419,6 +424,7 @@ describe('Identity model', function() {
networkName: 'testnet',
opts: {},
});
Identity._newAsync = function() { return net; };
iden.createWallet = sinon.stub().yields(null, null);
iden.joinWallet(opts, function(err, w) {
err.should.equal('walletFull');
@ -428,7 +434,10 @@ describe('Identity model', function() {
it('should accept a priv key a input', function() {
opts.privHex = 'tprv8ZgxMBicQKsPf7MCvCjnhnr4uiR2Z2gyNC27vgd9KUu98F9mM1tbaRrWMyddVju36GxLbeyntuSadBAttriwGGMWUkRgVmUUCg5nFioGZsd';
var net = iden.networks['testnet'];
var net = sinon.stub();
Identity._newAsync = function() { return net; };
net.on = sinon.stub();
net.cleanUp = sinon.spy();
net.start = sinon.spy();
iden.joinWallet(opts, function(err, w) {
@ -437,9 +446,11 @@ describe('Identity model', function() {
});
it('should call network.start with private key', function() {
opts.privHex = undefined;
var net = iden.networks['testnet'];
var net = sinon.stub();
net.cleanUp = sinon.spy();
net.on = sinon.stub();
net.start = sinon.spy();
Identity._newAsync = function() { return net; };
iden.joinWallet(opts, function(err, w) {
net.start.getCall(0).args[0].privkey.length.should.equal(64); //privkey is hex of private key buffer
});