From 94363704abd33a2c8a54f6cf14cb24f507169bd9 Mon Sep 17 00:00:00 2001 From: Gustavo Maximiliano Cortez Date: Thu, 24 Aug 2017 17:02:49 -0300 Subject: [PATCH 01/34] Adds bitcoin cash basic support (unit convertion, integrations, request specific amount, etc) --- src/js/controllers/addresses.js | 6 +- src/js/controllers/amount.js | 13 +- src/js/controllers/buyAmazon.js | 7 +- src/js/controllers/buyCoinbase.js | 152 +++++++------- src/js/controllers/buyGlidera.js | 71 ++++--- src/js/controllers/buyMercadoLibre.js | 7 +- src/js/controllers/confirm.js | 44 ++--- src/js/controllers/customAmount.js | 22 ++- src/js/controllers/modals/txpDetails.js | 2 +- src/js/controllers/sellCoinbase.js | 250 ++++++++++++------------ src/js/controllers/sellGlidera.js | 76 +++---- src/js/controllers/tab-receive.js | 3 +- src/js/controllers/topup.js | 7 +- src/js/controllers/tx-details.js | 2 +- src/js/filters/filters.js | 4 +- src/js/routes.js | 21 +- src/js/services/configService.js | 8 + src/js/services/feeService.js | 1 - src/js/services/profileService.js | 17 +- src/js/services/txFormatService.js | 34 ++-- src/js/services/walletService.js | 38 ++-- src/sass/views/amount.scss | 14 +- www/views/amount.html | 11 +- www/views/customAmount.html | 2 +- 24 files changed, 443 insertions(+), 369 deletions(-) diff --git a/src/js/controllers/addresses.js b/src/js/controllers/addresses.js index 47ec668ce..3bc0b4fea 100644 --- a/src/js/controllers/addresses.js +++ b/src/js/controllers/addresses.js @@ -88,9 +88,9 @@ angular.module('copayApp.controllers').controller('addressesController', functio $scope.lowWarning = resp.warning; $scope.lowUtxosNb = resp.lowUtxos.length; $scope.allUtxosNb = resp.allUtxos.length; - $scope.lowUtxosSum = txFormatService.formatAmountStr(lodash.sum(resp.lowUtxos || 0, 'satoshis')); - $scope.allUtxosSum = txFormatService.formatAmountStr(allSum); - $scope.minFee = txFormatService.formatAmountStr(resp.minFee || 0); + $scope.lowUtxosSum = txFormatService.formatAmountStr($scope.wallet, lodash.sum(resp.lowUtxos || 0, 'satoshis')); + $scope.allUtxosSum = txFormatService.formatAmountStr($scope.wallet, allSum); + $scope.minFee = txFormatService.formatAmountStr($scope.wallet, resp.minFee || 0); $scope.minFeePer = per.toFixed(2) + '%'; diff --git a/src/js/controllers/amount.js b/src/js/controllers/amount.js index 99912b99f..55c101024 100644 --- a/src/js/controllers/amount.js +++ b/src/js/controllers/amount.js @@ -21,6 +21,8 @@ angular.module('copayApp.controllers').controller('amountController', function($ $scope.nextStep = data.stateParams.nextStep; $scope.currency = data.stateParams.currency; $scope.forceCurrency = data.stateParams.forceCurrency; + $scope.forceChain = data.stateParams.forceChain || null; + $scope.chain = $scope.forceChain || data.stateParams.chain || 'BTC'; $scope.showMenu = $ionicHistory.backView() && ($ionicHistory.backView().stateName == 'tabs.send' || $ionicHistory.backView().stateName == 'tabs.bitpayCard'); @@ -63,7 +65,6 @@ angular.module('copayApp.controllers').controller('amountController', function($ }); var config = configService.getSync().wallet.settings; - $scope.unitName = config.unitName; if (data.stateParams.currency) { $scope.alternativeIsoCode = data.stateParams.currency; } else { @@ -124,6 +125,12 @@ angular.module('copayApp.controllers').controller('amountController', function($ } }; + $scope.toggleChain = function() { + if ($scope.forceCurrency || $scope.forceChain) return; + + $scope.chain = $scope.chain == 'BTC' ? 'BCH' : 'BTC'; + }; + function checkFontSize() { if ($scope.amount && $scope.amount.length >= SMALL_FONT_SIZE_LIMIT) $scope.smallFont = true; else $scope.smallFont = false; @@ -227,7 +234,8 @@ angular.module('copayApp.controllers').controller('amountController', function($ $state.transitionTo($scope.nextStep, { id: _id, amount: $scope.useSendMax ? null : _amount, - currency: $scope.showAlternativeAmount ? $scope.alternativeIsoCode : $scope.unitName, + currency: $scope.showAlternativeAmount ? $scope.alternativeIsoCode : $scope.chain, + chain: $scope.chain, useSendMax: $scope.useSendMax }); } else { @@ -239,6 +247,7 @@ angular.module('copayApp.controllers').controller('amountController', function($ toName: $scope.toName, toEmail: $scope.toEmail, toColor: $scope.toColor, + chain: $scope.chain, useSendMax: $scope.useSendMax }); } diff --git a/src/js/controllers/buyAmazon.js b/src/js/controllers/buyAmazon.js index 986b2c908..e2418e80e 100644 --- a/src/js/controllers/buyAmazon.js +++ b/src/js/controllers/buyAmazon.js @@ -216,7 +216,7 @@ angular.module('copayApp.controllers').controller('buyAmazonController', functio }); var initialize = function(wallet) { - var parsedAmount = txFormatService.parseAmount(amount, currency); + var parsedAmount = txFormatService.parseAmount(wallet, amount, currency); $scope.currencyIsoCode = parsedAmount.currency; $scope.amountUnitStr = parsedAmount.amountUnitStr; var dataSrc = { @@ -260,7 +260,7 @@ angular.module('copayApp.controllers').controller('buyAmazonController', functio invoiceUrl: invoice.url, invoiceTime: invoice.invoiceTime }; - $scope.totalAmountStr = txFormatService.formatAmountStr(ctxp.amount); + $scope.totalAmountStr = txFormatService.formatAmountStr(wallet, ctxp.amount); setTotalAmount(parsedAmount.amountSat, invoiceFeeSat, ctxp.fee); }); }); @@ -292,7 +292,8 @@ angular.module('copayApp.controllers').controller('buyAmazonController', functio $scope.wallets = profileService.getWallets({ onlyComplete: true, network: $scope.network, - hasFunds: true + hasFunds: true, + chain: 'BTC' }); if (lodash.isEmpty($scope.wallets)) { showErrorAndBack(null, gettextCatalog.getString('No wallets available')); diff --git a/src/js/controllers/buyCoinbase.js b/src/js/controllers/buyCoinbase.js index 57a95a0c7..57d9db779 100644 --- a/src/js/controllers/buyCoinbase.js +++ b/src/js/controllers/buyCoinbase.js @@ -33,6 +33,52 @@ angular.module('copayApp.controllers').controller('buyCoinbaseController', funct } }; + var processPaymentInfo = function() { + ongoingProcess.set('connectingCoinbase', true); + coinbaseService.init(function(err, res) { + if (err) { + ongoingProcess.set('connectingCoinbase', false); + showErrorAndBack(err); + return; + } + var accessToken = res.accessToken; + + coinbaseService.buyPrice(accessToken, coinbaseService.getAvailableCurrency(), function(err, b) { + $scope.buyPrice = b.data || null; + }); + + $scope.paymentMethods = []; + $scope.selectedPaymentMethodId = { value : null }; + coinbaseService.getPaymentMethods(accessToken, function(err, p) { + if (err) { + ongoingProcess.set('connectingCoinbase', false); + showErrorAndBack(err); + return; + } + + var hasPrimary; + var pm; + for(var i = 0; i < p.data.length; i++) { + pm = p.data[i]; + if (pm.allow_buy) { + $scope.paymentMethods.push(pm); + } + if (pm.allow_buy && pm.primary_buy) { + hasPrimary = true; + $scope.selectedPaymentMethodId.value = pm.id; + } + } + if (lodash.isEmpty($scope.paymentMethods)) { + ongoingProcess.set('connectingCoinbase', false); + showErrorAndBack('No payment method available to buy'); + return; + } + if (!hasPrimary) $scope.selectedPaymentMethodId.value = $scope.paymentMethods[0].id; + $scope.buyRequest(); + }); + }); + }; + $scope.$on("$ionicView.beforeLeave", function(event, data) { $ionicConfig.views.swipeBackEnabled(true); }); @@ -42,81 +88,22 @@ angular.module('copayApp.controllers').controller('buyCoinbaseController', funct }); $scope.$on("$ionicView.beforeEnter", function(event, data) { - $scope.isFiat = data.stateParams.currency != 'bits' && data.stateParams.currency != 'BTC' ? true : false; - var parsedAmount = txFormatService.parseAmount( - data.stateParams.amount, - data.stateParams.currency); + $scope.isFiat = data.stateParams.currency != 'BCH' && data.stateParams.currency != 'BTC' ? true : false; + amount = data.stateParams.amount; + currency = data.stateParams.currency; - // Buy always in BTC - amount = (parsedAmount.amountSat / 100000000).toFixed(8); - currency = 'BTC'; - - $scope.amountUnitStr = parsedAmount.amountUnitStr; - - ongoingProcess.set('calculatingFee', true); - coinbaseService.checkEnoughFundsForFee(amount, function(err) { - ongoingProcess.set('calculatingFee', false); - if (err) { - showErrorAndBack(err); - return; - } - - $scope.network = coinbaseService.getNetwork(); - $scope.wallets = profileService.getWallets({ - onlyComplete: true, - network: $scope.network - }); - - if (lodash.isEmpty($scope.wallets)) { - showErrorAndBack('No wallets available'); - return; - } - $scope.wallet = $scope.wallets[0]; // Default first wallet - - ongoingProcess.set('connectingCoinbase', true); - coinbaseService.init(function(err, res) { - if (err) { - ongoingProcess.set('connectingCoinbase', false); - showErrorAndBack(err); - return; - } - var accessToken = res.accessToken; - - coinbaseService.buyPrice(accessToken, coinbaseService.getAvailableCurrency(), function(err, b) { - $scope.buyPrice = b.data || null; - }); - - $scope.paymentMethods = []; - $scope.selectedPaymentMethodId = { value : null }; - coinbaseService.getPaymentMethods(accessToken, function(err, p) { - if (err) { - ongoingProcess.set('connectingCoinbase', false); - showErrorAndBack(err); - return; - } - - var hasPrimary; - var pm; - for(var i = 0; i < p.data.length; i++) { - pm = p.data[i]; - if (pm.allow_buy) { - $scope.paymentMethods.push(pm); - } - if (pm.allow_buy && pm.primary_buy) { - hasPrimary = true; - $scope.selectedPaymentMethodId.value = pm.id; - } - } - if (lodash.isEmpty($scope.paymentMethods)) { - ongoingProcess.set('connectingCoinbase', false); - showErrorAndBack('No payment method available to buy'); - return; - } - if (!hasPrimary) $scope.selectedPaymentMethodId.value = $scope.paymentMethods[0].id; - $scope.buyRequest(); - }); - }); + $scope.network = coinbaseService.getNetwork(); + $scope.wallets = profileService.getWallets({ + onlyComplete: true, + network: $scope.network, + chain: 'BTC' }); + + if (lodash.isEmpty($scope.wallets)) { + showErrorAndBack('No wallets available'); + return; + } + $scope.onWalletSelect($scope.wallets[0]); // Default first wallet }); $scope.buyRequest = function() { @@ -248,6 +235,25 @@ angular.module('copayApp.controllers').controller('buyCoinbaseController', funct $scope.onWalletSelect = function(wallet) { $scope.wallet = wallet; + var parsedAmount = txFormatService.parseAmount( + wallet, + amount, + currency); + + // Buy always in BTC + amount = (parsedAmount.amountSat / 100000000).toFixed(8); + currency = 'BTC'; + + $scope.amountUnitStr = parsedAmount.amountUnitStr; + ongoingProcess.set('calculatingFee', true); + coinbaseService.checkEnoughFundsForFee(amount, function(err) { + ongoingProcess.set('calculatingFee', false); + if (err) { + showErrorAndBack(err); + return; + } + processPaymentInfo(); + }); }; $scope.goBackHome = function() { diff --git a/src/js/controllers/buyGlidera.js b/src/js/controllers/buyGlidera.js index 46d0c3238..3b0ef1265 100644 --- a/src/js/controllers/buyGlidera.js +++ b/src/js/controllers/buyGlidera.js @@ -35,36 +35,7 @@ angular.module('copayApp.controllers').controller('buyGlideraController', functi } }; - $scope.$on("$ionicView.beforeLeave", function(event, data) { - $ionicConfig.views.swipeBackEnabled(true); - }); - - $scope.$on("$ionicView.enter", function(event, data) { - $ionicConfig.views.swipeBackEnabled(false); - }); - - $scope.$on("$ionicView.beforeEnter", function(event, data) { - $scope.isFiat = data.stateParams.currency != 'bits' && data.stateParams.currency != 'BTC' ? true : false; - var parsedAmount = txFormatService.parseAmount( - data.stateParams.amount, - data.stateParams.currency); - - amount = parsedAmount.amount; - currency = parsedAmount.currency; - $scope.amountUnitStr = parsedAmount.amountUnitStr; - - $scope.network = glideraService.getNetwork(); - $scope.wallets = profileService.getWallets({ - onlyComplete: true, - network: $scope.network - }); - - if (lodash.isEmpty($scope.wallets)) { - showErrorAndBack('No wallets available'); - return; - } - $scope.wallet = $scope.wallets[0]; // Default first wallet - + var processPaymentInfo = function() { ongoingProcess.set('connectingGlidera', true); glideraService.init(function(err, data) { if (err) { @@ -88,6 +59,33 @@ angular.module('copayApp.controllers').controller('buyGlideraController', functi $scope.buyInfo = buy; }); }); + }; + + $scope.$on("$ionicView.beforeLeave", function(event, data) { + $ionicConfig.views.swipeBackEnabled(true); + }); + + $scope.$on("$ionicView.enter", function(event, data) { + $ionicConfig.views.swipeBackEnabled(false); + }); + + $scope.$on("$ionicView.beforeEnter", function(event, data) { + $scope.isFiat = data.stateParams.currency != 'BCH' && data.stateParams.currency != 'BTC' ? true : false; + amount = data.stateParams.amount; + currency = data.stateParams.currency; + + $scope.network = glideraService.getNetwork(); + $scope.wallets = profileService.getWallets({ + onlyComplete: true, + network: $scope.network, + chain: 'BTC' + }); + + if (lodash.isEmpty($scope.wallets)) { + showErrorAndBack('No wallets available'); + return; + } + $scope.onWalletSelect($scope.wallets[0]); // Default first wallet }); var ask2FaCode = function(mode, cb) { @@ -105,7 +103,7 @@ angular.module('copayApp.controllers').controller('buyGlideraController', functi popupService.showPrompt(title, message, null, function(twoFaCode) { if (typeof twoFaCode == 'undefined') return cb(); return cb(twoFaCode); - }); + }); } else { return cb(); } @@ -116,7 +114,7 @@ angular.module('copayApp.controllers').controller('buyGlideraController', functi var okText = 'Confirm'; var cancelText = 'Cancel'; popupService.showConfirm(null, message, okText, cancelText, function(ok) { - if (!ok) return; + if (!ok) return; ongoingProcess.set('buyingBitcoin', true, statusChangeHandler); glideraService.get2faCode($scope.token, function(err, tfa) { if (err) { @@ -162,6 +160,15 @@ angular.module('copayApp.controllers').controller('buyGlideraController', functi $scope.onWalletSelect = function(wallet) { $scope.wallet = wallet; + var parsedAmount = txFormatService.parseAmount( + wallet, + amount, + currency); + + amount = parsedAmount.amount; + currency = parsedAmount.currency; + $scope.amountUnitStr = parsedAmount.amountUnitStr; + processPaymentInfo(); }; $scope.goBackHome = function() { diff --git a/src/js/controllers/buyMercadoLibre.js b/src/js/controllers/buyMercadoLibre.js index fa01a6143..a89a38d83 100644 --- a/src/js/controllers/buyMercadoLibre.js +++ b/src/js/controllers/buyMercadoLibre.js @@ -214,7 +214,7 @@ angular.module('copayApp.controllers').controller('buyMercadoLibreController', f }); var initialize = function(wallet) { - var parsedAmount = txFormatService.parseAmount(amount, currency); + var parsedAmount = txFormatService.parseAmount(wallet, amount, currency); $scope.currencyIsoCode = parsedAmount.currency; $scope.amountUnitStr = parsedAmount.amountUnitStr; var dataSrc = { @@ -258,7 +258,7 @@ angular.module('copayApp.controllers').controller('buyMercadoLibreController', f invoiceUrl: invoice.url, invoiceTime: invoice.invoiceTime }; - $scope.totalAmountStr = txFormatService.formatAmountStr(ctxp.amount); + $scope.totalAmountStr = txFormatService.formatAmountStr(wallet, ctxp.amount); setTotalAmount(parsedAmount.amountSat, invoiceFeeSat, ctxp.fee); }); }); @@ -284,7 +284,8 @@ angular.module('copayApp.controllers').controller('buyMercadoLibreController', f $scope.network = mercadoLibreService.getNetwork(); $scope.wallets = profileService.getWallets({ onlyComplete: true, - network: $scope.network + network: $scope.network, + chain: 'BTC' }); if (lodash.isEmpty($scope.wallets)) { showErrorAndBack(null, gettextCatalog.getString('No wallets available')); diff --git a/src/js/controllers/confirm.js b/src/js/controllers/confirm.js index eff5aa4b2..4135ec4b3 100644 --- a/src/js/controllers/confirm.js +++ b/src/js/controllers/confirm.js @@ -69,14 +69,15 @@ angular.module('copayApp.controllers').controller('confirmController', function( $scope.$on("$ionicView.beforeEnter", function(event, data) { - function setWalletSelector(network, minAmount, cb) { + function setWalletSelector(chain, network, minAmount, cb) { // no min amount? (sendMax) => look for no empty wallets minAmount = minAmount || 1; $scope.wallets = profileService.getWallets({ onlyComplete: true, - network: network + network: network, + chain: chain }); if (!$scope.wallets || !$scope.wallets.length) { @@ -137,6 +138,7 @@ angular.module('copayApp.controllers').controller('confirmController', function( toEmail: data.stateParams.toEmail, toColor: data.stateParams.toColor, network: (new bitcore.Address(data.stateParams.toAddress)).network.name, + chain: data.stateParams.chain || 'BTC', txp: {}, }; @@ -146,23 +148,21 @@ angular.module('copayApp.controllers').controller('confirmController', function( $scope.isWindowsPhoneApp = isWindowsPhoneApp; $scope.showAddress = false; - updateTx(tx, null, {}, function() { - $scope.walletSelectorTitle = gettextCatalog.getString('Send from'); + $scope.walletSelectorTitle = gettextCatalog.getString('Send from'); - setWalletSelector(tx.network, tx.toAmount, function(err) { - if (err) { - return exitWithError('Could not update wallets'); - } - - if ($scope.wallets.length > 1) { - $scope.showWalletSelector(); - } else if ($scope.wallets.length) { - setWallet($scope.wallets[0], tx); - } - }); + setWalletSelector(tx.chain, tx.network, tx.toAmount, function(err) { + if (err) { + return exitWithError('Could not update wallets'); + } + if ($scope.wallets.length > 1) { + $scope.showWalletSelector(); + } else if ($scope.wallets.length) { + setWallet($scope.wallets[0], tx); + } }); + }); @@ -238,7 +238,7 @@ angular.module('copayApp.controllers').controller('confirmController', function( if (!tx.toAmount) return; // Amount - tx.amountStr = txFormatService.formatAmountStr(tx.toAmount); + tx.amountStr = txFormatService.formatAmountStr(wallet, tx.toAmount); tx.amountValueStr = tx.amountStr.split(' ')[0]; tx.amountUnitStr = tx.amountStr.split(' ')[1]; txFormatService.formatAlternativeStr(tx.toAmount, function(v) { @@ -280,7 +280,7 @@ angular.module('copayApp.controllers').controller('confirmController', function( tx.sendMaxInfo = sendMaxInfo; tx.toAmount = tx.sendMaxInfo.amount; updateAmount(); - showSendMaxWarning(sendMaxInfo); + showSendMaxWarning(wallet, sendMaxInfo); } // txp already generated for this wallet? @@ -292,7 +292,7 @@ angular.module('copayApp.controllers').controller('confirmController', function( getTxp(lodash.clone(tx), wallet, opts.dryRun, function(err, txp) { if (err) return cb(err); - txp.feeStr = txFormatService.formatAmountStr(txp.fee); + txp.feeStr = txFormatService.formatAmountStr(wallet, txp.fee); txFormatService.formatAlternativeStr(txp.fee, function(v) { txp.alternativeFeeStr = v; }); @@ -337,26 +337,26 @@ angular.module('copayApp.controllers').controller('confirmController', function( }; - function showSendMaxWarning(sendMaxInfo) { + function showSendMaxWarning(wallet, sendMaxInfo) { function verifyExcludedUtxos() { var warningMsg = []; if (sendMaxInfo.utxosBelowFee > 0) { warningMsg.push(gettextCatalog.getString("A total of {{amountBelowFeeStr}} were excluded. These funds come from UTXOs smaller than the network fee provided.", { - amountBelowFeeStr: txFormatService.formatAmountStr(sendMaxInfo.amountBelowFee) + amountBelowFeeStr: txFormatService.formatAmountStr(wallet, sendMaxInfo.amountBelowFee) })); } if (sendMaxInfo.utxosAboveMaxSize > 0) { warningMsg.push(gettextCatalog.getString("A total of {{amountAboveMaxSizeStr}} were excluded. The maximum size allowed for a transaction was exceeded.", { - amountAboveMaxSizeStr: txFormatService.formatAmountStr(sendMaxInfo.amountAboveMaxSize) + amountAboveMaxSizeStr: txFormatService.formatAmountStr(wallet, sendMaxInfo.amountAboveMaxSize) })); } return warningMsg.join('\n'); }; var msg = gettextCatalog.getString("{{fee}} will be deducted for bitcoin networking fees.", { - fee: txFormatService.formatAmountStr(sendMaxInfo.fee) + fee: txFormatService.formatAmountStr(wallet, sendMaxInfo.fee) }); var warningMsg = verifyExcludedUtxos(); diff --git a/src/js/controllers/customAmount.js b/src/js/controllers/customAmount.js index 9a2b46f6c..093edd568 100644 --- a/src/js/controllers/customAmount.js +++ b/src/js/controllers/customAmount.js @@ -15,7 +15,7 @@ angular.module('copayApp.controllers').controller('customAmountController', func showErrorAndBack('Error', 'No wallet selected'); return; } - + $scope.showShareButton = platformInfo.isCordova ? (platformInfo.isIOS ? 'iOS' : 'Android') : null; $scope.wallet = profileService.getWallet(walletId); @@ -25,11 +25,13 @@ angular.module('copayApp.controllers').controller('customAmountController', func showErrorAndBack('Error', 'Could not get the address'); return; } - + $scope.address = addr; - + + $scope.chain = (data.stateParams.chain).toLowerCase(); var parsedAmount = txFormatService.parseAmount( - data.stateParams.amount, + $scope.wallet, + data.stateParams.amount, data.stateParams.currency); // Amount in USD or BTC @@ -37,16 +39,16 @@ angular.module('copayApp.controllers').controller('customAmountController', func var currency = parsedAmount.currency; $scope.amountUnitStr = parsedAmount.amountUnitStr; - if (currency != 'BTC') { - // Convert to BTC + if (currency != 'BTC' && currency != 'BCH') { + // Convert to BTC or BCH var config = configService.getSync().wallet.settings; var amountUnit = txFormatService.satToUnit(parsedAmount.amountSat); - var btcParsedAmount = txFormatService.parseAmount(amountUnit, config.unitName); - + var btcParsedAmount = txFormatService.parseAmount($scope.wallet, amountUnit, $scope.wallet.chain); + $scope.amountBtc = btcParsedAmount.amount; $scope.altAmountStr = btcParsedAmount.amountUnitStr; } else { - $scope.amountBtc = amount; // BTC + $scope.amountBtc = amount; // BTC or BCH $scope.altAmountStr = txFormatService.formatAlternativeStr(parsedAmount.amountSat); } }); @@ -66,7 +68,7 @@ angular.module('copayApp.controllers').controller('customAmountController', func } $scope.copyToClipboard = function() { - return 'bitcoin:' + $scope.address + '?amount=' + $scope.amountBtc; + return 'bitcoin:' + $scope.address + '?amount=' + $scope.amountBtc + '&chain=' + $scope.chain; }; }); diff --git a/src/js/controllers/modals/txpDetails.js b/src/js/controllers/modals/txpDetails.js index 68c6d0778..79c8738c6 100644 --- a/src/js/controllers/modals/txpDetails.js +++ b/src/js/controllers/modals/txpDetails.js @@ -219,7 +219,7 @@ angular.module('copayApp.controllers').controller('txpDetailsController', functi copayerId: $scope.wallet.credentials.copayerId }); - $scope.tx = txFormatService.processTx(tx); + $scope.tx = txFormatService.processTx($scope.wallet, tx); if (!action && tx.status == 'pending') $scope.tx.pendingForUs = true; diff --git a/src/js/controllers/sellCoinbase.js b/src/js/controllers/sellCoinbase.js index c6fd31f58..3bee99602 100644 --- a/src/js/controllers/sellCoinbase.js +++ b/src/js/controllers/sellCoinbase.js @@ -34,124 +34,7 @@ angular.module('copayApp.controllers').controller('sellCoinbaseController', func }, onSendStatusChange); }; - var checkTransaction = lodash.throttle(function(count, txp) { - $log.warn('Check if transaction has been received by Coinbase. Try ' + count + '/5'); - // TX amount in BTC - var satToBtc = 1 / 100000000; - var amountBTC = (txp.amount * satToBtc).toFixed(8); - coinbaseService.init(function(err, res) { - if (err) { - $log.error(err); - checkTransaction(count, txp); - return; - } - var accessToken = res.accessToken; - var accountId = res.accountId; - var sellPrice = null; - - coinbaseService.sellPrice(accessToken, coinbaseService.getAvailableCurrency(), function(err, sell) { - if (err) { - $log.debug(err); - checkTransaction(count, txp); - return; - } - sellPrice = sell.data; - - coinbaseService.getTransactions(accessToken, accountId, function(err, ctxs) { - if (err) { - $log.debug(err); - checkTransaction(count, txp); - return; - } - - var coinbaseTransactions = ctxs.data; - var txFound = false; - var ctx; - for(var i = 0; i < coinbaseTransactions.length; i++) { - ctx = coinbaseTransactions[i]; - if (ctx.type == 'send' && ctx.from && ctx.amount.amount == amountBTC ) { - $log.warn('Transaction found!', ctx); - txFound = true; - $log.debug('Saving transaction to process later...'); - ctx['payment_method'] = $scope.selectedPaymentMethodId.value; - ctx['status'] = 'pending'; // Forcing "pending" status to process later - ctx['price_sensitivity'] = $scope.selectedPriceSensitivity.data; - ctx['sell_price_amount'] = sellPrice ? sellPrice.amount : ''; - ctx['sell_price_currency'] = sellPrice ? sellPrice.currency : 'USD'; - ctx['description'] = appConfigService.nameCase + ' Wallet: ' + $scope.wallet.name; - coinbaseService.savePendingTransaction(ctx, null, function(err) { - ongoingProcess.set('sellingBitcoin', false, statusChangeHandler); - if (err) $log.debug(err); - }); - return; - } - } - if (!txFound) { - // Transaction sent, but could not be verified by Coinbase.com - $log.warn('Transaction not found in Coinbase.'); - if (count < 5) { - checkTransaction(count + 1, txp); - } else { - ongoingProcess.set('sellingBitcoin', false, statusChangeHandler); - showError('No transaction found'); - return; - } - } - }); - }); - }); - }, 8000, { - 'leading': true - }); - - var statusChangeHandler = function (processName, showName, isOn) { - $log.debug('statusChangeHandler: ', processName, showName, isOn); - if ( processName == 'sellingBitcoin' && !isOn) { - $scope.sendStatus = 'success'; - $timeout(function() { - $scope.$digest(); - }, 100); - } else if (showName) { - $scope.sendStatus = showName; - } - }; - - $scope.$on("$ionicView.beforeLeave", function(event, data) { - $ionicConfig.views.swipeBackEnabled(true); - }); - - $scope.$on("$ionicView.enter", function(event, data) { - $ionicConfig.views.swipeBackEnabled(false); - }); - - $scope.$on("$ionicView.beforeEnter", function(event, data) { - $scope.isFiat = data.stateParams.currency != 'bits' && data.stateParams.currency != 'BTC' ? true : false; - var parsedAmount = txFormatService.parseAmount( - data.stateParams.amount, - data.stateParams.currency); - - amount = parsedAmount.amount; - currency = parsedAmount.currency; - $scope.amountUnitStr = parsedAmount.amountUnitStr; - - $scope.priceSensitivity = coinbaseService.priceSensitivity; - $scope.selectedPriceSensitivity = { data: coinbaseService.selectedPriceSensitivity }; - - $scope.network = coinbaseService.getNetwork(); - $scope.wallets = profileService.getWallets({ - m: 1, // Only 1-signature wallet - onlyComplete: true, - network: $scope.network, - hasFunds: true, - minAmount: parsedAmount.amountSat - }); - - if (lodash.isEmpty($scope.wallets)) { - showErrorAndBack('Insufficient funds'); - return; - } - $scope.wallet = $scope.wallets[0]; // Default first wallet - + var processPaymentInfo = function() { ongoingProcess.set('connectingCoinbase', true); coinbaseService.init(function(err, res) { if (err) { @@ -193,7 +76,121 @@ angular.module('copayApp.controllers').controller('sellCoinbaseController', func if (!hasPrimary) $scope.selectedPaymentMethodId.value = $scope.paymentMethods[0].id; $scope.sellRequest(); }); - }); + }); + }; + + var checkTransaction = lodash.throttle(function(count, txp) { + $log.warn('Check if transaction has been received by Coinbase. Try ' + count + '/5'); + // TX amount in BTC + var satToBtc = 1 / 100000000; + var amountBTC = (txp.amount * satToBtc).toFixed(8); + coinbaseService.init(function(err, res) { + if (err) { + $log.error(err); + checkTransaction(count, txp); + return; + } + var accessToken = res.accessToken; + var accountId = res.accountId; + var sellPrice = null; + + coinbaseService.sellPrice(accessToken, coinbaseService.getAvailableCurrency(), function(err, sell) { + if (err) { + $log.debug(err); + checkTransaction(count, txp); + return; + } + sellPrice = sell.data; + + coinbaseService.getTransactions(accessToken, accountId, function(err, ctxs) { + if (err) { + $log.debug(err); + checkTransaction(count, txp); + return; + } + + var coinbaseTransactions = ctxs.data; + var txFound = false; + var ctx; + for(var i = 0; i < coinbaseTransactions.length; i++) { + ctx = coinbaseTransactions[i]; + if (ctx.type == 'send' && ctx.from && ctx.amount.amount == amountBTC ) { + $log.warn('Transaction found!', ctx); + txFound = true; + $log.debug('Saving transaction to process later...'); + ctx['payment_method'] = $scope.selectedPaymentMethodId.value; + ctx['status'] = 'pending'; // Forcing "pending" status to process later + ctx['price_sensitivity'] = $scope.selectedPriceSensitivity.data; + ctx['sell_price_amount'] = sellPrice ? sellPrice.amount : ''; + ctx['sell_price_currency'] = sellPrice ? sellPrice.currency : 'USD'; + ctx['description'] = appConfigService.nameCase + ' Wallet: ' + $scope.wallet.name; + coinbaseService.savePendingTransaction(ctx, null, function(err) { + ongoingProcess.set('sellingBitcoin', false, statusChangeHandler); + if (err) $log.debug(err); + }); + return; + } + } + if (!txFound) { + // Transaction sent, but could not be verified by Coinbase.com + $log.warn('Transaction not found in Coinbase.'); + if (count < 5) { + checkTransaction(count + 1, txp); + } else { + ongoingProcess.set('sellingBitcoin', false, statusChangeHandler); + showError('No transaction found'); + return; + } + } + }); + }); + }); + }, 8000, { + 'leading': true + }); + + var statusChangeHandler = function (processName, showName, isOn) { + $log.debug('statusChangeHandler: ', processName, showName, isOn); + if ( processName == 'sellingBitcoin' && !isOn) { + $scope.sendStatus = 'success'; + $timeout(function() { + $scope.$digest(); + }, 100); + } else if (showName) { + $scope.sendStatus = showName; + } + }; + + $scope.$on("$ionicView.beforeLeave", function(event, data) { + $ionicConfig.views.swipeBackEnabled(true); + }); + + $scope.$on("$ionicView.enter", function(event, data) { + $ionicConfig.views.swipeBackEnabled(false); + }); + + $scope.$on("$ionicView.beforeEnter", function(event, data) { + $scope.isFiat = data.stateParams.currency != 'BCH' && data.stateParams.currency != 'BTC' ? true : false; + amount = data.stateParams.amount; + currency = data.stateParams.currency; + + $scope.priceSensitivity = coinbaseService.priceSensitivity; + $scope.selectedPriceSensitivity = { data: coinbaseService.selectedPriceSensitivity }; + + $scope.network = coinbaseService.getNetwork(); + $scope.wallets = profileService.getWallets({ + m: 1, // Only 1-signature wallet + onlyComplete: true, + network: $scope.network, + hasFunds: true, + chain: 'BTC' + }); + + if (lodash.isEmpty($scope.wallets)) { + showErrorAndBack('Insufficient funds'); + return; + } + $scope.onWalletSelect($scope.wallets[0]); // Default first wallet }); $scope.sellRequest = function() { @@ -236,7 +233,7 @@ angular.module('copayApp.controllers').controller('sellCoinbaseController', func var cancelText = 'Cancel'; popupService.showConfirm(null, message, okText, cancelText, function(ok) { if (!ok) return; - + ongoingProcess.set('sellingBitcoin', true, statusChangeHandler); coinbaseService.init(function(err, res) { if (err) { @@ -294,8 +291,8 @@ angular.module('copayApp.controllers').controller('sellCoinbaseController', func checkTransaction(1, txSent); }); }); - }); - }); + }); + }); }); }; @@ -306,6 +303,15 @@ angular.module('copayApp.controllers').controller('sellCoinbaseController', func $scope.onWalletSelect = function(wallet) { $scope.wallet = wallet; + var parsedAmount = txFormatService.parseAmount( + wallet, + amount, + currency); + + amount = parsedAmount.amount; + currency = parsedAmount.currency; + $scope.amountUnitStr = parsedAmount.amountUnitStr; + processPaymentInfo(); }; $scope.goBackHome = function() { diff --git a/src/js/controllers/sellGlidera.js b/src/js/controllers/sellGlidera.js index 90a6ed027..0978590c7 100644 --- a/src/js/controllers/sellGlidera.js +++ b/src/js/controllers/sellGlidera.js @@ -35,39 +35,7 @@ angular.module('copayApp.controllers').controller('sellGlideraController', funct } }; - $scope.$on("$ionicView.beforeLeave", function(event, data) { - $ionicConfig.views.swipeBackEnabled(true); - }); - - $scope.$on("$ionicView.enter", function(event, data) { - $ionicConfig.views.swipeBackEnabled(false); - }); - - $scope.$on("$ionicView.beforeEnter", function(event, data) { - $scope.isFiat = data.stateParams.currency != 'bits' && data.stateParams.currency != 'BTC' ? true : false; - var parsedAmount = txFormatService.parseAmount( - data.stateParams.amount, - data.stateParams.currency); - - amount = parsedAmount.amount; - currency = parsedAmount.currency; - $scope.amountUnitStr = parsedAmount.amountUnitStr; - - $scope.network = glideraService.getNetwork(); - $scope.wallets = profileService.getWallets({ - m: 1, // Only 1-signature wallet - onlyComplete: true, - network: $scope.network, - hasFunds: true, - minAmount: parsedAmount.amountSat - }); - - if (lodash.isEmpty($scope.wallets)) { - showErrorAndBack('Insufficient funds'); - return; - } - $scope.wallet = $scope.wallets[0]; // Default first wallet - + var processPaymentInfo = function() { ongoingProcess.set('connectingGlidera', true); glideraService.init(function(err, data) { if (err) { @@ -91,6 +59,35 @@ angular.module('copayApp.controllers').controller('sellGlideraController', funct $scope.sellInfo = sell; }); }); + }; + + $scope.$on("$ionicView.beforeLeave", function(event, data) { + $ionicConfig.views.swipeBackEnabled(true); + }); + + $scope.$on("$ionicView.enter", function(event, data) { + $ionicConfig.views.swipeBackEnabled(false); + }); + + $scope.$on("$ionicView.beforeEnter", function(event, data) { + $scope.isFiat = data.stateParams.currency != 'BCH' && data.stateParams.currency != 'BTC' ? true : false; + amount = data.stateParams.amount; + currency = data.stateParams.currency; + + $scope.network = glideraService.getNetwork(); + $scope.wallets = profileService.getWallets({ + m: 1, // Only 1-signature wallet + onlyComplete: true, + network: $scope.network, + hasFunds: true, + chain: 'BTC' + }); + + if (lodash.isEmpty($scope.wallets)) { + showErrorAndBack('Insufficient funds'); + return; + } + $scope.onWalletSelect($scope.wallets[0]); // Default first wallet }); var ask2FaCode = function(mode, cb) { @@ -108,7 +105,7 @@ angular.module('copayApp.controllers').controller('sellGlideraController', funct popupService.showPrompt(title, message, null, function(twoFaCode) { if (typeof twoFaCode == 'undefined') return cb(); return cb(twoFaCode); - }); + }); } else { return cb(); } @@ -119,7 +116,7 @@ angular.module('copayApp.controllers').controller('sellGlideraController', funct var okText = 'Confirm'; var cancelText = 'Cancel'; popupService.showConfirm(null, message, okText, cancelText, function(ok) { - if (!ok) return; + if (!ok) return; ongoingProcess.set('sellingBitcoin', true, statusChangeHandler); glideraService.get2faCode($scope.token, function(err, tfa) { if (err) { @@ -231,6 +228,15 @@ angular.module('copayApp.controllers').controller('sellGlideraController', funct $scope.onWalletSelect = function(wallet) { $scope.wallet = wallet; + var parsedAmount = txFormatService.parseAmount( + wallet, + amount, + currency); + + amount = parsedAmount.amount; + currency = parsedAmount.currency; + $scope.amountUnitStr = parsedAmount.amountUnitStr; + processPaymentInfo(); }; $scope.goBackHome = function() { diff --git a/src/js/controllers/tab-receive.js b/src/js/controllers/tab-receive.js index 39446924f..5bd61c70b 100644 --- a/src/js/controllers/tab-receive.js +++ b/src/js/controllers/tab-receive.js @@ -8,7 +8,8 @@ angular.module('copayApp.controllers').controller('tabReceiveController', functi $scope.requestSpecificAmount = function() { $state.go('tabs.paymentRequest.amount', { - id: $scope.wallet.credentials.walletId + id: $scope.wallet.credentials.walletId, + forceChain: $scope.wallet.chain }); }; diff --git a/src/js/controllers/topup.js b/src/js/controllers/topup.js index 3c66830b1..d5959e545 100644 --- a/src/js/controllers/topup.js +++ b/src/js/controllers/topup.js @@ -218,7 +218,7 @@ angular.module('copayApp.controllers').controller('topUpController', function($s // Save TX in memory createdTx = ctxp; - $scope.totalAmountStr = txFormatService.formatAmountStr(ctxp.amount); + $scope.totalAmountStr = txFormatService.formatAmountStr(wallet, ctxp.amount); setTotalAmount(parsedAmount.amountSat, invoiceFeeSat, ctxp.fee); @@ -256,7 +256,8 @@ angular.module('copayApp.controllers').controller('topUpController', function($s $scope.wallets = profileService.getWallets({ onlyComplete: true, network: bitpayService.getEnvironment().network, - hasFunds: true + hasFunds: true, + chain: 'BTC' }); if (lodash.isEmpty($scope.wallets)) { @@ -319,7 +320,7 @@ angular.module('copayApp.controllers').controller('topUpController', function($s }); return; } - var parsedAmount = txFormatService.parseAmount(a, c); + var parsedAmount = txFormatService.parseAmount(wallet, a, c); initializeTopUp(wallet, parsedAmount); }); }; diff --git a/src/js/controllers/tx-details.js b/src/js/controllers/tx-details.js index ebd44f6a5..58eb473aa 100644 --- a/src/js/controllers/tx-details.js +++ b/src/js/controllers/tx-details.js @@ -112,7 +112,7 @@ angular.module('copayApp.controllers').controller('txDetailsController', functio return popupService.showAlert(gettextCatalog.getString('Error'), gettextCatalog.getString('Transaction not available at this time')); } - $scope.btx = txFormatService.processTx(tx); + $scope.btx = txFormatService.processTx($scope.wallet, tx); txFormatService.formatAlternativeStr(tx.fees, function(v) { $scope.btx.feeFiatStr = v; $scope.btx.feeRateStr = ($scope.btx.fees / ($scope.btx.amount + $scope.btx.fees) * 100).toFixed(2) + '%'; diff --git a/src/js/filters/filters.js b/src/js/filters/filters.js index 8d9a56d10..e074f803b 100644 --- a/src/js/filters/filters.js +++ b/src/js/filters/filters.js @@ -27,12 +27,10 @@ angular.module('copayApp.filters', []) } }) .filter('formatFiatAmount', ['$filter', '$locale', 'configService', - function(filter, locale, configService) { + function(filter, locale) { var numberFilter = filter('number'); var formats = locale.NUMBER_FORMATS; - var config = configService.getSync().wallet.settings; return function(amount) { - if (!config) return amount; var fractionSize = 2; var value = numberFilter(amount, fractionSize); diff --git a/src/js/routes.js b/src/js/routes.js index 59cfad4fa..04ae0ad6f 100644 --- a/src/js/routes.js +++ b/src/js/routes.js @@ -287,7 +287,7 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr */ .state('tabs.send.amount', { - url: '/amount/:recipientType/:toAddress/:toName/:toEmail/:toColor', + url: '/amount/:recipientType/:toAddress/:toName/:toEmail/:toColor/:chain', views: { 'tab-send@tabs': { controller: 'amountController', @@ -296,7 +296,7 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr } }) .state('tabs.send.confirm', { - url: '/confirm/:recipientType/:toAddress/:toName/:toAmount/:toEmail/:toColor/:description/:useSendMax', + url: '/confirm/:recipientType/:toAddress/:toName/:toAmount/:toEmail/:toColor/:description/:chain/:useSendMax', views: { 'tab-send@tabs': { controller: 'confirmController', @@ -681,7 +681,7 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr }) .state('tabs.paymentRequest.amount', { - url: '/amount', + url: '/amount/:forceChain', views: { 'tab-receive@tabs': { controller: 'amountController', @@ -690,7 +690,7 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr } }) .state('tabs.paymentRequest.confirm', { - url: '/confirm/:amount/:currency', + url: '/confirm/:amount/:currency/:chain', views: { 'tab-receive@tabs': { controller: 'customAmountController', @@ -923,6 +923,9 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr controllerAs: 'glidera', templateUrl: 'views/glidera.html' } + }, + params: { + forceChain: 'BTC' } }) .state('tabs.buyandsell.glidera.amount', { @@ -976,6 +979,9 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr controllerAs: 'coinbase', templateUrl: 'views/coinbase.html' } + }, + params: { + forceChain: 'BTC' } }) .state('tabs.preferences.coinbase', { @@ -1064,7 +1070,8 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr params: { nextStep: 'tabs.giftcards.mercadoLibre.buy', currency: 'BRL', - forceCurrency: true + forceCurrency: true, + forceChain: 'BTC' } }) .state('tabs.giftcards.mercadoLibre.buy', { @@ -1115,7 +1122,8 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr params: { nextStep: 'tabs.giftcards.amazon.buy', currency: 'USD', - forceCurrency: true + forceCurrency: true, + forceChain: 'BTC' } }) .state('tabs.giftcards.amazon.buy', { @@ -1155,6 +1163,7 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr params: { id: null, currency: 'USD', + forceChain: 'BTC', useSendMax: null } }) diff --git a/src/js/services/configService.js b/src/js/services/configService.js index a17fcf628..3fa2f1f59 100644 --- a/src/js/services/configService.js +++ b/src/js/services/configService.js @@ -143,6 +143,14 @@ angular.module('copayApp.services').factory('configService', function(storageSer configCache.bitpayAccount = defaultConfig.bitpayAccount; } + if (configCache.wallet.settings.unitCode == 'bit') { + // Convert to BTC. Bits will be disabled + configCache.wallet.settings.unitName = defaultConfig.wallet.settings.unitName; + configCache.wallet.settings.unitToSatoshi = defaultConfig.wallet.settings.unitToSatoshi; + configCache.wallet.settings.unitDecimals = defaultConfig.wallet.settings.unitDecimals; + configCache.wallet.settings.unitCode = defaultConfig.wallet.settings.unitCode; + } + } else { configCache = lodash.clone(defaultConfig); }; diff --git a/src/js/services/feeService.js b/src/js/services/feeService.js index 3a289bfd8..852c0cf31 100644 --- a/src/js/services/feeService.js +++ b/src/js/services/feeService.js @@ -64,7 +64,6 @@ angular.module('copayApp.services').factory('feeService', function($log, $timeou } var walletClient = bwcService.getClient(); - var unitName = configService.getSync().wallet.settings.unitName; walletClient.getFeeLevels('livenet', function(errLivenet, levelsLivenet) { walletClient.getFeeLevels('testnet', function(errTestnet, levelsTestnet) { diff --git a/src/js/services/profileService.js b/src/js/services/profileService.js index 9f32b137f..b1d7b30e1 100644 --- a/src/js/services/profileService.js +++ b/src/js/services/profileService.js @@ -89,6 +89,7 @@ angular.module('copayApp.services') wallet.copayerId = wallet.credentials.copayerId; wallet.m = wallet.credentials.m; wallet.n = wallet.credentials.n; + wallet.chain = wallet.credentials.chain; root.updateWalletSettings(wallet); root.wallet[walletId] = wallet; @@ -222,11 +223,13 @@ angular.module('copayApp.services') return ((config.bwsFor && config.bwsFor[walletId]) || defaults.bws.url); }; - var client = bwcService.getClient(JSON.stringify(credentials), { bwsurl: getBWSURL(credentials.walletId), }); + // TODO: Should return "chain" = "BTC" or "BCH" + client.credentials.chain = 'BTC'; + var skipKeyValidation = shouldSkipValidation(credentials.walletId); if (!skipKeyValidation) root.runValidation(client, 500); @@ -749,6 +752,12 @@ angular.module('copayApp.services') var ret = lodash.values(root.wallet); + if (opts.chain) { + ret = lodash.filter(ret, function(x) { + return (x.credentials.chain == opts.chain); + }); + } + if (opts.network) { ret = lodash.filter(ret, function(x) { return (x.credentials.network == opts.network); @@ -848,7 +857,7 @@ angular.module('copayApp.services') }); }; - function process(notifications) { + function process(wallet, notifications) { if (!notifications) return []; var shown = lodash.sortBy(notifications, 'createdOn').reverse(); @@ -861,7 +870,7 @@ angular.module('copayApp.services') x.types = [x.type]; if (x.data && x.data.amount) - x.amountStr = txFormatService.formatAmountStr(x.data.amount); + x.amountStr = txFormatService.formatAmountStr(wallet, x.data.amount); x.action = function() { // TODO? @@ -939,7 +948,7 @@ angular.module('copayApp.services') notifications = lodash.sortBy(notifications, 'createdOn'); notifications = lodash.compact(lodash.flatten(notifications)).slice(0, MAX); var total = notifications.length; - return cb(null, process(notifications), total); + return cb(null, process(wallet, notifications), total); }; }); }); diff --git a/src/js/services/txFormatService.js b/src/js/services/txFormatService.js index 0df46fe86..e203ad69a 100644 --- a/src/js/services/txFormatService.js +++ b/src/js/services/txFormatService.js @@ -17,10 +17,10 @@ angular.module('copayApp.services').factory('txFormatService', function($filter, return this.Utils.formatAmount(satoshis, config.unitCode, opts); }; - root.formatAmountStr = function(satoshis) { + root.formatAmountStr = function(wallet, satoshis) { +console.log('[txFormatService.js:20]',wallet); //TODO/ if (isNaN(satoshis)) return; - var config = configService.getSync().wallet.settings; - return root.formatAmount(satoshis) + ' ' + config.unitName; + return root.formatAmount(satoshis) + ' ' + wallet.chain; }; root.toFiat = function(satoshis, code, cb) { @@ -86,7 +86,7 @@ angular.module('copayApp.services').factory('txFormatService', function($filter, }; }; - root.processTx = function(tx) { + root.processTx = function(wallet, tx) { if (!tx || tx.action == 'invalid') return tx; @@ -101,7 +101,7 @@ angular.module('copayApp.services').factory('txFormatService', function($filter, tx.hasMultiplesOutputs = true; } tx.amount = lodash.reduce(tx.outputs, function(total, o) { - o.amountStr = root.formatAmountStr(o.amount); + o.amountStr = root.formatAmountStr(wallet, o.amount); o.alternativeAmountStr = root.formatAlternativeStr(o.amount); return total + o.amount; }, 0); @@ -109,9 +109,9 @@ angular.module('copayApp.services').factory('txFormatService', function($filter, tx.toAddress = tx.outputs[0].toAddress; } - tx.amountStr = root.formatAmountStr(tx.amount); + tx.amountStr = root.formatAmountStr(wallet, tx.amount); tx.alternativeAmountStr = root.formatAlternativeStr(tx.amount); - tx.feeStr = root.formatAmountStr(tx.fee || tx.fees); + tx.feeStr = root.formatAmountStr(wallet, tx.fee || tx.fees); if (tx.amountStr) { tx.amountValueStr = tx.amountStr.split(' ')[0]; @@ -145,8 +145,6 @@ angular.module('copayApp.services').factory('txFormatService', function($filter, lodash.each(txps, function(tx) { - tx = txFormatService.processTx(tx); - // no future transactions... if (tx.createdOn > now) tx.createdOn = now; @@ -157,6 +155,8 @@ angular.module('copayApp.services').factory('txFormatService', function($filter, return; } + tx = txFormatService.processTx(tx.wallet, tx); + var action = lodash.find(tx.actions, { copayerId: tx.wallet.copayerId }); @@ -180,7 +180,7 @@ angular.module('copayApp.services').factory('txFormatService', function($filter, return txps; }; - root.parseAmount = function(amount, currency) { + root.parseAmount = function(wallet, amount, currency) { var config = configService.getSync().wallet.settings; var satToBtc = 1 / 100000000; var unitToSatoshi = config.unitToSatoshi; @@ -189,21 +189,21 @@ angular.module('copayApp.services').factory('txFormatService', function($filter, var alternativeIsoCode = config.alternativeIsoCode; // If fiat currency - if (currency != 'bits' && currency != 'BTC' && currency != 'sat') { + if (currency != 'BCH' && currency != 'BTC' && currency != 'sat') { amountUnitStr = $filter('formatFiatAmount')(amount) + ' ' + currency; amountSat = rateService.fromFiat(amount, currency).toFixed(0); } else if (currency == 'sat') { amountSat = amount; - amountUnitStr = root.formatAmountStr(amountSat); - // convert sat to BTC + amountUnitStr = root.formatAmountStr(wallet, amountSat); + // convert sat to BTC or BCH amount = (amountSat * satToBtc).toFixed(8); - currency = 'BTC'; + currency = wallet.chain; } else { amountSat = parseInt((amount * unitToSatoshi).toFixed(0)); - amountUnitStr = root.formatAmountStr(amountSat); - // convert unit to BTC + amountUnitStr = root.formatAmountStr(wallet, amountSat); + // convert unit to BTC or BCH amount = (amountSat * satToBtc).toFixed(8); - currency = 'BTC'; + currency = wallet.chain; } return { diff --git a/src/js/services/walletService.js b/src/js/services/walletService.js index 5414da09c..e90aa1a1d 100644 --- a/src/js/services/walletService.js +++ b/src/js/services/walletService.js @@ -2,8 +2,8 @@ angular.module('copayApp.services').factory('walletService', function($log, $timeout, lodash, trezor, ledger, intelTEE, storageService, configService, rateService, uxLanguage, $filter, gettextCatalog, bwcError, $ionicPopup, fingerprintService, ongoingProcess, gettext, $rootScope, txFormatService, $ionicModal, $state, bwcService, bitcore, popupService) { - // Ratio low amount warning (fee/amount) in incoming TX - var LOW_AMOUNT_RATIO = 0.15; + // Ratio low amount warning (fee/amount) in incoming TX + var LOW_AMOUNT_RATIO = 0.15; // Ratio of "many utxos" warning in total balance (fee/amount) var TOTAL_LOW_WARNING_RATIO = .3; @@ -130,7 +130,7 @@ angular.module('copayApp.services').factory('walletService', function($log, $tim lodash.each(txps, function(tx) { - tx = txFormatService.processTx(tx); + tx = txFormatService.processTx(wallet, tx); // no future transactions... if (tx.createdOn > now) @@ -213,14 +213,13 @@ angular.module('copayApp.services').factory('walletService', function($log, $tim // Selected unit cache.unitToSatoshi = config.settings.unitToSatoshi; cache.satToUnit = 1 / cache.unitToSatoshi; - cache.unitName = config.settings.unitName; //STR - cache.totalBalanceStr = txFormatService.formatAmount(cache.totalBalanceSat) + ' ' + cache.unitName; - cache.lockedBalanceStr = txFormatService.formatAmount(cache.lockedBalanceSat) + ' ' + cache.unitName; - cache.availableBalanceStr = txFormatService.formatAmount(cache.availableBalanceSat) + ' ' + cache.unitName; - cache.spendableBalanceStr = txFormatService.formatAmount(cache.spendableAmount) + ' ' + cache.unitName; - cache.pendingBalanceStr = txFormatService.formatAmount(cache.pendingAmount) + ' ' + cache.unitName; + cache.totalBalanceStr = txFormatService.formatAmount(cache.totalBalanceSat) + ' ' + wallet.chain; + cache.lockedBalanceStr = txFormatService.formatAmount(cache.lockedBalanceSat) + ' ' + wallet.chain; + cache.availableBalanceStr = txFormatService.formatAmount(cache.availableBalanceSat) + ' ' + wallet.chain; + cache.spendableBalanceStr = txFormatService.formatAmount(cache.spendableAmount) + ' ' + wallet.chain; + cache.pendingBalanceStr = txFormatService.formatAmount(cache.pendingAmount) + ' ' + wallet.chain; cache.alternativeName = config.settings.alternativeName; cache.alternativeIsoCode = config.settings.alternativeIsoCode; @@ -366,7 +365,7 @@ angular.module('copayApp.services').factory('walletService', function($log, $tim wallet.hasUnsafeConfirmed = false; lodash.each(txs, function(tx) { - tx = txFormatService.processTx(tx); + tx = txFormatService.processTx(wallet, tx); // no future transactions... if (tx.time > now) @@ -400,7 +399,6 @@ angular.module('copayApp.services').factory('walletService', function($log, $tim var LIMIT = 50; var requestLimit = FIRST_LIMIT; var walletId = wallet.credentials.walletId; - var config = configService.getSync().wallet.settings; var opts = opts || {}; var progressFn = opts.progressFn || function() {}; @@ -414,17 +412,15 @@ angular.module('copayApp.services').factory('walletService', function($log, $tim var fixTxsUnit = function(txs) { if (!txs || !txs[0] || !txs[0].amountStr) return; - var cacheUnit = txs[0].amountStr.split(' ')[1]; + var cacheChain = txs[0].amountStr.split(' ')[1]; - if (cacheUnit == config.unitName) + if (cacheChain == wallet.chain) return; - var name = ' ' + config.unitName; - - $log.debug('Fixing Tx Cache Unit to:' + name) + $log.debug('Fixing Tx Cache Unit to: ' + wallet.chain) lodash.each(txs, function(tx) { - tx.amountStr = txFormatService.formatAmount(tx.amount) + name; - tx.feeStr = txFormatService.formatAmount(tx.fees) + name; + tx.amountStr = txFormatService.formatAmountStr(wallet, tx.amount); + tx.feeStr = txFormatService.formatAmountStr(wallet, tx.fees); }); }; @@ -788,7 +784,7 @@ angular.module('copayApp.services').factory('walletService', function($log, $tim //prefs.email (may come from arguments) prefs.email = config.emailNotifications.email; prefs.language = uxLanguage.getCurrentLanguage(); - prefs.unit = walletSettings.unitCode; + // prefs.unit = walletSettings.unitCode; // TODO: remove, not used updateRemotePreferencesFor(lodash.clone(clients), prefs, function(err) { if (err) return cb(err); @@ -922,7 +918,7 @@ angular.module('copayApp.services').factory('walletService', function($log, $tim }; - // Approx utxo amount, from which the uxto is economically redeemable + // Approx utxo amount, from which the uxto is economically redeemable root.getMinFee = function(wallet, feeLevels, nbOutputs) { var lowLevelRate = (lodash.find(feeLevels[wallet.network], { level: 'normal', @@ -933,7 +929,7 @@ angular.module('copayApp.services').factory('walletService', function($log, $tim }; - // Approx utxo amount, from which the uxto is economically redeemable + // Approx utxo amount, from which the uxto is economically redeemable root.getLowAmount = function(wallet, feeLevels, nbOutputs) { var minFee = root.getMinFee(wallet,feeLevels, nbOutputs); return parseInt( minFee / LOW_AMOUNT_RATIO); diff --git a/src/sass/views/amount.scss b/src/sass/views/amount.scss index 627f905e8..1f6a242d6 100644 --- a/src/sass/views/amount.scss +++ b/src/sass/views/amount.scss @@ -139,6 +139,19 @@ } } .amount { + .icon-toggle { + font-size: 1.2em; + width: auto; + margin: 0.8em auto; + border: 1px solid $v-subtle-gray; + color: $v-dark-gray; + border-radius: 3px; + padding: 0 10px; + cursor: pointer; + @media(max-height: 280px) { + margin: 0.1em auto; + } + } &__editable { &--minimize { font-size: 22px; @@ -196,7 +209,6 @@ &__result-equiv { color: $v-mid-gray; font-size: 1.2em; - margin-top: 2rem; @media(max-height: 480px) { margin-top: 0; font-size: 16px; diff --git a/www/views/amount.html b/www/views/amount.html index 5dfee29e5..b3b4b0cfd 100644 --- a/www/views/amount.html +++ b/www/views/amount.html @@ -48,16 +48,19 @@
+
+
-
{{globalResult}} {{unitName}}
+
{{globalResult}} {{chain}}
≈ {{amountResult || '0.00'}} {{alternativeIsoCode}}
{{globalResult}} {{alternativeIsoCode}}
-
{{alternativeResult || '0.00'}} {{unitName}}
+
{{alternativeResult || '0.00'}} {{chain}}
diff --git a/www/views/customAmount.html b/www/views/customAmount.html index f9d5aafb7..6cd7be9c3 100644 --- a/www/views/customAmount.html +++ b/www/views/customAmount.html @@ -21,7 +21,7 @@
- +
From e1aa5cc8f83c890ba0c4db8598d2d4bea5315006 Mon Sep 17 00:00:00 2001 From: Gustavo Maximiliano Cortez Date: Thu, 24 Aug 2017 17:14:09 -0300 Subject: [PATCH 02/34] Removes Unit from settings --- src/js/controllers/preferencesUnit.js | 43 --------------------------- src/js/controllers/tab-settings.js | 1 - src/js/routes.js | 9 ------ www/views/preferencesUnit.html | 14 --------- www/views/tab-settings.html | 10 ------- 5 files changed, 77 deletions(-) delete mode 100644 src/js/controllers/preferencesUnit.js delete mode 100644 www/views/preferencesUnit.html diff --git a/src/js/controllers/preferencesUnit.js b/src/js/controllers/preferencesUnit.js deleted file mode 100644 index 235deb3b2..000000000 --- a/src/js/controllers/preferencesUnit.js +++ /dev/null @@ -1,43 +0,0 @@ -'use strict'; - -angular.module('copayApp.controllers').controller('preferencesUnitController', function($scope, $log, configService, $ionicHistory, gettextCatalog, walletService, profileService) { - - var config = configService.getSync(); - $scope.unitList = [{ - name: 'bits (1,000,000 bits = 1BTC)', - shortName: 'bits', - value: 100, - decimals: 2, - code: 'bit', - }, { - name: 'BTC', - shortName: 'BTC', - value: 100000000, - decimals: 8, - code: 'btc', - }]; - - $scope.save = function(newUnit) { - var opts = { - wallet: { - settings: { - unitName: newUnit.shortName, - unitToSatoshi: newUnit.value, - unitDecimals: newUnit.decimals, - unitCode: newUnit.code, - } - } - }; - - configService.set(opts, function(err) { - if (err) $log.warn(err); - - $ionicHistory.goBack(); - walletService.updateRemotePreferences(profileService.getWallets()) - }); - }; - - $scope.$on("$ionicView.enter", function(event, data){ - $scope.currentUnit = config.wallet.settings.unitCode; - }); -}); diff --git a/src/js/controllers/tab-settings.js b/src/js/controllers/tab-settings.js index 01ffacd42..f806b0f84 100644 --- a/src/js/controllers/tab-settings.js +++ b/src/js/controllers/tab-settings.js @@ -10,7 +10,6 @@ angular.module('copayApp.controllers').controller('tabSettingsController', funct $scope.buyAndSellServices = buyAndSellService.getLinked(); configService.whenAvailable(function(config) { - $scope.unitName = config.wallet.settings.unitName; $scope.selectedAlternative = { name: config.wallet.settings.alternativeName, isoCode: config.wallet.settings.alternativeIsoCode diff --git a/src/js/routes.js b/src/js/routes.js index 04ae0ad6f..2726a697d 100644 --- a/src/js/routes.js +++ b/src/js/routes.js @@ -392,15 +392,6 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr } } }) - .state('tabs.unit', { - url: '/unit', - views: { - 'tab-settings@tabs': { - controller: 'preferencesUnitController', - templateUrl: 'views/preferencesUnit.html' - } - } - }) .state('tabs.fee', { url: '/fee', views: { diff --git a/www/views/preferencesUnit.html b/www/views/preferencesUnit.html deleted file mode 100644 index 77edf05d7..000000000 --- a/www/views/preferencesUnit.html +++ /dev/null @@ -1,14 +0,0 @@ - - - - {{'Unit'|translate}} - - - - - - {{unit.shortName}} - - - diff --git a/www/views/tab-settings.html b/www/views/tab-settings.html index 2ccd0afdb..ff27f0d33 100644 --- a/www/views/tab-settings.html +++ b/www/views/tab-settings.html @@ -56,16 +56,6 @@ - - - - - {{'Bitcoin Unit' | translate}} - - {{unitName}} - - - From 450be84fcc87223f5540e67a4f48d14cfe83dd63 Mon Sep 17 00:00:00 2001 From: Gustavo Maximiliano Cortez Date: Fri, 25 Aug 2017 13:05:15 -0300 Subject: [PATCH 03/34] Change wallet icons for btc, bch and testnet --- src/js/services/txFormatService.js | 1 - www/img/icon-bch.svg | 12 ++++++++++++ www/img/icon-btc.svg | 12 ++++++++++++ www/img/icon-wallet-testnet.svg | 7 +++++++ www/views/buyAmazon.html | 2 +- www/views/buyCoinbase.html | 2 +- www/views/buyGlidera.html | 2 +- www/views/buyMercadoLibre.html | 2 +- www/views/confirm.html | 2 +- www/views/customAmount.html | 2 +- www/views/includes/walletItem.html | 2 +- www/views/includes/walletSelector.html | 2 +- www/views/modals/txp-details.html | 2 +- www/views/paperWallet.html | 2 +- www/views/sellCoinbase.html | 2 +- www/views/sellGlidera.html | 2 +- www/views/tab-home.html | 2 +- www/views/tab-receive.html | 2 +- www/views/tab-send.html | 2 +- www/views/tab-settings.html | 2 +- www/views/topup.html | 4 ++-- www/views/tx-details.html | 2 +- 22 files changed, 50 insertions(+), 20 deletions(-) create mode 100644 www/img/icon-bch.svg create mode 100644 www/img/icon-btc.svg create mode 100644 www/img/icon-wallet-testnet.svg diff --git a/src/js/services/txFormatService.js b/src/js/services/txFormatService.js index e203ad69a..d0be0de6f 100644 --- a/src/js/services/txFormatService.js +++ b/src/js/services/txFormatService.js @@ -18,7 +18,6 @@ angular.module('copayApp.services').factory('txFormatService', function($filter, }; root.formatAmountStr = function(wallet, satoshis) { -console.log('[txFormatService.js:20]',wallet); //TODO/ if (isNaN(satoshis)) return; return root.formatAmount(satoshis) + ' ' + wallet.chain; }; diff --git a/www/img/icon-bch.svg b/www/img/icon-bch.svg new file mode 100644 index 000000000..b02172ceb --- /dev/null +++ b/www/img/icon-bch.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/www/img/icon-btc.svg b/www/img/icon-btc.svg new file mode 100644 index 000000000..da480b629 --- /dev/null +++ b/www/img/icon-btc.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/www/img/icon-wallet-testnet.svg b/www/img/icon-wallet-testnet.svg new file mode 100644 index 000000000..c1759c599 --- /dev/null +++ b/www/img/icon-wallet-testnet.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/www/views/buyAmazon.html b/www/views/buyAmazon.html index ded0aca93..25e89148e 100644 --- a/www/views/buyAmazon.html +++ b/www/views/buyAmazon.html @@ -29,7 +29,7 @@
From
- + {{wallet ? wallet.name : '...'}}
diff --git a/www/views/buyCoinbase.html b/www/views/buyCoinbase.html index 8ae1999a0..8311c7398 100644 --- a/www/views/buyCoinbase.html +++ b/www/views/buyCoinbase.html @@ -38,7 +38,7 @@
Receive in
- + {{wallet ? wallet.name : '...'}}
diff --git a/www/views/buyGlidera.html b/www/views/buyGlidera.html index df8e386e9..6959af141 100644 --- a/www/views/buyGlidera.html +++ b/www/views/buyGlidera.html @@ -30,7 +30,7 @@
Receive in
- + {{wallet ? wallet.name : '...'}}
diff --git a/www/views/buyMercadoLibre.html b/www/views/buyMercadoLibre.html index 7791aee82..d132bb27d 100644 --- a/www/views/buyMercadoLibre.html +++ b/www/views/buyMercadoLibre.html @@ -28,7 +28,7 @@
From
- + {{wallet ? wallet.name : '...'}}
diff --git a/www/views/confirm.html b/www/views/confirm.html index a2b85ad88..831d3182c 100644 --- a/www/views/confirm.html +++ b/www/views/confirm.html @@ -65,7 +65,7 @@ From
- +
{{wallet.name}}
diff --git a/www/views/customAmount.html b/www/views/customAmount.html index 6cd7be9c3..3705c7cd9 100644 --- a/www/views/customAmount.html +++ b/www/views/customAmount.html @@ -39,7 +39,7 @@
- + {{wallet.name}}
diff --git a/www/views/includes/walletItem.html b/www/views/includes/walletItem.html index e087e1410..9d86fb573 100644 --- a/www/views/includes/walletItem.html +++ b/www/views/includes/walletItem.html @@ -1,6 +1,6 @@
- +
{{wallet.name || wallet.id}} diff --git a/www/views/includes/walletSelector.html b/www/views/includes/walletSelector.html index 28b77830f..13e4e2860 100644 --- a/www/views/includes/walletSelector.html +++ b/www/views/includes/walletSelector.html @@ -7,7 +7,7 @@ ng-click="selectWallet(w)" > - +
diff --git a/www/views/modals/txp-details.html b/www/views/modals/txp-details.html index 144202699..01d0eb88f 100644 --- a/www/views/modals/txp-details.html +++ b/www/views/modals/txp-details.html @@ -74,7 +74,7 @@ From
- +
{{wallet.name}}
diff --git a/www/views/paperWallet.html b/www/views/paperWallet.html index 81b84ba41..12d862685 100644 --- a/www/views/paperWallet.html +++ b/www/views/paperWallet.html @@ -24,7 +24,7 @@
- + {{wallet.name || wallet.id}} diff --git a/www/views/sellCoinbase.html b/www/views/sellCoinbase.html index 5827efda6..0dbc97ac9 100644 --- a/www/views/sellCoinbase.html +++ b/www/views/sellCoinbase.html @@ -29,7 +29,7 @@
From
- + {{wallet ? wallet.name : '...'}}
diff --git a/www/views/sellGlidera.html b/www/views/sellGlidera.html index cb354bac0..b4409a13f 100644 --- a/www/views/sellGlidera.html +++ b/www/views/sellGlidera.html @@ -30,7 +30,7 @@
From
- + {{wallet ? wallet.name : '...'}}
diff --git a/www/views/tab-home.html b/www/views/tab-home.html index 0af9df0cd..9deef5e39 100644 --- a/www/views/tab-home.html +++ b/www/views/tab-home.html @@ -81,7 +81,7 @@ class="item item-sub item-icon-left item-big-icon-left item-icon-right wallet" ng-click="openWallet(wallet)"> - + {{wallet.name || wallet.id}} diff --git a/www/views/tab-receive.html b/www/views/tab-receive.html index 7f42ab857..7e198ad1d 100644 --- a/www/views/tab-receive.html +++ b/www/views/tab-receive.html @@ -63,7 +63,7 @@
- + {{wallet.name || wallet.id}} diff --git a/www/views/tab-send.html b/www/views/tab-send.html index 6b36814b0..0abbe3039 100644 --- a/www/views/tab-send.html +++ b/www/views/tab-send.html @@ -69,7 +69,7 @@
- + {{item.name}} diff --git a/www/views/tab-settings.html b/www/views/tab-settings.html index ff27f0d33..74cba161d 100644 --- a/www/views/tab-settings.html +++ b/www/views/tab-settings.html @@ -95,7 +95,7 @@ ui-sref="tabs.preferences({'walletId': item.id})" ng-repeat="item in wallets track by $index"> - + {{item.name || item.id}} diff --git a/www/views/topup.html b/www/views/topup.html index 9dee6b185..1a093544c 100644 --- a/www/views/topup.html +++ b/www/views/topup.html @@ -31,10 +31,10 @@
-
From
+
From {{wallet.chain}}
- + {{wallet ? wallet.name : '...'}}
diff --git a/www/views/tx-details.html b/www/views/tx-details.html index fbf1cc6ab..df5e66591 100644 --- a/www/views/tx-details.html +++ b/www/views/tx-details.html @@ -53,7 +53,7 @@ To
- +
{{wallet.name}}
From be15f7bc7c523662a393c293caa6f4567dc811fa Mon Sep 17 00:00:00 2001 From: Gustavo Maximiliano Cortez Date: Fri, 25 Aug 2017 15:26:44 -0300 Subject: [PATCH 04/34] Confirm without chain param, show all available wallets --- src/js/controllers/confirm.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/js/controllers/confirm.js b/src/js/controllers/confirm.js index 4135ec4b3..9b7a87df9 100644 --- a/src/js/controllers/confirm.js +++ b/src/js/controllers/confirm.js @@ -138,7 +138,7 @@ angular.module('copayApp.controllers').controller('confirmController', function( toEmail: data.stateParams.toEmail, toColor: data.stateParams.toColor, network: (new bitcore.Address(data.stateParams.toAddress)).network.name, - chain: data.stateParams.chain || 'BTC', + chain: data.stateParams.chain, txp: {}, }; From ef8302f8546e5e5fd4ace2a1b61d30008b0abed1 Mon Sep 17 00:00:00 2001 From: Gustavo Maximiliano Cortez Date: Fri, 25 Aug 2017 15:50:57 -0300 Subject: [PATCH 05/34] Handler bip21 with extra param chain --- src/js/services/incomingData.js | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/js/services/incomingData.js b/src/js/services/incomingData.js index c9d633eb8..ac1274577 100644 --- a/src/js/services/incomingData.js +++ b/src/js/services/incomingData.js @@ -46,7 +46,7 @@ angular.module('copayApp.services').factory('incomingData', function($log, $stat return true; } - function goSend(addr, amount, message) { + function goSend(addr, amount, message, chain) { $state.go('tabs.send', {}, { 'reload': true, 'notify': $state.current.name == 'tabs.send' ? false : true @@ -57,11 +57,13 @@ angular.module('copayApp.services').factory('incomingData', function($log, $stat $state.transitionTo('tabs.send.confirm', { toAmount: amount, toAddress: addr, - description: message + description: message, + chain: chain }); } else { $state.transitionTo('tabs.send.amount', { - toAddress: addr + toAddress: addr, + chain: chain }); } }, 100); @@ -90,16 +92,17 @@ angular.module('copayApp.services').factory('incomingData', function($log, $stat var message = parsed.message; var amount = parsed.amount ? parsed.amount : ''; + var chain = parsed.extras && parsed.extras.chain ? (parsed.extras.chain).toUpperCase() : ''; if (parsed.r) { payproService.getPayProDetails(parsed.r, function(err, details) { if (err) { - if (addr && amount) goSend(addr, amount, message); + if (addr && amount) goSend(addr, amount, message, chain); else popupService.showAlert(gettextCatalog.getString('Error'), err); } else handlePayPro(details); }); } else { - goSend(addr, amount, message); + goSend(addr, amount, message, chain); } return true; From ac5ede702d75fd9cfbee483d2b2d9887f8d6791d Mon Sep 17 00:00:00 2001 From: Gustavo Maximiliano Cortez Date: Sun, 27 Aug 2017 18:00:39 -0300 Subject: [PATCH 06/34] Fix btc/bch icons. Adds coin param to createWallet method --- src/js/controllers/create.js | 2 ++ src/js/services/profileService.js | 10 +++++++--- www/views/buyAmazon.html | 2 +- www/views/buyCoinbase.html | 2 +- www/views/buyGlidera.html | 2 +- www/views/buyMercadoLibre.html | 2 +- www/views/customAmount.html | 2 +- www/views/includes/walletItem.html | 2 +- www/views/includes/walletSelector.html | 2 +- www/views/modals/txp-details.html | 2 +- www/views/paperWallet.html | 2 +- www/views/sellCoinbase.html | 2 +- www/views/sellGlidera.html | 2 +- www/views/tab-create-personal.html | 10 ++++++++++ www/views/tab-home.html | 2 +- www/views/tab-receive.html | 2 +- www/views/tab-send.html | 2 +- www/views/tab-settings.html | 2 +- www/views/topup.html | 2 +- www/views/tx-details.html | 2 +- 20 files changed, 36 insertions(+), 20 deletions(-) diff --git a/src/js/controllers/create.js b/src/js/controllers/create.js index c43bf406b..b32e8bd25 100644 --- a/src/js/controllers/create.js +++ b/src/js/controllers/create.js @@ -27,6 +27,7 @@ angular.module('copayApp.controllers').controller('createController', $scope.formData.bwsurl = defaults.bws.url; $scope.TCValues = lodash.range(2, defaults.limits.totalCopayers + 1); $scope.formData.derivationPath = derivationPathHelper.default; + $scope.formData.coin = 'btc'; $scope.setTotalCopayers(tc); updateRCSelect(tc); resetPasswordFields(); @@ -137,6 +138,7 @@ angular.module('copayApp.controllers').controller('createController', bwsurl: $scope.formData.bwsurl, singleAddress: $scope.formData.singleAddressEnabled, walletPrivKey: $scope.formData._walletPrivKey, // Only for testing + coin: $scope.formData.coin }; var setSeed = $scope.formData.seedSource.id == 'set'; diff --git a/src/js/services/profileService.js b/src/js/services/profileService.js index b1d7b30e1..cb7aa4eb7 100644 --- a/src/js/services/profileService.js +++ b/src/js/services/profileService.js @@ -89,7 +89,10 @@ angular.module('copayApp.services') wallet.copayerId = wallet.credentials.copayerId; wallet.m = wallet.credentials.m; wallet.n = wallet.credentials.n; - wallet.chain = wallet.credentials.chain; + wallet.chain = wallet.credentials.chain ? (wallet.credentials.chain).toUpperCase() : 'BTC'; + + // TODO: Should return "chain" = "BTC" or "BCH" + client.credentials.chain = 'BTC'; root.updateWalletSettings(wallet); root.wallet[walletId] = wallet; @@ -227,8 +230,7 @@ angular.module('copayApp.services') bwsurl: getBWSURL(credentials.walletId), }); - // TODO: Should return "chain" = "BTC" or "BCH" - client.credentials.chain = 'BTC'; + var skipKeyValidation = shouldSkipValidation(credentials.walletId); if (!skipKeyValidation) @@ -395,6 +397,7 @@ angular.module('copayApp.services') network: opts.networkName, singleAddress: opts.singleAddress, walletPrivKey: opts.walletPrivKey, + coin: opts.coin }, function(err, secret) { if (err) return bwcError.cb(err, gettextCatalog.getString('Error creating wallet'), cb); return cb(null, walletClient, secret); @@ -687,6 +690,7 @@ angular.module('copayApp.services') opts.m = 1; opts.n = 1; opts.networkName = 'livenet'; + opts.coin = 'btc'; root.createWallet(opts, cb); }; diff --git a/www/views/buyAmazon.html b/www/views/buyAmazon.html index 25e89148e..704f29167 100644 --- a/www/views/buyAmazon.html +++ b/www/views/buyAmazon.html @@ -29,7 +29,7 @@
From
- + {{wallet ? wallet.name : '...'}}
diff --git a/www/views/buyCoinbase.html b/www/views/buyCoinbase.html index 8311c7398..013d9b053 100644 --- a/www/views/buyCoinbase.html +++ b/www/views/buyCoinbase.html @@ -38,7 +38,7 @@
Receive in
- + {{wallet ? wallet.name : '...'}}
diff --git a/www/views/buyGlidera.html b/www/views/buyGlidera.html index 6959af141..1acbbedea 100644 --- a/www/views/buyGlidera.html +++ b/www/views/buyGlidera.html @@ -30,7 +30,7 @@
Receive in
- + {{wallet ? wallet.name : '...'}}
diff --git a/www/views/buyMercadoLibre.html b/www/views/buyMercadoLibre.html index d132bb27d..a4ff67c90 100644 --- a/www/views/buyMercadoLibre.html +++ b/www/views/buyMercadoLibre.html @@ -28,7 +28,7 @@
From
- + {{wallet ? wallet.name : '...'}}
diff --git a/www/views/customAmount.html b/www/views/customAmount.html index 3705c7cd9..95c4bd0fb 100644 --- a/www/views/customAmount.html +++ b/www/views/customAmount.html @@ -39,7 +39,7 @@
- + {{wallet.name}}
diff --git a/www/views/includes/walletItem.html b/www/views/includes/walletItem.html index 9d86fb573..c44abef1c 100644 --- a/www/views/includes/walletItem.html +++ b/www/views/includes/walletItem.html @@ -1,6 +1,6 @@
- +
{{wallet.name || wallet.id}} diff --git a/www/views/includes/walletSelector.html b/www/views/includes/walletSelector.html index 13e4e2860..add64d0cd 100644 --- a/www/views/includes/walletSelector.html +++ b/www/views/includes/walletSelector.html @@ -7,7 +7,7 @@ ng-click="selectWallet(w)" > - +
diff --git a/www/views/modals/txp-details.html b/www/views/modals/txp-details.html index 01d0eb88f..beb122b9d 100644 --- a/www/views/modals/txp-details.html +++ b/www/views/modals/txp-details.html @@ -74,7 +74,7 @@ From
- +
{{wallet.name}}
diff --git a/www/views/paperWallet.html b/www/views/paperWallet.html index 12d862685..904cb5b6c 100644 --- a/www/views/paperWallet.html +++ b/www/views/paperWallet.html @@ -24,7 +24,7 @@
- + {{wallet.name || wallet.id}} diff --git a/www/views/sellCoinbase.html b/www/views/sellCoinbase.html index 0dbc97ac9..6972c5f98 100644 --- a/www/views/sellCoinbase.html +++ b/www/views/sellCoinbase.html @@ -29,7 +29,7 @@
From
- + {{wallet ? wallet.name : '...'}}
diff --git a/www/views/sellGlidera.html b/www/views/sellGlidera.html index b4409a13f..ee6e262c9 100644 --- a/www/views/sellGlidera.html +++ b/www/views/sellGlidera.html @@ -30,7 +30,7 @@
From
- + {{wallet ? wallet.name : '...'}}
diff --git a/www/views/tab-create-personal.html b/www/views/tab-create-personal.html index 9b695aefc..38bb2794f 100644 --- a/www/views/tab-create-personal.html +++ b/www/views/tab-create-personal.html @@ -19,6 +19,16 @@ required> + +
diff --git a/www/views/tab-home.html b/www/views/tab-home.html index 9deef5e39..7ffcb5629 100644 --- a/www/views/tab-home.html +++ b/www/views/tab-home.html @@ -81,7 +81,7 @@ class="item item-sub item-icon-left item-big-icon-left item-icon-right wallet" ng-click="openWallet(wallet)"> - + {{wallet.name || wallet.id}} diff --git a/www/views/tab-receive.html b/www/views/tab-receive.html index 7e198ad1d..c78317451 100644 --- a/www/views/tab-receive.html +++ b/www/views/tab-receive.html @@ -63,7 +63,7 @@
- + {{wallet.name || wallet.id}} diff --git a/www/views/tab-send.html b/www/views/tab-send.html index 0abbe3039..8b1e0c3eb 100644 --- a/www/views/tab-send.html +++ b/www/views/tab-send.html @@ -69,7 +69,7 @@
- + {{item.name}} diff --git a/www/views/tab-settings.html b/www/views/tab-settings.html index 74cba161d..e6b3f0ad8 100644 --- a/www/views/tab-settings.html +++ b/www/views/tab-settings.html @@ -95,7 +95,7 @@ ui-sref="tabs.preferences({'walletId': item.id})" ng-repeat="item in wallets track by $index"> - + {{item.name || item.id}} diff --git a/www/views/topup.html b/www/views/topup.html index 1a093544c..a9329ba94 100644 --- a/www/views/topup.html +++ b/www/views/topup.html @@ -34,7 +34,7 @@
From {{wallet.chain}}
- + {{wallet ? wallet.name : '...'}}
diff --git a/www/views/tx-details.html b/www/views/tx-details.html index df5e66591..3e281b8bf 100644 --- a/www/views/tx-details.html +++ b/www/views/tx-details.html @@ -53,7 +53,7 @@ To
- +
{{wallet.name}}
From 2c33f186af2f439c04dfb4cc431433a848aa3966 Mon Sep 17 00:00:00 2001 From: Gustavo Maximiliano Cortez Date: Sun, 27 Aug 2017 23:50:27 -0300 Subject: [PATCH 07/34] Ref chain to coin. Adds create wallet --- src/js/controllers/addresses.js | 7 +------ src/js/controllers/amount.js | 16 ++++++++-------- src/js/controllers/buyAmazon.js | 2 +- src/js/controllers/buyCoinbase.js | 4 ++-- src/js/controllers/buyGlidera.js | 4 ++-- src/js/controllers/buyMercadoLibre.js | 2 +- src/js/controllers/confirm.js | 8 ++++---- src/js/controllers/customAmount.js | 6 +++--- src/js/controllers/sellCoinbase.js | 4 ++-- src/js/controllers/sellGlidera.js | 4 ++-- src/js/controllers/tab-receive.js | 2 +- src/js/controllers/topup.js | 2 +- src/js/routes.js | 23 ++++++++++++++--------- src/js/services/feeService.js | 4 ++-- src/js/services/incomingData.js | 12 ++++++------ src/js/services/profileService.js | 11 ++++++----- src/js/services/txFormatService.js | 6 +++--- src/js/services/walletService.js | 16 ++++++++-------- www/views/amount.html | 6 +++--- www/views/buyAmazon.html | 2 +- www/views/buyCoinbase.html | 2 +- www/views/buyGlidera.html | 2 +- www/views/buyMercadoLibre.html | 2 +- www/views/confirm.html | 2 +- www/views/customAmount.html | 4 ++-- www/views/includes/walletItem.html | 2 +- www/views/includes/walletSelector.html | 2 +- www/views/modals/txp-details.html | 2 +- www/views/paperWallet.html | 2 +- www/views/sellCoinbase.html | 2 +- www/views/sellGlidera.html | 2 +- www/views/tab-home.html | 2 +- www/views/tab-receive.html | 2 +- www/views/tab-send.html | 2 +- www/views/tab-settings.html | 2 +- www/views/topup.html | 4 ++-- www/views/tx-details.html | 2 +- 37 files changed, 90 insertions(+), 89 deletions(-) diff --git a/src/js/controllers/addresses.js b/src/js/controllers/addresses.js index 3bc0b4fea..97cca45e1 100644 --- a/src/js/controllers/addresses.js +++ b/src/js/controllers/addresses.js @@ -1,13 +1,8 @@ 'use strict'; -angular.module('copayApp.controllers').controller('addressesController', function($scope, $log, $stateParams, $state, $timeout, $ionicHistory, $ionicScrollDelegate, configService, popupService, gettextCatalog, ongoingProcess, lodash, profileService, walletService, bwcError, platformInfo, appConfigService, txFormatService, feeService) { +angular.module('copayApp.controllers').controller('addressesController', function($scope, $log, $stateParams, $state, $timeout, $ionicHistory, $ionicScrollDelegate, popupService, gettextCatalog, ongoingProcess, lodash, profileService, walletService, bwcError, platformInfo, appConfigService, txFormatService, feeService) { var UNUSED_ADDRESS_LIMIT = 5; var BALANCE_ADDRESS_LIMIT = 5; - var config = configService.getSync().wallet.settings; - var unitName = config.unitName; - var unitToSatoshi = config.unitToSatoshi; - var satToUnit = 1 / unitToSatoshi; - var unitDecimals = config.unitDecimals; var withBalance, cachedWallet; $scope.isCordova = platformInfo.isCordova; diff --git a/src/js/controllers/amount.js b/src/js/controllers/amount.js index 55c101024..03e9743af 100644 --- a/src/js/controllers/amount.js +++ b/src/js/controllers/amount.js @@ -21,8 +21,8 @@ angular.module('copayApp.controllers').controller('amountController', function($ $scope.nextStep = data.stateParams.nextStep; $scope.currency = data.stateParams.currency; $scope.forceCurrency = data.stateParams.forceCurrency; - $scope.forceChain = data.stateParams.forceChain || null; - $scope.chain = $scope.forceChain || data.stateParams.chain || 'BTC'; + $scope.forceCoin = data.stateParams.forceCoin; + $scope.coin = data.stateParams.coin || 'btc'; $scope.showMenu = $ionicHistory.backView() && ($ionicHistory.backView().stateName == 'tabs.send' || $ionicHistory.backView().stateName == 'tabs.bitpayCard'); @@ -125,10 +125,10 @@ angular.module('copayApp.controllers').controller('amountController', function($ } }; - $scope.toggleChain = function() { - if ($scope.forceCurrency || $scope.forceChain) return; + $scope.toggleCoin = function() { + if ($scope.forceCurrency || $scope.forceCoin) return; - $scope.chain = $scope.chain == 'BTC' ? 'BCH' : 'BTC'; + $scope.coin = $scope.coin == 'btc' ? 'bch' : 'btc'; }; function checkFontSize() { @@ -234,8 +234,8 @@ angular.module('copayApp.controllers').controller('amountController', function($ $state.transitionTo($scope.nextStep, { id: _id, amount: $scope.useSendMax ? null : _amount, - currency: $scope.showAlternativeAmount ? $scope.alternativeIsoCode : $scope.chain, - chain: $scope.chain, + currency: $scope.showAlternativeAmount ? $scope.alternativeIsoCode : $scope.coin, + coin: $scope.coin, useSendMax: $scope.useSendMax }); } else { @@ -247,7 +247,7 @@ angular.module('copayApp.controllers').controller('amountController', function($ toName: $scope.toName, toEmail: $scope.toEmail, toColor: $scope.toColor, - chain: $scope.chain, + coin: $scope.coin, useSendMax: $scope.useSendMax }); } diff --git a/src/js/controllers/buyAmazon.js b/src/js/controllers/buyAmazon.js index e2418e80e..ee3732e95 100644 --- a/src/js/controllers/buyAmazon.js +++ b/src/js/controllers/buyAmazon.js @@ -293,7 +293,7 @@ angular.module('copayApp.controllers').controller('buyAmazonController', functio onlyComplete: true, network: $scope.network, hasFunds: true, - chain: 'BTC' + coin: 'btc' }); if (lodash.isEmpty($scope.wallets)) { showErrorAndBack(null, gettextCatalog.getString('No wallets available')); diff --git a/src/js/controllers/buyCoinbase.js b/src/js/controllers/buyCoinbase.js index 57d9db779..d9690f058 100644 --- a/src/js/controllers/buyCoinbase.js +++ b/src/js/controllers/buyCoinbase.js @@ -88,7 +88,7 @@ angular.module('copayApp.controllers').controller('buyCoinbaseController', funct }); $scope.$on("$ionicView.beforeEnter", function(event, data) { - $scope.isFiat = data.stateParams.currency != 'BCH' && data.stateParams.currency != 'BTC' ? true : false; + $scope.isFiat = data.stateParams.currency != 'BTC' ? true : false; amount = data.stateParams.amount; currency = data.stateParams.currency; @@ -96,7 +96,7 @@ angular.module('copayApp.controllers').controller('buyCoinbaseController', funct $scope.wallets = profileService.getWallets({ onlyComplete: true, network: $scope.network, - chain: 'BTC' + coin: 'btc' }); if (lodash.isEmpty($scope.wallets)) { diff --git a/src/js/controllers/buyGlidera.js b/src/js/controllers/buyGlidera.js index 3b0ef1265..536dbc1e8 100644 --- a/src/js/controllers/buyGlidera.js +++ b/src/js/controllers/buyGlidera.js @@ -70,7 +70,7 @@ angular.module('copayApp.controllers').controller('buyGlideraController', functi }); $scope.$on("$ionicView.beforeEnter", function(event, data) { - $scope.isFiat = data.stateParams.currency != 'BCH' && data.stateParams.currency != 'BTC' ? true : false; + $scope.isFiat = data.stateParams.currency != 'BTC' ? true : false; amount = data.stateParams.amount; currency = data.stateParams.currency; @@ -78,7 +78,7 @@ angular.module('copayApp.controllers').controller('buyGlideraController', functi $scope.wallets = profileService.getWallets({ onlyComplete: true, network: $scope.network, - chain: 'BTC' + coin: 'btc' }); if (lodash.isEmpty($scope.wallets)) { diff --git a/src/js/controllers/buyMercadoLibre.js b/src/js/controllers/buyMercadoLibre.js index a89a38d83..153a715d5 100644 --- a/src/js/controllers/buyMercadoLibre.js +++ b/src/js/controllers/buyMercadoLibre.js @@ -285,7 +285,7 @@ angular.module('copayApp.controllers').controller('buyMercadoLibreController', f $scope.wallets = profileService.getWallets({ onlyComplete: true, network: $scope.network, - chain: 'BTC' + coin: 'btc' }); if (lodash.isEmpty($scope.wallets)) { showErrorAndBack(null, gettextCatalog.getString('No wallets available')); diff --git a/src/js/controllers/confirm.js b/src/js/controllers/confirm.js index 9b7a87df9..e2065ebb2 100644 --- a/src/js/controllers/confirm.js +++ b/src/js/controllers/confirm.js @@ -69,7 +69,7 @@ angular.module('copayApp.controllers').controller('confirmController', function( $scope.$on("$ionicView.beforeEnter", function(event, data) { - function setWalletSelector(chain, network, minAmount, cb) { + function setWalletSelector(coin, network, minAmount, cb) { // no min amount? (sendMax) => look for no empty wallets minAmount = minAmount || 1; @@ -77,7 +77,7 @@ angular.module('copayApp.controllers').controller('confirmController', function( $scope.wallets = profileService.getWallets({ onlyComplete: true, network: network, - chain: chain + coin: coin }); if (!$scope.wallets || !$scope.wallets.length) { @@ -138,7 +138,7 @@ angular.module('copayApp.controllers').controller('confirmController', function( toEmail: data.stateParams.toEmail, toColor: data.stateParams.toColor, network: (new bitcore.Address(data.stateParams.toAddress)).network.name, - chain: data.stateParams.chain, + coin: data.stateParams.coin, txp: {}, }; @@ -151,7 +151,7 @@ angular.module('copayApp.controllers').controller('confirmController', function( $scope.walletSelectorTitle = gettextCatalog.getString('Send from'); - setWalletSelector(tx.chain, tx.network, tx.toAmount, function(err) { + setWalletSelector(tx.coin, tx.network, tx.toAmount, function(err) { if (err) { return exitWithError('Could not update wallets'); } diff --git a/src/js/controllers/customAmount.js b/src/js/controllers/customAmount.js index 093edd568..4fa97ed18 100644 --- a/src/js/controllers/customAmount.js +++ b/src/js/controllers/customAmount.js @@ -28,7 +28,7 @@ angular.module('copayApp.controllers').controller('customAmountController', func $scope.address = addr; - $scope.chain = (data.stateParams.chain).toLowerCase(); + $scope.coin = (data.stateParams.coin).toLowerCase(); var parsedAmount = txFormatService.parseAmount( $scope.wallet, data.stateParams.amount, @@ -43,7 +43,7 @@ angular.module('copayApp.controllers').controller('customAmountController', func // Convert to BTC or BCH var config = configService.getSync().wallet.settings; var amountUnit = txFormatService.satToUnit(parsedAmount.amountSat); - var btcParsedAmount = txFormatService.parseAmount($scope.wallet, amountUnit, $scope.wallet.chain); + var btcParsedAmount = txFormatService.parseAmount($scope.wallet, amountUnit, $scope.wallet.coin); $scope.amountBtc = btcParsedAmount.amount; $scope.altAmountStr = btcParsedAmount.amountUnitStr; @@ -68,7 +68,7 @@ angular.module('copayApp.controllers').controller('customAmountController', func } $scope.copyToClipboard = function() { - return 'bitcoin:' + $scope.address + '?amount=' + $scope.amountBtc + '&chain=' + $scope.chain; + return 'bitcoin:' + $scope.address + '?amount=' + $scope.amountBtc + '&coin=' + $scope.coin; }; }); diff --git a/src/js/controllers/sellCoinbase.js b/src/js/controllers/sellCoinbase.js index 3bee99602..624748f7c 100644 --- a/src/js/controllers/sellCoinbase.js +++ b/src/js/controllers/sellCoinbase.js @@ -170,7 +170,7 @@ angular.module('copayApp.controllers').controller('sellCoinbaseController', func }); $scope.$on("$ionicView.beforeEnter", function(event, data) { - $scope.isFiat = data.stateParams.currency != 'BCH' && data.stateParams.currency != 'BTC' ? true : false; + $scope.isFiat = data.stateParams.currency != 'BTC' ? true : false; amount = data.stateParams.amount; currency = data.stateParams.currency; @@ -183,7 +183,7 @@ angular.module('copayApp.controllers').controller('sellCoinbaseController', func onlyComplete: true, network: $scope.network, hasFunds: true, - chain: 'BTC' + coin: 'btc' }); if (lodash.isEmpty($scope.wallets)) { diff --git a/src/js/controllers/sellGlidera.js b/src/js/controllers/sellGlidera.js index 0978590c7..bf5db0f7a 100644 --- a/src/js/controllers/sellGlidera.js +++ b/src/js/controllers/sellGlidera.js @@ -70,7 +70,7 @@ angular.module('copayApp.controllers').controller('sellGlideraController', funct }); $scope.$on("$ionicView.beforeEnter", function(event, data) { - $scope.isFiat = data.stateParams.currency != 'BCH' && data.stateParams.currency != 'BTC' ? true : false; + $scope.isFiat = data.stateParams.currency != 'BTC' ? true : false; amount = data.stateParams.amount; currency = data.stateParams.currency; @@ -80,7 +80,7 @@ angular.module('copayApp.controllers').controller('sellGlideraController', funct onlyComplete: true, network: $scope.network, hasFunds: true, - chain: 'BTC' + coin: 'btc' }); if (lodash.isEmpty($scope.wallets)) { diff --git a/src/js/controllers/tab-receive.js b/src/js/controllers/tab-receive.js index 5bd61c70b..43785ab8b 100644 --- a/src/js/controllers/tab-receive.js +++ b/src/js/controllers/tab-receive.js @@ -9,7 +9,7 @@ angular.module('copayApp.controllers').controller('tabReceiveController', functi $scope.requestSpecificAmount = function() { $state.go('tabs.paymentRequest.amount', { id: $scope.wallet.credentials.walletId, - forceChain: $scope.wallet.chain + coin: $scope.wallet.coin }); }; diff --git a/src/js/controllers/topup.js b/src/js/controllers/topup.js index d5959e545..d72ad8e2a 100644 --- a/src/js/controllers/topup.js +++ b/src/js/controllers/topup.js @@ -257,7 +257,7 @@ angular.module('copayApp.controllers').controller('topUpController', function($s onlyComplete: true, network: bitpayService.getEnvironment().network, hasFunds: true, - chain: 'BTC' + coin: 'btc' }); if (lodash.isEmpty($scope.wallets)) { diff --git a/src/js/routes.js b/src/js/routes.js index 2726a697d..e8beece45 100644 --- a/src/js/routes.js +++ b/src/js/routes.js @@ -287,7 +287,7 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr */ .state('tabs.send.amount', { - url: '/amount/:recipientType/:toAddress/:toName/:toEmail/:toColor/:chain', + url: '/amount/:recipientType/:toAddress/:toName/:toEmail/:toColor/:coin', views: { 'tab-send@tabs': { controller: 'amountController', @@ -296,7 +296,7 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr } }) .state('tabs.send.confirm', { - url: '/confirm/:recipientType/:toAddress/:toName/:toAmount/:toEmail/:toColor/:description/:chain/:useSendMax', + url: '/confirm/:recipientType/:toAddress/:toName/:toAmount/:toEmail/:toColor/:description/:coin/:useSendMax', views: { 'tab-send@tabs': { controller: 'confirmController', @@ -672,7 +672,7 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr }) .state('tabs.paymentRequest.amount', { - url: '/amount/:forceChain', + url: '/amount/:coin', views: { 'tab-receive@tabs': { controller: 'amountController', @@ -681,7 +681,7 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr } }) .state('tabs.paymentRequest.confirm', { - url: '/confirm/:amount/:currency/:chain', + url: '/confirm/:amount/:currency/:coin', views: { 'tab-receive@tabs': { controller: 'customAmountController', @@ -916,7 +916,8 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr } }, params: { - forceChain: 'BTC' + coin: 'btc', + forceCoin: true } }) .state('tabs.buyandsell.glidera.amount', { @@ -972,7 +973,8 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr } }, params: { - forceChain: 'BTC' + coin: 'btc', + forceCoin: true } }) .state('tabs.preferences.coinbase', { @@ -1062,7 +1064,8 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr nextStep: 'tabs.giftcards.mercadoLibre.buy', currency: 'BRL', forceCurrency: true, - forceChain: 'BTC' + coin: 'btc', + forceCoin: true } }) .state('tabs.giftcards.mercadoLibre.buy', { @@ -1114,7 +1117,8 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr nextStep: 'tabs.giftcards.amazon.buy', currency: 'USD', forceCurrency: true, - forceChain: 'BTC' + coin: 'btc', + forceCoin: true } }) .state('tabs.giftcards.amazon.buy', { @@ -1154,7 +1158,8 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr params: { id: null, currency: 'USD', - forceChain: 'BTC', + coin: 'btc', + forceCoin: true, useSendMax: null } }) diff --git a/src/js/services/feeService.js b/src/js/services/feeService.js index 852c0cf31..e827cac1b 100644 --- a/src/js/services/feeService.js +++ b/src/js/services/feeService.js @@ -65,8 +65,8 @@ angular.module('copayApp.services').factory('feeService', function($log, $timeou var walletClient = bwcService.getClient(); - walletClient.getFeeLevels('livenet', function(errLivenet, levelsLivenet) { - walletClient.getFeeLevels('testnet', function(errTestnet, levelsTestnet) { + walletClient.getFeeLevels('btc', 'livenet', function(errLivenet, levelsLivenet) { + walletClient.getFeeLevels('btc', 'testnet', function(errTestnet, levelsTestnet) { if (errLivenet || errTestnet) { return cb(gettextCatalog.getString('Could not get dynamic fee')); } diff --git a/src/js/services/incomingData.js b/src/js/services/incomingData.js index ac1274577..48f037c7a 100644 --- a/src/js/services/incomingData.js +++ b/src/js/services/incomingData.js @@ -46,7 +46,7 @@ angular.module('copayApp.services').factory('incomingData', function($log, $stat return true; } - function goSend(addr, amount, message, chain) { + function goSend(addr, amount, message, coin) { $state.go('tabs.send', {}, { 'reload': true, 'notify': $state.current.name == 'tabs.send' ? false : true @@ -58,12 +58,12 @@ angular.module('copayApp.services').factory('incomingData', function($log, $stat toAmount: amount, toAddress: addr, description: message, - chain: chain + coin: coin }); } else { $state.transitionTo('tabs.send.amount', { toAddress: addr, - chain: chain + coin: coin }); } }, 100); @@ -92,17 +92,17 @@ angular.module('copayApp.services').factory('incomingData', function($log, $stat var message = parsed.message; var amount = parsed.amount ? parsed.amount : ''; - var chain = parsed.extras && parsed.extras.chain ? (parsed.extras.chain).toUpperCase() : ''; + var coin = parsed.extras && parsed.extras.coin ? (parsed.extras.coin).toUpperCase() : ''; if (parsed.r) { payproService.getPayProDetails(parsed.r, function(err, details) { if (err) { - if (addr && amount) goSend(addr, amount, message, chain); + if (addr && amount) goSend(addr, amount, message, coin); else popupService.showAlert(gettextCatalog.getString('Error'), err); } else handlePayPro(details); }); } else { - goSend(addr, amount, message, chain); + goSend(addr, amount, message, coin); } return true; diff --git a/src/js/services/profileService.js b/src/js/services/profileService.js index cb7aa4eb7..bbba03cf6 100644 --- a/src/js/services/profileService.js +++ b/src/js/services/profileService.js @@ -89,10 +89,11 @@ angular.module('copayApp.services') wallet.copayerId = wallet.credentials.copayerId; wallet.m = wallet.credentials.m; wallet.n = wallet.credentials.n; - wallet.chain = wallet.credentials.chain ? (wallet.credentials.chain).toUpperCase() : 'BTC'; + wallet.coin = wallet.credentials.coin ? wallet.credentials.coin : 'btc'; +console.log('[profileService.js:92]',wallet); //TODO/ - // TODO: Should return "chain" = "BTC" or "BCH" - client.credentials.chain = 'BTC'; + // TODO: Should return "coin" = "btc" or "bch" + //client.credentials.coin = 'btc'; root.updateWalletSettings(wallet); root.wallet[walletId] = wallet; @@ -756,9 +757,9 @@ angular.module('copayApp.services') var ret = lodash.values(root.wallet); - if (opts.chain) { + if (opts.coin) { ret = lodash.filter(ret, function(x) { - return (x.credentials.chain == opts.chain); + return (x.credentials.coin == opts.coin); }); } diff --git a/src/js/services/txFormatService.js b/src/js/services/txFormatService.js index d0be0de6f..428286d1a 100644 --- a/src/js/services/txFormatService.js +++ b/src/js/services/txFormatService.js @@ -19,7 +19,7 @@ angular.module('copayApp.services').factory('txFormatService', function($filter, root.formatAmountStr = function(wallet, satoshis) { if (isNaN(satoshis)) return; - return root.formatAmount(satoshis) + ' ' + wallet.chain; + return root.formatAmount(satoshis) + ' ' + wallet.coin; }; root.toFiat = function(satoshis, code, cb) { @@ -196,13 +196,13 @@ angular.module('copayApp.services').factory('txFormatService', function($filter, amountUnitStr = root.formatAmountStr(wallet, amountSat); // convert sat to BTC or BCH amount = (amountSat * satToBtc).toFixed(8); - currency = wallet.chain; + currency = (wallet.coin).toUpperCase(); } else { amountSat = parseInt((amount * unitToSatoshi).toFixed(0)); amountUnitStr = root.formatAmountStr(wallet, amountSat); // convert unit to BTC or BCH amount = (amountSat * satToBtc).toFixed(8); - currency = wallet.chain; + currency = (wallet.coin).toUpperCase(); } return { diff --git a/src/js/services/walletService.js b/src/js/services/walletService.js index e90aa1a1d..496765ea9 100644 --- a/src/js/services/walletService.js +++ b/src/js/services/walletService.js @@ -215,11 +215,11 @@ angular.module('copayApp.services').factory('walletService', function($log, $tim cache.satToUnit = 1 / cache.unitToSatoshi; //STR - cache.totalBalanceStr = txFormatService.formatAmount(cache.totalBalanceSat) + ' ' + wallet.chain; - cache.lockedBalanceStr = txFormatService.formatAmount(cache.lockedBalanceSat) + ' ' + wallet.chain; - cache.availableBalanceStr = txFormatService.formatAmount(cache.availableBalanceSat) + ' ' + wallet.chain; - cache.spendableBalanceStr = txFormatService.formatAmount(cache.spendableAmount) + ' ' + wallet.chain; - cache.pendingBalanceStr = txFormatService.formatAmount(cache.pendingAmount) + ' ' + wallet.chain; + cache.totalBalanceStr = txFormatService.formatAmount(cache.totalBalanceSat) + ' ' + wallet.coin; + cache.lockedBalanceStr = txFormatService.formatAmount(cache.lockedBalanceSat) + ' ' + wallet.coin; + cache.availableBalanceStr = txFormatService.formatAmount(cache.availableBalanceSat) + ' ' + wallet.coin; + cache.spendableBalanceStr = txFormatService.formatAmount(cache.spendableAmount) + ' ' + wallet.coin; + cache.pendingBalanceStr = txFormatService.formatAmount(cache.pendingAmount) + ' ' + wallet.coin; cache.alternativeName = config.settings.alternativeName; cache.alternativeIsoCode = config.settings.alternativeIsoCode; @@ -412,12 +412,12 @@ angular.module('copayApp.services').factory('walletService', function($log, $tim var fixTxsUnit = function(txs) { if (!txs || !txs[0] || !txs[0].amountStr) return; - var cacheChain = txs[0].amountStr.split(' ')[1]; + var cacheCoin = txs[0].amountStr.split(' ')[1]; - if (cacheChain == wallet.chain) + if (cacheCoin == wallet.coin) return; - $log.debug('Fixing Tx Cache Unit to: ' + wallet.chain) + $log.debug('Fixing Tx Cache Unit to: ' + wallet.coin) lodash.each(txs, function(tx) { tx.amountStr = txFormatService.formatAmountStr(wallet, tx.amount); tx.feeStr = txFormatService.formatAmountStr(wallet, tx.fees); diff --git a/www/views/amount.html b/www/views/amount.html index b3b4b0cfd..4f37414ca 100644 --- a/www/views/amount.html +++ b/www/views/amount.html @@ -49,18 +49,18 @@
-
{{globalResult}} {{chain}}
+
{{globalResult}} {{coin}}
≈ {{amountResult || '0.00'}} {{alternativeIsoCode}}
{{globalResult}} {{alternativeIsoCode}}
-
{{alternativeResult || '0.00'}} {{chain}}
+
{{alternativeResult || '0.00'}} {{coin}}
diff --git a/www/views/buyAmazon.html b/www/views/buyAmazon.html index 704f29167..3ea4d78c6 100644 --- a/www/views/buyAmazon.html +++ b/www/views/buyAmazon.html @@ -29,7 +29,7 @@
From
- + {{wallet ? wallet.name : '...'}}
diff --git a/www/views/buyCoinbase.html b/www/views/buyCoinbase.html index 013d9b053..fe1371ce9 100644 --- a/www/views/buyCoinbase.html +++ b/www/views/buyCoinbase.html @@ -38,7 +38,7 @@
Receive in
- + {{wallet ? wallet.name : '...'}}
diff --git a/www/views/buyGlidera.html b/www/views/buyGlidera.html index 1acbbedea..5f1168996 100644 --- a/www/views/buyGlidera.html +++ b/www/views/buyGlidera.html @@ -30,7 +30,7 @@
Receive in
- + {{wallet ? wallet.name : '...'}}
diff --git a/www/views/buyMercadoLibre.html b/www/views/buyMercadoLibre.html index a4ff67c90..322259a01 100644 --- a/www/views/buyMercadoLibre.html +++ b/www/views/buyMercadoLibre.html @@ -28,7 +28,7 @@
From
- + {{wallet ? wallet.name : '...'}}
diff --git a/www/views/confirm.html b/www/views/confirm.html index 831d3182c..3622398a1 100644 --- a/www/views/confirm.html +++ b/www/views/confirm.html @@ -65,7 +65,7 @@ From
- +
{{wallet.name}}
diff --git a/www/views/customAmount.html b/www/views/customAmount.html index 95c4bd0fb..c05c8d704 100644 --- a/www/views/customAmount.html +++ b/www/views/customAmount.html @@ -21,7 +21,7 @@
- +
@@ -39,7 +39,7 @@
- + {{wallet.name}}
diff --git a/www/views/includes/walletItem.html b/www/views/includes/walletItem.html index c44abef1c..1d5ba209e 100644 --- a/www/views/includes/walletItem.html +++ b/www/views/includes/walletItem.html @@ -1,6 +1,6 @@
- +
{{wallet.name || wallet.id}} diff --git a/www/views/includes/walletSelector.html b/www/views/includes/walletSelector.html index add64d0cd..3fa8860f1 100644 --- a/www/views/includes/walletSelector.html +++ b/www/views/includes/walletSelector.html @@ -7,7 +7,7 @@ ng-click="selectWallet(w)" > - +
diff --git a/www/views/modals/txp-details.html b/www/views/modals/txp-details.html index beb122b9d..c5e2aea91 100644 --- a/www/views/modals/txp-details.html +++ b/www/views/modals/txp-details.html @@ -74,7 +74,7 @@ From
- +
{{wallet.name}}
diff --git a/www/views/paperWallet.html b/www/views/paperWallet.html index 904cb5b6c..d92aba85e 100644 --- a/www/views/paperWallet.html +++ b/www/views/paperWallet.html @@ -24,7 +24,7 @@
- + {{wallet.name || wallet.id}} diff --git a/www/views/sellCoinbase.html b/www/views/sellCoinbase.html index 6972c5f98..ae715ebe4 100644 --- a/www/views/sellCoinbase.html +++ b/www/views/sellCoinbase.html @@ -29,7 +29,7 @@
From
- + {{wallet ? wallet.name : '...'}}
diff --git a/www/views/sellGlidera.html b/www/views/sellGlidera.html index ee6e262c9..e3ac25c31 100644 --- a/www/views/sellGlidera.html +++ b/www/views/sellGlidera.html @@ -30,7 +30,7 @@
From
- + {{wallet ? wallet.name : '...'}}
diff --git a/www/views/tab-home.html b/www/views/tab-home.html index 7ffcb5629..1a30620da 100644 --- a/www/views/tab-home.html +++ b/www/views/tab-home.html @@ -81,7 +81,7 @@ class="item item-sub item-icon-left item-big-icon-left item-icon-right wallet" ng-click="openWallet(wallet)"> - + {{wallet.name || wallet.id}} diff --git a/www/views/tab-receive.html b/www/views/tab-receive.html index c78317451..95c35b8de 100644 --- a/www/views/tab-receive.html +++ b/www/views/tab-receive.html @@ -63,7 +63,7 @@
- + {{wallet.name || wallet.id}} diff --git a/www/views/tab-send.html b/www/views/tab-send.html index 8b1e0c3eb..23ef00e62 100644 --- a/www/views/tab-send.html +++ b/www/views/tab-send.html @@ -69,7 +69,7 @@
- + {{item.name}} diff --git a/www/views/tab-settings.html b/www/views/tab-settings.html index e6b3f0ad8..f5768dfd2 100644 --- a/www/views/tab-settings.html +++ b/www/views/tab-settings.html @@ -95,7 +95,7 @@ ui-sref="tabs.preferences({'walletId': item.id})" ng-repeat="item in wallets track by $index"> - + {{item.name || item.id}} diff --git a/www/views/topup.html b/www/views/topup.html index a9329ba94..2290359f6 100644 --- a/www/views/topup.html +++ b/www/views/topup.html @@ -31,10 +31,10 @@
-
From {{wallet.chain}}
+
From {{wallet.coin}}
- + {{wallet ? wallet.name : '...'}}
diff --git a/www/views/tx-details.html b/www/views/tx-details.html index 3e281b8bf..be97b37eb 100644 --- a/www/views/tx-details.html +++ b/www/views/tx-details.html @@ -53,7 +53,7 @@ To
- +
{{wallet.name}}
From 378a780df23ddfdd3c9bbeea4a6a07e72d9ef065 Mon Sep 17 00:00:00 2001 From: Gustavo Maximiliano Cortez Date: Mon, 28 Aug 2017 00:00:37 -0300 Subject: [PATCH 08/34] Currency in uppercase --- src/js/controllers/amount.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/js/controllers/amount.js b/src/js/controllers/amount.js index 03e9743af..167200e1d 100644 --- a/src/js/controllers/amount.js +++ b/src/js/controllers/amount.js @@ -234,7 +234,7 @@ angular.module('copayApp.controllers').controller('amountController', function($ $state.transitionTo($scope.nextStep, { id: _id, amount: $scope.useSendMax ? null : _amount, - currency: $scope.showAlternativeAmount ? $scope.alternativeIsoCode : $scope.coin, + currency: $scope.showAlternativeAmount ? $scope.alternativeIsoCode : ($scope.coin).toUpperCase(), coin: $scope.coin, useSendMax: $scope.useSendMax }); From e85175ed6cbb1f2c3e3bbccf97d65acc7dffe8d5 Mon Sep 17 00:00:00 2001 From: Gustavo Maximiliano Cortez Date: Mon, 28 Aug 2017 09:59:49 -0300 Subject: [PATCH 09/34] Fix incomingData --- src/js/services/incomingData.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/js/services/incomingData.js b/src/js/services/incomingData.js index 48f037c7a..8e384b051 100644 --- a/src/js/services/incomingData.js +++ b/src/js/services/incomingData.js @@ -92,7 +92,7 @@ angular.module('copayApp.services').factory('incomingData', function($log, $stat var message = parsed.message; var amount = parsed.amount ? parsed.amount : ''; - var coin = parsed.extras && parsed.extras.coin ? (parsed.extras.coin).toUpperCase() : ''; + var coin = parsed.extras && parsed.extras.coin ? parsed.extras.coin : ''; if (parsed.r) { payproService.getPayProDetails(parsed.r, function(err, details) { From 5175e7e2c49f3d7d45f19d2a54e7434be7db4e01 Mon Sep 17 00:00:00 2001 From: Gustavo Maximiliano Cortez Date: Mon, 28 Aug 2017 12:57:32 -0300 Subject: [PATCH 10/34] Create, import join wallet BCH --- src/js/controllers/import.js | 2 ++ src/js/controllers/join.js | 4 +++- src/js/services/profileService.js | 8 +++++++- www/views/join.html | 11 +++++++++++ www/views/tab-create-shared.html | 10 ++++++++++ www/views/tab-import-phrase.html | 11 +++++++++++ 6 files changed, 44 insertions(+), 2 deletions(-) diff --git a/src/js/controllers/import.js b/src/js/controllers/import.js index 3b34839ad..d026c6c07 100644 --- a/src/js/controllers/import.js +++ b/src/js/controllers/import.js @@ -15,6 +15,7 @@ angular.module('copayApp.controllers').controller('importController', $scope.formData.bwsurl = defaults.bws.url; $scope.formData.derivationPath = derivationPathHelper.default; $scope.formData.account = 1; + $scope.formData.coin = 'btc'; $scope.importErr = false; $scope.isCopay = appConfigService.name == 'copay'; $scope.fromHardwareWallet = { value: false }; @@ -273,6 +274,7 @@ angular.module('copayApp.controllers').controller('importController', } opts.passphrase = $scope.formData.passphrase || null; + opts.coin = $scope.formData.coin; if ($scope.fromHardwareWallet.value) { $log.debug('Importing seed from hardware wallet'); diff --git a/src/js/controllers/join.js b/src/js/controllers/join.js index 2728b6eb0..bf1e5ec00 100644 --- a/src/js/controllers/join.js +++ b/src/js/controllers/join.js @@ -10,6 +10,7 @@ angular.module('copayApp.controllers').controller('joinController', $scope.formData.derivationPath = derivationPathHelper.default; $scope.formData.account = 1; $scope.formData.secret = null; + $scope.formData.coin = 'btc'; resetPasswordFields(); updateSeedSourceSelect(); }); @@ -103,7 +104,8 @@ angular.module('copayApp.controllers').controller('joinController', var opts = { secret: $scope.formData.secret, myName: $scope.formData.myName, - bwsurl: $scope.formData.bwsurl + bwsurl: $scope.formData.bwsurl, + coin: $scope.formData.coin } var setSeed = $scope.formData.seedSource.id == 'set'; diff --git a/src/js/services/profileService.js b/src/js/services/profileService.js index bbba03cf6..bef87b67d 100644 --- a/src/js/services/profileService.js +++ b/src/js/services/profileService.js @@ -334,6 +334,7 @@ console.log('[profileService.js:92]',wallet); //TODO/ passphrase: opts.passphrase, account: opts.account || 0, derivationStrategy: opts.derivationStrategy || 'BIP44', + coin: opts.coin }); } catch (ex) { @@ -352,6 +353,7 @@ console.log('[profileService.js:92]',wallet); //TODO/ walletClient.seedFromExtendedPublicKey(opts.extendedPublicKey, opts.externalSource, opts.entropySource, { account: opts.account || 0, derivationStrategy: opts.derivationStrategy || 'BIP44', + coin: opts.coin }); walletClient.credentials.hwInfo = opts.hwInfo; } catch (ex) { @@ -366,6 +368,7 @@ console.log('[profileService.js:92]',wallet); //TODO/ passphrase: opts.passphrase, language: lang, account: 0, + coin: opts.coin }); } catch (e) { $log.info('Error creating recovery phrase: ' + e.message); @@ -375,6 +378,7 @@ console.log('[profileService.js:92]',wallet); //TODO/ network: network, passphrase: opts.passphrase, account: 0, + coin: opts.coin }); } else { return cb(e); @@ -442,7 +446,7 @@ console.log('[profileService.js:92]',wallet); //TODO/ seedWallet(opts, function(err, walletClient) { if (err) return cb(err); - walletClient.joinWallet(opts.secret, opts.myName || 'me', {}, function(err) { + walletClient.joinWallet(opts.secret, opts.myName || 'me', { coin: opts.coin }, function(err) { if (err) return bwcError.cb(err, gettextCatalog.getString('Could not join wallet'), cb); addAndBindWalletClient(walletClient, { bwsurl: opts.bwsurl @@ -630,6 +634,7 @@ console.log('[profileService.js:92]',wallet); //TODO/ entropySourcePath: opts.entropySourcePath, derivationStrategy: opts.derivationStrategy || 'BIP44', account: opts.account || 0, + coin: opts.coin }, function(err) { if (err) { if (err instanceof errors.NOT_AUTHORIZED) @@ -651,6 +656,7 @@ console.log('[profileService.js:92]',wallet); //TODO/ walletClient.importFromExtendedPublicKey(opts.extendedPublicKey, opts.externalSource, opts.entropySource, { account: opts.account || 0, derivationStrategy: opts.derivationStrategy || 'BIP44', + coin: opts.coin }, function(err) { if (err) { diff --git a/www/views/join.html b/www/views/join.html index 411b8b190..ce282b67e 100644 --- a/www/views/join.html +++ b/www/views/join.html @@ -39,6 +39,17 @@
+ + +
diff --git a/www/views/tab-create-shared.html b/www/views/tab-create-shared.html index 700ac9c2b..593dad599 100644 --- a/www/views/tab-create-shared.html +++ b/www/views/tab-create-shared.html @@ -29,6 +29,16 @@ ng-blur="formFocus(false)"> + +
+ + +
From 09d1d5d3ffef0d54118ab7b246ba4ec66c45ac17 Mon Sep 17 00:00:00 2001 From: Matias Alejo Garcia Date: Mon, 28 Aug 2017 13:33:10 -0300 Subject: [PATCH 11/34] add BCH to rateService --- src/js/services/rateService.js | 88 +++++++++++++++++++++++++--------- 1 file changed, 66 insertions(+), 22 deletions(-) diff --git a/src/js/services/rateService.js b/src/js/services/rateService.js index 9cbfe2821..4cc6f88d5 100644 --- a/src/js/services/rateService.js +++ b/src/js/services/rateService.js @@ -25,9 +25,10 @@ var RateService = function(opts) { self._isAvailable = false; self._rates = {}; self._alternatives = []; + self._ratesBCH = {}; self._queued = []; - self._fetchCurrencies(); + self.updateRates(); }; @@ -39,14 +40,20 @@ RateService.singleton = function(opts) { return _instance; }; -RateService.prototype._fetchCurrencies = function() { +RateService.prototype.updateRates = function() { +console.log('[rateService.js.44:updateRates:]'); //TODO var self = this; var backoffSeconds = 5; var updateFrequencySeconds = 5 * 60; var rateServiceUrl = 'https://bitpay.com/api/rates'; + var bchRateServiceUrl = 'https://api.kraken.com/0/public/Ticker?pair=BCHUSD,BCHEUR'; + + + function getBTC(cb, tries) { + tries = tries || 0; + if (tries > 5) return cb('could not get BTC rates'); - var retrieve = function() { //log.info('Fetching exchange rates'); self.httprequest.get(rateServiceUrl).success(function(res) { self.lodash.each(res, function(currency) { @@ -57,27 +64,64 @@ RateService.prototype._fetchCurrencies = function() { rate: currency.rate }); }); + + return cb(); + }).error(function() { + //log.debug('Error fetching exchange rates', err); + setTimeout(function() { + backoffSeconds *= 1.5; + getBTC(cb, tries++); + }, backoffSeconds * 1000); + return; + }) + } + + function getBCH(cb, tries) { + tries = tries || 0; + if (tries > 5) return cb('could not get BCH rates'); + + function retry(tries) { +console.log('[rateService.js.84:retry:] BCH'); //TODO + //log.debug('Error fetching exchange rates', err); + setTimeout(function() { + backoffSeconds *= 1.5; + getBTC(cb, tries++); + }, backoffSeconds * 1000); + return; + } + + self.httprequest.get(bchRateServiceUrl).success(function(res) { + self.lodash.each(res.result, function(data, paircode) { + var code = paircode.substr(3,3); + var rate =data.c[0]; + self._ratesBCH[code] = rate; + }) + return cb(); + }).error(function() { + return retry(tries); + }) + } + + getBTC(function(err) { + if (err) return; + getBCH(function(err) { + if (err) return; + self._isAvailable = true; self.lodash.each(self._queued, function(callback) { setTimeout(callback, 1); }); - setTimeout(retrieve, updateFrequencySeconds * 1000); - }).error(function(err) { - //log.debug('Error fetching exchange rates', err); - setTimeout(function() { - backoffSeconds *= 1.5; - retrieve(); - }, backoffSeconds * 1000); - return; - }); + setTimeout( self.updateRates , updateFrequencySeconds * 1000); + }) + }) - }; - - retrieve(); }; -RateService.prototype.getRate = function(code) { - return this._rates[code]; +RateService.prototype.getRate = function(code, chain) { + if (chain = 'bch') + return this._ratesBCH[code]; + else + return this._rates[code]; }; RateService.prototype.getAlternatives = function() { @@ -90,25 +134,25 @@ RateService.prototype.isAvailable = function() { RateService.prototype.whenAvailable = function(callback) { if (this.isAvailable()) { - setTimeout(callback, 1); + setTimeout(callback, 10); } else { this._queued.push(callback); } }; -RateService.prototype.toFiat = function(satoshis, code) { +RateService.prototype.toFiat = function(satoshis, code, chain) { if (!this.isAvailable()) { return null; } - return satoshis * this.SAT_TO_BTC * this.getRate(code); + return satoshis * this.SAT_TO_BTC * this.getRate(code, chain); }; -RateService.prototype.fromFiat = function(amount, code) { +RateService.prototype.fromFiat = function(amount, code, chain) { if (!this.isAvailable()) { return null; } - return amount / this.getRate(code) * this.BTC_TO_SAT; + return amount / this.getRate(code, chain) * this.BTC_TO_SAT; }; RateService.prototype.listAlternatives = function(sort) { From a5a80684eb777b439befcc8edca45f256f45fc4a Mon Sep 17 00:00:00 2001 From: Gustavo Maximiliano Cortez Date: Mon, 28 Aug 2017 15:51:13 -0300 Subject: [PATCH 12/34] Fix rateService. Add usd rates --- src/js/controllers/addresses.js | 6 ++-- src/js/controllers/amount.js | 4 +-- src/js/controllers/buyAmazon.js | 9 +++--- src/js/controllers/buyCoinbase.js | 5 +-- src/js/controllers/buyGlidera.js | 5 +-- src/js/controllers/buyMercadoLibre.js | 9 +++--- src/js/controllers/confirm.js | 18 +++++------ src/js/controllers/customAmount.js | 12 +++---- src/js/controllers/modals/txpDetails.js | 4 +-- src/js/controllers/onboarding/tour.js | 2 +- src/js/controllers/paperWallet.js | 3 +- src/js/controllers/sellCoinbase.js | 5 +-- src/js/controllers/sellGlidera.js | 5 +-- src/js/controllers/topup.js | 9 +++--- src/js/controllers/tx-details.js | 4 +-- src/js/routes.js | 3 +- src/js/services/rateService.js | 4 +-- src/js/services/txFormatService.js | 42 ++++++++++++------------- src/js/services/walletService.js | 18 +++++------ 19 files changed, 87 insertions(+), 80 deletions(-) diff --git a/src/js/controllers/addresses.js b/src/js/controllers/addresses.js index 97cca45e1..684ee53de 100644 --- a/src/js/controllers/addresses.js +++ b/src/js/controllers/addresses.js @@ -83,9 +83,9 @@ angular.module('copayApp.controllers').controller('addressesController', functio $scope.lowWarning = resp.warning; $scope.lowUtxosNb = resp.lowUtxos.length; $scope.allUtxosNb = resp.allUtxos.length; - $scope.lowUtxosSum = txFormatService.formatAmountStr($scope.wallet, lodash.sum(resp.lowUtxos || 0, 'satoshis')); - $scope.allUtxosSum = txFormatService.formatAmountStr($scope.wallet, allSum); - $scope.minFee = txFormatService.formatAmountStr($scope.wallet, resp.minFee || 0); + $scope.lowUtxosSum = txFormatService.formatAmountStr($scope.wallet.coin, lodash.sum(resp.lowUtxos || 0, 'satoshis')); + $scope.allUtxosSum = txFormatService.formatAmountStr($scope.wallet.coin, allSum); + $scope.minFee = txFormatService.formatAmountStr($scope.wallet.coin, resp.minFee || 0); $scope.minFeePer = per.toFixed(2) + '%'; diff --git a/src/js/controllers/amount.js b/src/js/controllers/amount.js index 167200e1d..813667251 100644 --- a/src/js/controllers/amount.js +++ b/src/js/controllers/amount.js @@ -200,11 +200,11 @@ angular.module('copayApp.controllers').controller('amountController', function($ }; function fromFiat(val) { - return parseFloat((rateService.fromFiat(val, $scope.alternativeIsoCode) * satToUnit).toFixed(unitDecimals)); + return parseFloat((rateService.fromFiat(val, $scope.alternativeIsoCode, $scope.coin) * satToUnit).toFixed(unitDecimals)); }; function toFiat(val) { - return parseFloat((rateService.toFiat(val * unitToSatoshi, $scope.alternativeIsoCode)).toFixed(2)); + return parseFloat((rateService.toFiat(val * unitToSatoshi, $scope.alternativeIsoCode, $scope.coin)).toFixed(2)); }; function evaluate(val) { diff --git a/src/js/controllers/buyAmazon.js b/src/js/controllers/buyAmazon.js index ee3732e95..856888e68 100644 --- a/src/js/controllers/buyAmazon.js +++ b/src/js/controllers/buyAmazon.js @@ -2,6 +2,7 @@ angular.module('copayApp.controllers').controller('buyAmazonController', function($scope, $log, $state, $timeout, $filter, $ionicHistory, $ionicConfig, lodash, amazonService, popupService, profileService, ongoingProcess, configService, walletService, payproService, bwcError, externalLinkService, platformInfo, gettextCatalog, txFormatService) { + var coin = 'btc'; var amount; var currency; var createdTx; @@ -64,7 +65,7 @@ angular.module('copayApp.controllers').controller('buyAmazonController', functio }; var satToFiat = function(sat, cb) { - txFormatService.toFiat(sat, $scope.currencyIsoCode, function(value) { + txFormatService.toFiat(coin, sat, $scope.currencyIsoCode, function(value) { return cb(value); }); }; @@ -216,7 +217,7 @@ angular.module('copayApp.controllers').controller('buyAmazonController', functio }); var initialize = function(wallet) { - var parsedAmount = txFormatService.parseAmount(wallet, amount, currency); + var parsedAmount = txFormatService.parseAmount(coin, amount, currency); $scope.currencyIsoCode = parsedAmount.currency; $scope.amountUnitStr = parsedAmount.amountUnitStr; var dataSrc = { @@ -260,7 +261,7 @@ angular.module('copayApp.controllers').controller('buyAmazonController', functio invoiceUrl: invoice.url, invoiceTime: invoice.invoiceTime }; - $scope.totalAmountStr = txFormatService.formatAmountStr(wallet, ctxp.amount); + $scope.totalAmountStr = txFormatService.formatAmountStr(coin, ctxp.amount); setTotalAmount(parsedAmount.amountSat, invoiceFeeSat, ctxp.fee); }); }); @@ -293,7 +294,7 @@ angular.module('copayApp.controllers').controller('buyAmazonController', functio onlyComplete: true, network: $scope.network, hasFunds: true, - coin: 'btc' + coin: coin }); if (lodash.isEmpty($scope.wallets)) { showErrorAndBack(null, gettextCatalog.getString('No wallets available')); diff --git a/src/js/controllers/buyCoinbase.js b/src/js/controllers/buyCoinbase.js index d9690f058..10e6e35a0 100644 --- a/src/js/controllers/buyCoinbase.js +++ b/src/js/controllers/buyCoinbase.js @@ -2,6 +2,7 @@ angular.module('copayApp.controllers').controller('buyCoinbaseController', function($scope, $log, $state, $timeout, $ionicHistory, $ionicScrollDelegate, $ionicConfig, lodash, coinbaseService, popupService, profileService, ongoingProcess, walletService, txFormatService) { + var coin = 'btc'; var amount; var currency; @@ -96,7 +97,7 @@ angular.module('copayApp.controllers').controller('buyCoinbaseController', funct $scope.wallets = profileService.getWallets({ onlyComplete: true, network: $scope.network, - coin: 'btc' + coin: coin }); if (lodash.isEmpty($scope.wallets)) { @@ -236,7 +237,7 @@ angular.module('copayApp.controllers').controller('buyCoinbaseController', funct $scope.onWalletSelect = function(wallet) { $scope.wallet = wallet; var parsedAmount = txFormatService.parseAmount( - wallet, + coin, amount, currency); diff --git a/src/js/controllers/buyGlidera.js b/src/js/controllers/buyGlidera.js index 536dbc1e8..a2040bc3c 100644 --- a/src/js/controllers/buyGlidera.js +++ b/src/js/controllers/buyGlidera.js @@ -2,6 +2,7 @@ angular.module('copayApp.controllers').controller('buyGlideraController', function($scope, $log, $state, $timeout, $ionicHistory, $ionicConfig, lodash, glideraService, popupService, profileService, ongoingProcess, walletService, platformInfo, txFormatService) { + var coin = 'btc'; var amount; var currency; @@ -78,7 +79,7 @@ angular.module('copayApp.controllers').controller('buyGlideraController', functi $scope.wallets = profileService.getWallets({ onlyComplete: true, network: $scope.network, - coin: 'btc' + coin: coin }); if (lodash.isEmpty($scope.wallets)) { @@ -161,7 +162,7 @@ angular.module('copayApp.controllers').controller('buyGlideraController', functi $scope.onWalletSelect = function(wallet) { $scope.wallet = wallet; var parsedAmount = txFormatService.parseAmount( - wallet, + coin, amount, currency); diff --git a/src/js/controllers/buyMercadoLibre.js b/src/js/controllers/buyMercadoLibre.js index 153a715d5..2bd96ed55 100644 --- a/src/js/controllers/buyMercadoLibre.js +++ b/src/js/controllers/buyMercadoLibre.js @@ -2,6 +2,7 @@ angular.module('copayApp.controllers').controller('buyMercadoLibreController', function($scope, $log, $state, $timeout, $filter, $ionicHistory, $ionicConfig, lodash, mercadoLibreService, popupService, profileService, ongoingProcess, configService, walletService, payproService, bwcError, externalLinkService, platformInfo, txFormatService, gettextCatalog) { + var coin = 'btc'; var amount; var currency; var createdTx; @@ -64,7 +65,7 @@ angular.module('copayApp.controllers').controller('buyMercadoLibreController', f }; var satToFiat = function(sat, cb) { - txFormatService.toFiat(sat, $scope.currencyIsoCode, function(value) { + txFormatService.toFiat(coin, sat, $scope.currencyIsoCode, function(value) { return cb(value); }); }; @@ -214,7 +215,7 @@ angular.module('copayApp.controllers').controller('buyMercadoLibreController', f }); var initialize = function(wallet) { - var parsedAmount = txFormatService.parseAmount(wallet, amount, currency); + var parsedAmount = txFormatService.parseAmount(coin, amount, currency); $scope.currencyIsoCode = parsedAmount.currency; $scope.amountUnitStr = parsedAmount.amountUnitStr; var dataSrc = { @@ -258,7 +259,7 @@ angular.module('copayApp.controllers').controller('buyMercadoLibreController', f invoiceUrl: invoice.url, invoiceTime: invoice.invoiceTime }; - $scope.totalAmountStr = txFormatService.formatAmountStr(wallet, ctxp.amount); + $scope.totalAmountStr = txFormatService.formatAmountStr(coin, ctxp.amount); setTotalAmount(parsedAmount.amountSat, invoiceFeeSat, ctxp.fee); }); }); @@ -285,7 +286,7 @@ angular.module('copayApp.controllers').controller('buyMercadoLibreController', f $scope.wallets = profileService.getWallets({ onlyComplete: true, network: $scope.network, - coin: 'btc' + coin: coin }); if (lodash.isEmpty($scope.wallets)) { showErrorAndBack(null, gettextCatalog.getString('No wallets available')); diff --git a/src/js/controllers/confirm.js b/src/js/controllers/confirm.js index e2065ebb2..4111487e3 100644 --- a/src/js/controllers/confirm.js +++ b/src/js/controllers/confirm.js @@ -1,6 +1,6 @@ 'use strict'; -angular.module('copayApp.controllers').controller('confirmController', function($rootScope, $scope, $interval, $filter, $timeout, $ionicScrollDelegate, gettextCatalog, walletService, platformInfo, lodash, configService, rateService, $stateParams, $window, $state, $log, profileService, bitcore, txFormatService, ongoingProcess, $ionicModal, popupService, $ionicHistory, $ionicConfig, payproService, feeService, bwcError, txConfirmNotification) { +angular.module('copayApp.controllers').controller('confirmController', function($rootScope, $scope, $interval, $filter, $timeout, $ionicScrollDelegate, gettextCatalog, walletService, platformInfo, lodash, configService, $stateParams, $window, $state, $log, profileService, bitcore, txFormatService, ongoingProcess, $ionicModal, popupService, $ionicHistory, $ionicConfig, payproService, feeService, bwcError, txConfirmNotification) { var countDown = null; var CONFIRM_LIMIT_USD = 20; @@ -238,10 +238,10 @@ angular.module('copayApp.controllers').controller('confirmController', function( if (!tx.toAmount) return; // Amount - tx.amountStr = txFormatService.formatAmountStr(wallet, tx.toAmount); + tx.amountStr = txFormatService.formatAmountStr(wallet.coin, tx.toAmount); tx.amountValueStr = tx.amountStr.split(' ')[0]; tx.amountUnitStr = tx.amountStr.split(' ')[1]; - txFormatService.formatAlternativeStr(tx.toAmount, function(v) { + txFormatService.formatAlternativeStr(wallet.coin, tx.toAmount, function(v) { tx.alternativeAmountStr = v; }); } @@ -292,8 +292,8 @@ angular.module('copayApp.controllers').controller('confirmController', function( getTxp(lodash.clone(tx), wallet, opts.dryRun, function(err, txp) { if (err) return cb(err); - txp.feeStr = txFormatService.formatAmountStr(wallet, txp.fee); - txFormatService.formatAlternativeStr(txp.fee, function(v) { + txp.feeStr = txFormatService.formatAmountStr(wallet.coin, txp.fee); + txFormatService.formatAlternativeStr(wallet.coin, txp.fee, function(v) { txp.alternativeFeeStr = v; }); @@ -343,20 +343,20 @@ angular.module('copayApp.controllers').controller('confirmController', function( var warningMsg = []; if (sendMaxInfo.utxosBelowFee > 0) { warningMsg.push(gettextCatalog.getString("A total of {{amountBelowFeeStr}} were excluded. These funds come from UTXOs smaller than the network fee provided.", { - amountBelowFeeStr: txFormatService.formatAmountStr(wallet, sendMaxInfo.amountBelowFee) + amountBelowFeeStr: txFormatService.formatAmountStr(wallet.coin, sendMaxInfo.amountBelowFee) })); } if (sendMaxInfo.utxosAboveMaxSize > 0) { warningMsg.push(gettextCatalog.getString("A total of {{amountAboveMaxSizeStr}} were excluded. The maximum size allowed for a transaction was exceeded.", { - amountAboveMaxSizeStr: txFormatService.formatAmountStr(wallet, sendMaxInfo.amountAboveMaxSize) + amountAboveMaxSizeStr: txFormatService.formatAmountStr(wallet.coin, sendMaxInfo.amountAboveMaxSize) })); } return warningMsg.join('\n'); }; var msg = gettextCatalog.getString("{{fee}} will be deducted for bitcoin networking fees.", { - fee: txFormatService.formatAmountStr(wallet, sendMaxInfo.fee) + fee: txFormatService.formatAmountStr(wallet.coin, sendMaxInfo.fee) }); var warningMsg = verifyExcludedUtxos(); @@ -483,7 +483,7 @@ angular.module('copayApp.controllers').controller('confirmController', function( if (walletService.isEncrypted(wallet)) return cb(); - var amountUsd = parseFloat(txFormatService.formatToUSD(txp.amount)); + var amountUsd = parseFloat(txFormatService.formatToUSD(wallet.coin, txp.amount)); if (amountUsd <= CONFIRM_LIMIT_USD) return cb(); diff --git a/src/js/controllers/customAmount.js b/src/js/controllers/customAmount.js index 4fa97ed18..a57ea8c3b 100644 --- a/src/js/controllers/customAmount.js +++ b/src/js/controllers/customAmount.js @@ -28,9 +28,9 @@ angular.module('copayApp.controllers').controller('customAmountController', func $scope.address = addr; - $scope.coin = (data.stateParams.coin).toLowerCase(); + $scope.coin = data.stateParams.coin; var parsedAmount = txFormatService.parseAmount( - $scope.wallet, + $scope.wallet.coin, data.stateParams.amount, data.stateParams.currency); @@ -43,13 +43,13 @@ angular.module('copayApp.controllers').controller('customAmountController', func // Convert to BTC or BCH var config = configService.getSync().wallet.settings; var amountUnit = txFormatService.satToUnit(parsedAmount.amountSat); - var btcParsedAmount = txFormatService.parseAmount($scope.wallet, amountUnit, $scope.wallet.coin); + var btcParsedAmount = txFormatService.parseAmount($scope.wallet.coin, amountUnit, $scope.wallet.coin); $scope.amountBtc = btcParsedAmount.amount; $scope.altAmountStr = btcParsedAmount.amountUnitStr; } else { $scope.amountBtc = amount; // BTC or BCH - $scope.altAmountStr = txFormatService.formatAlternativeStr(parsedAmount.amountSat); + $scope.altAmountStr = txFormatService.formatAlternativeStr($scope.wallet.coin, parsedAmount.amountSat); } }); }); @@ -63,12 +63,12 @@ angular.module('copayApp.controllers').controller('customAmountController', func $scope.shareAddress = function() { if (!platformInfo.isCordova) return; - var data = 'bitcoin:' + $scope.address + '?amount=' + $scope.amountBtc; + var data = 'bitcoin:' + $scope.address + '?amount=' + $scope.amountBtc + '&coin=' + $scope.wallet.coin; window.plugins.socialsharing.share(data, null, null, null); } $scope.copyToClipboard = function() { - return 'bitcoin:' + $scope.address + '?amount=' + $scope.amountBtc + '&coin=' + $scope.coin; + return 'bitcoin:' + $scope.address + '?amount=' + $scope.amountBtc + '&coin=' + $scope.wallet.coin; }; }); diff --git a/src/js/controllers/modals/txpDetails.js b/src/js/controllers/modals/txpDetails.js index 79c8738c6..a901871e8 100644 --- a/src/js/controllers/modals/txpDetails.js +++ b/src/js/controllers/modals/txpDetails.js @@ -23,7 +23,7 @@ angular.module('copayApp.controllers').controller('txpDetailsController', functi }; function displayFeeValues() { - txFormatService.formatAlternativeStr($scope.tx.fee, function(v) { + txFormatService.formatAlternativeStr($scope.wallet.coin, $scope.tx.fee, function(v) { $scope.tx.feeFiatStr = v; }); $scope.tx.feeRateStr = ($scope.tx.fee / ($scope.tx.amount + $scope.tx.fee) * 100).toFixed(2) + '%'; @@ -219,7 +219,7 @@ angular.module('copayApp.controllers').controller('txpDetailsController', functi copayerId: $scope.wallet.credentials.copayerId }); - $scope.tx = txFormatService.processTx($scope.wallet, tx); + $scope.tx = txFormatService.processTx($scope.wallet.coin, tx); if (!action && tx.status == 'pending') $scope.tx.pendingForUs = true; diff --git a/src/js/controllers/onboarding/tour.js b/src/js/controllers/onboarding/tour.js index bcea8c405..5781ec22a 100644 --- a/src/js/controllers/onboarding/tour.js +++ b/src/js/controllers/onboarding/tour.js @@ -27,7 +27,7 @@ angular.module('copayApp.controllers').controller('tourController', rateService.whenAvailable(function() { var localCurrency = 'USD'; var btcAmount = 1; - var rate = rateService.toFiat(btcAmount * 1e8, localCurrency); + var rate = rateService.toFiat(btcAmount * 1e8, localCurrency, 'btc'); $scope.localCurrencySymbol = '$'; $scope.localCurrencyPerBtc = $filter('formatFiatAmount')(parseFloat(rate.toFixed(2), 10)); $timeout(function() { diff --git a/src/js/controllers/paperWallet.js b/src/js/controllers/paperWallet.js index 83346fbbc..c00d4910b 100644 --- a/src/js/controllers/paperWallet.js +++ b/src/js/controllers/paperWallet.js @@ -45,8 +45,7 @@ angular.module('copayApp.controllers').controller('paperWalletController', $scope.balanceSat = balance; if ($scope.balanceSat <= 0) popupService.showAlert(gettextCatalog.getString('Error'), gettextCatalog.getString('Not funds found')); - var config = configService.getSync().wallet.settings; - $scope.balance = txFormatService.formatAmount(balance) + ' ' + config.unitName; + $scope.balance = txFormatService.formatAmountStr($scope.wallet.coin, balance); } $scope.$apply(); }); diff --git a/src/js/controllers/sellCoinbase.js b/src/js/controllers/sellCoinbase.js index 624748f7c..b90b1e610 100644 --- a/src/js/controllers/sellCoinbase.js +++ b/src/js/controllers/sellCoinbase.js @@ -2,6 +2,7 @@ angular.module('copayApp.controllers').controller('sellCoinbaseController', function($scope, $log, $state, $timeout, $ionicHistory, $ionicScrollDelegate, $ionicConfig, lodash, coinbaseService, popupService, profileService, ongoingProcess, walletService, appConfigService, configService, txFormatService) { + var coin = 'btc'; var amount; var currency; @@ -183,7 +184,7 @@ angular.module('copayApp.controllers').controller('sellCoinbaseController', func onlyComplete: true, network: $scope.network, hasFunds: true, - coin: 'btc' + coin: coin }); if (lodash.isEmpty($scope.wallets)) { @@ -304,7 +305,7 @@ angular.module('copayApp.controllers').controller('sellCoinbaseController', func $scope.onWalletSelect = function(wallet) { $scope.wallet = wallet; var parsedAmount = txFormatService.parseAmount( - wallet, + coin, amount, currency); diff --git a/src/js/controllers/sellGlidera.js b/src/js/controllers/sellGlidera.js index bf5db0f7a..039286980 100644 --- a/src/js/controllers/sellGlidera.js +++ b/src/js/controllers/sellGlidera.js @@ -2,6 +2,7 @@ angular.module('copayApp.controllers').controller('sellGlideraController', function($scope, $log, $state, $timeout, $ionicHistory, $ionicConfig, lodash, glideraService, popupService, profileService, ongoingProcess, walletService, configService, platformInfo, txFormatService) { + var coin = 'btc'; var amount; var currency; @@ -80,7 +81,7 @@ angular.module('copayApp.controllers').controller('sellGlideraController', funct onlyComplete: true, network: $scope.network, hasFunds: true, - coin: 'btc' + coin: coin }); if (lodash.isEmpty($scope.wallets)) { @@ -229,7 +230,7 @@ angular.module('copayApp.controllers').controller('sellGlideraController', funct $scope.onWalletSelect = function(wallet) { $scope.wallet = wallet; var parsedAmount = txFormatService.parseAmount( - wallet, + coin, amount, currency); diff --git a/src/js/controllers/topup.js b/src/js/controllers/topup.js index d72ad8e2a..ee47872cc 100644 --- a/src/js/controllers/topup.js +++ b/src/js/controllers/topup.js @@ -3,6 +3,7 @@ angular.module('copayApp.controllers').controller('topUpController', function($scope, $log, $state, $timeout, $ionicHistory, $ionicConfig, lodash, popupService, profileService, ongoingProcess, walletService, configService, platformInfo, bitpayService, bitpayCardService, payproService, bwcError, txFormatService, sendMaxService, gettextCatalog) { $scope.isCordova = platformInfo.isCordova; + var coin = 'btc'; var cardId; var useSendMax; var amount; @@ -36,7 +37,7 @@ angular.module('copayApp.controllers').controller('topUpController', function($s }; var satToFiat = function(sat, cb) { - txFormatService.toFiat(sat, $scope.currencyIsoCode, function(value) { + txFormatService.toFiat(coin, sat, $scope.currencyIsoCode, function(value) { return cb(value); }); }; @@ -218,7 +219,7 @@ angular.module('copayApp.controllers').controller('topUpController', function($s // Save TX in memory createdTx = ctxp; - $scope.totalAmountStr = txFormatService.formatAmountStr(wallet, ctxp.amount); + $scope.totalAmountStr = txFormatService.formatAmountStr(coin, ctxp.amount); setTotalAmount(parsedAmount.amountSat, invoiceFeeSat, ctxp.fee); @@ -257,7 +258,7 @@ angular.module('copayApp.controllers').controller('topUpController', function($s onlyComplete: true, network: bitpayService.getEnvironment().network, hasFunds: true, - coin: 'btc' + coin: coin }); if (lodash.isEmpty($scope.wallets)) { @@ -320,7 +321,7 @@ angular.module('copayApp.controllers').controller('topUpController', function($s }); return; } - var parsedAmount = txFormatService.parseAmount(wallet, a, c); + var parsedAmount = txFormatService.parseAmount(coin, a, c); initializeTopUp(wallet, parsedAmount); }); }; diff --git a/src/js/controllers/tx-details.js b/src/js/controllers/tx-details.js index 58eb473aa..e2ef2f9f8 100644 --- a/src/js/controllers/tx-details.js +++ b/src/js/controllers/tx-details.js @@ -112,8 +112,8 @@ angular.module('copayApp.controllers').controller('txDetailsController', functio return popupService.showAlert(gettextCatalog.getString('Error'), gettextCatalog.getString('Transaction not available at this time')); } - $scope.btx = txFormatService.processTx($scope.wallet, tx); - txFormatService.formatAlternativeStr(tx.fees, function(v) { + $scope.btx = txFormatService.processTx($scope.wallet.coin, tx); + txFormatService.formatAlternativeStr($scope.wallet.coin, tx.fees, function(v) { $scope.btx.feeFiatStr = v; $scope.btx.feeRateStr = ($scope.btx.fees / ($scope.btx.amount + $scope.btx.fees) * 100).toFixed(2) + '%'; }); diff --git a/src/js/routes.js b/src/js/routes.js index e8beece45..c3e8442ae 100644 --- a/src/js/routes.js +++ b/src/js/routes.js @@ -667,7 +667,8 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr abstract: true, params: { id: null, - nextStep: 'tabs.paymentRequest.confirm' + nextStep: 'tabs.paymentRequest.confirm', + forceCoin: true } }) diff --git a/src/js/services/rateService.js b/src/js/services/rateService.js index 4cc6f88d5..a6dc7dd9e 100644 --- a/src/js/services/rateService.js +++ b/src/js/services/rateService.js @@ -118,9 +118,9 @@ console.log('[rateService.js.84:retry:] BCH'); //TODO }; RateService.prototype.getRate = function(code, chain) { - if (chain = 'bch') + if (chain == 'bch') return this._ratesBCH[code]; - else + else return this._rates[code]; }; diff --git a/src/js/services/txFormatService.js b/src/js/services/txFormatService.js index 428286d1a..249c28ad1 100644 --- a/src/js/services/txFormatService.js +++ b/src/js/services/txFormatService.js @@ -17,15 +17,15 @@ angular.module('copayApp.services').factory('txFormatService', function($filter, return this.Utils.formatAmount(satoshis, config.unitCode, opts); }; - root.formatAmountStr = function(wallet, satoshis) { + root.formatAmountStr = function(coin, satoshis) { if (isNaN(satoshis)) return; - return root.formatAmount(satoshis) + ' ' + wallet.coin; + return root.formatAmount(satoshis) + ' ' + coin; }; - root.toFiat = function(satoshis, code, cb) { + root.toFiat = function(coin, satoshis, code, cb) { if (isNaN(satoshis)) return; var val = function() { - var v1 = rateService.toFiat(satoshis, code); + var v1 = rateService.toFiat(satoshis, code, coin); if (!v1) return null; return v1.toFixed(2); @@ -42,10 +42,10 @@ angular.module('copayApp.services').factory('txFormatService', function($filter, }; }; - root.formatToUSD = function(satoshis, cb) { + root.formatToUSD = function(coin, satoshis, cb) { if (isNaN(satoshis)) return; var val = function() { - var v1 = rateService.toFiat(satoshis, 'USD'); + var v1 = rateService.toFiat(satoshis, 'USD', coin); if (!v1) return null; return v1.toFixed(2); @@ -62,12 +62,12 @@ angular.module('copayApp.services').factory('txFormatService', function($filter, }; }; - root.formatAlternativeStr = function(satoshis, cb) { + root.formatAlternativeStr = function(coin, satoshis, cb) { if (isNaN(satoshis)) return; var config = configService.getSync().wallet.settings; var val = function() { - var v1 = parseFloat((rateService.toFiat(satoshis, config.alternativeIsoCode)).toFixed(2)); + var v1 = parseFloat((rateService.toFiat(satoshis, config.alternativeIsoCode, coin)).toFixed(2)); v1 = $filter('formatFiatAmount')(v1); if (!v1) return null; @@ -85,7 +85,7 @@ angular.module('copayApp.services').factory('txFormatService', function($filter, }; }; - root.processTx = function(wallet, tx) { + root.processTx = function(coin, tx) { if (!tx || tx.action == 'invalid') return tx; @@ -100,17 +100,17 @@ angular.module('copayApp.services').factory('txFormatService', function($filter, tx.hasMultiplesOutputs = true; } tx.amount = lodash.reduce(tx.outputs, function(total, o) { - o.amountStr = root.formatAmountStr(wallet, o.amount); - o.alternativeAmountStr = root.formatAlternativeStr(o.amount); + o.amountStr = root.formatAmountStr(coin, o.amount); + o.alternativeAmountStr = root.formatAlternativeStr(coin, o.amount); return total + o.amount; }, 0); } tx.toAddress = tx.outputs[0].toAddress; } - tx.amountStr = root.formatAmountStr(wallet, tx.amount); - tx.alternativeAmountStr = root.formatAlternativeStr(tx.amount); - tx.feeStr = root.formatAmountStr(wallet, tx.fee || tx.fees); + tx.amountStr = root.formatAmountStr(coin, tx.amount); + tx.alternativeAmountStr = root.formatAlternativeStr(coin, tx.amount); + tx.feeStr = root.formatAmountStr(coin, tx.fee || tx.fees); if (tx.amountStr) { tx.amountValueStr = tx.amountStr.split(' ')[0]; @@ -154,7 +154,7 @@ angular.module('copayApp.services').factory('txFormatService', function($filter, return; } - tx = txFormatService.processTx(tx.wallet, tx); + tx = txFormatService.processTx(tx.wallet.coin, tx); var action = lodash.find(tx.actions, { copayerId: tx.wallet.copayerId @@ -179,7 +179,7 @@ angular.module('copayApp.services').factory('txFormatService', function($filter, return txps; }; - root.parseAmount = function(wallet, amount, currency) { + root.parseAmount = function(coin, amount, currency) { var config = configService.getSync().wallet.settings; var satToBtc = 1 / 100000000; var unitToSatoshi = config.unitToSatoshi; @@ -190,19 +190,19 @@ angular.module('copayApp.services').factory('txFormatService', function($filter, // If fiat currency if (currency != 'BCH' && currency != 'BTC' && currency != 'sat') { amountUnitStr = $filter('formatFiatAmount')(amount) + ' ' + currency; - amountSat = rateService.fromFiat(amount, currency).toFixed(0); + amountSat = rateService.fromFiat(amount, currency, coin).toFixed(0); } else if (currency == 'sat') { amountSat = amount; - amountUnitStr = root.formatAmountStr(wallet, amountSat); + amountUnitStr = root.formatAmountStr(coin, amountSat); // convert sat to BTC or BCH amount = (amountSat * satToBtc).toFixed(8); - currency = (wallet.coin).toUpperCase(); + currency = (coin).toUpperCase(); } else { amountSat = parseInt((amount * unitToSatoshi).toFixed(0)); - amountUnitStr = root.formatAmountStr(wallet, amountSat); + amountUnitStr = root.formatAmountStr(coin, amountSat); // convert unit to BTC or BCH amount = (amountSat * satToBtc).toFixed(8); - currency = (wallet.coin).toUpperCase(); + currency = (coin).toUpperCase(); } return { diff --git a/src/js/services/walletService.js b/src/js/services/walletService.js index 496765ea9..8d2ad40ca 100644 --- a/src/js/services/walletService.js +++ b/src/js/services/walletService.js @@ -130,7 +130,7 @@ angular.module('copayApp.services').factory('walletService', function($log, $tim lodash.each(txps, function(tx) { - tx = txFormatService.processTx(wallet, tx); + tx = txFormatService.processTx(wallet.coin, tx); // no future transactions... if (tx.createdOn > now) @@ -237,11 +237,11 @@ angular.module('copayApp.services').factory('walletService', function($log, $tim rateService.whenAvailable(function() { - var totalBalanceAlternative = rateService.toFiat(cache.totalBalanceSat, cache.alternativeIsoCode); - var pendingBalanceAlternative = rateService.toFiat(cache.pendingAmount, cache.alternativeIsoCode); - var lockedBalanceAlternative = rateService.toFiat(cache.lockedBalanceSat, cache.alternativeIsoCode); - var spendableBalanceAlternative = rateService.toFiat(cache.spendableAmount, cache.alternativeIsoCode); - var alternativeConversionRate = rateService.toFiat(100000000, cache.alternativeIsoCode); + var totalBalanceAlternative = rateService.toFiat(cache.totalBalanceSat, cache.alternativeIsoCode, wallet.coin); + var pendingBalanceAlternative = rateService.toFiat(cache.pendingAmount, cache.alternativeIsoCode, wallet.coin); + var lockedBalanceAlternative = rateService.toFiat(cache.lockedBalanceSat, cache.alternativeIsoCode, wallet.coin); + var spendableBalanceAlternative = rateService.toFiat(cache.spendableAmount, cache.alternativeIsoCode, wallet.coin); + var alternativeConversionRate = rateService.toFiat(100000000, cache.alternativeIsoCode, wallet.coin); cache.totalBalanceAlternative = $filter('formatFiatAmount')(totalBalanceAlternative); cache.pendingBalanceAlternative = $filter('formatFiatAmount')(pendingBalanceAlternative); @@ -365,7 +365,7 @@ angular.module('copayApp.services').factory('walletService', function($log, $tim wallet.hasUnsafeConfirmed = false; lodash.each(txs, function(tx) { - tx = txFormatService.processTx(wallet, tx); + tx = txFormatService.processTx(wallet.coin, tx); // no future transactions... if (tx.time > now) @@ -419,8 +419,8 @@ angular.module('copayApp.services').factory('walletService', function($log, $tim $log.debug('Fixing Tx Cache Unit to: ' + wallet.coin) lodash.each(txs, function(tx) { - tx.amountStr = txFormatService.formatAmountStr(wallet, tx.amount); - tx.feeStr = txFormatService.formatAmountStr(wallet, tx.fees); + tx.amountStr = txFormatService.formatAmountStr(wallet.coin, tx.amount); + tx.feeStr = txFormatService.formatAmountStr(wallet.coin, tx.fees); }); }; From 2e9d2793208fe65c6c137abbe315f470fdf87612 Mon Sep 17 00:00:00 2001 From: Gustavo Maximiliano Cortez Date: Mon, 28 Aug 2017 16:10:23 -0300 Subject: [PATCH 13/34] Fix getTxInfo, formatAmountStr --- src/js/services/profileService.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/js/services/profileService.js b/src/js/services/profileService.js index bef87b67d..492171431 100644 --- a/src/js/services/profileService.js +++ b/src/js/services/profileService.js @@ -881,7 +881,7 @@ console.log('[profileService.js:92]',wallet); //TODO/ x.types = [x.type]; if (x.data && x.data.amount) - x.amountStr = txFormatService.formatAmountStr(wallet, x.data.amount); + x.amountStr = txFormatService.formatAmountStr(wallet.coin, x.data.amount); x.action = function() { // TODO? From ac5a5a9bdc40ba719489f857f71e244fcac1d6ec Mon Sep 17 00:00:00 2001 From: Gustavo Maximiliano Cortez Date: Mon, 28 Aug 2017 17:17:32 -0300 Subject: [PATCH 14/34] Fix feeRate, sendMax --- src/js/controllers/modals/feeLevels.js | 6 +++--- src/js/controllers/paperWallet.js | 4 ++-- src/js/controllers/preferencesFee.js | 4 ++-- src/js/services/coinbaseService.js | 4 ++-- src/js/services/feeService.js | 6 +++--- src/js/services/profileService.js | 4 ---- src/js/services/walletService.js | 2 +- 7 files changed, 13 insertions(+), 17 deletions(-) diff --git a/src/js/controllers/modals/feeLevels.js b/src/js/controllers/modals/feeLevels.js index 72a3e2abf..30776ac88 100644 --- a/src/js/controllers/modals/feeLevels.js +++ b/src/js/controllers/modals/feeLevels.js @@ -18,14 +18,14 @@ angular.module('copayApp.controllers').controller('feeLevelsController', functio var value = lodash.find($scope.feeLevels[$scope.network], { level: 'superEconomy' }); - return parseInt((value.feePerKB / 1000).toFixed()); + return parseInt((value.feePerKb / 1000).toFixed()); }; var getMaxRecommended = function() { var value = lodash.find($scope.feeLevels[$scope.network], { level: 'urgent' }); - return parseInt((value.feePerKB / 1000).toFixed()); + return parseInt((value.feePerKb / 1000).toFixed()); }; $scope.ok = function() { @@ -61,7 +61,7 @@ angular.module('copayApp.controllers').controller('feeLevelsController', functio // If no custom fee if (value) { $scope.customFeePerKB = null; - $scope.feePerSatByte = (value.feePerKB / 1000).toFixed(); + $scope.feePerSatByte = (value.feePerKb / 1000).toFixed(); $scope.avgConfirmationTime = value.nbBlocks * 10; } else { $scope.avgConfirmationTime = null; diff --git a/src/js/controllers/paperWallet.js b/src/js/controllers/paperWallet.js index c00d4910b..82390bc3e 100644 --- a/src/js/controllers/paperWallet.js +++ b/src/js/controllers/paperWallet.js @@ -59,9 +59,9 @@ angular.module('copayApp.controllers').controller('paperWalletController', $scope.wallet.buildTxFromPrivateKey($scope.privateKey, destinationAddress, null, function(err, testTx) { if (err) return cb(err); var rawTxLength = testTx.serialize().length; - feeService.getCurrentFeeRate('livenet', function(err, feePerKB) { + feeService.getCurrentFeeRate('livenet', function(err, feePerKb) { var opts = {}; - opts.fee = Math.round((feePerKB * rawTxLength) / 2000); + opts.fee = Math.round((feePerKb * rawTxLength) / 2000); $scope.wallet.buildTxFromPrivateKey($scope.privateKey, destinationAddress, opts, function(err, tx) { if (err) return cb(err); $scope.wallet.broadcastRawTx({ diff --git a/src/js/controllers/preferencesFee.js b/src/js/controllers/preferencesFee.js index 9339b413e..5446d7737 100644 --- a/src/js/controllers/preferencesFee.js +++ b/src/js/controllers/preferencesFee.js @@ -66,7 +66,7 @@ angular.module('copayApp.controllers').controller('preferencesFeeController', fu return; } - $scope.feePerSatByte = (value.feePerKB / 1000).toFixed(); + $scope.feePerSatByte = (value.feePerKb / 1000).toFixed(); $scope.avgConfirmationTime = value.nbBlocks * 10; $scope.invalidCustomFeeEntered = false; setMinWarning(); @@ -97,7 +97,7 @@ angular.module('copayApp.controllers').controller('preferencesFeeController', fu var value = lodash.find($scope.feeLevels[$scope.network], { level: 'superEconomy' }); - return parseInt((value.feePerKB / 1000).toFixed()); + return parseInt((value.feePerKb / 1000).toFixed()); }; var setMinWarning = function() { diff --git a/src/js/services/coinbaseService.js b/src/js/services/coinbaseService.js index 87e732bb1..6c393e307 100644 --- a/src/js/services/coinbaseService.js +++ b/src/js/services/coinbaseService.js @@ -170,9 +170,9 @@ angular.module('copayApp.services').factory('coinbaseService', function($http, $ var _getNetAmount = function(amount, cb) { // Fee Normal for a single transaction (450 bytes) var txNormalFeeKB = 450 / 1000; - feeService.getFeeRate(null, 'normal', function(err, feePerKB) { + feeService.getFeeRate(null, 'normal', function(err, feePerKb) { if (err) return cb(err); - var feeBTC = (feePerKB * txNormalFeeKB / 100000000).toFixed(8); + var feeBTC = (feePerKb * txNormalFeeKB / 100000000).toFixed(8); return cb(null, amount - feeBTC, feeBTC); }); diff --git a/src/js/services/feeService.js b/src/js/services/feeService.js index e827cac1b..c396c2337 100644 --- a/src/js/services/feeService.js +++ b/src/js/services/feeService.js @@ -37,7 +37,7 @@ angular.module('copayApp.services').factory('feeService', function($log, $timeou level: feeLevel }); - if (!feeLevelRate || !feeLevelRate.feePerKB) { + if (!feeLevelRate || !feeLevelRate.feePerKb) { return cb({ message: gettextCatalog.getString("Could not get dynamic fee for level: {{feeLevel}}", { feeLevel: feeLevel @@ -45,9 +45,9 @@ angular.module('copayApp.services').factory('feeService', function($log, $timeou }); } - var feeRate = feeLevelRate.feePerKB; + var feeRate = feeLevelRate.feePerKb; - if (!fromCache) $log.debug('Dynamic fee: ' + feeLevel + '/' + network + ' ' + (feeLevelRate.feePerKB / 1000).toFixed() + ' SAT/B'); + if (!fromCache) $log.debug('Dynamic fee: ' + feeLevel + '/' + network + ' ' + (feeLevelRate.feePerKb / 1000).toFixed() + ' SAT/B'); return cb(null, feeRate); }); diff --git a/src/js/services/profileService.js b/src/js/services/profileService.js index 492171431..f30a011f8 100644 --- a/src/js/services/profileService.js +++ b/src/js/services/profileService.js @@ -90,10 +90,6 @@ angular.module('copayApp.services') wallet.m = wallet.credentials.m; wallet.n = wallet.credentials.n; wallet.coin = wallet.credentials.coin ? wallet.credentials.coin : 'btc'; -console.log('[profileService.js:92]',wallet); //TODO/ - - // TODO: Should return "coin" = "btc" or "bch" - //client.credentials.coin = 'btc'; root.updateWalletSettings(wallet); root.wallet[walletId] = wallet; diff --git a/src/js/services/walletService.js b/src/js/services/walletService.js index 8d2ad40ca..295484558 100644 --- a/src/js/services/walletService.js +++ b/src/js/services/walletService.js @@ -922,7 +922,7 @@ angular.module('copayApp.services').factory('walletService', function($log, $tim root.getMinFee = function(wallet, feeLevels, nbOutputs) { var lowLevelRate = (lodash.find(feeLevels[wallet.network], { level: 'normal', - }).feePerKB / 1000).toFixed(0); + }).feePerKb / 1000).toFixed(0); var size = root.getEstimatedTxSize(wallet, nbOutputs); return size * lowLevelRate; From db04a31a061ede31744d555be918c3222fca78d6 Mon Sep 17 00:00:00 2001 From: Gustavo Maximiliano Cortez Date: Mon, 28 Aug 2017 18:01:07 -0300 Subject: [PATCH 15/34] Fix priority normal for bch transactions --- src/js/controllers/confirm.js | 9 +++++++-- src/js/services/profileService.js | 9 ++++++--- www/views/confirm.html | 18 ++++++++++-------- 3 files changed, 23 insertions(+), 13 deletions(-) diff --git a/src/js/controllers/confirm.js b/src/js/controllers/confirm.js index 4111487e3..26265dda9 100644 --- a/src/js/controllers/confirm.js +++ b/src/js/controllers/confirm.js @@ -119,6 +119,11 @@ angular.module('copayApp.controllers').controller('confirmController', function( }); }; + // TODO: Default fee level for BCH + if (data.stateParams.coin == 'bch') { + configFeeLevel = 'normal'; + } + // Setup $scope // Grab stateParams @@ -142,13 +147,11 @@ angular.module('copayApp.controllers').controller('confirmController', function( txp: {}, }; - // Other Scope vars $scope.isCordova = isCordova; $scope.isWindowsPhoneApp = isWindowsPhoneApp; $scope.showAddress = false; - $scope.walletSelectorTitle = gettextCatalog.getString('Send from'); setWalletSelector(tx.coin, tx.network, tx.toAmount, function(err) { @@ -563,6 +566,8 @@ angular.module('copayApp.controllers').controller('confirmController', function( $scope.chooseFeeLevel = function(tx, wallet) { + if (wallet.coin == 'bch') return; + var scope = $rootScope.$new(true); scope.network = tx.network; scope.feeLevel = tx.feeLevel; diff --git a/src/js/services/profileService.js b/src/js/services/profileService.js index f30a011f8..006adaf23 100644 --- a/src/js/services/profileService.js +++ b/src/js/services/profileService.js @@ -91,6 +91,9 @@ angular.module('copayApp.services') wallet.n = wallet.credentials.n; wallet.coin = wallet.credentials.coin ? wallet.credentials.coin : 'btc'; + // TODO + if (wallet.id == 'bf338d5b-6b2e-4118-adb0-6208c2d22a81') wallet.credentials.coin = wallet.coin = 'bch'; + root.updateWalletSettings(wallet); root.wallet[walletId] = wallet; @@ -864,7 +867,7 @@ angular.module('copayApp.services') }); }; - function process(wallet, notifications) { + function process(notifications) { if (!notifications) return []; var shown = lodash.sortBy(notifications, 'createdOn').reverse(); @@ -877,7 +880,7 @@ angular.module('copayApp.services') x.types = [x.type]; if (x.data && x.data.amount) - x.amountStr = txFormatService.formatAmountStr(wallet.coin, x.data.amount); + x.amountStr = txFormatService.formatAmountStr(x.wallet.coin, x.data.amount); x.action = function() { // TODO? @@ -955,7 +958,7 @@ angular.module('copayApp.services') notifications = lodash.sortBy(notifications, 'createdOn'); notifications = lodash.compact(lodash.flatten(notifications)).slice(0, MAX); var total = notifications.length; - return cb(null, process(wallet, notifications), total); + return cb(null, process(notifications), total); }; }); }); diff --git a/www/views/confirm.html b/www/views/confirm.html index 3622398a1..fa0fd8821 100644 --- a/www/views/confirm.html +++ b/www/views/confirm.html @@ -79,18 +79,20 @@
{{'Fee:' | translate}} {{tx.feeLevelName | translate}} - {{tx.txp[wallet.id].feeStr || '...'}} - - {{tx.txp[wallet.id].alternativeFeeStr || '...'}}  - · -   - {{tx.txp[wallet.id].feeRatePerStr}} of the sending amount + + {{tx.txp[wallet.id].feeStr || '...'}} + + {{tx.txp[wallet.id].alternativeFeeStr || '...'}}  + · +   + {{tx.txp[wallet.id].feeRatePerStr}} of the sending amount + + - - +
Add Memo From 5613e06e6234b023e8684858a6023a1c594fb5ce Mon Sep 17 00:00:00 2001 From: Gustavo Maximiliano Cortez Date: Mon, 28 Aug 2017 18:15:08 -0300 Subject: [PATCH 16/34] Import bch from file --- src/js/controllers/import.js | 2 ++ www/views/tab-import-file.html | 10 ++++++++++ 2 files changed, 12 insertions(+) diff --git a/src/js/controllers/import.js b/src/js/controllers/import.js index d026c6c07..b520ad2b6 100644 --- a/src/js/controllers/import.js +++ b/src/js/controllers/import.js @@ -204,6 +204,7 @@ angular.module('copayApp.controllers').controller('importController', if (evt.target.readyState == FileReader.DONE) { // DONE == 2 var opts = {}; opts.bwsurl = $scope.formData.bwsurl; + opts.coin = $scope.formData.coin; _importBlob(evt.target.result, opts); } } @@ -229,6 +230,7 @@ angular.module('copayApp.controllers').controller('importController', } else { var opts = {}; opts.bwsurl = $scope.formData.bwsurl; + opts.coin = $scope.formData.coin; _importBlob(backupText, opts); } }; diff --git a/www/views/tab-import-file.html b/www/views/tab-import-file.html index 65e9ee001..4f931dc8e 100644 --- a/www/views/tab-import-file.html +++ b/www/views/tab-import-file.html @@ -21,6 +21,16 @@ ng-model="formData.password"> + +
From c21afeca3059e39d321cc38796d2c9b06fd1f851 Mon Sep 17 00:00:00 2001 From: Matias Alejo Garcia Date: Tue, 29 Aug 2017 10:52:26 -0300 Subject: [PATCH 17/34] cash support in amount.js --- src/js/controllers/advancedSettings.js | 17 +++ src/js/controllers/amount.js | 151 +++++++++++++++++++++---- src/js/services/configService.js | 10 +- src/sass/views/amount.scss | 2 +- www/views/advancedSettings.html | 10 ++ www/views/amount.html | 16 +-- 6 files changed, 170 insertions(+), 36 deletions(-) diff --git a/src/js/controllers/advancedSettings.js b/src/js/controllers/advancedSettings.js index cd065200c..baca061fc 100644 --- a/src/js/controllers/advancedSettings.js +++ b/src/js/controllers/advancedSettings.js @@ -14,6 +14,10 @@ angular.module('copayApp.controllers').controller('advancedSettingsController', $scope.hideNextSteps = { value: config.hideNextSteps.enabled }; + $scope.cashSupport = { + value: config.cashSupport.enabled + }; + }; $scope.spendUnconfirmedChange = function() { @@ -27,6 +31,19 @@ angular.module('copayApp.controllers').controller('advancedSettingsController', }); }; + + $scope.cashSupportChange = function() { + var opts = { + cashSupport: { + enabled: $scope.cashSupport.value + } + }; + configService.set(opts, function(err) { + if (err) $log.debug(err); + }); + }; + + $scope.nextStepsChange = function() { var opts = { hideNextSteps: { diff --git a/src/js/controllers/amount.js b/src/js/controllers/amount.js index 813667251..d1f503efb 100644 --- a/src/js/controllers/amount.js +++ b/src/js/controllers/amount.js @@ -9,6 +9,12 @@ angular.module('copayApp.controllers').controller('amountController', function($ var SMALL_FONT_SIZE_LIMIT = 10; var LENGTH_EXPRESSION_LIMIT = 19; var isNW = platformInfo.isNW; + + var unitIndex = 0; + var altUnitIndex = 0; + var availableUnits = []; + var fiatCode; + $scope.isChromeApp = platformInfo.isChromeApp; $scope.$on('$ionicView.leave', function() { @@ -16,13 +22,71 @@ angular.module('copayApp.controllers').controller('amountController', function($ }); $scope.$on("$ionicView.beforeEnter", function(event, data) { + + var config = configService.getSync().wallet.settings; + + function setAvailableUnits() { + + // TODO: Depends on the available wallets + // also, depends on forceCurrency & forceCoin + // Take this from somewhere elase + availableUnits = [{ + name: 'Bitcoin', + id: 'btc', + shortName: 'BTC', + }]; + + + var anyCashWallet = true; // TODO!! + if (anyCashWallet) { + availableUnits.push({ + name: 'Bitcoin Cash', + id: 'bch', + shortName: 'BCH', + }); + }; + + + var fiat; + if (data.stateParams.currency) { + fiat = data.stateParams.currency; + } else { + fiat = config.fiat || 'USD'; + } + + availableUnits.push({ + name: fiat, // TODO + id: fiat, + shortName: fiat, + isFiat: true, + }); + + unitIndex = 0; + altUnitIndex = availableUnits.length - 1; + fiatCode = fiat; + }; + // Go to... _id = data.stateParams.id; // Optional (BitPay Card ID or Wallet ID) $scope.nextStep = data.stateParams.nextStep; + + // TODO $scope.currency = data.stateParams.currency; $scope.forceCurrency = data.stateParams.forceCurrency; $scope.forceCoin = data.stateParams.forceCoin; - $scope.coin = data.stateParams.coin || 'btc'; + + + // TODO + // if (data.stateParams.coin) { + // unitIndex = lodash.indexOf(data.stateParams.coin.toUpperCase()); + // if (unitIndex < 0) { + // $log.warn('Could not find desired coin:' + data.stateParams.coin) + // unitIndex = 0; + // } + // } + + setAvailableUnits(); + updateUnitUI(); $scope.showMenu = $ionicHistory.backView() && ($ionicHistory.backView().stateName == 'tabs.send' || $ionicHistory.backView().stateName == 'tabs.bitpayCard'); @@ -30,7 +94,6 @@ angular.module('copayApp.controllers').controller('amountController', function($ $scope.toAddress = data.stateParams.toAddress; $scope.toName = data.stateParams.toName; $scope.toEmail = data.stateParams.toEmail; - $scope.showAlternativeAmount = !!$scope.nextStep; $scope.toColor = data.stateParams.toColor; $scope.showSendMax = false; @@ -63,13 +126,6 @@ angular.module('copayApp.controllers').controller('amountController', function($ $scope.$apply(); }); }); - - var config = configService.getSync().wallet.settings; - if (data.stateParams.currency) { - $scope.alternativeIsoCode = data.stateParams.currency; - } else { - $scope.alternativeIsoCode = config.alternativeIsoCode || 'USD'; - } $scope.specificAmount = $scope.specificAlternativeAmount = ''; $scope.isCordova = platformInfo.isCordova; unitToSatoshi = config.unitToSatoshi; @@ -115,6 +171,8 @@ angular.module('copayApp.controllers').controller('amountController', function($ $scope.finish(); }; + + // TODO $scope.toggleAlternative = function() { if ($scope.forceCurrency) return; $scope.showAlternativeAmount = !$scope.showAlternativeAmount; @@ -125,10 +183,52 @@ angular.module('copayApp.controllers').controller('amountController', function($ } }; - $scope.toggleCoin = function() { - if ($scope.forceCurrency || $scope.forceCoin) return; + function updateUnitUI() { - $scope.coin = $scope.coin == 'btc' ? 'bch' : 'btc'; + $scope.unit = availableUnits[unitIndex].shortName; + $scope.alternativeUnit = availableUnits[altUnitIndex].shortName; + + processAmount(); + $log.debug('Update unit coin @amount unit:' + $scope.unit + " alternativeUnit:" + $scope.alternativeUnit); //TODO + }; + + $scope.changeUnit = function() { + // TODO + // if ($scope.forceCurrency || $scope.forceCoin) return; + + unitIndex++; + if (unitIndex >= availableUnits.length) unitIndex = 0; + + + if (availableUnits[unitIndex].isFiat) { + // Always return to BTC... TODO? + altUnitIndex = 0; + } else { + altUnitIndex = lodash.findIndex(availableUnits, { + isFiat: true + }); + } + + updateUnitUI(); + }; + + + $scope.changeAlternativeUnit = function() { + console.log('[amount.js.215:changeAlternativeUnit:]'); //TODO + + // Do nothing is fiat is not main unit + if (!availableUnits[unitIndex].isFiat) return; + + var nextCoin = lodash.findIndex(availableUnits, function(x) { + if (x.isFiat) return false; + if (x.id == availableUnits[altUnitIndex].id) return false; + return true; + }); + + if (nextCoin >= 0) { + altUnitIndex = nextCoin; + updateUnitUI(); + } }; function checkFontSize() { @@ -139,7 +239,7 @@ angular.module('copayApp.controllers').controller('amountController', function($ $scope.pushDigit = function(digit) { if ($scope.amount && $scope.amount.length >= LENGTH_EXPRESSION_LIMIT) return; if ($scope.amount.indexOf('.') > -1 && digit == '.') return; - if ($scope.showAlternativeAmount && $scope.amount.indexOf('.') > -1 && $scope.amount[$scope.amount.indexOf('.') + 2]) return; + if (availableUnits[unitIndex].isFiat && $scope.amount.indexOf('.') > -1 && $scope.amount[$scope.amount.indexOf('.') + 2]) return; $scope.amount = ($scope.amount + digit).replace('..', '.'); checkFontSize(); @@ -176,7 +276,7 @@ angular.module('copayApp.controllers').controller('amountController', function($ }; $scope.resetAmount = function() { - $scope.amount = $scope.alternativeResult = $scope.amountResult = $scope.globalResult = ''; + $scope.amount = $scope.alternativeAmount = $scope.globalResult = ''; $scope.allowSend = false; checkFontSize(); }; @@ -187,24 +287,28 @@ angular.module('copayApp.controllers').controller('amountController', function($ $scope.allowSend = lodash.isNumber(result) && +result > 0; if (lodash.isNumber(result)) { $scope.globalResult = isExpression($scope.amount) ? '= ' + processResult(result) : ''; - $scope.amountResult = $filter('formatFiatAmount')(toFiat(result)); - $scope.alternativeResult = txFormatService.formatAmount(fromFiat(result) * unitToSatoshi, true); + + if (availableUnits[unitIndex].isFiat) { + $scope.alternativeAmount = txFormatService.formatAmount(fromFiat(result) * unitToSatoshi, true); + } else { + $scope.alternativeAmount = $filter('formatFiatAmount')(toFiat(result)); + } } }; function processResult(val) { - if ($scope.showAlternativeAmount) + if (availableUnits[unitIndex].isFiat) return $filter('formatFiatAmount')(val); else return txFormatService.formatAmount(val.toFixed(unitDecimals) * unitToSatoshi, true); }; function fromFiat(val) { - return parseFloat((rateService.fromFiat(val, $scope.alternativeIsoCode, $scope.coin) * satToUnit).toFixed(unitDecimals)); + return parseFloat((rateService.fromFiat(val, fiatCode, availableUnits[altUnitIndex].id) * satToUnit).toFixed(unitDecimals)); }; function toFiat(val) { - return parseFloat((rateService.toFiat(val * unitToSatoshi, $scope.alternativeIsoCode, $scope.coin)).toFixed(2)); + return parseFloat((rateService.toFiat(val * unitToSatoshi, fiatCode, availableUnits[unitIndex].id)).toFixed(2)); }; function evaluate(val) { @@ -219,6 +323,8 @@ angular.module('copayApp.controllers').controller('amountController', function($ }; function format(val) { + if (!val) return; + var result = val.toString(); if (isOperator(lodash.last(val))) @@ -234,8 +340,9 @@ angular.module('copayApp.controllers').controller('amountController', function($ $state.transitionTo($scope.nextStep, { id: _id, amount: $scope.useSendMax ? null : _amount, - currency: $scope.showAlternativeAmount ? $scope.alternativeIsoCode : ($scope.coin).toUpperCase(), - coin: $scope.coin, + // TODO + currency: $scope.showAlternativeAmount ? fiatCode : (coin).toUpperCase(), + coin: coin, useSendMax: $scope.useSendMax }); } else { @@ -247,7 +354,7 @@ angular.module('copayApp.controllers').controller('amountController', function($ toName: $scope.toName, toEmail: $scope.toEmail, toColor: $scope.toColor, - coin: $scope.coin, + coin: coin, useSendMax: $scope.useSendMax }); } diff --git a/src/js/services/configService.js b/src/js/services/configService.js index 3fa2f1f59..de2776c0d 100644 --- a/src/js/services/configService.js +++ b/src/js/services/configService.js @@ -61,7 +61,10 @@ angular.module('copayApp.services').factory('configService', function(storageSer bannedUntil: null, }, - // External services + cashSupport: { + enabled: true, + }, + recentTransactions: { enabled: true, }, @@ -133,6 +136,11 @@ angular.module('copayApp.services').factory('configService', function(storageSer configCache.hideNextSteps = defaultConfig.hideNextSteps; } + + if (!configCache.cashSupport) { + configCache.cashSupport = defaultConfig.cashSupport; + } + if (!configCache.recentTransactions) { configCache.recentTransactions = defaultConfig.recentTransactions; } diff --git a/src/sass/views/amount.scss b/src/sass/views/amount.scss index 1f6a242d6..bd45e524a 100644 --- a/src/sass/views/amount.scss +++ b/src/sass/views/amount.scss @@ -200,7 +200,7 @@ &__result { color: $v-light-gray; font-size: .9em; - margin-bottom: -.9em; + //margin-bottom: -.9em; TODO matias line-height: 1; @media(max-height: 480px) { margin-bottom: 0; diff --git a/www/views/advancedSettings.html b/www/views/advancedSettings.html index 68f1f58a5..6b610b5ea 100644 --- a/www/views/advancedSettings.html +++ b/www/views/advancedSettings.html @@ -7,6 +7,16 @@
+ + + Support Bitcoin Cash + + + + + Use Unconfirmed Funds diff --git a/www/views/amount.html b/www/views/amount.html index 4f37414ca..5d79f8ad7 100644 --- a/www/views/amount.html +++ b/www/views/amount.html @@ -48,19 +48,11 @@
{{amount || "0.00" }} - {{alternativeIsoCode}} - {{coin}} + {{unit}}
-
- -
-
-
{{globalResult}} {{coin}}
-
≈ {{amountResult || '0.00'}} {{alternativeIsoCode}}
-
-
-
{{globalResult}} {{alternativeIsoCode}}
-
{{alternativeResult || '0.00'}} {{coin}}
+
+
{{globalResult}} {{unit}}
+
≈ {{alternativeAmount || '0.00'}} {{alternativeUnit}}
From e040871e2650dc408d4cddfd4b562d164365d350 Mon Sep 17 00:00:00 2001 From: Matias Alejo Garcia Date: Tue, 29 Aug 2017 11:24:29 -0300 Subject: [PATCH 18/34] add confirm fixes --- src/js/controllers/amount.js | 55 +++++++++++++++++++---------------- src/js/controllers/confirm.js | 1 + 2 files changed, 31 insertions(+), 25 deletions(-) diff --git a/src/js/controllers/amount.js b/src/js/controllers/amount.js index d1f503efb..0252636a1 100644 --- a/src/js/controllers/amount.js +++ b/src/js/controllers/amount.js @@ -27,9 +27,6 @@ angular.module('copayApp.controllers').controller('amountController', function($ function setAvailableUnits() { - // TODO: Depends on the available wallets - // also, depends on forceCurrency & forceCoin - // Take this from somewhere elase availableUnits = [{ name: 'Bitcoin', id: 'btc', @@ -70,20 +67,18 @@ angular.module('copayApp.controllers').controller('amountController', function($ _id = data.stateParams.id; // Optional (BitPay Card ID or Wallet ID) $scope.nextStep = data.stateParams.nextStep; - // TODO - $scope.currency = data.stateParams.currency; $scope.forceCurrency = data.stateParams.forceCurrency; $scope.forceCoin = data.stateParams.forceCoin; - - // TODO - // if (data.stateParams.coin) { - // unitIndex = lodash.indexOf(data.stateParams.coin.toUpperCase()); - // if (unitIndex < 0) { - // $log.warn('Could not find desired coin:' + data.stateParams.coin) - // unitIndex = 0; - // } - // } + if (data.stateParams.coin) { + var index = lodash.findIndex(availableUnits, { id: data.stateParams.coin }); + + if (index < 0) { + $log.warn('Could not find desired coin:' + data.stateParams.coin) + } else { + unitIndex = index; + } + } setAvailableUnits(); updateUnitUI(); @@ -172,11 +167,7 @@ angular.module('copayApp.controllers').controller('amountController', function($ }; - // TODO $scope.toggleAlternative = function() { - if ($scope.forceCurrency) return; - $scope.showAlternativeAmount = !$scope.showAlternativeAmount; - if ($scope.amount && isExpression($scope.amount)) { var amount = evaluate(format($scope.amount)); $scope.globalResult = '= ' + processResult(amount); @@ -193,8 +184,7 @@ angular.module('copayApp.controllers').controller('amountController', function($ }; $scope.changeUnit = function() { - // TODO - // if ($scope.forceCurrency || $scope.forceCoin) return; + if ($scope.forceCurrency || $scope.forceCoin) return; unitIndex++; if (unitIndex >= availableUnits.length) unitIndex = 0; @@ -334,27 +324,42 @@ angular.module('copayApp.controllers').controller('amountController', function($ }; $scope.finish = function() { + + var unit = availableUnits[unitIndex]; var _amount = evaluate(format($scope.amount)); if ($scope.nextStep) { + + var coin = unit.id; + if (unit.isFiat) { + coin = availableUnits[altUnitIndex].id; + } + $state.transitionTo($scope.nextStep, { id: _id, amount: $scope.useSendMax ? null : _amount, - // TODO - currency: $scope.showAlternativeAmount ? fiatCode : (coin).toUpperCase(), + currency: unit.id.toUpperCase(), coin: coin, useSendMax: $scope.useSendMax }); } else { - var amount = $scope.showAlternativeAmount ? fromFiat(_amount) : _amount; + var amount = _amount; + + if (unit.isFiat) { + amount = fromFiat(_amount); + } else if ($scope.useSendMax){ + amount = (amount * unitToSatoshi).toFixed(0); + } + + $state.transitionTo('tabs.send.confirm', { recipientType: $scope.recipientType, - toAmount: $scope.useSendMax ? null : (amount * unitToSatoshi).toFixed(0), + toAmount: amount, toAddress: $scope.toAddress, toName: $scope.toName, toEmail: $scope.toEmail, toColor: $scope.toColor, - coin: coin, + coin: unit.id, useSendMax: $scope.useSendMax }); } diff --git a/src/js/controllers/confirm.js b/src/js/controllers/confirm.js index 26265dda9..1f792fa8d 100644 --- a/src/js/controllers/confirm.js +++ b/src/js/controllers/confirm.js @@ -74,6 +74,7 @@ angular.module('copayApp.controllers').controller('confirmController', function( // no min amount? (sendMax) => look for no empty wallets minAmount = minAmount || 1; +console.log('[confirm.js.76]', network, coin); //TODO $scope.wallets = profileService.getWallets({ onlyComplete: true, network: network, From 42ee794c3e22375ce5841d6e20ec19999a6af86f Mon Sep 17 00:00:00 2001 From: Matias Alejo Garcia Date: Tue, 29 Aug 2017 12:45:10 -0300 Subject: [PATCH 19/34] fix fixedUnit --- src/js/controllers/amount.js | 60 +++++++++++++++++++++++------------- src/js/routes.js | 12 ++------ 2 files changed, 41 insertions(+), 31 deletions(-) diff --git a/src/js/controllers/amount.js b/src/js/controllers/amount.js index 0252636a1..8697b9d37 100644 --- a/src/js/controllers/amount.js +++ b/src/js/controllers/amount.js @@ -15,6 +15,8 @@ angular.module('copayApp.controllers').controller('amountController', function($ var availableUnits = []; var fiatCode; + var fixedUnit; + $scope.isChromeApp = platformInfo.isChromeApp; $scope.$on('$ionicView.leave', function() { @@ -33,8 +35,8 @@ angular.module('copayApp.controllers').controller('amountController', function($ shortName: 'BTC', }]; - - var anyCashWallet = true; // TODO!! + + var anyCashWallet = true; // TODO!! if (anyCashWallet) { availableUnits.push({ name: 'Bitcoin Cash', @@ -43,12 +45,38 @@ angular.module('copayApp.controllers').controller('amountController', function($ }); }; + unitIndex = 0; + if (data.stateParams.coin) { + var coins = data.stateParams.coin.split(','); + var newAvailableUnits = []; + + lodash.each(coins, function(c) { + var coin = lodash.find(availableUnits, { + id: c + }); + if (!coin) { + $log.warn('Could not find desired coin:' + data.stateParams.coin) + } else { + newAvailableUnits.push(coin); + } + }); + + if (newAvailableUnits.length>0) { + availableUnits = newAvailableUnits; + } + } + + + // currency have preference var fiat; if (data.stateParams.currency) { fiat = data.stateParams.currency; + altUnitIndex = unitIndex + unitIndex = availableUnits.length; } else { fiat = config.fiat || 'USD'; + altUnitIndex = availableUnits.length; } availableUnits.push({ @@ -58,27 +86,17 @@ angular.module('copayApp.controllers').controller('amountController', function($ isFiat: true, }); - unitIndex = 0; - altUnitIndex = availableUnits.length - 1; fiatCode = fiat; + + if (data.stateParams.fixedUnit) { + fixedUnit = true; + } }; // Go to... _id = data.stateParams.id; // Optional (BitPay Card ID or Wallet ID) $scope.nextStep = data.stateParams.nextStep; - $scope.forceCurrency = data.stateParams.forceCurrency; - $scope.forceCoin = data.stateParams.forceCoin; - - if (data.stateParams.coin) { - var index = lodash.findIndex(availableUnits, { id: data.stateParams.coin }); - - if (index < 0) { - $log.warn('Could not find desired coin:' + data.stateParams.coin) - } else { - unitIndex = index; - } - } setAvailableUnits(); updateUnitUI(); @@ -175,16 +193,15 @@ angular.module('copayApp.controllers').controller('amountController', function($ }; function updateUnitUI() { - $scope.unit = availableUnits[unitIndex].shortName; $scope.alternativeUnit = availableUnits[altUnitIndex].shortName; processAmount(); - $log.debug('Update unit coin @amount unit:' + $scope.unit + " alternativeUnit:" + $scope.alternativeUnit); //TODO + $log.debug('Update unit coin @amount unit:' + $scope.unit + " alternativeUnit:" + $scope.alternativeUnit); }; $scope.changeUnit = function() { - if ($scope.forceCurrency || $scope.forceCoin) return; + if (fixedUnit) return; unitIndex++; if (unitIndex >= availableUnits.length) unitIndex = 0; @@ -204,7 +221,6 @@ angular.module('copayApp.controllers').controller('amountController', function($ $scope.changeAlternativeUnit = function() { - console.log('[amount.js.215:changeAlternativeUnit:]'); //TODO // Do nothing is fiat is not main unit if (!availableUnits[unitIndex].isFiat) return; @@ -332,7 +348,7 @@ angular.module('copayApp.controllers').controller('amountController', function($ var coin = unit.id; if (unit.isFiat) { - coin = availableUnits[altUnitIndex].id; + coin = availableUnits[altUnitIndex].id; } $state.transitionTo($scope.nextStep, { @@ -347,7 +363,7 @@ angular.module('copayApp.controllers').controller('amountController', function($ if (unit.isFiat) { amount = fromFiat(_amount); - } else if ($scope.useSendMax){ + } else if ($scope.useSendMax) { amount = (amount * unitToSatoshi).toFixed(0); } diff --git a/src/js/routes.js b/src/js/routes.js index c3e8442ae..0fe72181d 100644 --- a/src/js/routes.js +++ b/src/js/routes.js @@ -287,7 +287,7 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr */ .state('tabs.send.amount', { - url: '/amount/:recipientType/:toAddress/:toName/:toEmail/:toColor/:coin', + url: '/amount/:recipientType/:toAddress/:toName/:toEmail/:toColor/:coin/:fixedUnit', views: { 'tab-send@tabs': { controller: 'amountController', @@ -668,7 +668,6 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr params: { id: null, nextStep: 'tabs.paymentRequest.confirm', - forceCoin: true } }) @@ -918,7 +917,6 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr }, params: { coin: 'btc', - forceCoin: true } }) .state('tabs.buyandsell.glidera.amount', { @@ -975,7 +973,6 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr }, params: { coin: 'btc', - forceCoin: true } }) .state('tabs.preferences.coinbase', { @@ -1064,9 +1061,8 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr params: { nextStep: 'tabs.giftcards.mercadoLibre.buy', currency: 'BRL', - forceCurrency: true, coin: 'btc', - forceCoin: true + fixedUnit: 1, } }) .state('tabs.giftcards.mercadoLibre.buy', { @@ -1117,9 +1113,8 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr params: { nextStep: 'tabs.giftcards.amazon.buy', currency: 'USD', - forceCurrency: true, coin: 'btc', - forceCoin: true + fixedUnit: true, } }) .state('tabs.giftcards.amazon.buy', { @@ -1160,7 +1155,6 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr id: null, currency: 'USD', coin: 'btc', - forceCoin: true, useSendMax: null } }) From 491aef0acf89aa96843581eb28ff9085b688e29c Mon Sep 17 00:00:00 2001 From: Gustavo Maximiliano Cortez Date: Tue, 29 Aug 2017 15:42:51 -0300 Subject: [PATCH 20/34] Fix amount in satoshis --- src/js/controllers/amount.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/js/controllers/amount.js b/src/js/controllers/amount.js index 8697b9d37..c759f0dfb 100644 --- a/src/js/controllers/amount.js +++ b/src/js/controllers/amount.js @@ -363,7 +363,7 @@ angular.module('copayApp.controllers').controller('amountController', function($ if (unit.isFiat) { amount = fromFiat(_amount); - } else if ($scope.useSendMax) { + } else { amount = (amount * unitToSatoshi).toFixed(0); } From 70fa50177c78d27168e90aba47f100e9e181957c Mon Sep 17 00:00:00 2001 From: Gustavo Maximiliano Cortez Date: Tue, 29 Aug 2017 15:47:39 -0300 Subject: [PATCH 21/34] Fix fee levels for btc and bch --- src/js/controllers/addresses.js | 2 +- src/js/controllers/confirm.js | 4 ++-- src/js/controllers/modals/feeLevels.js | 2 +- src/js/controllers/paperWallet.js | 2 +- src/js/controllers/preferencesFee.js | 3 ++- src/js/controllers/tx-details.js | 2 +- src/js/controllers/walletDetails.js | 4 ++-- src/js/services/coinbaseService.js | 2 +- src/js/services/feeService.js | 13 +++++++------ src/js/services/profileService.js | 5 +---- src/js/services/sendMax.js | 2 +- www/views/confirm.html | 2 -- 12 files changed, 20 insertions(+), 23 deletions(-) diff --git a/src/js/controllers/addresses.js b/src/js/controllers/addresses.js index 684ee53de..cfcd33f64 100644 --- a/src/js/controllers/addresses.js +++ b/src/js/controllers/addresses.js @@ -70,7 +70,7 @@ angular.module('copayApp.controllers').controller('addressesController', functio - feeService.getFeeLevels(function(err, levels){ + feeService.getFeeLevels($scope.wallet.coin, function(err, levels){ walletService.getLowUtxos($scope.wallet, levels, function(err, resp) { if (err) return; diff --git a/src/js/controllers/confirm.js b/src/js/controllers/confirm.js index 1f792fa8d..45605f719 100644 --- a/src/js/controllers/confirm.js +++ b/src/js/controllers/confirm.js @@ -74,7 +74,6 @@ angular.module('copayApp.controllers').controller('confirmController', function( // no min amount? (sendMax) => look for no empty wallets minAmount = minAmount || 1; -console.log('[confirm.js.76]', network, coin); //TODO $scope.wallets = profileService.getWallets({ onlyComplete: true, network: network, @@ -256,7 +255,7 @@ console.log('[confirm.js.76]', network, coin); //TODO // End of quick refresh, before wallet is selected. if (!wallet) return cb(); - feeService.getFeeRate(tx.network, tx.feeLevel, function(err, feeRate) { + feeService.getFeeRate(wallet.coin, tx.network, tx.feeLevel, function(err, feeRate) { if (err) return cb(err); if (!usingCustomFee) tx.feeRate = feeRate; @@ -573,6 +572,7 @@ console.log('[confirm.js.76]', network, coin); //TODO scope.network = tx.network; scope.feeLevel = tx.feeLevel; scope.noSave = true; + scope.coin = wallet.coin; if (usingCustomFee) { scope.customFeePerKB = tx.feeRate; diff --git a/src/js/controllers/modals/feeLevels.js b/src/js/controllers/modals/feeLevels.js index 30776ac88..691ce7d32 100644 --- a/src/js/controllers/modals/feeLevels.js +++ b/src/js/controllers/modals/feeLevels.js @@ -102,7 +102,7 @@ angular.module('copayApp.controllers').controller('feeLevelsController', functio $scope.feeOpts = feeService.feeOpts; $scope.loadingFee = true; - feeService.getFeeLevels(function(err, levels) { + feeService.getFeeLevels($scope.coin, function(err, levels) { $scope.loadingFee = false; if (err || lodash.isEmpty(levels)) { showErrorAndClose(null, err); diff --git a/src/js/controllers/paperWallet.js b/src/js/controllers/paperWallet.js index 82390bc3e..72a1d961a 100644 --- a/src/js/controllers/paperWallet.js +++ b/src/js/controllers/paperWallet.js @@ -59,7 +59,7 @@ angular.module('copayApp.controllers').controller('paperWalletController', $scope.wallet.buildTxFromPrivateKey($scope.privateKey, destinationAddress, null, function(err, testTx) { if (err) return cb(err); var rawTxLength = testTx.serialize().length; - feeService.getCurrentFeeRate('livenet', function(err, feePerKb) { + feeService.getCurrentFeeRate('btc', 'livenet', function(err, feePerKb) { var opts = {}; opts.fee = Math.round((feePerKb * rawTxLength) / 2000); $scope.wallet.buildTxFromPrivateKey($scope.privateKey, destinationAddress, opts, function(err, tx) { diff --git a/src/js/controllers/preferencesFee.js b/src/js/controllers/preferencesFee.js index 5446d7737..686c78460 100644 --- a/src/js/controllers/preferencesFee.js +++ b/src/js/controllers/preferencesFee.js @@ -32,11 +32,12 @@ angular.module('copayApp.controllers').controller('preferencesFeeController', fu }); $scope.init = function() { + var coin = 'btc'; // TODO: only BTC in preferences $scope.network = $scope.network || 'livenet'; $scope.feeOpts = feeService.feeOpts; $scope.currentFeeLevel = $scope.feeLevel || feeService.getCurrentFeeLevel(); $scope.loadingFee = true; - feeService.getFeeLevels(function(err, levels) { + feeService.getFeeLevels(coin, function(err, levels) { $scope.loadingFee = false; if (err) { //Error is already formatted diff --git a/src/js/controllers/tx-details.js b/src/js/controllers/tx-details.js index e2ef2f9f8..2d3a87cb8 100644 --- a/src/js/controllers/tx-details.js +++ b/src/js/controllers/tx-details.js @@ -131,7 +131,7 @@ angular.module('copayApp.controllers').controller('txDetailsController', functio $scope.$digest(); }); - feeService.getFeeLevels(function(err, levels) { + feeService.getFeeLevels($scope.wallet.coin, function(err, levels) { if (err) return; walletService.getLowAmount($scope.wallet, levels, function(err, amount) { if (err) return; diff --git a/src/js/controllers/walletDetails.js b/src/js/controllers/walletDetails.js index 912086c79..2f112d21c 100644 --- a/src/js/controllers/walletDetails.js +++ b/src/js/controllers/walletDetails.js @@ -52,7 +52,7 @@ angular.module('copayApp.controllers').controller('walletDetailsController', fun var analyzeUtxos = function() { if (analyzeUtxosDone) return; - feeService.getFeeLevels(function(err, levels) { + feeService.getFeeLevels($scope.wallet.coin, function(err, levels) { if (err) return; walletService.getLowUtxos($scope.wallet, levels, function(err, resp) { if (err || !resp) return; @@ -169,7 +169,7 @@ angular.module('copayApp.controllers').controller('walletDetailsController', fun }); }; - feeService.getFeeLevels(function(err, levels) { + feeService.getFeeLevels($scope.wallet.coin, function(err, levels) { walletService.getTxHistory($scope.wallet, { progressFn: progressFn, feeLevels: levels, diff --git a/src/js/services/coinbaseService.js b/src/js/services/coinbaseService.js index 6c393e307..87d1205a6 100644 --- a/src/js/services/coinbaseService.js +++ b/src/js/services/coinbaseService.js @@ -170,7 +170,7 @@ angular.module('copayApp.services').factory('coinbaseService', function($http, $ var _getNetAmount = function(amount, cb) { // Fee Normal for a single transaction (450 bytes) var txNormalFeeKB = 450 / 1000; - feeService.getFeeRate(null, 'normal', function(err, feePerKb) { + feeService.getFeeRate('btc', 'livenet', 'normal', function(err, feePerKb) { if (err) return cb(err); var feeBTC = (feePerKb * txNormalFeeKB / 100000000).toFixed(8); diff --git a/src/js/services/feeService.js b/src/js/services/feeService.js index c396c2337..2109d7ea0 100644 --- a/src/js/services/feeService.js +++ b/src/js/services/feeService.js @@ -24,13 +24,13 @@ angular.module('copayApp.services').factory('feeService', function($log, $timeou }; - root.getFeeRate = function(network, feeLevel, cb) { + root.getFeeRate = function(coin, network, feeLevel, cb) { if (feeLevel == 'custom') return cb(); network = network || 'livenet'; - root.getFeeLevels(function(err, levels, fromCache) { + root.getFeeLevels(coin, function(err, levels, fromCache) { if (err) return cb(err); var feeLevelRate = lodash.find(levels[network], { @@ -53,11 +53,12 @@ angular.module('copayApp.services').factory('feeService', function($log, $timeou }); }; - root.getCurrentFeeRate = function(network, cb) { - return root.getFeeRate(network, root.getCurrentFeeLevel(), cb); + root.getCurrentFeeRate = function(coin, network, cb) { + return root.getFeeRate(coin, network, root.getCurrentFeeLevel(), cb); }; - root.getFeeLevels = function(cb) { + root.getFeeLevels = function(coin, cb) { + coin = coin || 'btc'; if (cache.updateTs > Date.now() - CACHE_TIME_TS * 1000) { return cb(null, cache.data, true); @@ -65,7 +66,7 @@ angular.module('copayApp.services').factory('feeService', function($log, $timeou var walletClient = bwcService.getClient(); - walletClient.getFeeLevels('btc', 'livenet', function(errLivenet, levelsLivenet) { + walletClient.getFeeLevels(coin, 'livenet', function(errLivenet, levelsLivenet) { walletClient.getFeeLevels('btc', 'testnet', function(errTestnet, levelsTestnet) { if (errLivenet || errTestnet) { return cb(gettextCatalog.getString('Could not get dynamic fee')); diff --git a/src/js/services/profileService.js b/src/js/services/profileService.js index 006adaf23..b1b9404fa 100644 --- a/src/js/services/profileService.js +++ b/src/js/services/profileService.js @@ -89,10 +89,7 @@ angular.module('copayApp.services') wallet.copayerId = wallet.credentials.copayerId; wallet.m = wallet.credentials.m; wallet.n = wallet.credentials.n; - wallet.coin = wallet.credentials.coin ? wallet.credentials.coin : 'btc'; - - // TODO - if (wallet.id == 'bf338d5b-6b2e-4118-adb0-6208c2d22a81') wallet.credentials.coin = wallet.coin = 'bch'; + wallet.coin = wallet.credentials.coin; root.updateWalletSettings(wallet); root.wallet[walletId] = wallet; diff --git a/src/js/services/sendMax.js b/src/js/services/sendMax.js index a9c238a1e..9183a3ca2 100644 --- a/src/js/services/sendMax.js +++ b/src/js/services/sendMax.js @@ -10,7 +10,7 @@ angular.module('copayApp.services').service('sendMaxService', function(feeServic * */ this.getInfo = function(wallet, cb) { - feeService.getCurrentFeeRate(wallet.credentials.network, function(err, feePerKb) { + feeService.getCurrentFeeRate(wallet.coin, wallet.credentials.network, function(err, feePerKb) { if (err) return cb(err); var config = configService.getSync().wallet; diff --git a/www/views/confirm.html b/www/views/confirm.html index fa0fd8821..ab289f266 100644 --- a/www/views/confirm.html +++ b/www/views/confirm.html @@ -79,7 +79,6 @@
{{'Fee:' | translate}} {{tx.feeLevelName | translate}} - {{tx.txp[wallet.id].feeStr || '...'}} {{tx.txp[wallet.id].alternativeFeeStr || '...'}}  @@ -90,7 +89,6 @@ -
From 2a455337976bce56dffbb7cf03d68a04b2459047 Mon Sep 17 00:00:00 2001 From: Gustavo Maximiliano Cortez Date: Wed, 30 Aug 2017 15:54:30 -0300 Subject: [PATCH 22/34] Fix address view for new wallets --- src/js/controllers/addresses.js | 2 +- src/js/services/walletService.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/js/controllers/addresses.js b/src/js/controllers/addresses.js index cfcd33f64..0b9de5aa1 100644 --- a/src/js/controllers/addresses.js +++ b/src/js/controllers/addresses.js @@ -74,7 +74,7 @@ angular.module('copayApp.controllers').controller('addressesController', functio walletService.getLowUtxos($scope.wallet, levels, function(err, resp) { if (err) return; - if (resp.allUtxos && resp.allUtxos.length) { + if (resp && resp.allUtxos && resp.allUtxos.length) { var allSum = lodash.sum(resp.allUtxos || 0, 'satoshis'); diff --git a/src/js/services/walletService.js b/src/js/services/walletService.js index 295484558..9b375807c 100644 --- a/src/js/services/walletService.js +++ b/src/js/services/walletService.js @@ -939,7 +939,7 @@ angular.module('copayApp.services').factory('walletService', function($log, $tim root.getLowUtxos = function(wallet, levels, cb) { - wallet.getUtxos({}, function(err, resp) { + wallet.getUtxos({coin: wallet.coin}, function(err, resp) { if (err || !resp || !resp.length) return cb(); var minFee = root.getMinFee(wallet, levels, resp.length); From 7d648276165db6d21f7416c8dd0aa913df9e3159 Mon Sep 17 00:00:00 2001 From: Gustavo Maximiliano Cortez Date: Wed, 30 Aug 2017 16:38:42 -0300 Subject: [PATCH 23/34] Adds setting for bitcoin cash support --- src/js/controllers/advancedSettings.js | 10 +++++++--- src/js/controllers/create.js | 4 ++++ src/js/controllers/import.js | 3 +++ src/js/controllers/join.js | 2 ++ src/js/services/configService.js | 2 +- www/views/advancedSettings.html | 5 +++-- www/views/includes/cash.html | 9 +++++++++ www/views/join.html | 10 +--------- www/views/tab-create-personal.html | 10 +--------- www/views/tab-create-shared.html | 10 +--------- www/views/tab-import-file.html | 10 +--------- www/views/tab-import-phrase.html | 10 +--------- 12 files changed, 34 insertions(+), 51 deletions(-) create mode 100644 www/views/includes/cash.html diff --git a/src/js/controllers/advancedSettings.js b/src/js/controllers/advancedSettings.js index baca061fc..f44719914 100644 --- a/src/js/controllers/advancedSettings.js +++ b/src/js/controllers/advancedSettings.js @@ -1,6 +1,6 @@ 'use strict'; -angular.module('copayApp.controllers').controller('advancedSettingsController', function($scope, $log, configService, platformInfo) { +angular.module('copayApp.controllers').controller('advancedSettingsController', function($scope, $log, configService, platformInfo, externalLinkService) { var updateConfig = function() { var config = configService.getSync(); @@ -15,9 +15,9 @@ angular.module('copayApp.controllers').controller('advancedSettingsController', value: config.hideNextSteps.enabled }; $scope.cashSupport = { - value: config.cashSupport.enabled + value: config.cashSupport.enabled }; - + }; $scope.spendUnconfirmedChange = function() { @@ -66,6 +66,10 @@ angular.module('copayApp.controllers').controller('advancedSettingsController', }); }; + $scope.openExternalLink = function(url) { + externalLinkService.open(url); + }; + $scope.$on("$ionicView.beforeEnter", function(event, data) { $scope.isWindowsPhoneApp = platformInfo.isCordova && platformInfo.isWP; updateConfig(); diff --git a/src/js/controllers/create.js b/src/js/controllers/create.js index b32e8bd25..e1d84bfed 100644 --- a/src/js/controllers/create.js +++ b/src/js/controllers/create.js @@ -22,12 +22,16 @@ angular.module('copayApp.controllers').controller('createController', $scope.$on("$ionicView.beforeEnter", function(event, data) { $scope.formData = {}; var defaults = configService.getDefaults(); + var config = configService.getSync(); var tc = $state.current.name == 'tabs.add.create-personal' ? 1 : defaults.wallet.totalCopayers; $scope.formData.account = 1; $scope.formData.bwsurl = defaults.bws.url; $scope.TCValues = lodash.range(2, defaults.limits.totalCopayers + 1); $scope.formData.derivationPath = derivationPathHelper.default; $scope.formData.coin = 'btc'; + + if (config.cashSupport.enabled) $scope.enableCash = true; + $scope.setTotalCopayers(tc); updateRCSelect(tc); resetPasswordFields(); diff --git a/src/js/controllers/import.js b/src/js/controllers/import.js index b520ad2b6..c66cb4a3f 100644 --- a/src/js/controllers/import.js +++ b/src/js/controllers/import.js @@ -5,6 +5,7 @@ angular.module('copayApp.controllers').controller('importController', var reader = new FileReader(); var defaults = configService.getDefaults(); + var config = configService.getSync(); var errors = bwcService.getErrors(); $scope.init = function() { @@ -20,6 +21,8 @@ angular.module('copayApp.controllers').controller('importController', $scope.isCopay = appConfigService.name == 'copay'; $scope.fromHardwareWallet = { value: false }; + if (config.cashSupport.enabled) $scope.enableCash = true; + if ($stateParams.code) $scope.processWalletInfo($stateParams.code); diff --git a/src/js/controllers/join.js b/src/js/controllers/join.js index bf1e5ec00..2a209701d 100644 --- a/src/js/controllers/join.js +++ b/src/js/controllers/join.js @@ -5,12 +5,14 @@ angular.module('copayApp.controllers').controller('joinController', $scope.$on("$ionicView.beforeEnter", function(event, data) { var defaults = configService.getDefaults(); + var config = configService.getSync(); $scope.formData = {}; $scope.formData.bwsurl = defaults.bws.url; $scope.formData.derivationPath = derivationPathHelper.default; $scope.formData.account = 1; $scope.formData.secret = null; $scope.formData.coin = 'btc'; + if (config.cashSupport.enabled) $scope.enableCash = true; resetPasswordFields(); updateSeedSourceSelect(); }); diff --git a/src/js/services/configService.js b/src/js/services/configService.js index de2776c0d..8d3bae013 100644 --- a/src/js/services/configService.js +++ b/src/js/services/configService.js @@ -62,7 +62,7 @@ angular.module('copayApp.services').factory('configService', function(storageSer }, cashSupport: { - enabled: true, + enabled: false, }, recentTransactions: { diff --git a/www/views/advancedSettings.html b/www/views/advancedSettings.html index 6b610b5ea..a02356120 100644 --- a/www/views/advancedSettings.html +++ b/www/views/advancedSettings.html @@ -12,10 +12,11 @@ Support Bitcoin Cash
- Enable Bitcoin Cash wallet creation and operation within the App. Learn more about Bitcoin Cash at its main website + Enable Bitcoin Cash wallet creation and operation within the App. Learn more about Bitcoin Cash at + its main website
- + Use Unconfirmed Funds diff --git a/www/views/includes/cash.html b/www/views/includes/cash.html new file mode 100644 index 000000000..e67fb182b --- /dev/null +++ b/www/views/includes/cash.html @@ -0,0 +1,9 @@ + diff --git a/www/views/join.html b/www/views/join.html index ce282b67e..8b858fa80 100644 --- a/www/views/join.html +++ b/www/views/join.html @@ -40,15 +40,7 @@
- +
diff --git a/www/views/tab-create-personal.html b/www/views/tab-create-personal.html index 38bb2794f..505f854d4 100644 --- a/www/views/tab-create-personal.html +++ b/www/views/tab-create-personal.html @@ -19,15 +19,7 @@ required> - +
diff --git a/www/views/tab-create-shared.html b/www/views/tab-create-shared.html index 593dad599..cdbb7ceec 100644 --- a/www/views/tab-create-shared.html +++ b/www/views/tab-create-shared.html @@ -29,15 +29,7 @@ ng-blur="formFocus(false)"> - +
- +
From 1bf879e08a4b0c5ebb731fb6e1f31463fe13459d Mon Sep 17 00:00:00 2001 From: Gustavo Maximiliano Cortez Date: Wed, 30 Aug 2017 16:51:24 -0300 Subject: [PATCH 24/34] Fix transfer to another wallet --- src/js/controllers/tab-send.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/js/controllers/tab-send.js b/src/js/controllers/tab-send.js index 830cc167b..77a664632 100644 --- a/src/js/controllers/tab-send.js +++ b/src/js/controllers/tab-send.js @@ -76,6 +76,7 @@ angular.module('copayApp.controllers').controller('tabSendController', function( color: v.color, name: v.name, recipientType: 'wallet', + coin: v.coin, getAddress: function(cb) { walletService.getAddress(v, false, cb); }, @@ -186,7 +187,8 @@ angular.module('copayApp.controllers').controller('tabSendController', function( toAddress: addr, toName: item.name, toEmail: item.email, - toColor: item.color + toColor: item.color, + coin: item.coin }) }); }); From c38eb4b54c1b772d41b5b975fe8eccb9d17cead7 Mon Sep 17 00:00:00 2001 From: JDonadio Date: Wed, 30 Aug 2017 17:32:11 -0300 Subject: [PATCH 25/34] ref enable bch text - fix open external link --- src/js/controllers/advancedSettings.js | 12 +++++++++--- www/views/advancedSettings.html | 4 ++-- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/js/controllers/advancedSettings.js b/src/js/controllers/advancedSettings.js index f44719914..b9bf65449 100644 --- a/src/js/controllers/advancedSettings.js +++ b/src/js/controllers/advancedSettings.js @@ -1,6 +1,6 @@ 'use strict'; -angular.module('copayApp.controllers').controller('advancedSettingsController', function($scope, $log, configService, platformInfo, externalLinkService) { +angular.module('copayApp.controllers').controller('advancedSettingsController', function($scope, $log, configService, platformInfo, externalLinkService, gettextCatalog) { var updateConfig = function() { var config = configService.getSync(); @@ -66,8 +66,14 @@ angular.module('copayApp.controllers').controller('advancedSettingsController', }); }; - $scope.openExternalLink = function(url) { - externalLinkService.open(url); + $scope.learnMore = function() { + var url = 'https://www.bitcoincash.org/'; + var optIn = true; + var title = null; + var message = gettextCatalog.getString('Open bitcoincash.org?'); + var okText = gettextCatalog.getString('Open'); + var cancelText = gettextCatalog.getString('Go Back'); + externalLinkService.open(url, optIn, title, message, okText, cancelText); }; $scope.$on("$ionicView.beforeEnter", function(event, data) { diff --git a/www/views/advancedSettings.html b/www/views/advancedSettings.html index a02356120..85dcaf0d4 100644 --- a/www/views/advancedSettings.html +++ b/www/views/advancedSettings.html @@ -12,8 +12,8 @@ Support Bitcoin Cash
- Enable Bitcoin Cash wallet creation and operation within the App. Learn more about Bitcoin Cash at - its main website + Enable Bitcoin Cash wallet creation and operation within the App. + Learn more
From 55c27f684c97bea9b55e10c574ff101ecee8cb5b Mon Sep 17 00:00:00 2001 From: Gustavo Maximiliano Cortez Date: Wed, 30 Aug 2017 18:24:11 -0300 Subject: [PATCH 26/34] Fix rateService --- src/js/services/rateService.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/js/services/rateService.js b/src/js/services/rateService.js index a6dc7dd9e..b97dfb652 100644 --- a/src/js/services/rateService.js +++ b/src/js/services/rateService.js @@ -52,6 +52,7 @@ console.log('[rateService.js.44:updateRates:]'); //TODO function getBTC(cb, tries) { tries = tries || 0; + if (!self.httprequest) return; if (tries > 5) return cb('could not get BTC rates'); //log.info('Fetching exchange rates'); @@ -78,10 +79,10 @@ console.log('[rateService.js.44:updateRates:]'); //TODO function getBCH(cb, tries) { tries = tries || 0; + if (!self.httprequest) return; if (tries > 5) return cb('could not get BCH rates'); function retry(tries) { -console.log('[rateService.js.84:retry:] BCH'); //TODO //log.debug('Error fetching exchange rates', err); setTimeout(function() { backoffSeconds *= 1.5; From 235e610d8495d03f626577c64c0aa9f25cd29239 Mon Sep 17 00:00:00 2001 From: Gustavo Maximiliano Cortez Date: Wed, 30 Aug 2017 18:25:12 -0300 Subject: [PATCH 27/34] Fix coin to formatAmount --- src/js/services/walletService.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/js/services/walletService.js b/src/js/services/walletService.js index 9b375807c..5bf2c7597 100644 --- a/src/js/services/walletService.js +++ b/src/js/services/walletService.js @@ -414,14 +414,14 @@ angular.module('copayApp.services').factory('walletService', function($log, $tim var cacheCoin = txs[0].amountStr.split(' ')[1]; - if (cacheCoin == wallet.coin) - return; + if (cacheCoin == 'bits') { - $log.debug('Fixing Tx Cache Unit to: ' + wallet.coin) - lodash.each(txs, function(tx) { - tx.amountStr = txFormatService.formatAmountStr(wallet.coin, tx.amount); - tx.feeStr = txFormatService.formatAmountStr(wallet.coin, tx.fees); - }); + $log.debug('Fixing Tx Cache Unit to: ' + 'btc') + lodash.each(txs, function(tx) { + tx.amountStr = txFormatService.formatAmountStr('BTC', tx.amount); + tx.feeStr = txFormatService.formatAmountStr('BTC', tx.fees); + }); + } }; getSavedTxs(walletId, function(err, txsFromLocal) { From 4329142a2b86d107d6148c4fbe86f10b8daef1f9 Mon Sep 17 00:00:00 2001 From: Gustavo Maximiliano Cortez Date: Wed, 30 Aug 2017 19:40:35 -0300 Subject: [PATCH 28/34] Currency str to uppercase --- src/js/services/txFormatService.js | 2 +- src/js/services/walletService.js | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/js/services/txFormatService.js b/src/js/services/txFormatService.js index 249c28ad1..96bc1d657 100644 --- a/src/js/services/txFormatService.js +++ b/src/js/services/txFormatService.js @@ -19,7 +19,7 @@ angular.module('copayApp.services').factory('txFormatService', function($filter, root.formatAmountStr = function(coin, satoshis) { if (isNaN(satoshis)) return; - return root.formatAmount(satoshis) + ' ' + coin; + return root.formatAmount(satoshis) + ' ' + (coin).toUpperCase(); }; root.toFiat = function(coin, satoshis, code, cb) { diff --git a/src/js/services/walletService.js b/src/js/services/walletService.js index 5bf2c7597..d292ecf2b 100644 --- a/src/js/services/walletService.js +++ b/src/js/services/walletService.js @@ -215,11 +215,11 @@ angular.module('copayApp.services').factory('walletService', function($log, $tim cache.satToUnit = 1 / cache.unitToSatoshi; //STR - cache.totalBalanceStr = txFormatService.formatAmount(cache.totalBalanceSat) + ' ' + wallet.coin; - cache.lockedBalanceStr = txFormatService.formatAmount(cache.lockedBalanceSat) + ' ' + wallet.coin; - cache.availableBalanceStr = txFormatService.formatAmount(cache.availableBalanceSat) + ' ' + wallet.coin; - cache.spendableBalanceStr = txFormatService.formatAmount(cache.spendableAmount) + ' ' + wallet.coin; - cache.pendingBalanceStr = txFormatService.formatAmount(cache.pendingAmount) + ' ' + wallet.coin; + cache.totalBalanceStr = txFormatService.formatAmount(cache.totalBalanceSat) + ' ' + (wallet.coin).toUpperCase(); + cache.lockedBalanceStr = txFormatService.formatAmount(cache.lockedBalanceSat) + ' ' + (wallet.coin).toUpperCase(); + cache.availableBalanceStr = txFormatService.formatAmount(cache.availableBalanceSat) + ' ' + (wallet.coin).toUpperCase(); + cache.spendableBalanceStr = txFormatService.formatAmount(cache.spendableAmount) + ' ' + (wallet.coin).toUpperCase(); + cache.pendingBalanceStr = txFormatService.formatAmount(cache.pendingAmount) + ' ' + (wallet.coin).toUpperCase(); cache.alternativeName = config.settings.alternativeName; cache.alternativeIsoCode = config.settings.alternativeIsoCode; From 7d9f7d9303cb30ea88c408f92b73805f26321732 Mon Sep 17 00:00:00 2001 From: Gustavo Maximiliano Cortez Date: Thu, 31 Aug 2017 10:08:26 -0300 Subject: [PATCH 29/34] Fix units. Ref formatAmount --- src/js/controllers/addresses.js | 2 +- src/js/services/walletService.js | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/js/controllers/addresses.js b/src/js/controllers/addresses.js index 0b9de5aa1..c83279f84 100644 --- a/src/js/controllers/addresses.js +++ b/src/js/controllers/addresses.js @@ -50,7 +50,7 @@ angular.module('copayApp.controllers').controller('addressesController', functio $scope.latestWithBalance = lodash.slice(withBalance, 0, BALANCE_ADDRESS_LIMIT); lodash.each(withBalance, function(a) { - a.balanceStr = txFormatService.formatAmount(a.amount); + a.balanceStr = txFormatService.formatAmountStr($scope.wallet.coin, a.amount); }); $scope.viewAll = { diff --git a/src/js/services/walletService.js b/src/js/services/walletService.js index d292ecf2b..1e7eb6dc8 100644 --- a/src/js/services/walletService.js +++ b/src/js/services/walletService.js @@ -215,11 +215,11 @@ angular.module('copayApp.services').factory('walletService', function($log, $tim cache.satToUnit = 1 / cache.unitToSatoshi; //STR - cache.totalBalanceStr = txFormatService.formatAmount(cache.totalBalanceSat) + ' ' + (wallet.coin).toUpperCase(); - cache.lockedBalanceStr = txFormatService.formatAmount(cache.lockedBalanceSat) + ' ' + (wallet.coin).toUpperCase(); - cache.availableBalanceStr = txFormatService.formatAmount(cache.availableBalanceSat) + ' ' + (wallet.coin).toUpperCase(); - cache.spendableBalanceStr = txFormatService.formatAmount(cache.spendableAmount) + ' ' + (wallet.coin).toUpperCase(); - cache.pendingBalanceStr = txFormatService.formatAmount(cache.pendingAmount) + ' ' + (wallet.coin).toUpperCase(); + cache.totalBalanceStr = txFormatService.formatAmountStr(wallet.coin, cache.totalBalanceSat); + cache.lockedBalanceStr = txFormatService.formatAmountStr(wallet.coin, cache.lockedBalanceSat); + cache.availableBalanceStr = txFormatService.formatAmountStr(wallet.coin, cache.availableBalanceSat); + cache.spendableBalanceStr = txFormatService.formatAmountStr(wallet.coin, cache.spendableAmount); + cache.pendingBalanceStr = txFormatService.formatAmountStr(wallet.coin, cache.pendingAmount); cache.alternativeName = config.settings.alternativeName; cache.alternativeIsoCode = config.settings.alternativeIsoCode; @@ -416,10 +416,10 @@ angular.module('copayApp.services').factory('walletService', function($log, $tim if (cacheCoin == 'bits') { - $log.debug('Fixing Tx Cache Unit to: ' + 'btc') + $log.debug('Fixing Tx Cache Unit to: ' + wallet.coin) lodash.each(txs, function(tx) { - tx.amountStr = txFormatService.formatAmountStr('BTC', tx.amount); - tx.feeStr = txFormatService.formatAmountStr('BTC', tx.fees); + tx.amountStr = txFormatService.formatAmountStr(wallet.coin, tx.amount); + tx.feeStr = txFormatService.formatAmountStr(wallet.coin, tx.fees); }); } }; From d3dda639dbb21b28ed1b401b785ded5632a1341c Mon Sep 17 00:00:00 2001 From: Gustavo Maximiliano Cortez Date: Thu, 31 Aug 2017 12:11:33 -0300 Subject: [PATCH 30/34] Default config unit for txFormatAmount --- src/js/services/txFormatService.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/js/services/txFormatService.js b/src/js/services/txFormatService.js index 96bc1d657..a8bc292c6 100644 --- a/src/js/services/txFormatService.js +++ b/src/js/services/txFormatService.js @@ -7,7 +7,7 @@ angular.module('copayApp.services').factory('txFormatService', function($filter, root.formatAmount = function(satoshis, fullPrecision) { - var config = configService.getSync().wallet.settings; + var config = configService.getDefaults().wallet.settings; if (config.unitCode == 'sat') return satoshis; //TODO : now only works for english, specify opts to change thousand separator and decimal separator From 6f3cea4a89eabfa6dca95ccb6e79a9ebe2ee3cb7 Mon Sep 17 00:00:00 2001 From: Gustavo Maximiliano Cortez Date: Thu, 31 Aug 2017 14:12:53 -0300 Subject: [PATCH 31/34] Fix UI walletDetail unconfirmed --- src/sass/views/walletDetails.scss | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/sass/views/walletDetails.scss b/src/sass/views/walletDetails.scss index a3ef99348..85baf42b8 100644 --- a/src/sass/views/walletDetails.scss +++ b/src/sass/views/walletDetails.scss @@ -215,6 +215,11 @@ &__button-balance { background-color: transparent; border: 1px solid rgba(255,255,255,0.25); + margin-top: 10px; + i.icon { + margin-right: 7px; + vertical-align: middle; + } } &__error { From 9d85481ae641c3269d79dbc3b4adf393e917f433 Mon Sep 17 00:00:00 2001 From: Gustavo Maximiliano Cortez Date: Thu, 31 Aug 2017 14:42:43 -0300 Subject: [PATCH 32/34] Fix link to blockchain --- src/js/controllers/tx-details.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/js/controllers/tx-details.js b/src/js/controllers/tx-details.js index 2d3a87cb8..2815878a5 100644 --- a/src/js/controllers/tx-details.js +++ b/src/js/controllers/tx-details.js @@ -5,6 +5,7 @@ angular.module('copayApp.controllers').controller('txDetailsController', functio var txId; var listeners = []; var config = configService.getSync(); + var blockexplorerUrl; $scope.$on("$ionicView.beforeEnter", function(event, data) { txId = data.stateParams.txid; @@ -15,6 +16,12 @@ angular.module('copayApp.controllers').controller('txDetailsController', functio $scope.isShared = $scope.wallet.credentials.n > 1; $scope.txsUnsubscribedForNotifications = config.confirmedTxsNotifications ? !config.confirmedTxsNotifications.enabled : true; + if ($scope.wallet.coin == 'bch') { + blockexplorerUrl = 'cashexplorer.bitcoin.com'; + } else { + blockexplorerUrl = 'insight.bitpay.com'; + } + txConfirmNotification.checkIfEnabled(txId, function(res) { $scope.txNotification = { value: res @@ -178,7 +185,7 @@ angular.module('copayApp.controllers').controller('txDetailsController', functio $scope.viewOnBlockchain = function() { var btx = $scope.btx; - var url = 'https://' + ($scope.getShortNetworkName() == 'test' ? 'test-' : '') + 'insight.bitpay.com/tx/' + btx.txid; + var url = 'https://' + ($scope.getShortNetworkName() == 'test' ? 'test-' : '') + blockexplorerUrl + '/tx/' + btx.txid; var optIn = true; var title = null; var message = gettextCatalog.getString('View Transaction on Insight'); From e310c5a9816a0bd3462d88cceeb0e1e0b7fa76a9 Mon Sep 17 00:00:00 2001 From: Gustavo Maximiliano Cortez Date: Thu, 31 Aug 2017 14:47:16 -0300 Subject: [PATCH 33/34] Removes console log --- src/js/services/rateService.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/js/services/rateService.js b/src/js/services/rateService.js index b97dfb652..3818120a0 100644 --- a/src/js/services/rateService.js +++ b/src/js/services/rateService.js @@ -41,7 +41,6 @@ RateService.singleton = function(opts) { }; RateService.prototype.updateRates = function() { -console.log('[rateService.js.44:updateRates:]'); //TODO var self = this; var backoffSeconds = 5; From fc9b563d9af82e83d5220e897dc40b95a34cbf38 Mon Sep 17 00:00:00 2001 From: Gustavo Maximiliano Cortez Date: Thu, 31 Aug 2017 15:01:46 -0300 Subject: [PATCH 34/34] Upgrade to BWC v6 --- app-template/package-template.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app-template/package-template.json b/app-template/package-template.json index 849d1e6a3..cd74ad7e6 100644 --- a/app-template/package-template.json +++ b/app-template/package-template.json @@ -56,7 +56,7 @@ "bezier-easing": "^2.0.3", "bhttp": "1.2.1", "bitauth": "^0.2.1", - "bitcore-wallet-client": "5.3.0", + "bitcore-wallet-client": "6.0.0", "bower": "^1.7.9", "cordova-android": "5.1.1", "cordova-custom-config": "^3.0.5",