From 3fca4b90d387435ee10ca645861f647716311efe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gabriel=20Baz=C3=A1n?= Date: Fri, 7 Jul 2017 10:26:31 -0300 Subject: [PATCH] custom fee feature --- src/js/controllers/confirm.js | 31 ++++++++------- src/js/controllers/preferencesFee.js | 57 +++++++++++++++++++++++----- src/js/services/feeService.js | 6 ++- src/sass/views/tab-settings.scss | 7 ++++ www/views/modals/chooseFeeLevel.html | 27 ++++++++----- www/views/preferencesFee.html | 2 +- 6 files changed, 97 insertions(+), 33 deletions(-) diff --git a/src/js/controllers/confirm.js b/src/js/controllers/confirm.js index 2e408d123..3cc2af5aa 100644 --- a/src/js/controllers/confirm.js +++ b/src/js/controllers/confirm.js @@ -202,7 +202,9 @@ angular.module('copayApp.controllers').controller('confirmController', function( txp.inputs = tx.sendMaxInfo.inputs; txp.fee = tx.sendMaxInfo.fee; } else { - txp.feeLevel = tx.feeLevel; + if (tx.feeLevel == 'custom') { + txp.feePerKb = tx.feeRate; + } else txp.feeLevel = tx.feeLevel; } txp.message = tx.description; @@ -245,12 +247,12 @@ angular.module('copayApp.controllers').controller('confirmController', function( refresh(); // End of quick refresh, before wallet is selected. - if (!wallet)return cb(); + if (!wallet) return cb(); feeService.getFeeRate(tx.network, tx.feeLevel, function(err, feeRate) { if (err) return cb(err); - tx.feeRate = feeRate; + if (tx.feeLevel != 'custom') tx.feeRate = feeRate; tx.feeLevelName = feeService.feeOpts[tx.feeLevel]; if (!wallet) @@ -294,8 +296,7 @@ angular.module('copayApp.controllers').controller('confirmController', function( var per = (txp.fee / (txp.amount + txp.fee) * 100); txp.feeRatePerStr = per.toFixed(2) + '%'; - txp.feeToHigh = per > FEE_TOO_HIGH_LIMIT_PER; - + txp.feeToHigh = per > FEE_TOO_HIGH_LIMIT_PER; tx.txp[wallet.id] = txp; $log.debug('Confirm. TX Fully Updated for wallet:' + wallet.id, tx); @@ -558,9 +559,12 @@ angular.module('copayApp.controllers').controller('confirmController', function( scope.network = tx.network; scope.feeLevel = tx.feeLevel; scope.noSave = true; + if (tx.feeLevel == 'custom') scope.feePerSatByte = (tx.feeRate / 1000).toFixed(); $ionicModal.fromTemplateUrl('views/modals/chooseFeeLevel.html', { scope: scope, + backdropClickToClose: false, + hardwareBackButtonClose: false }).then(function(modal) { scope.chooseFeeLevelModal = modal; scope.openModal(); @@ -569,18 +573,19 @@ angular.module('copayApp.controllers').controller('confirmController', function( scope.chooseFeeLevelModal.show(); }; - scope.hideModal = function(customFeeLevel) { + scope.hideModal = function(newFeeLevel, customFeePerKBValue) { scope.chooseFeeLevelModal.hide(); - $log.debug('Custom fee level choosen:' + customFeeLevel + ' was:' + tx.feeLevel); - if (tx.feeLevel == customFeeLevel) - return; + $log.debug('New fee level choosen:' + newFeeLevel + ' was:' + tx.feeLevel); + + if (tx.feeLevel == newFeeLevel && !customFeePerKBValue) return; + + tx.feeLevel = newFeeLevel; + if (customFeePerKBValue) tx.feeRate = parseInt(customFeePerKBValue); - tx.feeLevel = customFeeLevel; updateTx(tx, wallet, { clearCache: true, - dryRun: true, - }, function() { - }); + dryRun: true + }, function() {}); }; }; diff --git a/src/js/controllers/preferencesFee.js b/src/js/controllers/preferencesFee.js index 3c3c6ce78..ffc942f1a 100644 --- a/src/js/controllers/preferencesFee.js +++ b/src/js/controllers/preferencesFee.js @@ -2,14 +2,14 @@ angular.module('copayApp.controllers').controller('preferencesFeeController', function($scope, $timeout, $ionicHistory, lodash, gettextCatalog, configService, feeService, ongoingProcess, popupService) { - var network; - $scope.save = function(newFee) { - $scope.currentFeeLevel = newFee; - updateCurrentValues(); - if ($scope.noSave) - return; + $scope.currentFeeLevel = newFee; + + if ($scope.currentFeeLevel != 'custom') updateCurrentValues(); + else showCustomFeePrompt(); + + if ($scope.noSave) return; var opts = { wallet: { @@ -32,7 +32,6 @@ angular.module('copayApp.controllers').controller('preferencesFeeController', fu }); $scope.init = function() { - $scope.network = $scope.network || 'livenet'; $scope.feeOpts = feeService.feeOpts; $scope.currentFeeLevel = $scope.feeLevel || feeService.getCurrentFeeLevel(); @@ -60,16 +59,56 @@ angular.module('copayApp.controllers').controller('preferencesFeeController', fu }); if (lodash.isEmpty(value)) { - $scope.feePerSatByte = null; + $scope.feePerSatByte = $scope.currentFeeLevel == 'custom' ? $scope.feePerSatByte : null; $scope.avgConfirmationTime = null; + setMinWarning(); + setMaxWarning(); return; } $scope.feePerSatByte = (value.feePerKB / 1000).toFixed(); $scope.avgConfirmationTime = value.nbBlocks * 10; + $scope.invalidCustomFeeEntered = false; + setMinWarning(); + setMaxWarning(); }; $scope.chooseNewFee = function() { - $scope.hideModal($scope.currentFeeLevel); + $scope.hideModal($scope.currentFeeLevel, $scope.customFeePerKB); }; + + var showCustomFeePrompt = function() { + $scope.invalidCustomFeeEntered = true; + $scope.showMaxWarning = false; + popupService.showPrompt(null, gettextCatalog.getString('Custom Fee'), null, function(text) { + if (!text || !parseInt(text)) return; + $scope.feePerSatByte = parseInt(text); + $scope.customFeePerKB = ($scope.feePerSatByte * 1000).toFixed(); + setMaxWarning(); + setMinWarning(); + }); + }; + + $scope.getMinimumRecommeded = function() { + var value = lodash.find($scope.feeLevels[$scope.network], { + level: 'superEconomy' + }); + return parseInt((value.feePerKB / 1000).toFixed()); + }; + + var setMinWarning = function() { + if (parseInt($scope.feePerSatByte) < $scope.getMinimumRecommeded()) $scope.showMinWarning = true; + else $scope.showMinWarning = false; + }; + + var setMaxWarning = function() { + if (parseInt($scope.feePerSatByte) > 1000) { + $scope.showMaxWarning = true; + $scope.invalidCustomFeeEntered = true; + } else { + $scope.showMaxWarning = false; + $scope.invalidCustomFeeEntered = false; + } + }; + }); diff --git a/src/js/services/feeService.js b/src/js/services/feeService.js index cdab6a7a5..3a289bfd8 100644 --- a/src/js/services/feeService.js +++ b/src/js/services/feeService.js @@ -11,7 +11,8 @@ angular.module('copayApp.services').factory('feeService', function($log, $timeou priority: gettext('Priority'), normal: gettext('Normal'), economy: gettext('Economy'), - superEconomy: gettext('Super Economy') + superEconomy: gettext('Super Economy'), + custom: gettext('Custom') }; var cache = { @@ -24,6 +25,9 @@ angular.module('copayApp.services').factory('feeService', function($log, $timeou root.getFeeRate = function(network, feeLevel, cb) { + + if (feeLevel == 'custom') return cb(); + network = network || 'livenet'; root.getFeeLevels(function(err, levels, fromCache) { diff --git a/src/sass/views/tab-settings.scss b/src/sass/views/tab-settings.scss index 2cf1d9efa..59865d00b 100644 --- a/src/sass/views/tab-settings.scss +++ b/src/sass/views/tab-settings.scss @@ -25,6 +25,12 @@ background-color: #fff; font-size:0.9em; color: $v-mid-gray; + .text { + padding-left: 30px; + } + .icon { + position: absolute; + } } &-explanation, &-button-group { padding: 0 1rem; @@ -162,6 +168,7 @@ #settings-fee { .estimates { + min-height: 6rem; font-size: 15px; color: $v-dark-gray; margin-bottom: .5rem; diff --git a/www/views/modals/chooseFeeLevel.html b/www/views/modals/chooseFeeLevel.html index 1d65c73f8..542cc223b 100644 --- a/www/views/modals/chooseFeeLevel.html +++ b/www/views/modals/chooseFeeLevel.html @@ -1,26 +1,27 @@ - +
{{'Bitcoin Network Fee Policy'|translate}}
-
- +
Average confirmation time: - {{avgConfirmationTime | amDurationFormat: 'minute'}} - ... + {{avgConfirmationTime | amDurationFormat: 'minute'}} + Could not be estimated + ...
Current fee rate for this policy: - {{feePerSatByte}} satoshis/byte - ... + {{feePerSatByte}} satoshis/byte + ...
-
[{{network}}] + [{{network}}]
@@ -28,5 +29,13 @@ {{level|translate}}
+
+ + Your fee is lower than the minimum recommended ({{getMinimumRecommeded()}} satoshis/byte). Your transaction may never get confirmed. +
+
+ + Your could not set a fee higher than 1000 satoshis/byte. +
diff --git a/www/views/preferencesFee.html b/www/views/preferencesFee.html index c55cd3f01..fdf29e4cd 100644 --- a/www/views/preferencesFee.html +++ b/www/views/preferencesFee.html @@ -24,7 +24,7 @@
- + {{level|translate}}