Merge pull request #1791 from matiu/bug/use-all-funds

Fix #1789 - use all funds button
This commit is contained in:
Esteban Ordano 2014-11-12 22:17:50 -03:00
commit 4726570b7a
8 changed files with 43 additions and 72 deletions

View File

@ -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()) {

View File

@ -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);

View File

@ -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
};

View File

@ -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;

View File

@ -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() {

View File

@ -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() {

View File

@ -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) {

View File

@ -88,9 +88,9 @@
<small class="icon-input" ng-show="sendForm.amount.$invalid &&
!sendForm.amount.$pristine && !notValidAmount"><i class="fi-x"></i></small>
<a class="small input-note" title="{{'Send all funds'|translate}}"
ng-show="availableBalance && (!$root.merchant || +$root.merchant.total === 0)"
ng-click="topAmount(sendForm)">
<span translate>Use all funds</span> ({{availableBalance}} {{$root.wallet.settings.unitName}})
ng-show="topAmount && (!$root.merchant || +$root.merchant.total === 0)"
ng-click="setTopAmount(sendForm)">
<span translate>Use all funds</span> {{$root.wallet.settings.unitName}}
</a>
</div>
<div class="small-3 columns">