Set fees in preferences. First step for advanced send
This commit is contained in:
parent
075206cd8f
commit
e7a98d44f9
10 changed files with 82 additions and 64 deletions
|
|
@ -6,7 +6,7 @@
|
||||||
</section>
|
</section>
|
||||||
<section class="middle tab-bar-section">
|
<section class="middle tab-bar-section">
|
||||||
<h1 class="title ellipsis" ng-style="{'color':color}" translate>
|
<h1 class="title ellipsis" ng-style="{'color':color}" translate>
|
||||||
Bitcoin Network Fee Policy
|
Advanced Send
|
||||||
</h1>
|
</h1>
|
||||||
</section>
|
</section>
|
||||||
</nav>
|
</nav>
|
||||||
|
|
@ -14,12 +14,9 @@
|
||||||
|
|
||||||
<div class="modal-content fix-modals-touch">
|
<div class="modal-content fix-modals-touch">
|
||||||
<ul class="no-bullet m0 size-14">
|
<ul class="no-bullet m0 size-14">
|
||||||
<h4 class="title m0" translate>Fee level</h4>
|
<h4 class="title m0" translate>Fee Policy</h4>
|
||||||
<li ng-repeat="fee in (network == 'livenet' ? feeLevels.livenet : feeLevels.testnet)" ng-click="save(fee.level)" class="line-b p20">
|
<li ng-repeat="fee in (network == 'livenet' ? feeLevels.livenet : feeLevels.testnet)" ng-click="save(fee.level)" class="line-b p20">
|
||||||
<span ng-show="fee.level == 'priority'" translate>Priority</span>
|
<span class="text-capitalize">{{fee.level|translate}}</span>
|
||||||
<span ng-show="fee.level == 'normal'" translate>Normal</span>
|
|
||||||
<span ng-show="fee.level == 'economy'" translate>Economy</span>
|
|
||||||
<span class="size-12 text-light" translate>{{fee.feePerKBUnit}} per kB</span>
|
|
||||||
<i class="fi-check size-16 right" ng-show="currentFeeLevel == fee.level"></i>
|
<i class="fi-check size-16 right" ng-show="currentFeeLevel == fee.level"></i>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
@ -27,13 +24,8 @@
|
||||||
<div class="row column m20t">
|
<div class="row column m20t">
|
||||||
<div class="text-gray size-12 text-center" ng-repeat="fee in (network == 'livenet' ? feeLevels.livenet :
|
<div class="text-gray size-12 text-center" ng-repeat="fee in (network == 'livenet' ? feeLevels.livenet :
|
||||||
feeLevels.testnet)" ng-if="fee.level == currentFeeLevel">
|
feeLevels.testnet)" ng-if="fee.level == currentFeeLevel">
|
||||||
<span translate>Average confirmation time: {{fee.nbBlocks * 10}} minutes</span>
|
<span translate>Average confirmation time: {{fee.nbBlocks * 10}} minutes</span>.
|
||||||
</div>
|
<span class="size-12 text-light" translate>Current fee rate for this policy: {{fee.feePerKBUnit}}/kiB</span>
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="row column m20t">
|
|
||||||
<div class="text-gray size-12 text-center" translate>
|
|
||||||
Bitcoin transactions may include a fee collected by miners on the network. The higher the fee, the greater the incentive a miner has to include that transaction in a block.
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
@ -77,8 +77,13 @@
|
||||||
{{preferences.selectedAlternative.name}}
|
{{preferences.selectedAlternative.name}}
|
||||||
</span>
|
</span>
|
||||||
</li>
|
</li>
|
||||||
|
<li class="line-b p20" ng-click="$root.go('preferencesFee')">
|
||||||
|
<span translate>Bitcoin Network Fee Policy</span>
|
||||||
|
<span class="right text-gray">
|
||||||
|
<i class="icon-arrow-right3 size-24 right"></i>
|
||||||
|
<span class="text-capitalize">{{index.currentFeeLevel}}</span>
|
||||||
|
</span>
|
||||||
|
</li>
|
||||||
<li class="line-b p20" ng-click="$root.go('preferencesBwsUrl')">
|
<li class="line-b p20" ng-click="$root.go('preferencesBwsUrl')">
|
||||||
<span>Bitcore Wallet Service</span>
|
<span>Bitcore Wallet Service</span>
|
||||||
<span class="text-gray db">
|
<span class="text-gray db">
|
||||||
|
|
|
||||||
30
public/views/preferencesFee.html
Normal file
30
public/views/preferencesFee.html
Normal file
|
|
@ -0,0 +1,30 @@
|
||||||
|
<div
|
||||||
|
class="topbar-container"
|
||||||
|
ng-include="'views/includes/topbar.html'"
|
||||||
|
ng-init="titleSection='Bitcoin Network Fee Policy'; goBackToState = 'preferences'; noColor = true">
|
||||||
|
</div>
|
||||||
|
<div class="content preferences" ng-controller="preferencesFeeController as prefFee">
|
||||||
|
<ul class="no-bullet m0 size-14">
|
||||||
|
<li ng-repeat="fee in (index.network == 'livenet' ? index.feeLevels.livenet : index.feeLevels.testnet)"
|
||||||
|
ng-click="prefFee.save(fee.level)" class="line-b p20">
|
||||||
|
<span class="text-capitalize">{{fee.level}}</span>
|
||||||
|
<i class="fi-check size-16 right" ng-show="index.currentFeeLevel == fee.level"></i>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<div class="row column m20t">
|
||||||
|
<div class="text-gray size-12 text-center" ng-repeat="fee in (index.network == 'livenet' ? index.feeLevels.livenet :
|
||||||
|
index.feeLevels.testnet)" ng-if="fee.level == index.currentFeeLevel">
|
||||||
|
<span translate>Average confirmation time: {{fee.nbBlocks * 10}} minutes</span>.
|
||||||
|
<span class="size-12 text-light" translate>Current fee rate for this policy: {{fee.feePerKBUnit}}/kiB</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row column m20t">
|
||||||
|
<div class="text-gray size-12 text-center" translate>
|
||||||
|
Bitcoin transactions may include a fee collected by miners on the network. The higher the fee, the greater the incentive a miner has to include that transaction in a block. Actual fees are determined based on network load and the selected policy.
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="extra-margin-bottom"></div>
|
||||||
|
|
@ -398,16 +398,6 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="text-right size-12 m20b" ng-if="index.feeLevels.livenet && index.feeLevels.testnet">
|
|
||||||
<span ng-repeat="fee in (index.network == 'livenet' ? index.feeLevels.livenet : index.feeLevels.testnet)"
|
|
||||||
ng-show="index.currentFeeLevel == fee.level" class="pointer" ng-click="home.openFeeLevelsModal(index.feeLevels, index.currentFeeLevel)">
|
|
||||||
<span translate>Fee level: {{fee.level}}</span>
|
|
||||||
<span class="text-gray">({{fee.feePerKBUnit}}/KB)</span>
|
|
||||||
<i class="fi-pencil"></i>
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="large-12 columns">
|
<div class="large-12 columns">
|
||||||
<label for="comment"><span translate>Note</span>
|
<label for="comment"><span translate>Note</span>
|
||||||
|
|
|
||||||
|
|
@ -877,6 +877,7 @@ input.ng-invalid-match, input.ng-invalid-match:focus {
|
||||||
.text-alert {color: red;}
|
.text-alert {color: red;}
|
||||||
.text-success {color: #1ABC9C;}
|
.text-success {color: #1ABC9C;}
|
||||||
.text-spacing {letter-spacing:2px;}
|
.text-spacing {letter-spacing:2px;}
|
||||||
|
.text-capitalize {text-transform: capitalize;}
|
||||||
|
|
||||||
.panel {
|
.panel {
|
||||||
background: #FFFFFF;
|
background: #FFFFFF;
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,6 @@ angular.module('copayApp.controllers').controller('preferencesController',
|
||||||
function($scope, $rootScope, $filter, $timeout, $modal, $log, lodash, configService, profileService) {
|
function($scope, $rootScope, $filter, $timeout, $modal, $log, lodash, configService, profileService) {
|
||||||
var config = configService.getSync();
|
var config = configService.getSync();
|
||||||
this.unitName = config.wallet.settings.unitName;
|
this.unitName = config.wallet.settings.unitName;
|
||||||
this.feeName = config.wallet.settings.feeName || 'Priority';
|
|
||||||
this.bwsurl = config.bws.url;
|
this.bwsurl = config.bws.url;
|
||||||
this.selectedAlternative = {
|
this.selectedAlternative = {
|
||||||
name: config.wallet.settings.alternativeName,
|
name: config.wallet.settings.alternativeName,
|
||||||
|
|
|
||||||
21
src/js/controllers/preferencesFee.js
Normal file
21
src/js/controllers/preferencesFee.js
Normal file
|
|
@ -0,0 +1,21 @@
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
angular.module('copayApp.controllers').controller('preferencesFeeController',
|
||||||
|
function($rootScope, configService) {
|
||||||
|
|
||||||
|
this.save = function(newFee) {
|
||||||
|
var opts = {
|
||||||
|
wallet: {
|
||||||
|
settings: {
|
||||||
|
feeLevel: newFee
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
$rootScope.$emit('Local/FeeLevelUpdated', newFee);
|
||||||
|
|
||||||
|
configService.set(opts, function(err) {
|
||||||
|
if (err) $log.debug(err);
|
||||||
|
});
|
||||||
|
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
@ -973,7 +973,8 @@ angular.module('copayApp.controllers').controller('walletHomeController', functi
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
this.openFeeLevelsModal = function(feeLevels, currentFeeLevel) {
|
// Advanced SEND: set temporary fee policy for each transaction
|
||||||
|
this.openAdvancedSendModal = function(feeLevels, currentFeeLevel) {
|
||||||
var fc = profileService.focusedClient;
|
var fc = profileService.focusedClient;
|
||||||
|
|
||||||
var ModalInstanceCtrl = function($scope, $modalInstance) {
|
var ModalInstanceCtrl = function($scope, $modalInstance) {
|
||||||
|
|
@ -981,21 +982,8 @@ angular.module('copayApp.controllers').controller('walletHomeController', functi
|
||||||
$scope.currentFeeLevel = currentFeeLevel
|
$scope.currentFeeLevel = currentFeeLevel
|
||||||
$scope.network = fc.credentials.network;
|
$scope.network = fc.credentials.network;
|
||||||
$scope.color = fc.backgroundColor;
|
$scope.color = fc.backgroundColor;
|
||||||
|
|
||||||
$scope.save = function(level) {
|
$scope.save = function(level) {
|
||||||
var opts = {
|
|
||||||
wallet: {
|
|
||||||
settings: {
|
|
||||||
feeLevel: level
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
$scope.currentFeeLevel = level;
|
$scope.currentFeeLevel = level;
|
||||||
$rootScope.$emit('Local/FeeLevelUpdated', level);
|
|
||||||
|
|
||||||
configService.set(opts, function(err) {
|
|
||||||
if (err) $log.debug(err);
|
|
||||||
});
|
|
||||||
};
|
};
|
||||||
|
|
||||||
$scope.cancel = function() {
|
$scope.cancel = function() {
|
||||||
|
|
@ -1003,7 +991,7 @@ angular.module('copayApp.controllers').controller('walletHomeController', functi
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
var modalInstance = $modal.open({
|
var modalInstance = $modal.open({
|
||||||
templateUrl: 'views/modals/fee.html',
|
templateUrl: 'views/modals/advancedSend.html',
|
||||||
windowClass: 'full animated slideInUp',
|
windowClass: 'full animated slideInUp',
|
||||||
controller: ModalInstanceCtrl
|
controller: ModalInstanceCtrl
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -252,6 +252,17 @@ angular
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
.state('preferencesFee', {
|
||||||
|
url: '/preferencesFee',
|
||||||
|
templateUrl: 'views/preferencesFee.html',
|
||||||
|
walletShouldBeComplete: true,
|
||||||
|
needProfile: true,
|
||||||
|
views: {
|
||||||
|
'main': {
|
||||||
|
templateUrl: 'views/preferencesFee.html'
|
||||||
|
},
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
.state('preferencesAdvanced', {
|
.state('preferencesAdvanced', {
|
||||||
url: '/preferencesAdvanced',
|
url: '/preferencesAdvanced',
|
||||||
|
|
@ -458,6 +469,7 @@ angular
|
||||||
delete: 13,
|
delete: 13,
|
||||||
preferencesLanguage: 12,
|
preferencesLanguage: 12,
|
||||||
preferencesUnit: 12,
|
preferencesUnit: 12,
|
||||||
|
preferencesFee: 12,
|
||||||
preferencesAltCurrency: 12,
|
preferencesAltCurrency: 12,
|
||||||
preferencesBwsUrl: 12,
|
preferencesBwsUrl: 12,
|
||||||
preferencesAlias: 12,
|
preferencesAlias: 12,
|
||||||
|
|
|
||||||
|
|
@ -1,17 +1,17 @@
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
angular.module('copayApp.services').factory('feeService', function($log, lodash, profileService, configService, gettext) {
|
angular.module('copayApp.services').factory('feeService', function($log, profileService, configService) {
|
||||||
var root = {};
|
var root = {};
|
||||||
|
|
||||||
root.getCurrentFeeValue = function(cb) {
|
root.getCurrentFeeValue = function(cb) {
|
||||||
var fc = profileService.focusedClient;
|
var fc = profileService.focusedClient;
|
||||||
var config = configService.getSync().wallet.settings;
|
var config = configService.getSync().wallet.settings;
|
||||||
var feeLevel = config.feeLevel || 'priority';
|
var feeLevel = config.feeLevel || 'normal';
|
||||||
// static fee
|
// static fee
|
||||||
var fee = 10000;
|
var fee = 10000;
|
||||||
fc.getFeeLevels(fc.credentials.network, function(err, levels) {
|
fc.getFeeLevels(fc.credentials.network, function(err, levels) {
|
||||||
if (err) {
|
if (err) {
|
||||||
return cb({message: 'Could not get dynamic fee'}, fee);
|
return cb({message: 'Could not get dynamic fee. Using static 10000sat'}, fee);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
for (var i = 0; i < 3; i++) {
|
for (var i = 0; i < 3; i++) {
|
||||||
|
|
@ -25,30 +25,10 @@ angular.module('copayApp.services').factory('feeService', function($log, lodash,
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
var checkCompatibility = function(config) {
|
|
||||||
if (config.feeName && !config.feeLevel) {
|
|
||||||
// Migrate to new dynamic fee values
|
|
||||||
var level = config.feeName.toLowerCase();
|
|
||||||
if (level == 'emergency') level = 'priority';
|
|
||||||
|
|
||||||
var opts = {
|
|
||||||
wallet: {
|
|
||||||
settings: {
|
|
||||||
feeLevel: level
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
configService.set(opts, function(err) {
|
|
||||||
if (err) $log.debug(err);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
root.getFeeLevels = function(cb) {
|
root.getFeeLevels = function(cb) {
|
||||||
var fc = profileService.focusedClient;
|
var fc = profileService.focusedClient;
|
||||||
var config = configService.getSync().wallet.settings;
|
var config = configService.getSync().wallet.settings;
|
||||||
var unitName = config.unitName;
|
var unitName = config.unitName;
|
||||||
checkCompatibility(config);
|
|
||||||
|
|
||||||
fc.getFeeLevels('livenet', function(errLivenet, levelsLivenet) {
|
fc.getFeeLevels('livenet', function(errLivenet, levelsLivenet) {
|
||||||
fc.getFeeLevels('testnet', function(errTestnet, levelsTestnet) {
|
fc.getFeeLevels('testnet', function(errTestnet, levelsTestnet) {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue