mirror of https://github.com/BTCPrivate/copay.git
Merge pull request #1791 from matiu/bug/use-all-funds
Fix #1789 - use all funds button
This commit is contained in:
commit
4726570b7a
|
@ -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()) {
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
};
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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() {
|
||||
|
|
|
@ -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() {
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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">
|
||||
|
|
Loading…
Reference in New Issue