diff --git a/bower.json b/bower.json index 80012eb29..cb075503f 100644 --- a/bower.json +++ b/bower.json @@ -17,7 +17,7 @@ "ng-lodash": "~0.2.0", "angular-moment": "0.10.1", "moment": "2.10.3", - "angular-bitcore-wallet-client": "0.2.0", + "angular-bitcore-wallet-client": "0.2.2", "angular-ui-router": "~0.2.13", "qrcode-decoder-js": "*", "fastclick": "*", diff --git a/public/views/create.html b/public/views/create.html index f1340cb6b..0c495af1a 100644 --- a/public/views/create.html +++ b/public/views/create.html @@ -102,27 +102,27 @@
-
-
+
@@ -17,9 +17,23 @@ Importing wallet...
+
+
+
+
+
+
+
+
+
+ Connecting to Ledger Wallet... +
+
+ +
-
+
- - - - - +
+
+ + +
+ Ledger +
+
@@ -139,9 +166,29 @@
-
+
-TODO +
+
+ + {{import.error|translate}} + +
+ +
+ + +
+ +
+
diff --git a/public/views/join.html b/public/views/join.html index 39e7d873d..01ca33775 100644 --- a/public/views/join.html +++ b/public/views/join.html @@ -86,7 +86,7 @@
-
-
- - - - diff --git a/src/js/controllers/create.js b/src/js/controllers/create.js index a210bf5e5..f14e30591 100644 --- a/src/js/controllers/create.js +++ b/src/js/controllers/create.js @@ -106,7 +106,7 @@ angular.module('copayApp.controllers').controller('createController', }); } else { - if ( ( opts.mnemonic && opts.n==1) || otps.externalSource ) { + if ( ( opts.mnemonic && opts.n==1) || opts.externalSource ) { $rootScope.$emit('Local/WalletImported', walletId); } else { go.walletHome(); diff --git a/src/js/controllers/import.js b/src/js/controllers/import.js index 591a57a19..c8c95057d 100644 --- a/src/js/controllers/import.js +++ b/src/js/controllers/import.js @@ -1,12 +1,14 @@ 'use strict'; angular.module('copayApp.controllers').controller('importController', - function($scope, $rootScope, $location, $timeout, $log, profileService, notification, go, isMobile, isCordova, sjcl, gettext, lodash) { + function($scope, $rootScope, $location, $timeout, $log, profileService, notification, go, isMobile, isCordova, sjcl, gettext, lodash, ledger) { var self = this; this.isSafari = isMobile.Safari(); this.isCordova = isCordova; + this.externalIndexValues = lodash.range(0, ledger.MAX_SLOT); + $scope.externalIndex = 0; var reader = new FileReader(); window.ignoreMobilePause = true; @@ -80,13 +82,6 @@ angular.module('copayApp.controllers').controller('importController', }, 100); }; - // { - // network: opts.network, - // m: opts.m, - // n: opts.n, - // publicKeyRing: opts.publicKeyRing, - // }, - // $scope.getFile = function() { // If we use onloadend, we need to check the readyState. reader.onloadend = function(evt) { @@ -146,10 +141,12 @@ angular.module('copayApp.controllers').controller('importController', if (!words) { this.error = gettext('Please enter the backup words'); } else { - var wordList = words.split(/ /).filter(function(v){ return v.length>0; }); + var wordList = words.split(/ /).filter(function(v) { + return v.length > 0; + }); if (wordList.length != 12) this.error = gettext('Please enter 12 backup words'); - else + else words = wordList.join(' '); } @@ -166,4 +163,41 @@ angular.module('copayApp.controllers').controller('importController', _importMnemonic(words, opts); }; + + this.importLedger = function(form) { + var self = this; + if (form.$invalid) { + this.error = gettext('There is an error in the form'); + $timeout(function() { + $scope.$apply(); + }); + return; + } + self.ledger = true; + ledger.getInfoForNewWallet($scope.externalIndex, function(err, lopts) { + self.ledger = false; + if (err) { + self.error = err; + $scope.$apply(); + return; + } + lopts.externalIndex = $scope.externalIndex; + lopts.externalSource = 'ledger'; + self.loading = true; + $log.debug('Import opts', lopts); + profileService.importExtendedPublicKey(lopts, function(err, walletId) { + self.loading = false; + if (err) { + self.error = err; + return $timeout(function() { + $scope.$apply(); + }); + } + $rootScope.$emit('Local/WalletImported', walletId); + notification.success(gettext('Success'), gettext('Your wallet has been imported correctly')); + go.walletHome(); + }); + }, 100); + }; + }); diff --git a/src/js/controllers/index.js b/src/js/controllers/index.js index a1defdf67..661d30e8a 100644 --- a/src/js/controllers/index.js +++ b/src/js/controllers/index.js @@ -3,6 +3,7 @@ angular.module('copayApp.controllers').controller('indexController', function($rootScope, $scope, $log, $filter, $timeout, lodash, go, profileService, configService, isCordova, rateService, storageService, addressService, gettext, amMoment, nodeWebkit, addonManager, feeService, isChromeApp, bwsError, txFormatService, uxLanguage, $state, glideraService) { var self = this; self.isCordova = isCordova; + self.isChromeApp = isChromeApp; self.onGoingProcess = {}; self.limitHistory = 5; @@ -653,16 +654,18 @@ angular.module('copayApp.controllers').controller('indexController', function($r return str; } + var step = 6; + function getHistory(skip, cb) { skip = skip || 0; fc.getTxHistory({ skip: skip, - limit: 100 + limit: step, }, function(err, txs) { if (err) return cb(err); if (txs && txs.length > 0) { allTxs.push(txs); - return getHistory(skip + 100, cb); + return getHistory(skip + step, cb); } else { return cb(null, lodash.flatten(allTxs)); } diff --git a/src/js/controllers/join.js b/src/js/controllers/join.js index 6561f4af2..9e875270b 100644 --- a/src/js/controllers/join.js +++ b/src/js/controllers/join.js @@ -4,7 +4,7 @@ angular.module('copayApp.controllers').controller('joinController', function($scope, $rootScope, $timeout, go, isMobile, notification, profileService, isCordova, isChromeApp, $modal, gettext, lodash, ledger) { var self = this; - this.externalIndexValues = lodash.range(0,20); + this.externalIndexValues = lodash.range(0,ledger.MAX_SLOT); $scope.externalIndex = 0; this.isChromeApp = function() { diff --git a/src/js/services/bwsError.js b/src/js/services/bwsError.js index 7a5a83ef9..6060415a8 100644 --- a/src/js/services/bwsError.js +++ b/src/js/services/bwsError.js @@ -25,7 +25,7 @@ angular.module('copayApp.services') body = gettextCatalog.getString('Copayer already in this wallet'); break; case 'COPAYER_REGISTERED': - body = gettextCatalog.getString('Copayer already registered'); + body = gettextCatalog.getString('Wallet already registered'); break; case 'COPAYER_VOTED': body = gettextCatalog.getString('Copayer already voted on this spend proposal'); diff --git a/src/js/services/profileService.js b/src/js/services/profileService.js index 33a620a10..371af925b 100644 --- a/src/js/services/profileService.js +++ b/src/js/services/profileService.js @@ -179,8 +179,9 @@ angular.module('copayApp.services') } } else if (opts.extendedPublicKey) { try { - walletClient.seedFromExternalWalletPublicKey(opts.extendedPublicKey, opts.externalSource, opts.externalIndex, opts.entropySource); + walletClient.seedFromExtendedPublicKey(opts.extendedPublicKey, opts.externalSource, opts.externalIndex, opts.entropySource); } catch (ex) { + $log.warn(ex); return cb(gettext('Could not create using the specified extended public key')); } } else { @@ -191,7 +192,7 @@ angular.module('copayApp.services') $log.info('Error creating seed: ' + e.message); if (e.message.indexOf('language') > 0) { $log.info('Using default language for mnemonic'); - walletClient.seedFromRandomWithMnemonic(network, opts.passphrase); + walletClient.seedFromRandomWithMnemonic(network, opts.passphrase); } else { return cb(e); } @@ -358,6 +359,26 @@ angular.module('copayApp.services') }); }; + root.importExtendedPublicKey = function(opts, cb) { + var walletClient = bwcService.getClient(); + $log.debug('Importing Wallet XPubKey'); + + walletClient.importFromExtendedPublicKey(opts.extendedPublicKey, opts.externalSource, opts.externalIndex, opts.entropySource, function(err) { + if (err) { + + // in HW wallets, req key is always the same. They can't addAccess. + if (err.code == 'NOT_AUTHORIZED') + err.code = 'WALLET_DOES_NOT_EXIST'; + + return bwsError.cb(err, gettext('Could not import'), cb); + } + + root._addWalletClient(walletClient, cb); + }); + }; + + + root.create = function(opts, cb) { $log.info('Creating profile'); configService.get(function(err) {