From fbda525e6d90af8274242c8ab32fe8373358c324 Mon Sep 17 00:00:00 2001 From: matiu Date: Fri, 8 Sep 2017 05:03:30 -0300 Subject: [PATCH 01/16] refactor config/list/scan --- src/js/controllers/advancedSettings.js | 16 ----- src/js/controllers/cash.js | 97 ++++++++++++++++++++++++++ src/js/controllers/preferencesCash.js | 31 ++++++++ src/js/controllers/tab-settings.js | 7 ++ src/js/routes.js | 10 +++ www/views/advancedSettings.html | 10 --- www/views/cashScan.html | 41 +++++++++++ www/views/preferencesCash.html | 27 +++++++ 8 files changed, 213 insertions(+), 26 deletions(-) create mode 100644 src/js/controllers/cash.js create mode 100644 src/js/controllers/preferencesCash.js create mode 100644 www/views/cashScan.html create mode 100644 www/views/preferencesCash.html diff --git a/src/js/controllers/advancedSettings.js b/src/js/controllers/advancedSettings.js index 94f9a2553..42de010fe 100644 --- a/src/js/controllers/advancedSettings.js +++ b/src/js/controllers/advancedSettings.js @@ -14,9 +14,6 @@ angular.module('copayApp.controllers').controller('advancedSettingsController', $scope.hideNextSteps = { value: config.hideNextSteps.enabled }; - $scope.cashSupport = { - value: config.cashSupport.enabled - }; }; @@ -31,19 +28,6 @@ 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/cash.js b/src/js/controllers/cash.js new file mode 100644 index 000000000..f456360de --- /dev/null +++ b/src/js/controllers/cash.js @@ -0,0 +1,97 @@ + +'use strict'; + +angular.module('copayApp.controllers').controller('otherBalanceController', + function($rootScope, $timeout, $scope, $state, $stateParams, $ionicModal, $ionicScrollDelegate, $window, gettextCatalog, lodash, popupService, ongoingProcess, profileService, walletService, configService, $log, platformInfo, storageService, bwcError ) { + var wallet; + var listeners = []; + var notifications = []; + $scope.isCordova = platformInfo.isCordova; + $scope.isAndroid = platformInfo.isAndroid; + $scope.isWindowsPhoneApp = platformInfo.isCordova && platformInfo.isWP; + $scope.isNW = platformInfo.isNW; + + + $scope.$on("$ionicView.enter", function(event, data) { + updateAllWallets(); + }); + + var updateAllWallets = function() { + var wallets = profileService.getWallets({coin:'btc', onlyComplete:true, network: 'livenet' }); + + + // TODO ? + if (lodash.isEmpty(wallets)) return; +console.log('[otherBalance.js.24:wallets:]',wallets); //TODO + + + var walletsBCH = profileService.getWallets({coin:'bch', network: 'livenet' }); + var xPubKeyIndex = lodash.indexBy(walletsBCH,"credentials.xPubKey"); +console.log('[otherBalance.js.28:xPubKeyIndex:]',xPubKeyIndex); //TODO + + wallets= lodash.filter(wallets,function(w) { return xPubKeyIndex[w.credentials.xPubKey]; }); +console.log('[otherBalance.js.31:wallets:]',wallets); //TODO + + + // TODO Filterout already duplicated walelts + // TODO filterout balance=0 wallets + // + // + + $scope.wallets = wallets; + + var i = wallets.length; + var j = 0; + lodash.each(wallets, function(wallet) { + walletService.getBalance(wallet, {coin:'bch'}, function(err, status) { + if (err) { + + wallet.error = (err === 'WALLET_NOT_REGISTERED') ? gettextCatalog.getString('Wallet not registered') : bwcError.msg(err); + + $log.error(err); + return; + } +// + +console.log('[otherBalance.js.28:status:]',status); //TODO + wallet.error = null; + wallet.status = status; + if (++j == i) { + // + } + }); + }); + }; + + $scope.duplicate = function(wallet) { + $log.debug('Duplicating wallet for BCH:' + wallet.id + ':' + wallet.name); + + var opts = {}; + opts.name = wallet.name + '[BCH]'; + opts.m = wallet.m; + opts.n = wallet.n; + opts.myName = wallet.credentials.copayerName; + opts.networkName = wallet.network; + opts.coin = 'bch'; + + // TODO: finger print / decrypt + $log.warn('TODO finger print / decrypt'); + + + opts.walletPrivKey = wallet.credentials.walletPrivKey; + + walletService.getStatus(wallet, {}, function(err, status){ + if (err) { + // TODO + $log.err('TODO Err'); + return; + } + opts.singleAddress = status.wallet.singleAddress; + + // create and store a wallet + profileService.createWallet(opts, function(err) { + $state.go('tabs.home'); + }); + }); + } + }); diff --git a/src/js/controllers/preferencesCash.js b/src/js/controllers/preferencesCash.js new file mode 100644 index 000000000..e754e004d --- /dev/null +++ b/src/js/controllers/preferencesCash.js @@ -0,0 +1,31 @@ +'use strict'; + +angular.module('copayApp.controllers').controller('preferencesCashController', function($scope, $log, $timeout, appConfigService, lodash, configService, platformInfo, pushNotificationsService, emailService) { + var updateConfig = function() { + var config = configService.getSync(); + $scope.appName = appConfigService.nameCase; + + $scope.cashSupport = { + value: config.wallet.cashSupport.enabled + }; + + $timeout(function() { + $scope.$apply(); + }); + }; + + $scope.cashSupportChange = function() { + var opts = { + wallet: { + cashSupport: $scope.cashSupport.value + } + }; + configService.set(opts, function(err) { + if (err) $log.debug(err); + }); + }; + + $scope.$on("$ionicView.enter", function(event, data) { + updateConfig(); + }); +}); diff --git a/src/js/controllers/tab-settings.js b/src/js/controllers/tab-settings.js index f806b0f84..4c6f208a7 100644 --- a/src/js/controllers/tab-settings.js +++ b/src/js/controllers/tab-settings.js @@ -25,6 +25,11 @@ angular.module('copayApp.controllers').controller('tabSettingsController', funct }, 10); }); + $scope.cashSupport = { + value: config.cashSupport.enabled + }; + + // TODO move this to a generic service bitpayCardService.getCards(function(err, cards) { if (err) $log.error(err); @@ -62,6 +67,8 @@ angular.module('copayApp.controllers').controller('tabSettingsController', funct }); }); + + $scope.$on("$ionicView.enter", function(event, data) { updateConfig(); }); diff --git a/src/js/routes.js b/src/js/routes.js index 0fe72181d..36af61e8c 100644 --- a/src/js/routes.js +++ b/src/js/routes.js @@ -464,6 +464,16 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr } } }) + .state('tabs.cash', { + url: '/cash', + views: { + 'tab-home@tabs': { + controller: 'cashController', + templateUrl: 'views/tab-cash.html' + } + } + }) + /* * diff --git a/www/views/advancedSettings.html b/www/views/advancedSettings.html index 58031d981..253c35c8f 100644 --- a/www/views/advancedSettings.html +++ b/www/views/advancedSettings.html @@ -8,16 +8,6 @@
- - Support Bitcoin Cash - -
- Enable Bitcoin Cash wallet creation and operation within the App. - Learn more -
- - - Use Unconfirmed Funds diff --git a/www/views/cashScan.html b/www/views/cashScan.html new file mode 100644 index 000000000..3c0e47a89 --- /dev/null +++ b/www/views/cashScan.html @@ -0,0 +1,41 @@ + + + + Bitcoin Cash (BCH) Balances + + + + + + + +
+
+ BTC Wallets +
+
+
+ + + + + {{wallet.name || wallet.id}} + +

+ {{wallet.status.totalBalanceStr ? wallet.status.totalBalanceStr : ( wallet.cachedBalance ? wallet.cachedBalance + (wallet.cachedBalanceUpdatedOn ? ' · ' + ( wallet.cachedBalanceUpdatedOn * 1000 | amTimeAgo) : '') : '' ) }} + + + {{wallet.m}}-of-{{wallet.n}} + +   +

+ +
+
+
+ +
diff --git a/www/views/preferencesCash.html b/www/views/preferencesCash.html new file mode 100644 index 000000000..ba10d31f6 --- /dev/null +++ b/www/views/preferencesCash.html @@ -0,0 +1,27 @@ + + + {{'Bitcoin Cash Support' | translate}} + + + + + +
+ + Support Bitcoin Cash + + +
+ Enable Bitcoin Cash wallet creation and operation within the App. + Learn more +
+ + +
+ + + +
+
+
+
From acc1549633da94a9434e58325f6525ecb747a5dd Mon Sep 17 00:00:00 2001 From: matiu Date: Fri, 8 Sep 2017 16:37:26 -0300 Subject: [PATCH 02/16] add coin to preferences/info + refactor duplicate --- app-template/package-template.json | 4 +- src/js/controllers/advancedSettings.js | 10 --- src/js/controllers/cash.js | 97 -------------------- src/js/controllers/cashScan.js | 117 +++++++++++++++++++++++++ src/js/controllers/preferencesCash.js | 21 +++-- src/js/controllers/tab-settings.js | 2 +- src/js/routes.js | 54 ++++++++---- src/js/services/profileService.js | 7 +- www/views/cashScan.html | 4 +- www/views/preferencesCash.html | 18 ++-- www/views/preferencesInformation.html | 6 ++ www/views/tab-home.html | 4 + www/views/tab-settings.html | 14 +++ 13 files changed, 212 insertions(+), 146 deletions(-) delete mode 100644 src/js/controllers/cash.js create mode 100644 src/js/controllers/cashScan.js diff --git a/app-template/package-template.json b/app-template/package-template.json index cd74ad7e6..7f7dc5d84 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": "6.0.0", + "bitcore-wallet-client": "6.0.1", "bower": "^1.7.9", "cordova-android": "5.1.1", "cordova-custom-config": "^3.0.5", @@ -107,7 +107,7 @@ "run:android": "cordova run android --device", "run:android-release": "cordova run android --device --release", "log:android": "adb logcat | grep chromium", - "sign:android": "rm -f platforms/android/build/outputs/apk/android-release-signed-aligned.apk; jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore ../copay.keystore -signedjar platforms/android/build/outputs/apk/android-release-signed.apk platforms/android/build/outputs/apk/android-release-unsigned.apk copay_play && ../android-sdk-macosx/build-tools/25.0.3/zipalign -v 4 platforms/android/build/outputs/apk/android-release-signed.apk platforms/android/build/outputs/apk/android-release-signed-aligned.apk", + "sign:android": "rm -f platforms/android/build/outputs/apk/android-release-signed-aligned.apk; jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore ../copay.keystore -signedjar platforms/android/build/outputs/apk/android-release-signed.apk platforms/android/build/outputs/apk/android-release-unsigned.apk copay_play && $ANDROID_HOME/build-tools/26.0.1/zipalign -v 4 platforms/android/build/outputs/apk/android-release-signed.apk platforms/android/build/outputs/apk/android-release-signed-aligned.apk", "apply:copay": "npm i fs-extra && cd app-template && node apply.js copay && npm i && cordova prepare", "apply:bitpay": "npm i fs-extra && cd app-template && node apply.js bitpay && npm i && cordova prepare", "test": "echo \"no package tests configured\"", diff --git a/src/js/controllers/advancedSettings.js b/src/js/controllers/advancedSettings.js index 42de010fe..cd5604395 100644 --- a/src/js/controllers/advancedSettings.js +++ b/src/js/controllers/advancedSettings.js @@ -50,16 +50,6 @@ angular.module('copayApp.controllers').controller('advancedSettingsController', }); }; - $scope.openBitcoinCashWeb = 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) { $scope.isWindowsPhoneApp = platformInfo.isCordova && platformInfo.isWP; updateConfig(); diff --git a/src/js/controllers/cash.js b/src/js/controllers/cash.js deleted file mode 100644 index f456360de..000000000 --- a/src/js/controllers/cash.js +++ /dev/null @@ -1,97 +0,0 @@ - -'use strict'; - -angular.module('copayApp.controllers').controller('otherBalanceController', - function($rootScope, $timeout, $scope, $state, $stateParams, $ionicModal, $ionicScrollDelegate, $window, gettextCatalog, lodash, popupService, ongoingProcess, profileService, walletService, configService, $log, platformInfo, storageService, bwcError ) { - var wallet; - var listeners = []; - var notifications = []; - $scope.isCordova = platformInfo.isCordova; - $scope.isAndroid = platformInfo.isAndroid; - $scope.isWindowsPhoneApp = platformInfo.isCordova && platformInfo.isWP; - $scope.isNW = platformInfo.isNW; - - - $scope.$on("$ionicView.enter", function(event, data) { - updateAllWallets(); - }); - - var updateAllWallets = function() { - var wallets = profileService.getWallets({coin:'btc', onlyComplete:true, network: 'livenet' }); - - - // TODO ? - if (lodash.isEmpty(wallets)) return; -console.log('[otherBalance.js.24:wallets:]',wallets); //TODO - - - var walletsBCH = profileService.getWallets({coin:'bch', network: 'livenet' }); - var xPubKeyIndex = lodash.indexBy(walletsBCH,"credentials.xPubKey"); -console.log('[otherBalance.js.28:xPubKeyIndex:]',xPubKeyIndex); //TODO - - wallets= lodash.filter(wallets,function(w) { return xPubKeyIndex[w.credentials.xPubKey]; }); -console.log('[otherBalance.js.31:wallets:]',wallets); //TODO - - - // TODO Filterout already duplicated walelts - // TODO filterout balance=0 wallets - // - // - - $scope.wallets = wallets; - - var i = wallets.length; - var j = 0; - lodash.each(wallets, function(wallet) { - walletService.getBalance(wallet, {coin:'bch'}, function(err, status) { - if (err) { - - wallet.error = (err === 'WALLET_NOT_REGISTERED') ? gettextCatalog.getString('Wallet not registered') : bwcError.msg(err); - - $log.error(err); - return; - } -// - -console.log('[otherBalance.js.28:status:]',status); //TODO - wallet.error = null; - wallet.status = status; - if (++j == i) { - // - } - }); - }); - }; - - $scope.duplicate = function(wallet) { - $log.debug('Duplicating wallet for BCH:' + wallet.id + ':' + wallet.name); - - var opts = {}; - opts.name = wallet.name + '[BCH]'; - opts.m = wallet.m; - opts.n = wallet.n; - opts.myName = wallet.credentials.copayerName; - opts.networkName = wallet.network; - opts.coin = 'bch'; - - // TODO: finger print / decrypt - $log.warn('TODO finger print / decrypt'); - - - opts.walletPrivKey = wallet.credentials.walletPrivKey; - - walletService.getStatus(wallet, {}, function(err, status){ - if (err) { - // TODO - $log.err('TODO Err'); - return; - } - opts.singleAddress = status.wallet.singleAddress; - - // create and store a wallet - profileService.createWallet(opts, function(err) { - $state.go('tabs.home'); - }); - }); - } - }); diff --git a/src/js/controllers/cashScan.js b/src/js/controllers/cashScan.js new file mode 100644 index 000000000..311502aab --- /dev/null +++ b/src/js/controllers/cashScan.js @@ -0,0 +1,117 @@ + +'use strict'; + +angular.module('copayApp.controllers').controller('cashScanController', + function($rootScope, $timeout, $scope, $state, $stateParams, $ionicModal, $ionicScrollDelegate, $window, gettextCatalog, lodash, popupService, ongoingProcess, profileService, walletService, configService, $log, txFormatService, bwcError, pushNotificationsService, bwcService) { + var wallet; + var errors = bwcService.getErrors(); + $scope.error = null; + + $scope.$on("$ionicView.enter", function(event, data) { + updateAllWallets(); + }); + + var updateAllWallets = function() { + var wallets = profileService.getWallets({coin:'btc', onlyComplete:true, network: 'livenet' }); + + + var kk = lodash.indexBy(wallets,"credentials.xPubKey"); + + + // TODO ? + if (lodash.isEmpty(wallets)) return; + + + var walletsBCH = profileService.getWallets({coin:'bch', network: 'livenet' }); + var xPubKeyIndex = lodash.indexBy(walletsBCH,"credentials.xPubKey"); + +// wallets= lodash.filter(wallets,function(w) { return !xPubKeyIndex[w.credentials.xPubKey]; }); + + $scope.wallets = wallets; + + var i = wallets.length; + var j = 0; + lodash.each(wallets, function(wallet) { + walletService.getBalance(wallet, {coin:'bch'}, function(err, balance) { + if (err) { + + wallet.error = (err === 'WALLET_NOT_REGISTERED') ? gettextCatalog.getString('Wallet not registered') : bwcError.msg(err); + + $log.error(err); + return; + } +// + +console.log('[otherBalance.js.28:balance:]',balance); //TODO + wallet.error = null; + wallet.bchBalance = txFormatService.formatAmountStr('bch', balance.availableAmount); + if (++j == i) { + + //Done + $timeout(function() { + $rootScope.$apply(); + }, 10); + + } + }); + }); + }; + + $scope.duplicate = function(wallet) { + $scope.error = null; + $log.debug('Duplicating wallet for BCH:' + wallet.id + ':' + wallet.name); + + var opts = {}; + opts.name = wallet.name + '[BCH]'; + opts.m = wallet.m; + opts.n = wallet.n; + opts.myName = wallet.credentials.copayerName; + opts.networkName = wallet.network; + opts.coin = 'bch'; + + // TODO: finger print / decrypt + $log.warn('TODO finger print / decrypt'); + opts.extendedPrivateKey = wallet.credentials.xPrivKey; + + function setErr(err, cb) { + $scope.error = bwcError.cb(err, gettextCatalog.getString('Could not duplicate'), function() { + return cb(err); + }); + $timeout(function() { + $rootScope.$apply(); + }, 10); + } + + function importOrCreate(cb) { + walletService.getStatus(wallet, {}, function(err, status){ + if (err) return cb(err); + + opts.singleAddress = status.wallet.singleAddress; + + // first try to import + profileService.importExtendedPrivateKey(opts.extendedPrivateKey, opts, function(err, client) { + if (err && !(err instanceof errors.NOT_AUTHORIZED) ) { + return setErr(err, cb); + } + if (err) { + // create and store a wallet + return profileService.createWallet(opts, function(err, client) { + if (err) return setErr(err, cb); + return cb(null, client, true); + }); + } + return cb(null, client); + }); + }); + }; + + + importOrCreate(function(err, client, isNew) { + if (err) return; + walletService.updateRemotePreferences(client); + pushNotificationsService.updateSubscription(client); + walletService.startScan(wallet, function() { }); + $state.go('tabs.home'); + }); + } + }); diff --git a/src/js/controllers/preferencesCash.js b/src/js/controllers/preferencesCash.js index e754e004d..e720d7735 100644 --- a/src/js/controllers/preferencesCash.js +++ b/src/js/controllers/preferencesCash.js @@ -1,12 +1,13 @@ 'use strict'; -angular.module('copayApp.controllers').controller('preferencesCashController', function($scope, $log, $timeout, appConfigService, lodash, configService, platformInfo, pushNotificationsService, emailService) { +angular.module('copayApp.controllers').controller('preferencesCashController', function($scope, $log, $timeout, appConfigService, lodash, configService, gettextCatalog, externalLinkService) { var updateConfig = function() { + var config = configService.getSync(); $scope.appName = appConfigService.nameCase; $scope.cashSupport = { - value: config.wallet.cashSupport.enabled + value: config.cashSupport }; $timeout(function() { @@ -16,15 +17,25 @@ angular.module('copayApp.controllers').controller('preferencesCashController', f $scope.cashSupportChange = function() { var opts = { - wallet: { - cashSupport: $scope.cashSupport.value - } + cashSupport: $scope.cashSupport.value }; configService.set(opts, function(err) { if (err) $log.debug(err); }); }; + + $scope.openBitcoinCashWeb = 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.enter", function(event, data) { updateConfig(); }); diff --git a/src/js/controllers/tab-settings.js b/src/js/controllers/tab-settings.js index 4c6f208a7..75cce161b 100644 --- a/src/js/controllers/tab-settings.js +++ b/src/js/controllers/tab-settings.js @@ -26,7 +26,7 @@ angular.module('copayApp.controllers').controller('tabSettingsController', funct }); $scope.cashSupport = { - value: config.cashSupport.enabled + value: config.cashSupport }; diff --git a/src/js/routes.js b/src/js/routes.js index 36af61e8c..ed62372e3 100644 --- a/src/js/routes.js +++ b/src/js/routes.js @@ -244,15 +244,6 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr } } }) - .state('tabs.scan', { - url: '/scan', - views: { - 'tab-scan': { - controller: 'tabScanController', - templateUrl: 'views/tab-scan.html', - } - } - }) .state('scanner', { url: '/scanner', params: { @@ -374,6 +365,16 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr * */ + .state('tabs.preferencesCash', { + url: '/preferencesCash', + views: { + 'tab-settings@tabs': { + controller: 'preferencesCashController', + templateUrl: 'views/preferencesCash.html' + } + } + }) + .state('tabs.notifications', { url: '/notifications', views: { @@ -464,16 +465,7 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr } } }) - .state('tabs.cash', { - url: '/cash', - views: { - 'tab-home@tabs': { - controller: 'cashController', - templateUrl: 'views/tab-cash.html' - } - } - }) - + /* * @@ -590,6 +582,30 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr } }) + .state('tabs.preferencesCash.scan', { + url: '/cashScan', + views: { + 'tab-settings@tabs': { + controller: 'cashScanController', + templateUrl: 'views/cashScan.html' + } + } + }) + + + // TODO remove + .state('tabs.scan', { + url: '/cashScan2', + views: { + 'tab-home@tabs': { + controller: 'cashScanController', + templateUrl: 'views/cashScan.html' + } + } + }) + + + /* * * Addressbook diff --git a/src/js/services/profileService.js b/src/js/services/profileService.js index 36a7d938e..d944eca43 100644 --- a/src/js/services/profileService.js +++ b/src/js/services/profileService.js @@ -339,7 +339,12 @@ angular.module('copayApp.services') } } else if (opts.extendedPrivateKey) { try { - walletClient.seedFromExtendedPrivateKey(opts.extendedPrivateKey); + walletClient.seedFromExtendedPrivateKey(opts.extendedPrivateKey, { + network: network, + account: opts.account || 0, + derivationStrategy: opts.derivationStrategy || 'BIP44', + coin: opts.coin, + }); } catch (ex) { $log.warn(ex); return cb(gettextCatalog.getString('Could not create using the specified extended private key')); diff --git a/www/views/cashScan.html b/www/views/cashScan.html index 3c0e47a89..1d8c0a9af 100644 --- a/www/views/cashScan.html +++ b/www/views/cashScan.html @@ -13,6 +13,8 @@
BTC Wallets
+ + {{wallet.error}}

- {{wallet.status.totalBalanceStr ? wallet.status.totalBalanceStr : ( wallet.cachedBalance ? wallet.cachedBalance + (wallet.cachedBalanceUpdatedOn ? ' · ' + ( wallet.cachedBalanceUpdatedOn * 1000 | amTimeAgo) : '') : '' ) }} + {{wallet.bchBalance || 'Checking...'}} {{wallet.m}}-of-{{wallet.n}} diff --git a/www/views/preferencesCash.html b/www/views/preferencesCash.html index ba10d31f6..bc18563aa 100644 --- a/www/views/preferencesCash.html +++ b/www/views/preferencesCash.html @@ -10,18 +10,16 @@ Support Bitcoin Cash +

-
- Enable Bitcoin Cash wallet creation and operation within the App. - Learn more -
- - -
- - - +
+
+ Enable Bitcoin Cash wallet creation and operation within the App. + Learn more
+ diff --git a/www/views/preferencesInformation.html b/www/views/preferencesInformation.html index 728edb40b..4fe0012f2 100644 --- a/www/views/preferencesInformation.html +++ b/www/views/preferencesInformation.html @@ -13,6 +13,12 @@ {{walletName}}
+
+ Coin + + {{wallet.coin}} + +
Wallet Id diff --git a/www/views/tab-home.html b/www/views/tab-home.html index 1a30620da..6ac7c2bca 100644 --- a/www/views/tab-home.html +++ b/www/views/tab-home.html @@ -11,6 +11,10 @@ on-refresh="onRefresh()"> +TODO Remove: + Scan your wallets for Bitcoin Cash + +
diff --git a/www/views/tab-settings.html b/www/views/tab-settings.html index f5768dfd2..395c79891 100644 --- a/www/views/tab-settings.html +++ b/www/views/tab-settings.html @@ -39,6 +39,20 @@
{{'Preferences' | translate}}
+ + + + + {{'Bitcoin Cash Support' | translate}} + + Enabled + Disabled + + + + + + From 7349e8237a7316670d123f55757814a7502d3fdf Mon Sep 17 00:00:00 2001 From: matiu Date: Sat, 9 Sep 2017 21:14:27 -0300 Subject: [PATCH 03/16] refactor duplicate --- app-template/package-template.json | 2 +- src/js/controllers/cashScan.js | 131 ++++++++++++++++++++--------- src/js/controllers/tab-home.js | 2 + src/js/services/onGoingProcess.js | 3 +- src/js/services/profileService.js | 1 - src/js/services/walletService.js | 40 ++++++++- www/views/cashScan.html | 23 +++-- www/views/tab-home.html | 5 +- 8 files changed, 152 insertions(+), 55 deletions(-) diff --git a/app-template/package-template.json b/app-template/package-template.json index 7f7dc5d84..22e23c632 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": "6.0.1", + "bitcore-wallet-client": "6.1.0", "bower": "^1.7.9", "cordova-android": "5.1.1", "cordova-custom-config": "^3.0.5", diff --git a/src/js/controllers/cashScan.js b/src/js/controllers/cashScan.js index 311502aab..4bc429e07 100644 --- a/src/js/controllers/cashScan.js +++ b/src/js/controllers/cashScan.js @@ -1,48 +1,62 @@ - 'use strict'; angular.module('copayApp.controllers').controller('cashScanController', - function($rootScope, $timeout, $scope, $state, $stateParams, $ionicModal, $ionicScrollDelegate, $window, gettextCatalog, lodash, popupService, ongoingProcess, profileService, walletService, configService, $log, txFormatService, bwcError, pushNotificationsService, bwcService) { + function($rootScope, $timeout, $scope, $state, $stateParams, $ionicModal, $ionicScrollDelegate, $window, gettextCatalog, lodash, popupService, ongoingProcess, profileService, walletService, configService, $log, txFormatService, bwcError, pushNotificationsService, bwcService) { var wallet; var errors = bwcService.getErrors(); - $scope.error = null; + $scope.error = null; $scope.$on("$ionicView.enter", function(event, data) { updateAllWallets(); }); var updateAllWallets = function() { - var wallets = profileService.getWallets({coin:'btc', onlyComplete:true, network: 'livenet' }); + var wallets1 = profileService.getWallets({ + coin: 'btc', + onlyComplete: true, + network: 'livenet' + }); + + if (lodash.isEmpty(wallets1)) { + $state.go('tabs.home'); + return; + } + + // Filter out already duplicated wallets + var walletsBCH = profileService.getWallets({ + coin: 'bch', + network: 'livenet' + }); + var xPubKeyIndex = lodash.indexBy(walletsBCH, "credentials.xPubKey"); + + wallets1 = lodash.filter(wallets1, function(w) { + return !xPubKeyIndex[w.credentials.xPubKey]; + }); - var kk = lodash.indexBy(wallets,"credentials.xPubKey"); - - - // TODO ? - if (lodash.isEmpty(wallets)) return; - - - var walletsBCH = profileService.getWallets({coin:'bch', network: 'livenet' }); - var xPubKeyIndex = lodash.indexBy(walletsBCH,"credentials.xPubKey"); - -// wallets= lodash.filter(wallets,function(w) { return !xPubKeyIndex[w.credentials.xPubKey]; }); + // Filter out non BIP44 wallets + var wallets = lodash.filter(wallets1, function(w) { + return w.credentials.derivationStrategy == 'BIP44' + }); $scope.wallets = wallets; + $scope.nonBIP44 = wallets1.length != wallets.length; var i = wallets.length; var j = 0; lodash.each(wallets, function(wallet) { - walletService.getBalance(wallet, {coin:'bch'}, function(err, balance) { + walletService.getBalance(wallet, { + coin: 'bch' + }, function(err, balance) { if (err) { wallet.error = (err === 'WALLET_NOT_REGISTERED') ? gettextCatalog.getString('Wallet not registered') : bwcError.msg(err); $log.error(err); return; - } -// + } + // -console.log('[otherBalance.js.28:balance:]',balance); //TODO wallet.error = null; wallet.bchBalance = txFormatService.formatAmountStr('bch', balance.availableAmount); if (++j == i) { @@ -58,24 +72,26 @@ console.log('[otherBalance.js.28:balance:]',balance); //TODO }; $scope.duplicate = function(wallet) { - $scope.error = null; - $log.debug('Duplicating wallet for BCH:' + wallet.id + ':' + wallet.name); + $scope.error = null; + $log.debug('Duplicating wallet for BCH:' + wallet.id + ':' + wallet.name); var opts = {}; opts.name = wallet.name + '[BCH]'; opts.m = wallet.m; opts.n = wallet.n; - opts.myName = wallet.credentials.copayerName; + opts.myName = wallet.credentials.copayerName; opts.networkName = wallet.network; opts.coin = 'bch'; + opts.walletPrivKey = wallet.credentials.walletPrivKey; + opts.compliantDerivation = wallet.credentials.compliantDerivation; - // TODO: finger print / decrypt - $log.warn('TODO finger print / decrypt'); - opts.extendedPrivateKey = wallet.credentials.xPrivKey; function setErr(err, cb) { - $scope.error = bwcError.cb(err, gettextCatalog.getString('Could not duplicate'), function() { - return cb(err); + + if (!cb) cb = function() {}; + + $scope.error = bwcError.cb(err, gettextCatalog.getString('Could not duplicate'), function() { + return cb(err); }); $timeout(function() { $rootScope.$apply(); @@ -83,35 +99,70 @@ console.log('[otherBalance.js.28:balance:]',balance); //TODO } function importOrCreate(cb) { - walletService.getStatus(wallet, {}, function(err, status){ + walletService.getStatus(wallet, {}, function(err, status) { if (err) return cb(err); - opts.singleAddress = status.wallet.singleAddress; + opts.singleAddress = status.wallet.singleAddress; // first try to import - profileService.importExtendedPrivateKey(opts.extendedPrivateKey, opts, function(err, client) { - if (err && !(err instanceof errors.NOT_AUTHORIZED) ) { + profileService.importExtendedPrivateKey(opts.extendedPrivateKey, opts, function(err, newWallet) { + if (err && !(err instanceof errors.NOT_AUTHORIZED)) { return setErr(err, cb); } if (err) { // create and store a wallet - return profileService.createWallet(opts, function(err, client) { + return profileService.createWallet(opts, function(err, newWallet) { if (err) return setErr(err, cb); - return cb(null, client, true); + return cb(null, newWallet, true); }); } - return cb(null, client); + return cb(null, newWallet); }); }); }; + // Multisig wallets? add Copayers + function addCopayers(newWallet, isNew, cb) { + if (!isNew) return cb(); + if (wallet.n == 1) return cb(); - importOrCreate(function(err, client, isNew) { - if (err) return; - walletService.updateRemotePreferences(client); - pushNotificationsService.updateSubscription(client); - walletService.startScan(wallet, function() { }); - $state.go('tabs.home'); + $log.info('Adding copayers for BCH wallet config:' + wallet.m + '-' + wallet.n); + + walletService.copyCopayers(wallet, newWallet, function(err) { + if (err) return setErr(err, cb); + + return cb(); + }); + }; + + walletService.getKeys(wallet,function(err,keys) { + if (err) { + $scope.error = err; + return $timeout(function() { + $rootScope.$apply(); + }, 10); + } + opts.extendedPrivateKey = keys.xPrivKey; + ongoingProcess.set('duplicatingWallet', true); + importOrCreate(function(err, newWallet, isNew) { + if (err) { + ongoingProcess.set('duplicatingWallet', false); + return; + } + walletService.updateRemotePreferences(newWallet); + pushNotificationsService.updateSubscription(newWallet); + + addCopayers(newWallet, isNew, function(err) { + ongoingProcess.set('duplicatingWallet', false); + if (err) + return setErr(err); + + if (isNew) + walletService.startScan(newWallet, function() {}); + + $state.go('tabs.home'); + }); + }); }); } }); diff --git a/src/js/controllers/tab-home.js b/src/js/controllers/tab-home.js index 79be14391..a3a614e21 100644 --- a/src/js/controllers/tab-home.js +++ b/src/js/controllers/tab-home.js @@ -224,6 +224,7 @@ angular.module('copayApp.controllers').controller('tabHomeController', wallet.error = null; wallet.status = status; + wallet.updating = status && status.wallet && status.wallet.scanStatus == 'running'; // TODO service refactor? not in profile service profileService.setLastKnownBalance(wallet.id, wallet.status.totalBalanceStr, function() {}); } @@ -242,6 +243,7 @@ angular.module('copayApp.controllers').controller('tabHomeController', return; } wallet.status = status; + wallet.updating = status && status.wallet && status.wallet.scanStatus == 'running'; updateTxps(); }); }; diff --git a/src/js/services/onGoingProcess.js b/src/js/services/onGoingProcess.js index e0f82fc40..94d746202 100644 --- a/src/js/services/onGoingProcess.js +++ b/src/js/services/onGoingProcess.js @@ -45,7 +45,8 @@ angular.module('copayApp.services').factory('ongoingProcess', function($log, $ti 'cancelingGiftCard': 'Canceling Gift Card...', 'creatingGiftCard': 'Creating Gift Card...', 'buyingGiftCard': 'Buying Gift Card...', - 'topup': gettext('Top up in progress...') + 'topup': gettext('Top up in progress...'), + 'duplicatingWallet': gettext('Duplicating wallet...'), }; root.clear = function() { diff --git a/src/js/services/profileService.js b/src/js/services/profileService.js index d944eca43..f93fc03a8 100644 --- a/src/js/services/profileService.js +++ b/src/js/services/profileService.js @@ -386,7 +386,6 @@ angular.module('copayApp.services') } } } - return cb(null, walletClient); }; // Creates a wallet on BWC/BWS diff --git a/src/js/services/walletService.js b/src/js/services/walletService.js index 3768cecaa..b456fae61 100644 --- a/src/js/services/walletService.js +++ b/src/js/services/walletService.js @@ -259,6 +259,8 @@ angular.module('copayApp.services').factory('walletService', function($log, $tim }; function cacheStatus(status) { + if (status.wallet && status.wallet.scanStatus == 'running') return; + wallet.cachedStatus = status ||  {}; var cache = wallet.cachedStatus; cache.statusUpdatedOn = Date.now(); @@ -931,15 +933,17 @@ angular.module('copayApp.services').factory('walletService', function($log, $tim // 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); + var minFee = root.getMinFee(wallet, feeLevels, nbOutputs); + return parseInt(minFee / LOW_AMOUNT_RATIO); }; root.getLowUtxos = function(wallet, levels, cb) { - wallet.getUtxos({coin: wallet.coin}, 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); @@ -955,7 +959,7 @@ angular.module('copayApp.services').factory('walletService', function($log, $tim var totalLow = lodash.sum(lowUtxos, 'satoshis'); return cb(err, { - allUtxos: resp || [], + allUtxos: resp || [], lowUtxos: lowUtxos || [], warning: minFee / balance > TOTAL_LOW_WARNING_RATIO, minFee: minFee, @@ -1237,5 +1241,33 @@ angular.module('copayApp.services').factory('walletService', function($log, $tim else return 'bitcoin'; } + + root.copyCopayers = function(wallet, newWallet, cb) { + var c = wallet.credentials; + + var walletPrivKey = bitcore.PrivateKey.fromString(c.walletPrivKey); + + var copayer = 1, + i = 0, + l = c.publicKeyRing.length; + var mainErr = null; + + lodash.each(c.publicKeyRing, function(item) { + var name = item.copayerName || ('copayer ' + copayer++); + newWallet._doJoinWallet(newWallet.credentials.walletId, walletPrivKey, item.xPubKey, item.requestPubKey, name, { + coin: newWallet.credentials.coin, + }, function(err) { + //Ignore error is copayer already in wallet + if (err && !(err instanceof errors.COPAYER_IN_WALLET)) { + mainErr = err; + } + + if (++i == l) { + return cb(mainErr); + } + }); + }); + }; + return root; }); diff --git a/www/views/cashScan.html b/www/views/cashScan.html index 1d8c0a9af..602154605 100644 --- a/www/views/cashScan.html +++ b/www/views/cashScan.html @@ -14,10 +14,17 @@ BTC Wallets
- {{wallet.error}} +
+ {{error}} +
+ +
+ Some of you wallets are not elegible for Bitcon Cash support because there where created before Copay v1.2. Please use our recovery tool to access your Bitcoin Cash balance for those wallets +
+
@@ -26,16 +33,20 @@ {{wallet.name || wallet.id}}

- {{wallet.bchBalance || 'Checking...'}} + {{wallet.bchBalance || 'Checking...'}} {{wallet.m}}-of-{{wallet.n}}  

- + + +
+ +
diff --git a/www/views/tab-home.html b/www/views/tab-home.html index 6ac7c2bca..da3764c50 100644 --- a/www/views/tab-home.html +++ b/www/views/tab-home.html @@ -95,9 +95,10 @@ TODO Remove: Incomplete - {{wallet.status.totalBalanceStr ? wallet.status.totalBalanceStr : ( wallet.cachedBalance ? wallet.cachedBalance + (wallet.cachedBalanceUpdatedOn ? ' · ' + ( wallet.cachedBalanceUpdatedOn * 1000 | amTimeAgo) : '') : '' ) }} + {{wallet.status.totalBalanceStr ? wallet.status.totalBalanceStr : ( wallet.cachedBalance ? wallet.cachedBalance + (wallet.cachedBalanceUpdatedOn ? ' · ' + ( wallet.cachedBalanceUpdatedOn * 1000 | amTimeAgo) : '') : '' ) }} + Scanning for funds... - [Balance Hidden] + [Balance Hidden] {{wallet.m}}-of-{{wallet.n}} From f224f6112d9069799d5c4a651085731e682d8ab6 Mon Sep 17 00:00:00 2001 From: matiu Date: Sat, 9 Sep 2017 21:17:46 -0300 Subject: [PATCH 04/16] rm home link --- src/js/routes.js | 14 -------------- www/views/cashScan.html | 8 ++++++++ www/views/tab-home.html | 4 ---- 3 files changed, 8 insertions(+), 18 deletions(-) diff --git a/src/js/routes.js b/src/js/routes.js index ed62372e3..67d78bbde 100644 --- a/src/js/routes.js +++ b/src/js/routes.js @@ -592,20 +592,6 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr } }) - - // TODO remove - .state('tabs.scan', { - url: '/cashScan2', - views: { - 'tab-home@tabs': { - controller: 'cashScanController', - templateUrl: 'views/cashScan.html' - } - } - }) - - - /* * * Addressbook diff --git a/www/views/cashScan.html b/www/views/cashScan.html index 602154605..40621ee2b 100644 --- a/www/views/cashScan.html +++ b/www/views/cashScan.html @@ -14,6 +14,13 @@ BTC Wallets
+ +
+ No wallets elegible for Bitcoin Cash support +
+ + +
{{error}}
@@ -23,6 +30,7 @@
+
diff --git a/www/views/tab-home.html b/www/views/tab-home.html index da3764c50..9300a598e 100644 --- a/www/views/tab-home.html +++ b/www/views/tab-home.html @@ -11,10 +11,6 @@ on-refresh="onRefresh()"> -TODO Remove: - Scan your wallets for Bitcoin Cash - -
From 7653d1b6ab1e10f3a6b84a441a01120fc1a9237b Mon Sep 17 00:00:00 2001 From: matiu Date: Mon, 11 Sep 2017 11:45:19 -0300 Subject: [PATCH 05/16] fix create --- src/js/services/profileService.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/js/services/profileService.js b/src/js/services/profileService.js index f93fc03a8..109fee8b2 100644 --- a/src/js/services/profileService.js +++ b/src/js/services/profileService.js @@ -322,6 +322,7 @@ angular.module('copayApp.services') var walletClient = bwcService.getClient(null, opts); var network = opts.networkName || 'livenet'; +console.log('[profileService.js.324]'); //TODO if (opts.mnemonic) { try { opts.mnemonic = root._normalizeMnemonic(opts.mnemonic); @@ -386,6 +387,7 @@ angular.module('copayApp.services') } } } + return cb(null, walletClient); }; // Creates a wallet on BWC/BWS @@ -393,6 +395,7 @@ angular.module('copayApp.services') $log.debug('Creating Wallet:', opts); $timeout(function() { seedWallet(opts, function(err, walletClient) { +console.log('[profileService.js.395:walletClient:]',walletClient); //TODO if (err) return cb(err); var name = opts.name || gettextCatalog.getString('Personal Wallet'); @@ -404,6 +407,7 @@ angular.module('copayApp.services') walletPrivKey: opts.walletPrivKey, coin: opts.coin }, function(err, secret) { +console.log('[profileService.js.407:err:]',err); //TODO if (err) return bwcError.cb(err, gettextCatalog.getString('Error creating wallet'), cb); return cb(null, walletClient, secret); }); From eba074fd63fa51b16b253614bd5e1569e62b48ed Mon Sep 17 00:00:00 2001 From: JDonadio Date: Mon, 11 Sep 2017 14:50:14 -0300 Subject: [PATCH 06/16] ref style --- src/js/controllers/cashScan.js | 23 ++++----- src/js/controllers/preferencesCash.js | 4 +- src/sass/views/cashScan.scss | 39 +++++++++++++++ src/sass/views/views.scss | 1 + www/views/cashScan.html | 68 +++++++++++++-------------- www/views/preferencesCash.html | 2 +- 6 files changed, 86 insertions(+), 51 deletions(-) create mode 100644 src/sass/views/cashScan.scss diff --git a/src/js/controllers/cashScan.js b/src/js/controllers/cashScan.js index 4bc429e07..7f60192e3 100644 --- a/src/js/controllers/cashScan.js +++ b/src/js/controllers/cashScan.js @@ -5,19 +5,20 @@ angular.module('copayApp.controllers').controller('cashScanController', var wallet; var errors = bwcService.getErrors(); $scope.error = null; + $scope.walletDisabled = '#667'; - $scope.$on("$ionicView.enter", function(event, data) { + $scope.$on("$ionicView.beforeEnter", function(event, data) { updateAllWallets(); }); var updateAllWallets = function() { - var wallets1 = profileService.getWallets({ + var walletsBTC = profileService.getWallets({ coin: 'btc', onlyComplete: true, network: 'livenet' }); - if (lodash.isEmpty(wallets1)) { + if (lodash.isEmpty(walletsBTC)) { $state.go('tabs.home'); return; } @@ -29,18 +30,19 @@ angular.module('copayApp.controllers').controller('cashScanController', }); var xPubKeyIndex = lodash.indexBy(walletsBCH, "credentials.xPubKey"); - wallets1 = lodash.filter(wallets1, function(w) { + walletsBTC = lodash.filter(walletsBTC, function(w) { return !xPubKeyIndex[w.credentials.xPubKey]; }); - // Filter out non BIP44 wallets - var wallets = lodash.filter(wallets1, function(w) { + var wallets = lodash.filter(walletsBTC, function(w) { return w.credentials.derivationStrategy == 'BIP44' }); $scope.wallets = wallets; - $scope.nonBIP44 = wallets1.length != wallets.length; + $scope.nonBIP44Wallets = lodash.filter(walletsBTC, function(w) { + return w.credentials.derivationStrategy != 'BIP44'; + }); var i = wallets.length; var j = 0; @@ -49,23 +51,18 @@ angular.module('copayApp.controllers').controller('cashScanController', coin: 'bch' }, function(err, balance) { if (err) { - wallet.error = (err === 'WALLET_NOT_REGISTERED') ? gettextCatalog.getString('Wallet not registered') : bwcError.msg(err); - $log.error(err); return; } - // wallet.error = null; wallet.bchBalance = txFormatService.formatAmountStr('bch', balance.availableAmount); if (++j == i) { - //Done $timeout(function() { $rootScope.$apply(); }, 10); - } }); }); @@ -135,7 +132,7 @@ angular.module('copayApp.controllers').controller('cashScanController', }); }; - walletService.getKeys(wallet,function(err,keys) { + walletService.getKeys(wallet, function(err, keys) { if (err) { $scope.error = err; return $timeout(function() { diff --git a/src/js/controllers/preferencesCash.js b/src/js/controllers/preferencesCash.js index e720d7735..eb81e0394 100644 --- a/src/js/controllers/preferencesCash.js +++ b/src/js/controllers/preferencesCash.js @@ -1,6 +1,6 @@ 'use strict'; -angular.module('copayApp.controllers').controller('preferencesCashController', function($scope, $log, $timeout, appConfigService, lodash, configService, gettextCatalog, externalLinkService) { +angular.module('copayApp.controllers').controller('preferencesCashController', function($scope, $log, $timeout, appConfigService, configService, gettextCatalog, externalLinkService) { var updateConfig = function() { var config = configService.getSync(); @@ -36,7 +36,7 @@ angular.module('copayApp.controllers').controller('preferencesCashController', f }; - $scope.$on("$ionicView.enter", function(event, data) { + $scope.$on("$ionicView.beforeEnter", function(event, data) { updateConfig(); }); }); diff --git a/src/sass/views/cashScan.scss b/src/sass/views/cashScan.scss new file mode 100644 index 000000000..5ae76ef53 --- /dev/null +++ b/src/sass/views/cashScan.scss @@ -0,0 +1,39 @@ +#cash-scan { + .comment { + color: #667; + font-size: 0.9em; + } + + .item { + color: $v-dark-gray; + padding-top: 1.3rem; + padding-bottom: 1.3rem; + } + + .heading { + font-size: 17px; + color: $v-dark-gray; + margin: 1rem 0; + padding-top: 5px; + padding-bottom: 5px; + border: none; + } + + .text-disabled { + color: $v-light-gray; + } + + .supported { + display: flex; + + .wallet-content { + padding-left: 7px; + } + } + + .duplicate-button { + position: absolute; + right: 15px; + padding-top: .5rem; + } +} diff --git a/src/sass/views/views.scss b/src/sass/views/views.scss index 722c97e1d..37754970f 100644 --- a/src/sass/views/views.scss +++ b/src/sass/views/views.scss @@ -50,3 +50,4 @@ @import "includes/pin"; @import "includes/logOptions"; @import "includes/checkBar"; +@import "cashScan"; diff --git a/www/views/cashScan.html b/www/views/cashScan.html index 40621ee2b..2e62297ba 100644 --- a/www/views/cashScan.html +++ b/www/views/cashScan.html @@ -1,4 +1,4 @@ - + Bitcoin Cash (BCH) Balances @@ -10,51 +10,49 @@
-
+
+ No wallets eligible for Bitcoin Cash support +
+ +
+ {{error}} +
+ +
BTC Wallets
+
+ + + +
+
{{wallet.name || wallet.id}}
+
{{wallet.bchBalance || ('Checking...' | translate)}}
+
{{wallet.m}}-of-{{wallet.n}}
+
-
- No wallets elegible for Bitcoin Cash support +
+ +
+
+
+
+ Non eligible BTC wallets +
-
- {{error}} -
- -
- Some of you wallets are not elegible for Bitcon Cash support because there where created before Copay v1.2. Please use our recovery tool to access your Bitcoin Cash balance for those wallets -
- -
- -
+
- + - - {{wallet.name || wallet.id}} - -

+ {{wallet.name || wallet.id}} +

- {{wallet.bchBalance || 'Checking...'}} - - {{wallet.m}}-of-{{wallet.n}} - -   -

- - -
- -
+
+ Some of you wallets are not eligible for Bitcon Cash support because there where created before Copay v1.2. Please use our recovery tool to access your Bitcoin Cash balance for those wallets
diff --git a/www/views/preferencesCash.html b/www/views/preferencesCash.html index bc18563aa..b03acec3c 100644 --- a/www/views/preferencesCash.html +++ b/www/views/preferencesCash.html @@ -15,7 +15,7 @@
Enable Bitcoin Cash wallet creation and operation within the App. - Learn more + Learn more
From 8c3397e698359e5a58ce27c5da2977809016e95d Mon Sep 17 00:00:00 2001 From: matiu Date: Thu, 14 Sep 2017 12:27:45 -0300 Subject: [PATCH 07/16] fix for new addresses in send --- angular-bitcore-wallet-client/index.js | 4 ++++ src/js/controllers/confirm.js | 6 ++++-- src/js/controllers/create.js | 2 +- src/js/services/bitcoreCash.js | 6 ++++++ src/js/services/incomingData.js | 17 ++++++++++++++--- 5 files changed, 29 insertions(+), 6 deletions(-) create mode 100644 src/js/services/bitcoreCash.js diff --git a/angular-bitcore-wallet-client/index.js b/angular-bitcore-wallet-client/index.js index 0765b6df0..84d851ce0 100644 --- a/angular-bitcore-wallet-client/index.js +++ b/angular-bitcore-wallet-client/index.js @@ -13,6 +13,10 @@ bwcModule.provider("bwcService", function() { return Client.Bitcore; }; + service.getBitcoreCash = function() { + return Client.BitcoreCash; + }; + service.getErrors = function() { return Client.errors; }; diff --git a/src/js/controllers/confirm.js b/src/js/controllers/confirm.js index b85105a06..174531476 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, $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, bitcoreCash, txFormatService, ongoingProcess, $ionicModal, popupService, $ionicHistory, $ionicConfig, payproService, feeService, bwcError, txConfirmNotification) { var countDown = null; var CONFIRM_LIMIT_USD = 20; @@ -120,6 +120,8 @@ angular.module('copayApp.controllers').controller('confirmController', function( }; // Setup $scope + // + var B = data.stateParams.coin == 'bch' ? bitcoreCash : bitcore; // Grab stateParams tx = { @@ -137,7 +139,7 @@ angular.module('copayApp.controllers').controller('confirmController', function( toName: data.stateParams.toName, toEmail: data.stateParams.toEmail, toColor: data.stateParams.toColor, - network: (new bitcore.Address(data.stateParams.toAddress)).network.name, + network: (new B.Address(data.stateParams.toAddress)).network.name, coin: data.stateParams.coin, txp: {}, }; diff --git a/src/js/controllers/create.js b/src/js/controllers/create.js index 6bb2bd78a..d47dba87f 100644 --- a/src/js/controllers/create.js +++ b/src/js/controllers/create.js @@ -30,7 +30,7 @@ angular.module('copayApp.controllers').controller('createController', $scope.formData.derivationPath = derivationPathHelper.default; $scope.formData.coin = 'btc'; - if (config.cashSupport.enabled) $scope.enableCash = true; + if (config.cashSupport) $scope.enableCash = true; $scope.setTotalCopayers(tc); updateRCSelect(tc); diff --git a/src/js/services/bitcoreCash.js b/src/js/services/bitcoreCash.js new file mode 100644 index 000000000..484c2a6e9 --- /dev/null +++ b/src/js/services/bitcoreCash.js @@ -0,0 +1,6 @@ +'use strict'; +angular.module('copayApp.services') + .factory('bitcoreCash', function bitcoreFactory(bwcService) { + var bitcoreCash = bwcService.getBitcoreCash(); + return bitcoreCash; + }); diff --git a/src/js/services/incomingData.js b/src/js/services/incomingData.js index a805fac29..82d0510a4 100644 --- a/src/js/services/incomingData.js +++ b/src/js/services/incomingData.js @@ -1,6 +1,6 @@ 'use strict'; -angular.module('copayApp.services').factory('incomingData', function($log, $state, $timeout, $ionicHistory, bitcore, $rootScope, payproService, scannerService, appConfigService, popupService, gettextCatalog) { +angular.module('copayApp.services').factory('incomingData', function($log, $state, $timeout, $ionicHistory, bitcore, bitcoreCash, $rootScope, payproService, scannerService, appConfigService, popupService, gettextCatalog) { var root = {}; @@ -140,6 +140,16 @@ angular.module('copayApp.services').factory('incomingData', function($log, $stat } else { goToAmountPage(data); } + } else if (bitcoreCash.Address.isValid(data, 'livenet')) { + if ($state.includes('tabs.scan')) { + root.showMenu({ + data: data, + type: 'bitcoinAddress', + coin: 'bch', + }); + } else { + goToAmountPage(data, 'bch'); + } } else if (data && data.indexOf(appConfigService.name + '://glidera') === 0) { var code = getParameterByName('code', data); $ionicHistory.nextViewOptions({ @@ -254,14 +264,15 @@ angular.module('copayApp.services').factory('incomingData', function($log, $stat }; - function goToAmountPage(toAddress) { + function goToAmountPage(toAddress, coin) { $state.go('tabs.send', {}, { 'reload': true, 'notify': $state.current.name == 'tabs.send' ? false : true }); $timeout(function() { $state.transitionTo('tabs.send.amount', { - toAddress: toAddress + toAddress: toAddress, + coin: coin, }); }, 100); } From 1ac368c67d0b94d47508a63f818372e07d28c822 Mon Sep 17 00:00:00 2001 From: matiu Date: Thu, 14 Sep 2017 22:09:20 -0300 Subject: [PATCH 08/16] fix scanning status --- src/js/controllers/tab-home.js | 2 -- src/js/services/walletService.js | 7 +++---- www/views/tab-home.html | 6 +++--- www/views/walletDetails.html | 19 +++++++++++++++---- 4 files changed, 21 insertions(+), 13 deletions(-) diff --git a/src/js/controllers/tab-home.js b/src/js/controllers/tab-home.js index a3a614e21..79be14391 100644 --- a/src/js/controllers/tab-home.js +++ b/src/js/controllers/tab-home.js @@ -224,7 +224,6 @@ angular.module('copayApp.controllers').controller('tabHomeController', wallet.error = null; wallet.status = status; - wallet.updating = status && status.wallet && status.wallet.scanStatus == 'running'; // TODO service refactor? not in profile service profileService.setLastKnownBalance(wallet.id, wallet.status.totalBalanceStr, function() {}); } @@ -243,7 +242,6 @@ angular.module('copayApp.controllers').controller('tabHomeController', return; } wallet.status = status; - wallet.updating = status && status.wallet && status.wallet.scanStatus == 'running'; updateTxps(); }); }; diff --git a/src/js/services/walletService.js b/src/js/services/walletService.js index b456fae61..15be5ecc0 100644 --- a/src/js/services/walletService.js +++ b/src/js/services/walletService.js @@ -305,6 +305,8 @@ angular.module('copayApp.services').factory('walletService', function($log, $tim cacheStatus(status); + wallet.scanning = status.wallet && status.wallet.scanStatus == 'running'; + return cb(null, status); }); }; @@ -818,13 +820,10 @@ angular.module('copayApp.services').factory('walletService', function($log, $tim $log.debug('Scanning wallet ' + wallet.id); if (!wallet.isComplete()) return; - wallet.updating = true; - ongoingProcess.set('scanning', true); + wallet.scanning = true; wallet.startScan({ includeCopayerBranches: true, }, function(err) { - wallet.updating = false; - ongoingProcess.set('scanning', false); return cb(err); }); }; diff --git a/www/views/tab-home.html b/www/views/tab-home.html index 9300a598e..0e3e8e33d 100644 --- a/www/views/tab-home.html +++ b/www/views/tab-home.html @@ -91,10 +91,10 @@ Incomplete - {{wallet.status.totalBalanceStr ? wallet.status.totalBalanceStr : ( wallet.cachedBalance ? wallet.cachedBalance + (wallet.cachedBalanceUpdatedOn ? ' · ' + ( wallet.cachedBalanceUpdatedOn * 1000 | amTimeAgo) : '') : '' ) }} - Scanning for funds... + {{wallet.status.totalBalanceStr ? wallet.status.totalBalanceStr : ( wallet.cachedBalance ? wallet.cachedBalance + (wallet.cachedBalanceUpdatedOn ? ' · ' + ( wallet.cachedBalanceUpdatedOn * 1000 | amTimeAgo) : '') : '' ) }} + Scanning for funds... - [Balance Hidden] + [Balance Hidden] {{wallet.m}}-of-{{wallet.n}} diff --git a/www/views/walletDetails.html b/www/views/walletDetails.html index 2a094e233..6f3756d50 100644 --- a/www/views/walletDetails.html +++ b/www/views/walletDetails.html @@ -31,7 +31,7 @@
@@ -46,15 +46,26 @@
[Balance Hidden] -
Tap and hold to show
-
+ +
+ [Scanning Funds] +
+ Please wait +
+
+ + +