wallet to wallet case worked out. Also fixed routes and some css

This commit is contained in:
Sebastiaan Pasma 2018-07-24 14:24:22 +02:00
commit fd4adbfb57
No known key found for this signature in database
GPG key ID: 9A2B0C8B95A1D26F
6 changed files with 138 additions and 117 deletions

View file

@ -31,7 +31,6 @@ angular.module('copayApp.controllers').controller('amountController', function($
}); });
$scope.$on("$ionicView.beforeEnter", function(event, data) { $scope.$on("$ionicView.beforeEnter", function(event, data) {
initCurrencies(); initCurrencies();
if (data.stateParams.shapeshiftOrderId && data.stateParams.shapeshiftOrderId.length > 0) { if (data.stateParams.shapeshiftOrderId && data.stateParams.shapeshiftOrderId.length > 0) {
@ -42,6 +41,7 @@ angular.module('copayApp.controllers').controller('amountController', function($
// To get the wallet from with the new flow // To get the wallet from with the new flow
$scope.fromWalletId = data.stateParams.fromWalletId; $scope.fromWalletId = data.stateParams.fromWalletId;
$scope.toWalletId = data.stateParams.toWalletId;
if (data.stateParams.noPrefix) { if (data.stateParams.noPrefix) {
$scope.showWarningMessage = data.stateParams.noPrefix != 0; $scope.showWarningMessage = data.stateParams.noPrefix != 0;
@ -156,10 +156,10 @@ angular.module('copayApp.controllers').controller('amountController', function($
$scope.toEmail = data.stateParams.toEmail; $scope.toEmail = data.stateParams.toEmail;
$scope.toColor = data.stateParams.toColor; $scope.toColor = data.stateParams.toColor;
if (!$scope.nextStep && !data.stateParams.toAddress) { // if (!$scope.nextStep && !data.stateParams.toAddress) {
$log.error('Bad params at amount') // $log.error('Bad params at amount')
throw ('bad params'); // throw ('bad params');
} // }
var reNr = /^[1234567890\.]$/; var reNr = /^[1234567890\.]$/;
var reOp = /^[\*\+\-\/]$/; var reOp = /^[\*\+\-\/]$/;
@ -198,8 +198,8 @@ angular.module('copayApp.controllers').controller('amountController', function($
$scope.resetAmount(); $scope.resetAmount();
// in SAT ALWAYS // in SAT ALWAYS
if ($stateParams.toAmount) { if ($stateParams.amount) {
$scope.amountModel.amount = (($stateParams.toAmount) * satToUnit).toFixed(unitDecimals); $scope.amountModel.amount = (($stateParams.amount) * satToUnit).toFixed(unitDecimals);
} }
$scope.processAmount(); $scope.processAmount();
@ -461,7 +461,8 @@ angular.module('copayApp.controllers').controller('amountController', function($
currency: unit.id.toUpperCase(), currency: unit.id.toUpperCase(),
coin: coin, coin: coin,
useSendMax: $scope.useSendMax, useSendMax: $scope.useSendMax,
fromWalletId: $scope.fromWalletId fromWalletId: $scope.fromWalletId,
toWalletId: $scope.toWalletId
}); });
} else { } else {
var amount = _amount; var amount = _amount;
@ -474,7 +475,7 @@ angular.module('copayApp.controllers').controller('amountController', function($
var confirmData = { var confirmData = {
recipientType: $scope.recipientType, recipientType: $scope.recipientType,
toAmount: amount, amount: amount,
toAddress: $scope.toAddress, toAddress: $scope.toAddress,
displayAddress: $scope.displayAddress || $scope.toAddress, displayAddress: $scope.displayAddress || $scope.toAddress,
toName: $scope.toName, toName: $scope.toName,
@ -482,14 +483,14 @@ angular.module('copayApp.controllers').controller('amountController', function($
toColor: $scope.toColor, toColor: $scope.toColor,
coin: coin, coin: coin,
useSendMax: $scope.useSendMax, useSendMax: $scope.useSendMax,
fromWalletId: $scope.fromWalletId fromWalletId: $scope.fromWalletId,
toWalletId: $scope.toWalletId
}; };
if ($scope.shapeshiftOrderId) { if ($scope.shapeshiftOrderId) {
var shapeshiftOrderUrl = 'https://www.shapeshift.io/#/status/'; var shapeshiftOrderUrl = 'https://www.shapeshift.io/#/status/';
shapeshiftOrderUrl += $scope.shapeshiftOrderId; shapeshiftOrderUrl += $scope.shapeshiftOrderId;
confirmData.description = shapeshiftOrderUrl; confirmData.description = shapeshiftOrderUrl;
confirmData.fromWalletId = $scope.fromWalletId;
if (confirmData.useSendMax) { if (confirmData.useSendMax) {
var wallet = lodash.find(profileService.getWallets({ coin: coin }), var wallet = lodash.find(profileService.getWallets({ coin: coin }),
@ -500,10 +501,10 @@ angular.module('copayApp.controllers').controller('amountController', function($
var balance = parseFloat(wallet.cachedBalance.substring(0, wallet.cachedBalance.length-4)); var balance = parseFloat(wallet.cachedBalance.substring(0, wallet.cachedBalance.length-4));
if (balance < $scope.minShapeshiftAmount * 1.04) { if (balance < $scope.minShapeshiftAmount * 1.04) {
confirmData.useSendMax = false; confirmData.useSendMax = false;
confirmData.toAmount = $scope.minShapeshiftAmount * unitToSatoshi; confirmData.amount = $scope.minShapeshiftAmount * unitToSatoshi;
} else if (balance > $scope.maxShapeshiftAmount) { } else if (balance > $scope.maxShapeshiftAmount) {
confirmData.useSendMax = false; confirmData.useSendMax = false;
confirmData.toAmount = $scope.maxShapeshiftAmount * unitToSatoshi * 0.99; confirmData.amount = $scope.maxShapeshiftAmount * unitToSatoshi * 0.99;
} }
} }
} }

View file

@ -1,6 +1,6 @@
'use strict'; 'use strict';
angular.module('copayApp.controllers').controller('confirmController', function($rootScope, $scope, $interval, $filter, $timeout, $ionicScrollDelegate, gettextCatalog, walletService, platformInfo, lodash, configService, $stateParams, $window, $state, $log, profileService, bitcore, bitcoreCash, txFormatService, ongoingProcess, $ionicModal, popupService, $ionicHistory, $ionicConfig, payproService, feeService, bwcError, txConfirmNotification, externalLinkService, firebaseEventsService, soundService) { angular.module('copayApp.controllers').controller('confirmController', function($rootScope, $scope, $interval, $filter, $timeout, $ionicScrollDelegate, $ionicLoading, gettextCatalog, walletService, platformInfo, lodash, configService, $stateParams, $window, $state, $log, profileService, bitcore, bitcoreCash, txFormatService, ongoingProcess, $ionicModal, popupService, $ionicHistory, $ionicConfig, payproService, feeService, bwcError, txConfirmNotification, externalLinkService, firebaseEventsService, soundService) {
var countDown = null; var countDown = null;
var FEE_TOO_HIGH_LIMIT_PER = 15; var FEE_TOO_HIGH_LIMIT_PER = 15;
@ -68,82 +68,95 @@ angular.module('copayApp.controllers').controller('confirmController', function(
}); });
}; };
var setWalletSelector = function(coin, network, minAmount, cb) {
// no min amount? (sendMax) => look for no empty wallets
minAmount = minAmount || 1;
$scope.wallets = profileService.getWallets({
onlyComplete: true,
network: network,
coin: coin
});
if (tx.fromWalletId) {
$scope.wallets = lodash.filter($scope.wallets, function (w) {
return w.id == tx.fromWalletId;
});
}
if (!$scope.wallets || !$scope.wallets.length) {
setNoWallet(gettextCatalog.getString('No wallets available'), true);
return cb();
}
var filteredWallets = [];
var index = 0;
var walletsUpdated = 0;
lodash.each($scope.wallets, function (w) {
walletService.getStatus(w, {}, function (err, status) {
if (err || !status) {
$log.error(err);
} else {
walletsUpdated++;
w.status = status;
if (!status.availableBalanceSat)
$log.debug('No balance available in: ' + w.name);
if (status.availableBalanceSat > minAmount) {
filteredWallets.push(w);
}
}
if (++index == $scope.wallets.length) {
if (!walletsUpdated)
return cb('Could not update any wallet');
if (lodash.isEmpty(filteredWallets)) {
setNoWallet(gettextCatalog.getString('Insufficient confirmed funds'), true);
}
$scope.wallets = lodash.clone(filteredWallets);
return cb();
}
});
});
};
$scope.$on("$ionicView.beforeEnter", function(event, data) { $scope.$on("$ionicView.beforeEnter", function(event, data) {
function setWalletSelector(coin, network, minAmount, cb) {
// no min amount? (sendMax) => look for no empty wallets
minAmount = minAmount || 1;
$scope.wallets = profileService.getWallets({
onlyComplete: true,
network: network,
coin: coin
});
if (tx.fromWalletId) {
$scope.wallets = lodash.filter($scope.wallets, function(w) {
return w.id == tx.fromWalletId;
});
}
if (!$scope.wallets || !$scope.wallets.length) {
setNoWallet(gettextCatalog.getString('No wallets available'), true);
return cb();
}
var filteredWallets = [];
var index = 0;
var walletsUpdated = 0;
lodash.each($scope.wallets, function(w) {
walletService.getStatus(w, {}, function(err, status) {
if (err || !status) {
$log.error(err);
} else {
walletsUpdated++;
w.status = status;
if (!status.availableBalanceSat)
$log.debug('No balance available in: ' + w.name);
if (status.availableBalanceSat > minAmount) {
filteredWallets.push(w);
}
}
if (++index == $scope.wallets.length) {
if (!walletsUpdated)
return cb('Could not update any wallet');
if (lodash.isEmpty(filteredWallets)) {
setNoWallet(gettextCatalog.getString('Insufficient confirmed funds'), true);
}
$scope.wallets = lodash.clone(filteredWallets);
return cb();
}
});
});
};
// Setup $scope // Setup $scope
var B = data.stateParams.coin == 'bch' ? bitcoreCash : bitcore; var B = data.stateParams.coin == 'bch' ? bitcoreCash : bitcore;
var networkName; var networkName;
$scope.fromWallet = profileService.getWallet(data.stateParams.fromWalletId);
$scope.recipientType = null;
try { try {
networkName = (new B.Address(data.stateParams.toAddress)).network.name; if (data.stateParams.toWalletId) {
} catch(e) { $scope.recipientType = 'wallet'; // set type to wallet-to-wallet
$ionicLoading.show();
var wallet = profileService.getWallet(data.stateParams.toWalletId);
walletService.getAddress(wallet, true, function (err, addr) {
$ionicLoading.hide();
data.stateParams.toAddress = addr;
networkName = (new B.Address(data.stateParams.toAddress)).network.name;
vanityTx(networkName, data);
});
} else if (data.stateParams.toAddress) {
networkName = (new B.Address(data.stateParams.toAddress)).network.name;
vanityTx(networkName, data);
}
} catch (e) {
var message = gettextCatalog.getString('Invalid address'); var message = gettextCatalog.getString('Invalid address');
var backText = gettextCatalog.getString('Go back'); var backText = gettextCatalog.getString('Go back');
var learnText = gettextCatalog.getString('Learn more'); var learnText = gettextCatalog.getString('Learn more');
popupService.showConfirm(null, message, backText, learnText, function(back) { popupService.showConfirm(null, message, backText, learnText, function (back) {
$ionicHistory.nextViewOptions({ $ionicHistory.nextViewOptions({
disableAnimate: true, disableAnimate: true,
historyRoot: true historyRoot: true
}); });
$state.go('tabs.send').then(function() { $state.go('tabs.send').then(function () {
$ionicHistory.clearHistory(); $ionicHistory.clearHistory();
if (!back) { if (!back) {
var url = 'https://support.bitpay.com/hc/en-us/articles/115004671663'; var url = 'https://support.bitpay.com/hc/en-us/articles/115004671663';
@ -153,27 +166,24 @@ angular.module('copayApp.controllers').controller('confirmController', function(
}); });
return; return;
} }
});
var vanityTx = function(networkName, data) {
// Grab stateParams // Grab stateParams
tx = { tx = {
toAmount: parseInt(data.stateParams.toAmount), amount: parseInt(data.stateParams.amount),
sendMax: data.stateParams.useSendMax == 'true' ? true : false, sendMax: data.stateParams.useSendMax == 'true' ? true : false,
fromWalletId: data.stateParams.fromWalletId, fromWalletId: data.stateParams.fromWalletId,
toAddress: data.stateParams.toAddress, toAddress: data.stateParams.toAddress,
displayAddress: data.stateParams.displayAddress,
description: data.stateParams.description,
paypro: data.stateParams.paypro,
feeLevel: configFeeLevel, feeLevel: configFeeLevel,
spendUnconfirmed: walletConfig.spendUnconfirmed, spendUnconfirmed: walletConfig.spendUnconfirmed,
// Vanity tx info (not in the real tx) // Vanity tx info (not in the real tx)
recipientType: data.stateParams.recipientType || null, recipientType: $scope.recipientType || null,
toName: data.stateParams.toName, toName: data.stateParams.toName,
toEmail: data.stateParams.toEmail, toEmail: data.stateParams.toEmail,
toColor: data.stateParams.toColor, toColor: data.stateParams.toColor,
network: networkName, network: networkName,
coin: data.stateParams.coin, coin: $scope.fromWallet.coin,
txp: {}, txp: {},
}; };
@ -188,12 +198,10 @@ angular.module('copayApp.controllers').controller('confirmController', function(
// Other Scope vars // Other Scope vars
$scope.isCordova = isCordova; $scope.isCordova = isCordova;
$scope.isWindowsPhoneApp = isWindowsPhoneApp;
$scope.showAddress = false; $scope.showAddress = false;
$scope.walletSelectorTitle = gettextCatalog.getString('Send from'); $scope.walletSelectorTitle = gettextCatalog.getString('Send from');
setWalletSelector(tx.coin, tx.network, tx.toAmount, function(err) { setWalletSelector(tx.coin, tx.network, tx.amount, function(err) {
if (err) { if (err) {
return exitWithError('Could not update wallets'); return exitWithError('Could not update wallets');
} }
@ -207,7 +215,7 @@ angular.module('copayApp.controllers').controller('confirmController', function(
$scope.displayBalanceAsFiat = walletConfig.settings.priceDisplay === 'fiat'; $scope.displayBalanceAsFiat = walletConfig.settings.priceDisplay === 'fiat';
}); };
function getSendMaxInfo(tx, wallet, cb) { function getSendMaxInfo(tx, wallet, cb) {
@ -231,7 +239,7 @@ angular.module('copayApp.controllers').controller('confirmController', function(
return setSendError(msg); return setSendError(msg);
} }
if (tx.toAmount > Number.MAX_SAFE_INTEGER) { if (tx.amount > Number.MAX_SAFE_INTEGER) {
var msg = gettextCatalog.getString('Amount too big'); var msg = gettextCatalog.getString('Amount too big');
$log.warn(msg); $log.warn(msg);
return setSendError(msg); return setSendError(msg);
@ -241,7 +249,7 @@ angular.module('copayApp.controllers').controller('confirmController', function(
txp.outputs = [{ txp.outputs = [{
'toAddress': tx.toAddress, 'toAddress': tx.toAddress,
'amount': tx.toAmount, 'amount': tx.amount,
'message': tx.description 'message': tx.description
}]; }];
@ -280,13 +288,13 @@ angular.module('copayApp.controllers').controller('confirmController', function(
$scope.tx = tx; $scope.tx = tx;
function updateAmount() { function updateAmount() {
if (!tx.toAmount) return; if (!tx.amount) return;
// Amount // Amount
tx.amountStr = txFormatService.formatAmountStr(wallet.coin, tx.toAmount); tx.amountStr = txFormatService.formatAmountStr(wallet.coin, tx.amount);
tx.amountValueStr = tx.amountStr.split(' ')[0]; tx.amountValueStr = tx.amountStr.split(' ')[0];
tx.amountUnitStr = tx.amountStr.split(' ')[1]; tx.amountUnitStr = tx.amountStr.split(' ')[1];
txFormatService.formatAlternativeStr(wallet.coin, tx.toAmount, function(v) { txFormatService.formatAlternativeStr(wallet.coin, tx.amount, function(v) {
var parts = v.split(' '); var parts = v.split(' ');
tx.alternativeAmountStr = v; tx.alternativeAmountStr = v;
tx.alternativeAmountValueStr = parts[0]; tx.alternativeAmountValueStr = parts[0];
@ -342,7 +350,7 @@ angular.module('copayApp.controllers').controller('confirmController', function(
} }
tx.sendMaxInfo = sendMaxInfo; tx.sendMaxInfo = sendMaxInfo;
tx.toAmount = tx.sendMaxInfo.amount; tx.amount = tx.sendMaxInfo.amount;
updateAmount(); updateAmount();
ongoingProcess.set('calculatingFee', false); ongoingProcess.set('calculatingFee', false);
$timeout(function() { $timeout(function() {
@ -393,7 +401,7 @@ angular.module('copayApp.controllers').controller('confirmController', function(
function useSelectedWallet() { function useSelectedWallet() {
if (!$scope.useSendMax) { if (!$scope.useSendMax) {
showAmount(tx.toAmount); showAmount(tx.amount);
} }
$scope.onWalletSelect($scope.wallet); $scope.onWalletSelect($scope.wallet);

View file

@ -6,34 +6,34 @@ angular.module('copayApp.controllers').controller('sendFlowController', function
var satToUnit; var satToUnit;
var unitDecimals; var unitDecimals;
var satToBtc; var satToBtc;
var nextStep = '';
$scope.$on("$ionicView.beforeEnter", function(event, data) { $scope.$on("$ionicView.beforeEnter", function(event, data) {
var config = configService.getSync().wallet.settings; var config = configService.getSync().wallet.settings;
$scope.params = $stateParams;
$scope.specificAmount = $scope.specificAlternativeAmount = ''; $scope.specificAmount = $scope.specificAlternativeAmount = '';
unitToSatoshi = config.unitToSatoshi; unitToSatoshi = config.unitToSatoshi;
satToUnit = 1 / unitToSatoshi; satToUnit = 1 / unitToSatoshi;
satToBtc = 1 / 100000000; satToBtc = 1 / 100000000;
unitDecimals = config.unitDecimals; unitDecimals = config.unitDecimals;
// in SAT ALWAYS if ($scope.params.amount) {
if ($stateParams.toAmount) { console.log("is Payment Request", $scope.params.amount);
$scope.requestAmount = (($stateParams.toAmount) * satToUnit).toFixed(unitDecimals);
$scope.requestAmount = (($stateParams.amount) * satToUnit).toFixed(unitDecimals);
$scope.isPaymentRequest = true; $scope.isPaymentRequest = true;
} }
console.log(data, $stateParams);
$scope.params = $stateParams;
}); });
$scope.$on("$ionicView.enter", function(event, data) { $scope.$on("$ionicView.enter", function(event, data) {
console.log(data, $stateParams); console.log(data, $stateParams);
$scope.type = data.stateParams.fromWalletId ? 'destination' : 'origin'; // origin || destination $scope.type = data.stateParams && data.stateParams['fromWalletId'] ? 'destination' : 'origin'; // origin || destination
$scope.coin = false; // Wallets to show (for destination screen) $scope.coin = false; // Wallets to show (for destination screen)
$scope.walletsEmpty = []; $scope.walletsEmpty = [];
// Show price-header // Show price-header
console.log("current type: "+$scope.type);
if ($scope.type === 'origin') { if ($scope.type === 'origin') {
$scope.headerTitle = gettextCatalog.getString('Choose a wallet to send from'); $scope.headerTitle = gettextCatalog.getString('Choose a wallet to send from');
$scope.walletsEmpty = profileService.getWallets({coin: $scope.coin, hasNoFunds: true}); $scope.walletsEmpty = profileService.getWallets({coin: $scope.coin, hasNoFunds: true});
@ -57,13 +57,22 @@ angular.module('copayApp.controllers').controller('sendFlowController', function
}); });
}); });
function getNextStep() {
if (!$scope.params.toWalletId && !$scope.params.toAddress) {
return 'tabs.send.destination';
} else if (!$scope.params.amount) {
return 'tabs.send.amount';
} else {
return 'tabs.send.confirm';
}
}
$scope.useWallet = function(wallet) { $scope.useWallet = function(wallet) {
if ($scope.type === 'origin') { if ($scope.type === 'origin') {
$scope.params['fromWalletId'] = wallet.id; $scope.params['fromWalletId'] = wallet.id;
$state.transitionTo('tabs.send.destination', $scope.params);
} else { } else {
$scope.params['toWalletId'] = wallet.id; $scope.params['toWalletId'] = wallet.id;
$state.transitionTo('tabs.send.amount', $scope.params);
} }
$state.transitionTo(getNextStep(), $scope.params);
}; };
}); });

View file

@ -270,24 +270,6 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr
} }
} }
}) })
.state('tabs.send.origin', {
url: '/origin/:thirdParty/:amount/:toAddress/:toWalletId',
views: {
'tab-send@tabs': {
controller: 'sendFlowController',
templateUrl: 'views/wallet-origin-destination.html',
}
}
})
.state('tabs.send.destination', {
url: '/destination/:fromWalletId/:thirdParty/:amount',
views: {
'tab-send@tabs': {
controller: 'sendFlowController',
templateUrl: 'views/wallet-origin-destination.html',
}
}
})
.state('tabs.settings', { .state('tabs.settings', {
url: '/settings', url: '/settings',
views: { views: {
@ -305,7 +287,7 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr
*/ */
.state('tabs.send.amount', { .state('tabs.send.amount', {
url: '/amount/:recipientType/:toAddress/:toName/:toEmail/:toColor/:coin/:fixedUnit/:fromWalletId/:minShapeshiftAmount/:maxShapeshiftAmount/:shapeshiftOrderId/:displayAddress/:noPrefix', url: '/amount/:recipientType/:toAddress/:toName/:toEmail/:toColor/:coin/:fixedUnit/:fromWalletId/:toWalletId/:minShapeshiftAmount/:maxShapeshiftAmount/:shapeshiftOrderId/:displayAddress/:noPrefix',
views: { views: {
'tab-send@tabs': { 'tab-send@tabs': {
controller: 'amountController', controller: 'amountController',
@ -318,12 +300,30 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr
views: { views: {
'tab-send@tabs': { 'tab-send@tabs': {
controller: 'sendFlowController', controller: 'sendFlowController',
templateUrl: 'views/wallet-to-wallet-transfer.html' templateUrl: 'views/wallet-origin-destination.html'
}
}
})
.state('tabs.send.origin', {
url: '/origin/:thirdParty/:amount/:toAddress/:toWalletId',
views: {
'tab-send@tabs': {
controller: 'sendFlowController',
templateUrl: 'views/wallet-origin-destination.html',
}
}
})
.state('tabs.send.destination', {
url: '/destination/:thirdParty/:amount/:fromWalletId',
views: {
'tab-send@tabs': {
controller: 'sendFlowController',
templateUrl: 'views/wallet-origin-destination.html',
} }
} }
}) })
.state('tabs.send.confirm', { .state('tabs.send.confirm', {
url: '/confirm/:recipientType/:toAddress/:toName/:toAmount/:toEmail/:toColor/:description/:coin/:useSendMax/:fromWalletId/:displayAddress/:requiredFeeRate', url: '/confirm/:thirdParty/:amount/:fromWalletId/:toWalletId/:toAddress',
views: { views: {
'tab-send@tabs': { 'tab-send@tabs': {
controller: 'confirmController', controller: 'confirmController',

View file

@ -84,7 +84,7 @@ angular.module('copayApp.services').factory('incomingData', function($log, $stat
$timeout(function() { $timeout(function() {
if (amount) { if (amount) {
$state.transitionTo('tabs.send.origin', { $state.transitionTo('tabs.send.origin', {
toAmount: amount, amount: amount,
toAddress: addr, toAddress: addr,
displayAddress: originalAddress ? originalAddress : addr, displayAddress: originalAddress ? originalAddress : addr,
description: message, description: message,
@ -409,7 +409,7 @@ angular.module('copayApp.services').factory('incomingData', function($log, $stat
function handlePayPro(payProDetails, coin) { function handlePayPro(payProDetails, coin) {
var stateParams = { var stateParams = {
toAmount: payProDetails.amount, amount: payProDetails.amount,
toAddress: payProDetails.toAddress, toAddress: payProDetails.toAddress,
description: payProDetails.memo, description: payProDetails.memo,
paypro: payProDetails, paypro: payProDetails,

View file

@ -28,7 +28,6 @@
} }
} }
.wallets-header { .wallets-header {
font-size: 12px;
margin: 20px 14px 0px; margin: 20px 14px 0px;
.title { .title {
@ -43,7 +42,11 @@
margin: 20px 14px 0px; margin: 20px 14px 0px;
.item-heading { .item-heading {
.subtitle {
font-size: 12px;
}
font-weight: 600; font-weight: 600;
} }
&-insufficient { &-insufficient {