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 + + + + + +