diff --git a/js/controllers/send.js b/js/controllers/send.js index 7b2e76b15..b1816ee87 100644 --- a/js/controllers/send.js +++ b/js/controllers/send.js @@ -71,9 +71,9 @@ angular.module('copayApp.controllers').controller('SendController', configurable: true }); + $scope.loadTxs = function() { controllerUtils.updateTxs(); - setTimeout(function() { $scope.loading = false; $rootScope.$digest(); @@ -120,6 +120,9 @@ angular.module('copayApp.controllers').controller('SendController', if (msg.match('BIG')) msg = 'The transaction have too many inputs. Try creating many transactions for smaller amounts.' + if (msg.match('totalNeededAmount')) + msg = 'Not enough funds.' + var message = 'The transaction' + (w.isShared() ? ' proposal' : '') + ' could not be created: ' + msg; $scope.error = message; $scope.loading = false; @@ -400,17 +403,8 @@ angular.module('copayApp.controllers').controller('SendController', }); }; - $scope.getAvailableAmount = function() { - if (!$rootScope.safeUnspentCount) return null; - - var estimatedFee = copay.Wallet.estimatedFee($rootScope.safeUnspentCount); - var amount = ((($rootScope.availableBalance * w.settings.unitToSatoshi).toFixed(0) - estimatedFee) / w.settings.unitToSatoshi); - - return amount > 0 ? amount : 0; - }; - - $scope.topAmount = function(form) { - $scope.amount = $scope.getAvailableAmount(); + $scope.setTopAmount = function() { + $scope.amount = $rootScope.topAmount; }; @@ -449,6 +443,7 @@ angular.module('copayApp.controllers').controller('SendController', $scope.loadTxs(); return; } + $scope.error = undefined; var p = w.txProposals.getTxProposal(ntxid); if (p.builder.isFullySigned()) { diff --git a/js/models/Identity.js b/js/models/Identity.js index e04797575..1c71beeba 100644 --- a/js/models/Identity.js +++ b/js/models/Identity.js @@ -275,45 +275,6 @@ Identity.prototype.close = function(cb) { }, cb); }; -/** - * @desc Imports a wallet from an encrypted string - * @param {string} cypherText - the encrypted object - * @param {string} passphrase - passphrase to decrypt it - * @param {string[]} opts.skipFields - fields to ignore when importing - * @param {string[]} opts.salt - - * @param {string[]} opts.iterations - - * @param {string[]} opts.importFunction - for stubbing - * @return {Wallet} - */ - -// This is not used in favor of Compatibility. importEncryptedWallet - -// Identity.prototype.importEncryptedWallet = function(cypherText, password, opts, cb) { -// var crypto = opts.cryptoUtil || cryptoUtil; -// var obj = crypto.decrypt(password, cypherText); -// console.log('[Identity.js.290:obj:]',obj); //TODO -// -// if (!obj) { -// // 0.7.3 broken KDF -// log.debug('Trying legacy encryption...'); -// console.log('[Identity.js.296:password:]',password); //TODO -// var passphrase = crypto.kdf(password, 'mjuBtGybi/4=', 100); -// console.log('[Identity.js.296:passphrase:]',passphrase); //TODO -// obj = crypto.decrypt(passphrase, ejson); -// console.log('[Identity.js.297:obj:]',obj); //TODO -// } -// console.log('[Identity.js.300:obj:]',obj); //TOD -// -// if (!obj) -// return cb(new Error('Could not decrypt')); -// try { -// obj = JSON.parse(obj); -// } catch (e) { -// return cb(new Error('Could not decrypt')); -// } -// return this.importWalletFromObj(obj, opts, cb) -// }; -// Identity.prototype.importWalletFromObj = function(obj, opts, cb) { var self = this; preconditions.checkArgument(cb); diff --git a/js/models/Wallet.js b/js/models/Wallet.js index 53f8a1b94..ae31d25b3 100644 --- a/js/models/Wallet.js +++ b/js/models/Wallet.js @@ -812,6 +812,7 @@ Wallet.prototype._lockIncomming = function() { Wallet.prototype._setBlockchainListeners = function() { var self = this; self.blockchain.removeAllListeners(); + self.subscribeToAddresses(); log.debug('Setting Blockchain listeners for', this.getName()); self.blockchain.on('reconnect', function(attempts) { @@ -2179,6 +2180,7 @@ Wallet.prototype.getAddressesStr = function(opts) { Wallet.prototype.subscribeToAddresses = function() { var addrInfo = this.publicKeyRing.getAddressesInfo(); +console.log('[Wallet.js.2181:addrInfo:]',addrInfo); //TODO this.blockchain.subscribe(_.pluck(addrInfo, 'addressStr')); log.debug('Subscribed to ' + addrInfo.length + ' addresses'); //TODO }; diff --git a/js/services/controllerUtils.js b/js/services/controllerUtils.js index d7ff433cf..24a4c57f8 100644 --- a/js/services/controllerUtils.js +++ b/js/services/controllerUtils.js @@ -268,12 +268,18 @@ angular.module('copayApp.services') r.totalBalance = balanceSat * satToUnit; r.totalBalanceBTC = (balanceSat / COIN); r.availableBalance = safeBalanceSat * satToUnit; - r.safeUnspentCount = safeUnspentCount; r.availableBalanceBTC = (safeBalanceSat / COIN); + r.safeUnspentCount = safeUnspentCount; r.lockedBalance = (balanceSat - safeBalanceSat) * satToUnit; r.lockedBalanceBTC = (balanceSat - safeBalanceSat) / COIN; + + if (r.safeUnspentCount){ + var estimatedFee = copay.Wallet.estimatedFee(r.safeUnspentCount); + r.topAmount = (((r.availableBalance * w.settings.unitToSatoshi).toFixed(0) - estimatedFee) / w.settings.unitToSatoshi); + } + var balanceByAddr = {}; for (var ii in balanceByAddrSat) { balanceByAddr[ii] = balanceByAddrSat[ii] * satToUnit; @@ -281,6 +287,8 @@ angular.module('copayApp.services') r.balanceByAddr = balanceByAddr; root.updateAddressList(); + + if (rateService.isAvailable()) { r.totalBalanceAlternative = rateService.toFiat(balanceSat, w.settings.alternativeIsoCode); r.alternativeIsoCode = w.settings.alternativeIsoCode; @@ -303,6 +311,7 @@ angular.module('copayApp.services') }; root.updateBalance = function(w, cb, refreshAll) { + w = w || $rootScope.wallet; if (!w) return root.onErrorDigest(); if (!w.isReady()) return; diff --git a/test/Wallet.js b/test/Wallet.js index e26977c20..cfff4fd76 100644 --- a/test/Wallet.js +++ b/test/Wallet.js @@ -1327,6 +1327,14 @@ describe('Wallet model', function() { w.network.start.getCall(0).args[0].privkey.length.should.equal(64); }); + it('should call subscribeToAddresses', function() { + var w = cachedCreateW2(); + + w.blockchain.on = sinon.stub(); + w.subscribeToAddresses = sinon.spy(); + w.netStart(); + w.subscribeToAddresses.calledOnce.should.equal(true); + }); }); describe('_getKeymap', function() { diff --git a/test/unit/controllers/controllersSpec.js b/test/unit/controllers/controllersSpec.js index baac81a13..d0f2ed612 100644 --- a/test/unit/controllers/controllersSpec.js +++ b/test/unit/controllers/controllersSpec.js @@ -439,24 +439,12 @@ describe("Unit: Controllers", function() { expect(scope.isMobile).not.to.equal(null); }); it('should autotop balance correctly', function() { - scope.topAmount(form); + scope.setTopAmount(form); form.amount.$setViewValue(123356); expect(scope.amount).to.equal(123356); expect(form.amount.$invalid).to.equal(false); expect(form.amount.$pristine).to.equal(false); }); - it('should return available amount', function() { - form.amount.$setViewValue(123356); - var amount = scope.getAvailableAmount(); - expect(amount).to.equal(123356); - }); - it('should return 0 if available amount below minimum fee', function() { - inject(function($compile, $rootScope, $controller) { - $rootScope.availableBalance = 1; - }); - var amount = scope.getAvailableAmount(); - expect(amount).to.equal(0); - }); }); describe('Import Controller', function() { diff --git a/test/unit/services/servicesSpec.js b/test/unit/services/servicesSpec.js index 58183054c..fc044e4b8 100644 --- a/test/unit/services/servicesSpec.js +++ b/test/unit/services/servicesSpec.js @@ -74,11 +74,16 @@ describe("Angular services", function() { expect(controllerUtils.updateBalance).not.to.equal(null); var Waddr = Object.keys($rootScope.wallet.balanceByAddr)[0]; var a = {}; - a[Waddr] = 100; - w.getBalance = sinon.stub().returns(100000001, 90000002, a); + a[Waddr] = 200; + w.getBalance = sinon.stub().yields(null, 100000001, a, 90000002, 5); + + var orig =controllerUtils.isFocusedWallet; + controllerUtils.isFocusedWallet = sinon.stub().returns(true); //retuns values in DEFAULT UNIT(bits) controllerUtils.updateBalance(null, function() { + + expect($rootScope.totalBalanceBTC).to.be.equal(1.00000001); expect($rootScope.availableBalanceBTC).to.be.equal(0.90000002); expect($rootScope.lockedBalanceBTC).to.be.equal(0.09999999); @@ -87,9 +92,12 @@ describe("Angular services", function() { expect($rootScope.availableBalance).to.be.equal(900000.02); expect($rootScope.lockedBalance).to.be.equal(99999.99); - expect($rootScope.addrInfos).not.to.equal(null); - expect($rootScope.addrInfos[0].address).to.equal(Waddr); + expect($rootScope.balanceByAddr[Waddr]).to.equal(2); + expect($rootScope.safeUnspentCount).to.equal(5); + expect($rootScope.topAmount).to.equal(899800.02); }); + + controllerUtils.isFocusedWallet = orig; })); it('should set the rootScope', inject(function(controllerUtils, $rootScope) { diff --git a/views/send.html b/views/send.html index 6a49ed54f..697108974 100644 --- a/views/send.html +++ b/views/send.html @@ -88,9 +88,9 @@ - Use all funds ({{availableBalance}} {{$root.wallet.settings.unitName}}) + ng-show="topAmount && (!$root.merchant || +$root.merchant.total === 0)" + ng-click="setTopAmount(sendForm)"> + Use all funds {{$root.wallet.settings.unitName}}