mirror of https://github.com/BTCPrivate/copay.git
Merge branch 'master' into feature/01-tx-page
This commit is contained in:
commit
e7f22c9558
|
@ -5,7 +5,7 @@ var config = {
|
||||||
network: {
|
network: {
|
||||||
apiKey: 'lwjd5qra8257b9',
|
apiKey: 'lwjd5qra8257b9',
|
||||||
maxPeers: 3,
|
maxPeers: 3,
|
||||||
debug: 3,
|
debug: 0,
|
||||||
},
|
},
|
||||||
wallet: {
|
wallet: {
|
||||||
requiredCopayers: 2,
|
requiredCopayers: 2,
|
||||||
|
@ -15,4 +15,10 @@ var config = {
|
||||||
host: 'localhost',
|
host: 'localhost',
|
||||||
port: 3001
|
port: 3001
|
||||||
},
|
},
|
||||||
|
verbose: 0,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
var log = function () {
|
||||||
|
if (config.verbose) console.log(arguments);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -41,7 +41,6 @@ angular.module('copay.header').controller('HeaderController',
|
||||||
|
|
||||||
$scope.signout = function() {
|
$scope.signout = function() {
|
||||||
Network.disconnect(function() {
|
Network.disconnect(function() {
|
||||||
console.log('[header.js.41] disconnect CB'); //TODO
|
|
||||||
$location.path('signin');
|
$location.path('signin');
|
||||||
$rootScope.$digest();
|
$rootScope.$digest();
|
||||||
});
|
});
|
||||||
|
|
|
@ -6,14 +6,13 @@ angular.module('copay.home').controller('HomeController',
|
||||||
|
|
||||||
$scope.oneAtATime = true;
|
$scope.oneAtATime = true;
|
||||||
|
|
||||||
if (!$rootScope.wallet.id) {
|
if (!$rootScope.wallet || !$rootScope.wallet.id) {
|
||||||
$location.path('signin');
|
$location.path('signin');
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
$scope.addrs = $rootScope.wallet.publicKeyRing.getAddresses();
|
||||||
|
$scope.selectedAddr = $scope.addrs[0];
|
||||||
$scope.addrs = $rootScope.wallet.publicKeyRing.getAddresses();
|
}
|
||||||
$scope.selectedAddr = $scope.addrs[0];
|
|
||||||
|
|
||||||
$scope.newAddr = function() {
|
$scope.newAddr = function() {
|
||||||
var a = $rootScope.wallet.publicKeyRing.generateAddress();
|
var a = $rootScope.wallet.publicKeyRing.generateAddress();
|
||||||
|
|
|
@ -17,26 +17,31 @@ function Wallet(config) {
|
||||||
this._startInterface(config);
|
this._startInterface(config);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Wallet.prototype.log = function(){
|
||||||
|
if (!this.verbose) return;
|
||||||
|
|
||||||
|
console.this.log(arguments);
|
||||||
|
}
|
||||||
|
|
||||||
Wallet.prototype._startInterface = function(config) {
|
Wallet.prototype._startInterface = function(config) {
|
||||||
this.storage = new Storage(config.storage);
|
this.storage = new Storage(config.storage);
|
||||||
this.network = new Network(config.network);
|
this.network = new Network(config.network);
|
||||||
this.blockchain = new Blockchain(config.blockchain);
|
this.blockchain = new Blockchain(config.blockchain);
|
||||||
|
|
||||||
this.networkName = config.networkName;
|
this.networkName = config.networkName;
|
||||||
this.requiredCopayers = config.requiredCopayers;
|
this.requiredCopayers = config.wallet.requiredCopayers;
|
||||||
this.totalCopayers = config.totalCopayers;
|
this.totalCopayers = config.wallet.totalCopayers;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
Wallet.prototype.create = function(opts) {
|
Wallet.prototype.create = function(opts) {
|
||||||
|
|
||||||
this.id = opts.id || Wallet.getRandomId();
|
this.id = opts.id || Wallet.getRandomId();
|
||||||
console.log('### CREATING NEW WALLET.' + (opts.id ? ' USING ID: ' + opts.id : ' NEW ID'));
|
this.log('### CREATING NEW WALLET.' + (opts.id ? ' USING ID: ' + opts.id : ' NEW ID'));
|
||||||
|
|
||||||
this.privateKey = new copay.PrivateKey({
|
this.privateKey = new copay.PrivateKey({
|
||||||
networkName: this.networkName
|
networkName: this.networkName
|
||||||
});
|
});
|
||||||
console.log('\t### PrivateKey Initialized');
|
this.log('\t### PrivateKey Initialized');
|
||||||
|
|
||||||
this.publicKeyRing = new copay.PublicKeyRing({
|
this.publicKeyRing = new copay.PublicKeyRing({
|
||||||
walletId: this.id,
|
walletId: this.id,
|
||||||
|
@ -46,14 +51,14 @@ Wallet.prototype.create = function(opts) {
|
||||||
});
|
});
|
||||||
|
|
||||||
this.publicKeyRing.addCopayer(this.privateKey.getBIP32().extendedPublicKeyString());
|
this.publicKeyRing.addCopayer(this.privateKey.getBIP32().extendedPublicKeyString());
|
||||||
console.log('\t### PublicKeyRing Initialized WalletID: ' + this.publicKeyRing.walletId);
|
this.log('\t### PublicKeyRing Initialized WalletID: ' + this.publicKeyRing.walletId);
|
||||||
|
|
||||||
this.txProposals = new copay.TxProposals({
|
this.txProposals = new copay.TxProposals({
|
||||||
walletId: this.id,
|
walletId: this.id,
|
||||||
publicKeyRing: this.publicKeyRing,
|
publicKeyRing: this.publicKeyRing,
|
||||||
networkName: this.networkName,
|
networkName: this.networkName,
|
||||||
});
|
});
|
||||||
console.log('\t### TxProposals Initialized');
|
this.log('\t### TxProposals Initialized');
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -86,7 +91,7 @@ Wallet.prototype.load = function(walletId) {
|
||||||
this.privateKey.getBIP32().extendedPublicKeyString()
|
this.privateKey.getBIP32().extendedPublicKeyString()
|
||||||
);
|
);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.log('NOT NECCESARY AN ERROR:', e); //TODO
|
this.log('NOT NECCESARY AN ERROR:', e); //TODO
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -101,7 +106,7 @@ Wallet.prototype.store = function() {
|
||||||
|
|
||||||
|
|
||||||
Wallet.prototype.sendTxProposals = function(recipients) {
|
Wallet.prototype.sendTxProposals = function(recipients) {
|
||||||
console.log('### SENDING txProposals TO:', recipients||'All', this.txProposals);
|
this.log('### SENDING txProposals TO:', recipients||'All', this.txProposals);
|
||||||
|
|
||||||
this.network.send( recipients, {
|
this.network.send( recipients, {
|
||||||
type: 'txProposals',
|
type: 'txProposals',
|
||||||
|
@ -111,7 +116,7 @@ Wallet.prototype.sendTxProposals = function(recipients) {
|
||||||
};
|
};
|
||||||
|
|
||||||
Wallet.prototype.sendPublicKeyRing = function(recipients) {
|
Wallet.prototype.sendPublicKeyRing = function(recipients) {
|
||||||
console.log('### SENDING publicKeyRing TO:', recipients||'All', this.publicKeyRing.toObj());
|
this.log('### SENDING publicKeyRing TO:', recipients||'All', this.publicKeyRing.toObj());
|
||||||
|
|
||||||
this.network.send(recipients, {
|
this.network.send(recipients, {
|
||||||
type: 'publicKeyRing',
|
type: 'publicKeyRing',
|
||||||
|
@ -145,7 +150,6 @@ WalletFactory.prototype.create = function(config, opts) {
|
||||||
var w = new Wallet(config);
|
var w = new Wallet(config);
|
||||||
w.create(opts);
|
w.create(opts);
|
||||||
w.store();
|
w.store();
|
||||||
this.addWalletId(w.id);
|
|
||||||
return w;
|
return w;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -160,21 +164,22 @@ WalletFactory.prototype.remove = function(walletId) {
|
||||||
|
|
||||||
WalletFactory.prototype.addWalletId = function(walletId) {
|
WalletFactory.prototype.addWalletId = function(walletId) {
|
||||||
var ids = this.getWalletIds();
|
var ids = this.getWalletIds();
|
||||||
if (ids.indexOf(walletId) == -1) return;
|
if (ids.indexOf(walletId) !== -1) return;
|
||||||
storage.set('walletIds', (ids ? ids + ',' : '') + walletId);
|
ids.push(walletId);
|
||||||
|
this.storage.setGlobal('walletIds', ids);
|
||||||
};
|
};
|
||||||
|
|
||||||
WalletFactory.prototype._delWalletId = function(walletId) {
|
WalletFactory.prototype._delWalletId = function(walletId) {
|
||||||
var ids = this.getWalletIds();
|
var ids = this.getWalletIds();
|
||||||
var index = ids.indexOf(walletId);
|
var index = ids.indexOf(walletId);
|
||||||
if (index == -1) return;
|
if (index === -1) return;
|
||||||
ids.splice(index, 1); // removes walletId
|
ids.splice(index, 1); // removes walletId
|
||||||
this.storage.set('walletIds', ids.join(','));
|
this.storage.setGlobal('walletIds', ids);
|
||||||
};
|
};
|
||||||
|
|
||||||
WalletFactory.prototype.getWalletIds = function() {
|
WalletFactory.prototype.getWalletIds = function() {
|
||||||
var ids = this.storage.get('walletIds');
|
var ids = this.storage.getGlobal('walletIds');
|
||||||
return ids ? ids.split(',') : [];
|
return ids || [];
|
||||||
};
|
};
|
||||||
|
|
||||||
Wallet.factory = new WalletFactory();
|
Wallet.factory = new WalletFactory();
|
||||||
|
|
|
@ -63,7 +63,7 @@ Network._arrayRemove = function(el, array) {
|
||||||
|
|
||||||
// DEBUG
|
// DEBUG
|
||||||
Network.prototype._showConnectedPeers = function() {
|
Network.prototype._showConnectedPeers = function() {
|
||||||
console.log("### CONNECTED PEERS", this.connectedPeers);
|
// console.log("### CONNECTED PEERS", this.connectedPeers);
|
||||||
};
|
};
|
||||||
|
|
||||||
Network.prototype._onClose = function(peerId) {
|
Network.prototype._onClose = function(peerId) {
|
||||||
|
@ -166,7 +166,6 @@ Network.prototype._setupConnectionHandlers = function(
|
||||||
};
|
};
|
||||||
|
|
||||||
Network.prototype._notify = function(newPeer) {
|
Network.prototype._notify = function(newPeer) {
|
||||||
console.log('[Network.js.168:_notify:]'); //TODO
|
|
||||||
this._showConnectedPeers();
|
this._showConnectedPeers();
|
||||||
this.emit('networkChange', newPeer);
|
this.emit('networkChange', newPeer);
|
||||||
};
|
};
|
||||||
|
@ -177,7 +176,6 @@ Network.prototype._setupPeerHandlers = function(openCallback) {
|
||||||
|
|
||||||
|
|
||||||
p.on('open', function(peerId) {
|
p.on('open', function(peerId) {
|
||||||
console.log('### PEER OPEN. I AM:' + peerId);
|
|
||||||
self.peerId = peerId;
|
self.peerId = peerId;
|
||||||
self.connectedPeers = [peerId];
|
self.connectedPeers = [peerId];
|
||||||
self._notify();
|
self._notify();
|
||||||
|
@ -241,13 +239,10 @@ console.log('[WebRTC.js.222:peerId:]',peerId, data); //TODO
|
||||||
|
|
||||||
Network.prototype.send = function(peerIds, data, cb) {
|
Network.prototype.send = function(peerIds, data, cb) {
|
||||||
var self=this;
|
var self=this;
|
||||||
|
|
||||||
console.log('[WebRTC.js.242:peerIds:]',peerIds); //TODO
|
|
||||||
if (!peerIds) {
|
if (!peerIds) {
|
||||||
peerIds = this.connectedPeers;
|
peerIds = this.connectedPeers;
|
||||||
data.isBroadcast = 1;
|
data.isBroadcast = 1;
|
||||||
}
|
}
|
||||||
console.log('[WebRTC.js.246:peerIds:]',peerIds, data); //TODO
|
|
||||||
|
|
||||||
if (Array.isArray(peerIds)) {
|
if (Array.isArray(peerIds)) {
|
||||||
var l = peerIds.length;
|
var l = peerIds.length;
|
||||||
|
@ -279,13 +274,10 @@ Network.prototype.connectTo = function(peerId, openCallback, closeCallback ) {
|
||||||
|
|
||||||
|
|
||||||
Network.prototype.disconnect = function(peerId, cb) {
|
Network.prototype.disconnect = function(peerId, cb) {
|
||||||
console.log('[Network.js.268:disconnect:]'); //TODO
|
|
||||||
var self = this;
|
var self = this;
|
||||||
self.closing = 1;
|
self.closing = 1;
|
||||||
|
|
||||||
this.send(null, { type: 'disconnect' }, function() {
|
this.send(null, { type: 'disconnect' }, function() {
|
||||||
|
|
||||||
console.log('[Network.js.273] disconnect CB'); //TODO
|
|
||||||
self.connectedPeers = [];
|
self.connectedPeers = [];
|
||||||
self.peerId = null;
|
self.peerId = null;
|
||||||
if (self.peer) {
|
if (self.peer) {
|
||||||
|
|
|
@ -6,15 +6,40 @@ function Storage() {
|
||||||
this.data = {};
|
this.data = {};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Storage.prototype._read = function(k) {
|
||||||
|
var ret;
|
||||||
|
try {
|
||||||
|
ret = JSON.parse(localStorage.getItem(k));
|
||||||
|
} catch (e) {};
|
||||||
|
return ret;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// get value by key
|
||||||
|
Storage.prototype.getGlobal = function(k) {
|
||||||
|
return this._read(k);
|
||||||
|
};
|
||||||
|
|
||||||
|
// set value for key
|
||||||
|
Storage.prototype.setGlobal = function(k,v) {
|
||||||
|
localStorage.setItem(k, JSON.stringify(v));
|
||||||
|
};
|
||||||
|
|
||||||
|
// remove value for key
|
||||||
|
Storage.prototype.removeGlobal = function(k) {
|
||||||
|
localStorage.removeItem(k);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Storage.prototype._key = function(walletId, k) {
|
Storage.prototype._key = function(walletId, k) {
|
||||||
return walletId + '::' + k;
|
return walletId + '::' + k;
|
||||||
};
|
};
|
||||||
// get value by key
|
// get value by key
|
||||||
Storage.prototype.get = function(walletId, k) {
|
Storage.prototype.get = function(walletId, k) {
|
||||||
return JSON.parse(localStorage.getItem(this._key(walletId,k)));
|
return this._read(localStorage.getItem(this._key(walletId,k)));
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
// set value for key
|
// set value for key
|
||||||
Storage.prototype.set = function(walletId, k,v) {
|
Storage.prototype.set = function(walletId, k,v) {
|
||||||
localStorage.setItem(this._key(walletId,k), JSON.stringify(v));
|
localStorage.setItem(this._key(walletId,k), JSON.stringify(v));
|
||||||
|
|
|
@ -4,10 +4,9 @@ angular.module('copay.network')
|
||||||
.factory('Network', function($rootScope) {
|
.factory('Network', function($rootScope) {
|
||||||
var peer;
|
var peer;
|
||||||
|
|
||||||
|
|
||||||
var _refreshUx = function() {
|
var _refreshUx = function() {
|
||||||
var net = $rootScope.wallet.network;
|
var net = $rootScope.wallet.network;
|
||||||
console.log('*** UPDATING UX'); //TODO
|
log('*** UPDATING UX'); //TODO
|
||||||
$rootScope.peedId = net.peerId;
|
$rootScope.peedId = net.peerId;
|
||||||
$rootScope.connectedPeers = net.connectedPeers;
|
$rootScope.connectedPeers = net.connectedPeers;
|
||||||
$rootScope.$digest();
|
$rootScope.$digest();
|
||||||
|
@ -16,7 +15,7 @@ angular.module('copay.network')
|
||||||
// set new inbound connections
|
// set new inbound connections
|
||||||
var _setNewPeer = function(newPeer) {
|
var _setNewPeer = function(newPeer) {
|
||||||
var w = $rootScope.wallet;
|
var w = $rootScope.wallet;
|
||||||
console.log('#### Setting new PEER:', newPeer);
|
log('#### Setting new PEER:', newPeer);
|
||||||
w.sendPublicKeyRing(newPeer);
|
w.sendPublicKeyRing(newPeer);
|
||||||
w.sendTxProposals(newPeer);
|
w.sendTxProposals(newPeer);
|
||||||
};
|
};
|
||||||
|
@ -34,7 +33,7 @@ angular.module('copay.network')
|
||||||
var storeOpenWallet = function() {
|
var storeOpenWallet = function() {
|
||||||
var w = $rootScope.wallet;
|
var w = $rootScope.wallet;
|
||||||
w.store();
|
w.store();
|
||||||
console.log('\t### Wallet %s Stored', w.id);
|
log('\t### Wallet %s Stored', w.id);
|
||||||
};
|
};
|
||||||
|
|
||||||
// TODO -> probably not in network.js
|
// TODO -> probably not in network.js
|
||||||
|
@ -43,14 +42,14 @@ angular.module('copay.network')
|
||||||
w.create({id: walletId});
|
w.create({id: walletId});
|
||||||
w.store();
|
w.store();
|
||||||
$rootScope.wallet = w;
|
$rootScope.wallet = w;
|
||||||
console.log('createWallet ENDED'); //TODO
|
log('createWallet ENDED'); //TODO
|
||||||
};
|
};
|
||||||
|
|
||||||
var openWallet = function (walletId) {
|
var openWallet = function (walletId) {
|
||||||
var w = $rootScope.wallet || new copay.Wallet(config);
|
var w = $rootScope.wallet || new copay.Wallet(config);
|
||||||
w.load(walletId);
|
w.load(walletId);
|
||||||
if (w && w.publicKeyRing && w.privateKey) {
|
if (w && w.publicKeyRing && w.privateKey) {
|
||||||
console.log('### WALLET OPENED:', w.walletId);
|
log('### WALLET OPENED:', w.walletId);
|
||||||
$rootScope.wallet = w;
|
$rootScope.wallet = w;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -61,12 +60,12 @@ angular.module('copay.network')
|
||||||
if (w && w.id)
|
if (w && w.id)
|
||||||
w.store();
|
w.store();
|
||||||
|
|
||||||
console.log('### CLOSING WALLET');
|
log('### CLOSING WALLET');
|
||||||
delete $rootScope['wallet'];
|
delete $rootScope['wallet'];
|
||||||
};
|
};
|
||||||
|
|
||||||
var _checkWallet = function(walletId) {
|
var _checkWallet = function(walletId) {
|
||||||
console.log('[network.js.79:_checkWallet:]',walletId); //TODO
|
log('[network.js.79:_checkWallet:]',walletId); //TODO
|
||||||
|
|
||||||
if ($rootScope.wallet && $rootScope.wallet.id === walletId)
|
if ($rootScope.wallet && $rootScope.wallet.id === walletId)
|
||||||
return;
|
return;
|
||||||
|
@ -88,13 +87,13 @@ angular.module('copay.network')
|
||||||
var recipients, pkr = w.publicKeyRing;
|
var recipients, pkr = w.publicKeyRing;
|
||||||
var inPKR = copay.PublicKeyRing.fromObj(data.publicKeyRing);
|
var inPKR = copay.PublicKeyRing.fromObj(data.publicKeyRing);
|
||||||
if (pkr.merge(inPKR, true) && !data.isBroadcast) {
|
if (pkr.merge(inPKR, true) && !data.isBroadcast) {
|
||||||
console.log('### BROADCASTING PKR');
|
log('### BROADCASTING PKR');
|
||||||
recipients = null;
|
recipients = null;
|
||||||
shouldSend = true;
|
shouldSend = true;
|
||||||
}
|
}
|
||||||
else if (isInbound && !data.isBroadcast) {
|
else if (isInbound && !data.isBroadcast) {
|
||||||
// always replying to connecting peer
|
// always replying to connecting peer
|
||||||
console.log('### REPLYING PKR TO:', senderId);
|
log('### REPLYING PKR TO:', senderId);
|
||||||
recipients = senderId;
|
recipients = senderId;
|
||||||
shouldSend = true;
|
shouldSend = true;
|
||||||
}
|
}
|
||||||
|
@ -110,19 +109,19 @@ angular.module('copay.network')
|
||||||
|
|
||||||
var shouldSend = false;
|
var shouldSend = false;
|
||||||
var w = $rootScope.wallet;
|
var w = $rootScope.wallet;
|
||||||
console.log('RECV TXPROPOSAL:',data); //TODO
|
log('RECV TXPROPOSAL:',data); //TODO
|
||||||
|
|
||||||
var recipients;
|
var recipients;
|
||||||
var inTxProposals = copay.TxProposals.fromObj(data.txProposals);
|
var inTxProposals = copay.TxProposals.fromObj(data.txProposals);
|
||||||
var mergeInfo = w.txProposals.merge(inTxProposals, true);
|
var mergeInfo = w.txProposals.merge(inTxProposals, true);
|
||||||
if ( mergeInfo.merged && !data.isBroadcast) {
|
if ( mergeInfo.merged && !data.isBroadcast) {
|
||||||
console.log('### BROADCASTING txProposals');
|
log('### BROADCASTING txProposals');
|
||||||
recipients = null;
|
recipients = null;
|
||||||
shouldSend = true;
|
shouldSend = true;
|
||||||
}
|
}
|
||||||
else if (isInbound && !data.isBroadcast) {
|
else if (isInbound && !data.isBroadcast) {
|
||||||
// always replying to connecting peer
|
// always replying to connecting peer
|
||||||
console.log('### REPLYING txProposals TO:', senderId);
|
log('### REPLYING txProposals TO:', senderId);
|
||||||
recipients = senderId;
|
recipients = senderId;
|
||||||
shouldSend = true;
|
shouldSend = true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,12 +3,24 @@ var FakeStorage = function(){
|
||||||
this.storage = {};
|
this.storage = {};
|
||||||
};
|
};
|
||||||
|
|
||||||
FakeStorage.prototype.set = function (id, payload) {
|
FakeStorage.prototype.setGlobal = function (id, payload) {
|
||||||
this.storage[id] = payload;
|
this.storage[id] = payload;
|
||||||
};
|
};
|
||||||
|
|
||||||
FakeStorage.prototype.get = function(id) {
|
FakeStorage.prototype.getGlobal = function(id) {
|
||||||
return this.storage[id];
|
return this.storage[id];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
FakeStorage.prototype.set = function (wid, id, payload) {
|
||||||
|
this.storage[wid + '-' + id] = payload;
|
||||||
|
};
|
||||||
|
|
||||||
|
FakeStorage.prototype.get = function(wid, id) {
|
||||||
|
return this.storage[wid + '-' +id];
|
||||||
|
}
|
||||||
|
|
||||||
|
FakeStorage.prototype.clear = function() {
|
||||||
|
delete this['storage'];
|
||||||
|
}
|
||||||
|
|
||||||
module.exports = require('soop')(FakeStorage);
|
module.exports = require('soop')(FakeStorage);
|
||||||
|
|
|
@ -9,9 +9,6 @@ var Wallet = require('soop').load('../js/models/core/Wallet', {
|
||||||
Blockchain: copay.Insight
|
Blockchain: copay.Insight
|
||||||
});
|
});
|
||||||
|
|
||||||
console.log(Wallet);
|
|
||||||
|
|
||||||
|
|
||||||
describe('Wallet model', function() {
|
describe('Wallet model', function() {
|
||||||
var config = {
|
var config = {
|
||||||
wallet: {
|
wallet: {
|
||||||
|
|
Loading…
Reference in New Issue