From 273901d2d69504575440732dbc3fe774863b81a2 Mon Sep 17 00:00:00 2001 From: Javier Date: Tue, 17 Nov 2015 15:42:06 -0300 Subject: [PATCH 01/35] WIP functionality on words --- public/views/backup.html | 36 +++++++++++++++++++++++------------- src/js/controllers/backup.js | 32 +++++++++++++++++++++++++++++++- src/js/routes.js | 11 +++++++++++ 3 files changed, 65 insertions(+), 14 deletions(-) diff --git a/public/views/backup.html b/public/views/backup.html index 25a2c3ce5..ed223c1a0 100644 --- a/public/views/backup.html +++ b/public/views/backup.html @@ -61,7 +61,7 @@
-
+ -
+ +
Your Wallet Seed
-
+ +
{{word}}  @@ -88,18 +90,20 @@
-
-
- - - - WARNING: This seed was created with a passphrase. To recover this wallet both the mnemonic and passphrase are needed. - + +
+
+ + + + WARNING: This seed was created with a passphrase. To recover this wallet both the mnemonic and passphrase are needed. -
+ +
-
+ + + +
+
diff --git a/src/js/controllers/backup.js b/src/js/controllers/backup.js index 8b46b20c1..5bf5bfc4a 100644 --- a/src/js/controllers/backup.js +++ b/src/js/controllers/backup.js @@ -1,12 +1,15 @@ 'use strict'; angular.module('copayApp.controllers').controller('wordsController', - function($rootScope, $scope, $timeout, profileService, go, gettext, confirmDialog, notification, bwsError, $log) { + function($rootScope, $scope, $timeout, $log, $compile, lodash, profileService, go, gettext, confirmDialog, notification, bwsError) { var msg = gettext('Are you sure you want to delete the backup words?'); var successMsg = gettext('Backup words deleted'); var self = this; self.show = false; + self.sorted = false; + $scope.seed = ''; + var customSortWords = []; var fc = profileService.focusedClient; if (fc.isPrivKeyEncrypted()) self.credentialsEncrypted = true; @@ -84,4 +87,31 @@ angular.module('copayApp.controllers').controller('wordsController', } } } + + self.disableButton = function(word) { + document.getElementById(word).disabled = true; + $scope.seed += word + ' '; + customSortWords.push(word); + + if (customSortWords.length == 12) + self.shouldContinue(customSortWords); + + self.addButton(word); + } + + self.addButton = function(word) { + var btnhtml = ''; + var temp = $compile(btnhtml)($scope); + angular.element(document.getElementById('addWord')).append(temp); + } + + self.removeButton = function(word) { + + } + + self.shouldContinue = function(customSortWords) { + if (lodash.isEqual(self.mnemonicWords, customSortWords)) + self.sorted = true; + } }); diff --git a/src/js/routes.js b/src/js/routes.js index 90d408c3d..e0260bf17 100644 --- a/src/js/routes.js +++ b/src/js/routes.js @@ -434,6 +434,17 @@ angular }, } }) + .state('backupWords', { + url: '/backupWords', + templateUrl: 'views/backupWords.html', + walletShouldBeComplete: true, + needProfile: true, + views: { + 'main': { + templateUrl: 'views/backupWords.html' + }, + } + }) .state('preferencesGlobal', { url: '/preferencesGlobal', needProfile: true, From 58a5cb7b6a9568490074484b64c0cec72a5baa32 Mon Sep 17 00:00:00 2001 From: Javier Date: Tue, 17 Nov 2015 15:42:23 -0300 Subject: [PATCH 02/35] WIP functionality on words --- public/views/backupWords.html | 65 +++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 public/views/backupWords.html diff --git a/public/views/backupWords.html b/public/views/backupWords.html new file mode 100644 index 000000000..a041e3f50 --- /dev/null +++ b/public/views/backupWords.html @@ -0,0 +1,65 @@ +
+
+ + +
+

+ +
+ + {{wordsC.error|translate}} + +
+ +
+ + +
+
+ Your Wallet Seed +
+
+ + +
+
+
+
+
+
+ + + +
+
+
+ +
+ +
+ + +
+
+
+ You can safely install your wallet on another device and use it from multiple devices at the same time. + + Learn more about Copay backups + +
+
+
+ +
+ +
+
From b774d840221035a1a65b793f38bbdb889f25ff05 Mon Sep 17 00:00:00 2001 From: Javier Date: Wed, 18 Nov 2015 11:58:43 -0300 Subject: [PATCH 03/35] complete buttons functionality --- public/views/backupWords.html | 4 +++- src/js/controllers/backup.js | 26 ++++++++++++++++++-------- 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/public/views/backupWords.html b/public/views/backupWords.html index a041e3f50..4a8199cb3 100644 --- a/public/views/backupWords.html +++ b/public/views/backupWords.html @@ -27,7 +27,9 @@
-
+
+ +
diff --git a/src/js/controllers/backup.js b/src/js/controllers/backup.js index 5bf5bfc4a..f787dbc31 100644 --- a/src/js/controllers/backup.js +++ b/src/js/controllers/backup.js @@ -88,30 +88,40 @@ angular.module('copayApp.controllers').controller('wordsController', } } + self.enableButton = function(word) { + document.getElementById(word).disabled = false; + lodash.remove(customSortWords, function(v) { + return v == word; + }); + } + self.disableButton = function(word) { document.getElementById(word).disabled = true; - $scope.seed += word + ' '; customSortWords.push(word); - - if (customSortWords.length == 12) - self.shouldContinue(customSortWords); - self.addButton(word); } self.addButton = function(word) { + var asd = 'apospodk'; var btnhtml = ''; + 'data-ng-click="wordsC.removeButton($event)" id="_' + word + '" > ' + word + ' '; var temp = $compile(btnhtml)($scope); angular.element(document.getElementById('addWord')).append(temp); + self.shouldContinue(customSortWords); } - self.removeButton = function(word) { - + self.removeButton = function(event) { + var id = (event.target.id); + var element = document.getElementById(id); + element.remove(); + self.enableButton(id.substring(1)); + self.shouldContinue(customSortWords); } self.shouldContinue = function(customSortWords) { if (lodash.isEqual(self.mnemonicWords, customSortWords)) self.sorted = true; + else + self.sorted = false; } }); From f259d11f4e0a537c6403fbdb1cc73fd18d3aac1f Mon Sep 17 00:00:00 2001 From: Javier Date: Wed, 18 Nov 2015 12:29:56 -0300 Subject: [PATCH 04/35] complete flow views --- public/views/backupWords.html | 10 ++-------- src/js/controllers/backup.js | 15 +++++++-------- src/js/routes.js | 11 +++++++++++ 3 files changed, 20 insertions(+), 16 deletions(-) diff --git a/public/views/backupWords.html b/public/views/backupWords.html index 4a8199cb3..b8560609a 100644 --- a/public/views/backupWords.html +++ b/public/views/backupWords.html @@ -16,20 +16,16 @@
-
Your Wallet Seed
-
-
- -
+
@@ -44,12 +40,11 @@ ng-disabled="!wordsC.sorted" ng-style="{'background-color':index.backgroundColor}" class="button black round expand" - ng-click="" + ng-click="$root.go('backupConfirm');" translate>Continue
-
@@ -62,6 +57,5 @@
-
diff --git a/src/js/controllers/backup.js b/src/js/controllers/backup.js index f787dbc31..f0c3c0bc8 100644 --- a/src/js/controllers/backup.js +++ b/src/js/controllers/backup.js @@ -6,19 +6,18 @@ angular.module('copayApp.controllers').controller('wordsController', var msg = gettext('Are you sure you want to delete the backup words?'); var successMsg = gettext('Backup words deleted'); var self = this; - self.show = false; - self.sorted = false; - $scope.seed = ''; var customSortWords = []; var fc = profileService.focusedClient; + self.show = false; + self.sorted = false; - if (fc.isPrivKeyEncrypted()) self.credentialsEncrypted = true; - else { + if (fc.isPrivKeyEncrypted()) + self.credentialsEncrypted = true; + else setWords(fc.getMnemonic()); - } - if (fc.credentials && !fc.credentials.mnemonicEncrypted && !fc.credentials.mnemonic) { + + if (fc.credentials && !fc.credentials.mnemonicEncrypted && !fc.credentials.mnemonic) self.deleted = true; - } self.toggle = function() { self.error = ""; diff --git a/src/js/routes.js b/src/js/routes.js index e0260bf17..500fb70aa 100644 --- a/src/js/routes.js +++ b/src/js/routes.js @@ -445,6 +445,17 @@ angular }, } }) + .state('backupConfirm', { + url: '/backupConfirm', + templateUrl: 'views/backupConfirm.html', + walletShouldBeComplete: true, + needProfile: true, + views: { + 'main': { + templateUrl: 'views/backupConfirm.html' + }, + } + }) .state('preferencesGlobal', { url: '/preferencesGlobal', needProfile: true, From afdb26de1e4facfbb161ddd4bed42f357613e0ee Mon Sep 17 00:00:00 2001 From: Javier Date: Wed, 18 Nov 2015 12:31:00 -0300 Subject: [PATCH 05/35] add confirm view --- public/views/backupConfirm.html | 40 +++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 public/views/backupConfirm.html diff --git a/public/views/backupConfirm.html b/public/views/backupConfirm.html new file mode 100644 index 000000000..a603360c2 --- /dev/null +++ b/public/views/backupConfirm.html @@ -0,0 +1,40 @@ +
+
+ + +
+

+
+ +
+
+ Congratulations +
+
+ +
+ +
+ +
+
+
+ You can safely install your wallet on another device and use it from multiple devices at the same time. + + Learn more about Copay backups + +
+
+
+ +
+
+
From 4d94121ec624c5138a70b052f8812c45af8c5e17 Mon Sep 17 00:00:00 2001 From: Javier Date: Wed, 18 Nov 2015 18:37:42 -0300 Subject: [PATCH 06/35] WIP passphrase confirm - add passphrase view and separate controllers --- public/views/backup.html | 28 ++++---- public/views/backupConfirm.html | 7 +- public/views/backupPassphrase.html | 57 ++++++++++++++++ public/views/backupWords.html | 26 +++---- public/views/export.html | 32 ++++----- src/js/controllers/bachupWords.js | 56 ++++++++++++++++ src/js/controllers/backup.js | 93 ++------------------------ src/js/controllers/backupConfirm.js | 22 ++++++ src/js/controllers/backupPassphrase.js | 34 ++++++++++ src/js/controllers/export.js | 2 +- src/js/routes.js | 11 +++ 11 files changed, 234 insertions(+), 134 deletions(-) create mode 100644 public/views/backupPassphrase.html create mode 100644 src/js/controllers/bachupWords.js create mode 100644 src/js/controllers/backupConfirm.js create mode 100644 src/js/controllers/backupPassphrase.js diff --git a/public/views/backup.html b/public/views/backup.html index ed223c1a0..66fc58114 100644 --- a/public/views/backup.html +++ b/public/views/backup.html @@ -4,18 +4,14 @@ ng-init="titleSection='Backup'; goBackToState = 'preferences'">
- -
+

-
{{wordsC.error|translate}}
- -
@@ -75,23 +71,23 @@ -
+
Your Wallet Seed
-
+
-
- {{word}}  -
+
+ {{word}}  +
-
+
@@ -120,8 +116,12 @@
-->
-
@@ -136,8 +136,6 @@
-
-
diff --git a/public/views/backupConfirm.html b/public/views/backupConfirm.html index a603360c2..e1f7aa4b6 100644 --- a/public/views/backupConfirm.html +++ b/public/views/backupConfirm.html @@ -4,10 +4,9 @@ ng-init="titleSection='Backup'; goBackToState = 'backupWords'">
- -
+

-
+
@@ -19,7 +18,7 @@
diff --git a/public/views/backupPassphrase.html b/public/views/backupPassphrase.html new file mode 100644 index 000000000..aa837fcb7 --- /dev/null +++ b/public/views/backupPassphrase.html @@ -0,0 +1,57 @@ +
+
+ +
+

+
+ + {{backupPassphraseC.error|translate}} + +
+ +
+
+
+ Passphrase needed +
+
+ +
+
+ +
+ + +
+ +
+
+
+ You can safely install your wallet on another device and use it from multiple devices at the same time. + + Learn more about Copay backups + +
+
+
+ +
+
+
diff --git a/public/views/backupWords.html b/public/views/backupWords.html index b8560609a..95aa7b660 100644 --- a/public/views/backupWords.html +++ b/public/views/backupWords.html @@ -4,17 +4,10 @@ ng-init="titleSection='Backup'; goBackToState = 'backup'">
- -
+

- -
- - {{wordsC.error|translate}} - -
-
+
@@ -28,8 +21,8 @@
- - + +
@@ -37,12 +30,21 @@
+
diff --git a/public/views/export.html b/public/views/export.html index 2d5a2a558..4b3f24b67 100644 --- a/public/views/export.html +++ b/public/views/export.html @@ -6,17 +6,17 @@ -
+

-
-
+
+
Failed to export
-
+
The private key for this wallet is encrypted. Exporting keep the private key encrypted in the export archive. @@ -31,14 +31,14 @@
+ name="password" ng-model="exportC.password">
+ name="password" ng-model="exportC.repeatpassword">
@@ -83,25 +83,25 @@
- -

Export options

- -
@@ -109,11 +109,11 @@
-
+

Wallet Export

- +
diff --git a/src/js/controllers/bachupWords.js b/src/js/controllers/bachupWords.js new file mode 100644 index 000000000..672f95682 --- /dev/null +++ b/src/js/controllers/bachupWords.js @@ -0,0 +1,56 @@ +'use strict'; + +angular.module('copayApp.controllers').controller('backupWordsController', + function($rootScope, $scope, $timeout, $log, $compile, lodash, profileService, go, gettext, confirmDialog, notification, bwsError) { + + var self = this; + var fc = profileService.focusedClient; + var customSortWords = []; + self.sorted = false; + + setWords(fc.getMnemonic()); + + function setWords(words) { + if (words) { + self.mnemonicWords = words.split(/[\u3000\s]+/); + self.mnemonicHasPassphrase = fc.mnemonicHasPassphrase(); + self.useIdeograms = words.indexOf("\u3000") >= 0; + } + }; + + self.enableButton = function(word) { + document.getElementById(word).disabled = false; + lodash.remove(customSortWords, function(v) { + return v == word; + }); + } + + self.disableButton = function(word) { + document.getElementById(word).disabled = true; + customSortWords.push(word); + self.addButton(word); + } + + self.addButton = function(word) { + var btnhtml = ''; + var temp = $compile(btnhtml)($scope); + angular.element(document.getElementById('addWord')).append(temp); + self.shouldContinue(customSortWords); + } + + self.removeButton = function(event) { + var id = (event.target.id); + var element = document.getElementById(id); + element.remove(); + self.enableButton(id.substring(1)); + self.shouldContinue(customSortWords); + } + + self.shouldContinue = function(customSortWords) { + if (lodash.isEqual(self.mnemonicWords, customSortWords)) + self.sorted = true; + else + self.sorted = false; + } + }); diff --git a/src/js/controllers/backup.js b/src/js/controllers/backup.js index f0c3c0bc8..dbc37814d 100644 --- a/src/js/controllers/backup.js +++ b/src/js/controllers/backup.js @@ -1,57 +1,17 @@ 'use strict'; -angular.module('copayApp.controllers').controller('wordsController', +angular.module('copayApp.controllers').controller('backupController', function($rootScope, $scope, $timeout, $log, $compile, lodash, profileService, go, gettext, confirmDialog, notification, bwsError) { - var msg = gettext('Are you sure you want to delete the backup words?'); - var successMsg = gettext('Backup words deleted'); var self = this; - var customSortWords = []; var fc = profileService.focusedClient; - self.show = false; - self.sorted = false; - if (fc.isPrivKeyEncrypted()) + if (fc.isPrivKeyEncrypted()) { self.credentialsEncrypted = true; - else + passwordRequest(); + } else setWords(fc.getMnemonic()); - if (fc.credentials && !fc.credentials.mnemonicEncrypted && !fc.credentials.mnemonic) - self.deleted = true; - - self.toggle = function() { - self.error = ""; - if (!self.credentialsEncrypted) { - if (!self.show) - $rootScope.$emit('Local/BackupDone'); - self.show = !self.show; - } - - if (self.credentialsEncrypted) - self.passwordRequest(); - - $timeout(function() { - $scope.$apply(); - }, 1); - }; - - self.delete = function() { - confirmDialog.show(msg, function(ok) { - if (ok) { - fc.clearMnemonic(); - profileService.updateCredentialsFC(function() { - self.deleted = true; - notification.success(successMsg); - go.walletHome(); - }); - } - }); - }; - - $scope.$on('$destroy', function() { - profileService.lockFC(); - }); - function setWords(words) { if (words) { self.mnemonicWords = words.split(/[\u3000\s]+/); @@ -60,12 +20,11 @@ angular.module('copayApp.controllers').controller('wordsController', } }; - self.passwordRequest = function() { + function passwordRequest() { try { setWords(fc.getMnemonic()); } catch (e) { if (e.message && e.message.match(/encrypted/) && fc.isPrivKeyEncrypted()) { - self.credentialsEncrypted = true; $timeout(function() { $scope.$apply(); @@ -77,50 +36,12 @@ angular.module('copayApp.controllers').controller('wordsController', $log.warn('Error decrypting credentials:', self.error); //TODO return; } - if (!self.show && self.credentialsEncrypted) - self.show = !self.show; + self.credentialsEncrypted = false; setWords(fc.getMnemonic()); - $rootScope.$emit('Local/BackupDone'); + // $rootScope.$emit('Local/BackupDone'); }); } } } - - self.enableButton = function(word) { - document.getElementById(word).disabled = false; - lodash.remove(customSortWords, function(v) { - return v == word; - }); - } - - self.disableButton = function(word) { - document.getElementById(word).disabled = true; - customSortWords.push(word); - self.addButton(word); - } - - self.addButton = function(word) { - var asd = 'apospodk'; - var btnhtml = ''; - var temp = $compile(btnhtml)($scope); - angular.element(document.getElementById('addWord')).append(temp); - self.shouldContinue(customSortWords); - } - - self.removeButton = function(event) { - var id = (event.target.id); - var element = document.getElementById(id); - element.remove(); - self.enableButton(id.substring(1)); - self.shouldContinue(customSortWords); - } - - self.shouldContinue = function(customSortWords) { - if (lodash.isEqual(self.mnemonicWords, customSortWords)) - self.sorted = true; - else - self.sorted = false; - } }); diff --git a/src/js/controllers/backupConfirm.js b/src/js/controllers/backupConfirm.js new file mode 100644 index 000000000..609186249 --- /dev/null +++ b/src/js/controllers/backupConfirm.js @@ -0,0 +1,22 @@ +'use strict'; + +angular.module('copayApp.controllers').controller('backupConfirmController', + function($rootScope, $scope, $timeout, $log, $compile, lodash, profileService, go, gettext, confirmDialog, notification, bwsError) { + + var self = this; + var fc = profileService.focusedClient; + + setWords(fc.getMnemonic()); + + function setWords(words) { + if (words) { + self.mnemonicWords = words.split(/[\u3000\s]+/); + self.mnemonicHasPassphrase = fc.mnemonicHasPassphrase(); + self.useIdeograms = words.indexOf("\u3000") >= 0; + } + }; + + self.confirm = function() { + $rootScope.$emit('Local/BackupDone'); + } + }); diff --git a/src/js/controllers/backupPassphrase.js b/src/js/controllers/backupPassphrase.js new file mode 100644 index 000000000..bcfdd7885 --- /dev/null +++ b/src/js/controllers/backupPassphrase.js @@ -0,0 +1,34 @@ +'use strict'; + +angular.module('copayApp.controllers').controller('backupPassphraseController', + function($rootScope, $scope, $timeout, $log, $compile, bwcService, lodash, profileService, go, gettext, confirmDialog, notification, bwsError) { + + var self = this; + var fc = profileService.focusedClient; + self.passphraseSuccess = false; + self.error = ""; + + setWords(fc.getMnemonic()); + var words = fc.getMnemonic(); + + function setWords(words) { + if (words) { + self.mnemonicWords = words.split(/[\u3000\s]+/); + self.mnemonicHasPassphrase = fc.mnemonicHasPassphrase(); + self.useIdeograms = words.indexOf("\u3000") >= 0; + } + }; + + self.confirm = function() { + var walletClient = bwcService.getClient(); + + walletClient.importFromMnemonic(words, { + network: 'livenet', + passphrase: $scope.passphrase, + account: 0, + }, function(err) { + if (err) + self.error = err.message; + }); + } + }); diff --git a/src/js/controllers/export.js b/src/js/controllers/export.js index b25150550..af2f9ba4c 100644 --- a/src/js/controllers/export.js +++ b/src/js/controllers/export.js @@ -1,6 +1,6 @@ 'use strict'; -angular.module('copayApp.controllers').controller('backupController', +angular.module('copayApp.controllers').controller('exportController', function($rootScope, $scope, $timeout, $log, backupService, storageService, profileService, isMobile, notification, go, gettext, gettextCatalog) { var self = this; diff --git a/src/js/routes.js b/src/js/routes.js index 500fb70aa..eaea05692 100644 --- a/src/js/routes.js +++ b/src/js/routes.js @@ -456,6 +456,17 @@ angular }, } }) + .state('backupPassphrase', { + url: '/backupPassphrase', + templateUrl: 'views/backupPassphrase.html', + walletShouldBeComplete: true, + needProfile: true, + views: { + 'main': { + templateUrl: 'views/backupPassphrase.html' + }, + } + }) .state('preferencesGlobal', { url: '/preferencesGlobal', needProfile: true, From 75707b4a93a870d7c66b0971595f0da7dfcf7f32 Mon Sep 17 00:00:00 2001 From: Javier Date: Thu, 19 Nov 2015 10:45:57 -0300 Subject: [PATCH 07/35] complete passphrase verification - add spinner --- public/views/backupPassphrase.html | 17 +++++++++++++++-- public/views/backupWords.html | 2 +- src/js/controllers/bachupWords.js | 3 ++- src/js/controllers/backup.js | 1 - src/js/controllers/backupPassphrase.js | 24 +++++++++++++++++++++++- 5 files changed, 41 insertions(+), 6 deletions(-) diff --git a/public/views/backupPassphrase.html b/public/views/backupPassphrase.html index aa837fcb7..70fb264fe 100644 --- a/public/views/backupPassphrase.html +++ b/public/views/backupPassphrase.html @@ -12,20 +12,33 @@
+
+
+
+
+
+
+
+
+
+ Verifying passphrase... +
+
+
Passphrase needed
- +
+
diff --git a/src/js/controllers/bachupWords.js b/src/js/controllers/bachupWords.js index 672f95682..d9bef409e 100644 --- a/src/js/controllers/bachupWords.js +++ b/src/js/controllers/bachupWords.js @@ -32,7 +32,8 @@ angular.module('copayApp.controllers').controller('backupWordsController', } self.addButton = function(word) { - var btnhtml = ''; var temp = $compile(btnhtml)($scope); angular.element(document.getElementById('addWord')).append(temp); diff --git a/src/js/controllers/backup.js b/src/js/controllers/backup.js index dbc37814d..433ce61c4 100644 --- a/src/js/controllers/backup.js +++ b/src/js/controllers/backup.js @@ -39,7 +39,6 @@ angular.module('copayApp.controllers').controller('backupController', self.credentialsEncrypted = false; setWords(fc.getMnemonic()); - // $rootScope.$emit('Local/BackupDone'); }); } } diff --git a/src/js/controllers/backupPassphrase.js b/src/js/controllers/backupPassphrase.js index bcfdd7885..da4fda063 100644 --- a/src/js/controllers/backupPassphrase.js +++ b/src/js/controllers/backupPassphrase.js @@ -6,11 +6,19 @@ angular.module('copayApp.controllers').controller('backupPassphraseController', var self = this; var fc = profileService.focusedClient; self.passphraseSuccess = false; + self.checkingPassphrase = false; self.error = ""; setWords(fc.getMnemonic()); var words = fc.getMnemonic(); + self.changePassphrase = function() { + self.passphraseSuccess = false; + $timeout(function() { + $rootScope.$apply(); + }, 1); + } + function setWords(words) { if (words) { self.mnemonicWords = words.split(/[\u3000\s]+/); @@ -20,6 +28,9 @@ angular.module('copayApp.controllers').controller('backupPassphraseController', }; self.confirm = function() { + self.checkingPassphrase = true; + self.error = ""; + var walletClient = bwcService.getClient(); walletClient.importFromMnemonic(words, { @@ -27,8 +38,19 @@ angular.module('copayApp.controllers').controller('backupPassphraseController', passphrase: $scope.passphrase, account: 0, }, function(err) { - if (err) + self.checkingPassphrase = false; + if (err) { self.error = err.message; + $timeout(function() { + $rootScope.$apply(); + }, 1); + return; + } + + self.passphraseSuccess = true; + $timeout(function() { + $rootScope.$apply(); + }, 1); }); } }); From d7b3f8e4bae8cd3d878f3a87f6298beaa2ce4814 Mon Sep 17 00:00:00 2001 From: Javier Date: Thu, 19 Nov 2015 10:49:15 -0300 Subject: [PATCH 08/35] fix file name --- src/js/controllers/{bachupWords.js => backupWords.js} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/js/controllers/{bachupWords.js => backupWords.js} (100%) diff --git a/src/js/controllers/bachupWords.js b/src/js/controllers/backupWords.js similarity index 100% rename from src/js/controllers/bachupWords.js rename to src/js/controllers/backupWords.js From 945233363acc5f374ae3b192d99bd1148523fa24 Mon Sep 17 00:00:00 2001 From: Javier Date: Thu, 19 Nov 2015 11:36:57 -0300 Subject: [PATCH 09/35] fix flag wallet seed not available --- src/js/controllers/backup.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/js/controllers/backup.js b/src/js/controllers/backup.js index 433ce61c4..e2302f342 100644 --- a/src/js/controllers/backup.js +++ b/src/js/controllers/backup.js @@ -5,6 +5,10 @@ angular.module('copayApp.controllers').controller('backupController', var self = this; var fc = profileService.focusedClient; + self.deleted = false; + + if (fc.credentials && !fc.credentials.mnemonicEncrypted && !fc.credentials.mnemonic) + self.deleted = true; if (fc.isPrivKeyEncrypted()) { self.credentialsEncrypted = true; From 3cd14985125631011252a875f9ba97ed5f180af2 Mon Sep 17 00:00:00 2001 From: Javier Date: Fri, 20 Nov 2015 14:38:29 -0300 Subject: [PATCH 10/35] one view/controller --- public/views/backup.html | 208 +++++++++++++++++-------- public/views/backupConfirm.html | 39 ----- public/views/backupPassphrase.html | 70 --------- public/views/backupWords.html | 63 -------- src/js/controllers/backup.js | 159 ++++++++++++++++++- src/js/controllers/backupConfirm.js | 22 --- src/js/controllers/backupPassphrase.js | 56 ------- src/js/controllers/backupWords.js | 57 ------- src/js/routes.js | 22 +-- 9 files changed, 306 insertions(+), 390 deletions(-) delete mode 100644 public/views/backupConfirm.html delete mode 100644 public/views/backupPassphrase.html delete mode 100644 public/views/backupWords.html delete mode 100644 src/js/controllers/backupConfirm.js delete mode 100644 src/js/controllers/backupPassphrase.js delete mode 100644 src/js/controllers/backupWords.js diff --git a/public/views/backup.html b/public/views/backup.html index 66fc58114..d45c82790 100644 --- a/public/views/backup.html +++ b/public/views/backup.html @@ -13,16 +13,6 @@
-
-
- - You need the wallet seed to restore this personal wallet. - - - Write it down and keep them somewhere safe. - -
-
@@ -52,77 +42,159 @@
- Wallet seed not available. You can still export it from Advanced > Export. + Wallet seed not available. You can still export it from Advanced > Export.
- - - - -
-
- Your Wallet Seed -
-
- - -
-
-
- {{word}}  -
-
-
- - -
-
- - - - WARNING: This seed was created with a passphrase. To recover this wallet both the mnemonic and passphrase are needed. - +
+
+ + You need the wallet seed to restore this personal wallet. + + + Write it down and keep them somewhere safe.
+ - - +
+
+
+
+ {{word}}  +
+
+
+ +
+
+ + - Once you have copied your wallet seed down, it is recommended to delete it from this device. + WARNING: This seed was created with a passphrase. To recover this wallet both the mnemonic and passphrase are needed. + + +
+
+ +
+ +
+
+ + +
+
+
+
+
+
+
+ +
-
-
--> +
-
- +
+ +
+
+ + +
+
+
+ Passphrase needed +
+
+ +
+
+ +
+ +
+
+ + +
+
+ + Failed to verify backup. Please try again + +
+ +
+
+
+
+
+
+
+
+
+ Verifying... +
+
+ +
+
+ Congratulations +
+
+ +
+ +
diff --git a/public/views/backupConfirm.html b/public/views/backupConfirm.html deleted file mode 100644 index e1f7aa4b6..000000000 --- a/public/views/backupConfirm.html +++ /dev/null @@ -1,39 +0,0 @@ -
-
- -
-

-
- -
-
- Congratulations -
-
- -
- -
- -
-
-
- You can safely install your wallet on another device and use it from multiple devices at the same time. - - Learn more about Copay backups - -
-
-
- -
-
-
diff --git a/public/views/backupPassphrase.html b/public/views/backupPassphrase.html deleted file mode 100644 index 70fb264fe..000000000 --- a/public/views/backupPassphrase.html +++ /dev/null @@ -1,70 +0,0 @@ -
-
- -
-

-
- - {{backupPassphraseC.error|translate}} - -
- -
-
-
-
-
-
-
-
-
- Verifying passphrase... -
-
- -
-
-
- Passphrase needed -
-
- -
-
- -
- - -
- -
-
-
- You can safely install your wallet on another device and use it from multiple devices at the same time. - - Learn more about Copay backups - -
-
-
- -
-
-
diff --git a/public/views/backupWords.html b/public/views/backupWords.html deleted file mode 100644 index d670474b0..000000000 --- a/public/views/backupWords.html +++ /dev/null @@ -1,63 +0,0 @@ -
-
- -
-

- -
- -
-
- Your Wallet Seed -
-
- -
-
-
-
-
-
- - - -
-
-
- -
- - -
- -
-
-
- You can safely install your wallet on another device and use it from multiple devices at the same time. - - Learn more about Copay backups - -
-
-
- -
-
-
diff --git a/src/js/controllers/backup.js b/src/js/controllers/backup.js index e2302f342..200868834 100644 --- a/src/js/controllers/backup.js +++ b/src/js/controllers/backup.js @@ -1,11 +1,21 @@ 'use strict'; angular.module('copayApp.controllers').controller('backupController', - function($rootScope, $scope, $timeout, $log, $compile, lodash, profileService, go, gettext, confirmDialog, notification, bwsError) { + function($rootScope, $scope, $timeout, $log, $state, $compile, go, lodash, profileService, bwcService, bwsError) { var self = this; var fc = profileService.focusedClient; + var customWords = []; + var mnemonic = null; + self.xPrivKey = null; + self.step1 = true; + self.step2 = false; + self.step3 = false; + self.step4 = false; self.deleted = false; + self.credentialsEncrypted = false; + self.selectComplete = false; + self.backupNoOk = false; if (fc.credentials && !fc.credentials.mnemonicEncrypted && !fc.credentials.mnemonic) self.deleted = true; @@ -14,7 +24,52 @@ angular.module('copayApp.controllers').controller('backupController', self.credentialsEncrypted = true; passwordRequest(); } else - setWords(fc.getMnemonic()); + setWords(getMnemonic()); + + function getMnemonic() { + mnemonic = fc.getMnemonic(); + self.xPrivKey = fc.credentials.xPrivKey; + profileService.lockFC(); + return mnemonic; + } + + self.goToStep2 = function() { + self.step1 = false; + self.step2 = true; + self.step3 = false; + self.step4 = false; + $timeout(function() { + $scope.$apply(); + }, 1); + } + + self.goToStep3 = function() { + if (self.mnemonicHasPassphrase) { + self.step1 = false; + self.step2 = false; + self.step3 = true; + self.step4 = false; + } else { + self.step1 = false; + self.step2 = false; + self.step3 = false; + self.step4 = true; + } + + $timeout(function() { + $scope.$apply(); + }, 1); + } + + self.goToStep4 = function() { + self.step1 = false; + self.step2 = false; + self.step3 = false; + self.step4 = true; + $timeout(function() { + $scope.$apply(); + }, 1); + } function setWords(words) { if (words) { @@ -24,9 +79,20 @@ angular.module('copayApp.controllers').controller('backupController', } }; + self.toggle = function() { + self.error = ""; + + if (self.credentialsEncrypted) + passwordRequest(); + + $timeout(function() { + $scope.$apply(); + }, 1); + }; + function passwordRequest() { try { - setWords(fc.getMnemonic()); + setWords(getMnemonic()); } catch (e) { if (e.message && e.message.match(/encrypted/) && fc.isPrivKeyEncrypted()) { @@ -42,9 +108,94 @@ angular.module('copayApp.controllers').controller('backupController', } self.credentialsEncrypted = false; - setWords(fc.getMnemonic()); + setWords(getMnemonic()); + + $timeout(function() { + $scope.$apply(); + }, 1); }); } } } + + self.enableButton = function(word) { + document.getElementById(word).disabled = false; + lodash.remove(customWords, function(v) { + return v == word; + }); + } + + self.disableButton = function(word) { + document.getElementById(word).disabled = true; + customWords.push(word); + self.addButton(word); + } + + self.addButton = function(word) { + var btnhtml = ''; + var temp = $compile(btnhtml)($scope); + angular.element(document.getElementById('addWord')).append(temp); + self.shouldContinue(); + } + + self.removeButton = function(event) { + var id = (event.target.id); + var element = document.getElementById(id); + element.remove(); + self.enableButton(id.substring(1)); + self.shouldContinue(); + } + + self.shouldContinue = function() { + if (customWords.length == 12) + self.selectComplete = true; + else + self.selectComplete = false; + } + + self.confirm = function() { + self.backupNoOk = false; + + var walletClient = bwcService.getClient(); + + try { + var formatedCustomWords = ''; + + lodash.each(customWords, function(d) { + return formatedCustomWords += ' ' + d; + }); + + var passphrase = $scope.passphrase || ''; + + walletClient.seedFromMnemonic(formatedCustomWords.trim(), { + network: fc.credentials.network, + passphrase: passphrase, + account: fc.credentials.account + }) + + if (walletClient.credentials.xPrivKey != self.xPrivKey) + throw 'Private key mismatch'; + + } catch (err) { + $log.debug('Failed to verify backup: ', err); + self.backupNoOk = true; + $timeout(function() { + $scope.$apply(); + }, 1); + return; + } + + console.log('OK'); + + var words = lodash.map(mnemonic.split(' '), function(d) { + return d; + }); + + if (lodash.isEqual(words, customWords)) { + $rootScope.$emit('Local/BackupDone'); + go.walletHome(); + } + } }); diff --git a/src/js/controllers/backupConfirm.js b/src/js/controllers/backupConfirm.js deleted file mode 100644 index 609186249..000000000 --- a/src/js/controllers/backupConfirm.js +++ /dev/null @@ -1,22 +0,0 @@ -'use strict'; - -angular.module('copayApp.controllers').controller('backupConfirmController', - function($rootScope, $scope, $timeout, $log, $compile, lodash, profileService, go, gettext, confirmDialog, notification, bwsError) { - - var self = this; - var fc = profileService.focusedClient; - - setWords(fc.getMnemonic()); - - function setWords(words) { - if (words) { - self.mnemonicWords = words.split(/[\u3000\s]+/); - self.mnemonicHasPassphrase = fc.mnemonicHasPassphrase(); - self.useIdeograms = words.indexOf("\u3000") >= 0; - } - }; - - self.confirm = function() { - $rootScope.$emit('Local/BackupDone'); - } - }); diff --git a/src/js/controllers/backupPassphrase.js b/src/js/controllers/backupPassphrase.js deleted file mode 100644 index da4fda063..000000000 --- a/src/js/controllers/backupPassphrase.js +++ /dev/null @@ -1,56 +0,0 @@ -'use strict'; - -angular.module('copayApp.controllers').controller('backupPassphraseController', - function($rootScope, $scope, $timeout, $log, $compile, bwcService, lodash, profileService, go, gettext, confirmDialog, notification, bwsError) { - - var self = this; - var fc = profileService.focusedClient; - self.passphraseSuccess = false; - self.checkingPassphrase = false; - self.error = ""; - - setWords(fc.getMnemonic()); - var words = fc.getMnemonic(); - - self.changePassphrase = function() { - self.passphraseSuccess = false; - $timeout(function() { - $rootScope.$apply(); - }, 1); - } - - function setWords(words) { - if (words) { - self.mnemonicWords = words.split(/[\u3000\s]+/); - self.mnemonicHasPassphrase = fc.mnemonicHasPassphrase(); - self.useIdeograms = words.indexOf("\u3000") >= 0; - } - }; - - self.confirm = function() { - self.checkingPassphrase = true; - self.error = ""; - - var walletClient = bwcService.getClient(); - - walletClient.importFromMnemonic(words, { - network: 'livenet', - passphrase: $scope.passphrase, - account: 0, - }, function(err) { - self.checkingPassphrase = false; - if (err) { - self.error = err.message; - $timeout(function() { - $rootScope.$apply(); - }, 1); - return; - } - - self.passphraseSuccess = true; - $timeout(function() { - $rootScope.$apply(); - }, 1); - }); - } - }); diff --git a/src/js/controllers/backupWords.js b/src/js/controllers/backupWords.js deleted file mode 100644 index d9bef409e..000000000 --- a/src/js/controllers/backupWords.js +++ /dev/null @@ -1,57 +0,0 @@ -'use strict'; - -angular.module('copayApp.controllers').controller('backupWordsController', - function($rootScope, $scope, $timeout, $log, $compile, lodash, profileService, go, gettext, confirmDialog, notification, bwsError) { - - var self = this; - var fc = profileService.focusedClient; - var customSortWords = []; - self.sorted = false; - - setWords(fc.getMnemonic()); - - function setWords(words) { - if (words) { - self.mnemonicWords = words.split(/[\u3000\s]+/); - self.mnemonicHasPassphrase = fc.mnemonicHasPassphrase(); - self.useIdeograms = words.indexOf("\u3000") >= 0; - } - }; - - self.enableButton = function(word) { - document.getElementById(word).disabled = false; - lodash.remove(customSortWords, function(v) { - return v == word; - }); - } - - self.disableButton = function(word) { - document.getElementById(word).disabled = true; - customSortWords.push(word); - self.addButton(word); - } - - self.addButton = function(word) { - var btnhtml = ''; - var temp = $compile(btnhtml)($scope); - angular.element(document.getElementById('addWord')).append(temp); - self.shouldContinue(customSortWords); - } - - self.removeButton = function(event) { - var id = (event.target.id); - var element = document.getElementById(id); - element.remove(); - self.enableButton(id.substring(1)); - self.shouldContinue(customSortWords); - } - - self.shouldContinue = function(customSortWords) { - if (lodash.isEqual(self.mnemonicWords, customSortWords)) - self.sorted = true; - else - self.sorted = false; - } - }); diff --git a/src/js/routes.js b/src/js/routes.js index eaea05692..7b963db06 100644 --- a/src/js/routes.js +++ b/src/js/routes.js @@ -445,17 +445,6 @@ angular }, } }) - .state('backupConfirm', { - url: '/backupConfirm', - templateUrl: 'views/backupConfirm.html', - walletShouldBeComplete: true, - needProfile: true, - views: { - 'main': { - templateUrl: 'views/backupConfirm.html' - }, - } - }) .state('backupPassphrase', { url: '/backupPassphrase', templateUrl: 'views/backupPassphrase.html', @@ -467,6 +456,17 @@ angular }, } }) + .state('backupConfirm', { + url: '/backupConfirm', + templateUrl: 'views/backupConfirm.html', + walletShouldBeComplete: true, + needProfile: true, + views: { + 'main': { + templateUrl: 'views/backupConfirm.html' + }, + } + }) .state('preferencesGlobal', { url: '/preferencesGlobal', needProfile: true, From 3a5b426bae7c7429ea160f59a7413671b7d766f6 Mon Sep 17 00:00:00 2001 From: Javier Date: Fri, 20 Nov 2015 14:39:28 -0300 Subject: [PATCH 11/35] remove comments --- src/js/controllers/backup.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/js/controllers/backup.js b/src/js/controllers/backup.js index 200868834..764373902 100644 --- a/src/js/controllers/backup.js +++ b/src/js/controllers/backup.js @@ -187,8 +187,6 @@ angular.module('copayApp.controllers').controller('backupController', return; } - console.log('OK'); - var words = lodash.map(mnemonic.split(' '), function(d) { return d; }); From c6b8510308ec359ecd13a2263ef9f7aca8d728dd Mon Sep 17 00:00:00 2001 From: Javier Date: Fri, 20 Nov 2015 14:42:41 -0300 Subject: [PATCH 12/35] fix display error message --- src/js/controllers/backup.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/js/controllers/backup.js b/src/js/controllers/backup.js index 764373902..28160aded 100644 --- a/src/js/controllers/backup.js +++ b/src/js/controllers/backup.js @@ -1,7 +1,7 @@ 'use strict'; angular.module('copayApp.controllers').controller('backupController', - function($rootScope, $scope, $timeout, $log, $state, $compile, go, lodash, profileService, bwcService, bwsError) { + function($rootScope, $scope, $timeout, $log, $state, $compile, go, lodash, profileService, gettext, bwcService, bwsError) { var self = this; var fc = profileService.focusedClient; From 8a316b4290adb43c93e23c34ed24c6630798028c Mon Sep 17 00:00:00 2001 From: Javier Date: Fri, 20 Nov 2015 15:25:16 -0300 Subject: [PATCH 13/35] remove unused routes --- public/views/backup.html | 2 +- src/js/routes.js | 33 --------------------------------- 2 files changed, 1 insertion(+), 34 deletions(-) diff --git a/public/views/backup.html b/public/views/backup.html index d45c82790..65b1da6c1 100644 --- a/public/views/backup.html +++ b/public/views/backup.html @@ -1,7 +1,7 @@
+ ng-init="titleSection='Backup'; closeToHome = 'true'">
diff --git a/src/js/routes.js b/src/js/routes.js index 7b963db06..90d408c3d 100644 --- a/src/js/routes.js +++ b/src/js/routes.js @@ -434,39 +434,6 @@ angular }, } }) - .state('backupWords', { - url: '/backupWords', - templateUrl: 'views/backupWords.html', - walletShouldBeComplete: true, - needProfile: true, - views: { - 'main': { - templateUrl: 'views/backupWords.html' - }, - } - }) - .state('backupPassphrase', { - url: '/backupPassphrase', - templateUrl: 'views/backupPassphrase.html', - walletShouldBeComplete: true, - needProfile: true, - views: { - 'main': { - templateUrl: 'views/backupPassphrase.html' - }, - } - }) - .state('backupConfirm', { - url: '/backupConfirm', - templateUrl: 'views/backupConfirm.html', - walletShouldBeComplete: true, - needProfile: true, - views: { - 'main': { - templateUrl: 'views/backupConfirm.html' - }, - } - }) .state('preferencesGlobal', { url: '/preferencesGlobal', needProfile: true, From 7ceed35c2979de1c6f136f6e21678a4a0316b348 Mon Sep 17 00:00:00 2001 From: bechi Date: Fri, 20 Nov 2015 15:54:27 -0300 Subject: [PATCH 14/35] first step of ui --- public/views/backup.html | 197 +++++++++++++++++------------------ public/views/walletHome.html | 37 ++++--- src/css/main.css | 23 ++++ 3 files changed, 139 insertions(+), 118 deletions(-) diff --git a/public/views/backup.html b/public/views/backup.html index 65b1da6c1..17f802dae 100644 --- a/public/views/backup.html +++ b/public/views/backup.html @@ -4,7 +4,7 @@ ng-init="titleSection='Backup'; closeToHome = 'true'">
-
+

@@ -12,76 +12,67 @@
-
-
-
- - To restore this {{index.m}}-{{index.n}} shared wallet you will need - : -
    -
  1. Your wallet seed and access to the server that coordinated the initial wallet creation. You still need {{index.m}} keys to spend.
  2. -
  3. OR the wallet seed of all copayers in the wallet
  4. -
  5. OR 1 wallet export file and the remaining quorum of wallet seeds (e.g. in a 3-5 wallet: 1 wallet export file + 2 wallet seeds of any of the other copayers).
  6. -
- -
-
-
-
- - To restore this {{index.m}}-{{index.n}} shared wallet you will need - : -
    -
  1. Your wallet seed and access to the server that coordinated the initial wallet creation. You still need {{index.m}} keys to spend.
  2. -
  3. OR the wallet seeds of all copayers in the wallet
  4. -
- -
-
-
- -
-
- Wallet seed not available. You can still export it from Advanced > Export. -
-
- -
-
-
- - You need the wallet seed to restore this personal wallet. - - - Write it down and keep them somewhere safe. - -
-
- - -
-
- Your Wallet Seed -
-
- - + +
-
+
+
Write your wallet seed
+
+ + To restore this {{index.m}}-{{index.n}} shared wallet you will need + : +
    +
  1. Your wallet seed and access to the server that coordinated the initial wallet creation. You still need {{index.m}} keys to spend.
  2. +
  3. OR the wallet seed of all copayers in the wallet
  4. +
  5. OR 1 wallet export file and the remaining quorum of wallet seeds (e.g. in a 3-5 wallet: 1 wallet export file + 2 wallet seeds of any of the other copayers).
  6. +
+ +
+
+ + To restore this {{index.m}}-{{index.n}} shared wallet you will need + : +
    +
  1. Your wallet seed and access to the server that coordinated the initial wallet creation. You still need {{index.m}} keys to spend.
  2. +
  3. OR the wallet seeds of all copayers in the wallet
  4. +
+ +
+
+ +
+
+ Wallet seed not available. You can still export it from Advanced > Export. +
+
+ +
+

+ + You need the wallet seed to restore this personal wallet. + + + Write it down and keep them somewhere safe. + +

+ +
-
- {{word}}  +
+ {{word}} 
+
@@ -96,53 +87,53 @@
-
- -
-
-
-
+
+
+
Confirm your wallet seed
+

+ Please tap the words in order to confirm your backup phrase is correctly written. +

+
-
+
- +
-
-
- +
-
-
- Passphrase needed -
-
+
+
Enter your passphrase
+
@@ -150,17 +141,17 @@
- +
@@ -181,16 +172,20 @@
-
-
- Congratulations +
+
+
+
Congratulation
+

+ You backed up your new wallet. You can now restore this wallet at any time. +

- @@ -201,7 +196,7 @@
- You can safely install your wallet on another device and use it from multiple devices at the same time. + You can safely install your wallet on another device and use it from multiple devices at the same time. Learn more about Copay backups diff --git a/public/views/walletHome.html b/public/views/walletHome.html index 2e1004e61..77823d898 100644 --- a/public/views/walletHome.html +++ b/public/views/walletHome.html @@ -182,23 +182,18 @@ -->
-
-
-
- - - WARNING: Backup needed - -
-
- Before receiving funds, it is highly recommended you backup your wallet keys. -
- - +
+
+
+
Backup Needed
+

+ Before receiving funds, it is highly recommended you backup your wallet. If you lose this device, it is impossible to access your funds without a backup. +

+
@@ -473,6 +468,14 @@ Transactions Downloaded
+
+ Initial transaction history synchronization can take some minutes for wallets with many transactions.
+ Please stand by. +
+
+ {{index.txProgress}} + Transactions
Downloaded
+
@@ -514,7 +517,7 @@
{{btx.message}}
- {{index.addressbook[btx.addressTo] || btx.addressTo}} + To: {{index.addressbook[btx.addressTo] || btx.addressTo}}
diff --git a/src/css/main.css b/src/css/main.css index 274a9da1e..7ee058b8f 100644 --- a/src/css/main.css +++ b/src/css/main.css @@ -988,6 +988,29 @@ input.ng-invalid-match, input.ng-invalid-match:focus { padding: 1rem; } +.panel.words { + background: #E6EAEE; + border: 1px dashed #A5B2BF; + min-height: 170px; +} + +.backup .panel { + padding: 0.5rem; +} + +.backup button.words { + background: #FFFFFF; + box-shadow: 0px 0px 4px 0px rgba(0,0,0,0.30); + color: #4B6178; + text-transform: lowercase; + font-size: 0.8rem; + margin: 5px; +} + +.backup button[disabled] { + box-shadow: none; +} + .panel qrcode { background-color: white; } From 895e755df012457e7ff31f5d2d432fa30201909b Mon Sep 17 00:00:00 2001 From: Javier Date: Fri, 20 Nov 2015 16:04:11 -0300 Subject: [PATCH 15/35] set shuffled words --- src/js/controllers/backup.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/js/controllers/backup.js b/src/js/controllers/backup.js index 28160aded..3286eeef5 100644 --- a/src/js/controllers/backup.js +++ b/src/js/controllers/backup.js @@ -74,9 +74,12 @@ angular.module('copayApp.controllers').controller('backupController', function setWords(words) { if (words) { self.mnemonicWords = words.split(/[\u3000\s]+/); + self.shuffledMnemonicWords = lodash.shuffle(self.mnemonicWords); self.mnemonicHasPassphrase = fc.mnemonicHasPassphrase(); self.useIdeograms = words.indexOf("\u3000") >= 0; } + console.log(self.mnemonicWords); + console.log(self.shuffledMnemonicWords); }; self.toggle = function() { From bed85f027dd83b394054abf24cd9fb46bc1450d4 Mon Sep 17 00:00:00 2001 From: Javier Date: Fri, 20 Nov 2015 16:10:34 -0300 Subject: [PATCH 16/35] set shuffled words on view --- public/views/backup.html | 28 +++++++++++++++------------- src/js/controllers/backup.js | 2 -- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/public/views/backup.html b/public/views/backup.html index 17f802dae..89b92e82b 100644 --- a/public/views/backup.html +++ b/public/views/backup.html @@ -16,7 +16,6 @@ ## STEP 1 --> -
Write your wallet seed
@@ -100,20 +99,21 @@ +
-
Confirm your wallet seed
-

- Please tap the words in order to confirm your backup phrase is correctly written. -

-
-
-
-
- - - -
+
Confirm your wallet seed
+

+ Please tap the words in order to confirm your backup phrase is correctly written. +

+
+
+
+
+ + + +
@@ -130,6 +130,7 @@ +
Enter your passphrase
@@ -152,6 +153,7 @@ +
diff --git a/src/js/controllers/backup.js b/src/js/controllers/backup.js index 3286eeef5..5684eb8ae 100644 --- a/src/js/controllers/backup.js +++ b/src/js/controllers/backup.js @@ -78,8 +78,6 @@ angular.module('copayApp.controllers').controller('backupController', self.mnemonicHasPassphrase = fc.mnemonicHasPassphrase(); self.useIdeograms = words.indexOf("\u3000") >= 0; } - console.log(self.mnemonicWords); - console.log(self.shuffledMnemonicWords); }; self.toggle = function() { From f64b99938a7ffd24f4356acfe43382d008d14b63 Mon Sep 17 00:00:00 2001 From: bechi Date: Fri, 20 Nov 2015 17:30:38 -0300 Subject: [PATCH 17/35] details --- public/views/backup.html | 14 +++++++------- src/css/main.css | 16 ++++++++++++++++ src/js/controllers/backup.js | 3 +-- 3 files changed, 24 insertions(+), 9 deletions(-) diff --git a/public/views/backup.html b/public/views/backup.html index 89b92e82b..f18fd3c51 100644 --- a/public/views/backup.html +++ b/public/views/backup.html @@ -88,7 +88,7 @@
@@ -153,7 +153,7 @@ - +
@@ -187,7 +187,7 @@
diff --git a/src/css/main.css b/src/css/main.css index 7ee058b8f..1356d9c6a 100644 --- a/src/css/main.css +++ b/src/css/main.css @@ -367,6 +367,21 @@ ul.tx-copayers { margin: 0 auto; } +.receive .circle-icon { + padding: 0.2rem; + margin-bottom: 1rem; +} + +.backup .circle-icon { + background: #fff; + padding: 0.2rem; + margin-bottom: 1rem; +} + +.receive h5, .backup h5 { + font-weight: 500; +} + .date-message { background-color: #213140; border-radius: 3px; @@ -1005,6 +1020,7 @@ input.ng-invalid-match, input.ng-invalid-match:focus { text-transform: lowercase; font-size: 0.8rem; margin: 5px; + padding: 0.5rem; } .backup button[disabled] { diff --git a/src/js/controllers/backup.js b/src/js/controllers/backup.js index 5684eb8ae..f577e0bf2 100644 --- a/src/js/controllers/backup.js +++ b/src/js/controllers/backup.js @@ -133,8 +133,7 @@ angular.module('copayApp.controllers').controller('backupController', } self.addButton = function(word) { - var btnhtml = ''; var temp = $compile(btnhtml)($scope); angular.element(document.getElementById('addWord')).append(temp); From 32a1817ccb6041317e7dff7fa05e5fe4ee662ac7 Mon Sep 17 00:00:00 2001 From: Javier Date: Mon, 23 Nov 2015 12:58:04 -0300 Subject: [PATCH 18/35] fix confirm method --- public/views/backup.html | 32 ++++++++++++++------------------ src/js/controllers/backup.js | 17 +++++++++-------- 2 files changed, 23 insertions(+), 26 deletions(-) diff --git a/public/views/backup.html b/public/views/backup.html index f18fd3c51..0bc9cb7ec 100644 --- a/public/views/backup.html +++ b/public/views/backup.html @@ -155,32 +155,28 @@ -->
-
+ -
-
-
-
-
-
-
-
-
- Verifying... -
-
- -
+
Congratulation

- You backed up your new wallet. You can now restore this wallet at any time. + You backed up your new wallet. You can now restore this wallet at any time +

+
+
+
+ +
+
Backup failed
+

+ Failed to verify backup. Please try again

@@ -188,7 +184,7 @@
diff --git a/src/js/controllers/backup.js b/src/js/controllers/backup.js index f577e0bf2..be3ccc624 100644 --- a/src/js/controllers/backup.js +++ b/src/js/controllers/backup.js @@ -15,7 +15,7 @@ angular.module('copayApp.controllers').controller('backupController', self.deleted = false; self.credentialsEncrypted = false; self.selectComplete = false; - self.backupNoOk = false; + self.backupError = false; if (fc.credentials && !fc.credentials.mnemonicEncrypted && !fc.credentials.mnemonic) self.deleted = true; @@ -50,10 +50,7 @@ angular.module('copayApp.controllers').controller('backupController', self.step3 = true; self.step4 = false; } else { - self.step1 = false; - self.step2 = false; - self.step3 = false; - self.step4 = true; + self.goToStep4(); } $timeout(function() { @@ -62,10 +59,13 @@ angular.module('copayApp.controllers').controller('backupController', } self.goToStep4 = function() { + self.confirm(); + self.step1 = false; self.step2 = false; self.step3 = false; self.step4 = true; + $timeout(function() { $scope.$apply(); }, 1); @@ -156,7 +156,7 @@ angular.module('copayApp.controllers').controller('backupController', } self.confirm = function() { - self.backupNoOk = false; + self.backupError = false; var walletClient = bwcService.getClient(); @@ -180,10 +180,12 @@ angular.module('copayApp.controllers').controller('backupController', } catch (err) { $log.debug('Failed to verify backup: ', err); - self.backupNoOk = true; + self.backupError = true; + $timeout(function() { $scope.$apply(); }, 1); + return; } @@ -193,7 +195,6 @@ angular.module('copayApp.controllers').controller('backupController', if (lodash.isEqual(words, customWords)) { $rootScope.$emit('Local/BackupDone'); - go.walletHome(); } } }); From 9a806f3bab664901427e9687f9167d8117eeb957 Mon Sep 17 00:00:00 2001 From: Javier Date: Mon, 23 Nov 2015 17:53:42 -0300 Subject: [PATCH 19/35] fix navigation top control --- public/views/backup.html | 64 +++++++++++++++++++++++------------- src/js/controllers/backup.js | 40 +++++++++++++++++----- src/js/controllers/index.js | 7 +++- 3 files changed, 79 insertions(+), 32 deletions(-) diff --git a/public/views/backup.html b/public/views/backup.html index 0bc9cb7ec..86bc97838 100644 --- a/public/views/backup.html +++ b/public/views/backup.html @@ -1,16 +1,27 @@ -
-
+
+ + +
+
+ + {{wordsC.error}} + +
-
-
-
- You can safely install your wallet on another device and use it from multiple devices at the same time. - - Learn more about Copay backups - + +
+
+
+ You can safely install your wallet on another device and use it from multiple devices at the same time. + + Learn more about Copay backups + +
diff --git a/src/css/main.css b/src/css/main.css index e7ce2c3cf..b637c86dd 100644 --- a/src/css/main.css +++ b/src/css/main.css @@ -389,6 +389,22 @@ ul.tx-copayers { margin-bottom: 2rem; } +.backup .tab-bar { + background: #f1f3f5; + border-bottom: none; +} + +.backup .button-box { + background: #fff; + position: absolute; + bottom: 0; + left: 0; + width: 100%; + padding: 1rem; + z-index: 9999; + border-top: 1px solid #E0E6EA; +} + .date-message { background-color: #213140; border-radius: 3px; From 79c982dc79d45a0eae5e41987495545fcdee3950 Mon Sep 17 00:00:00 2001 From: bechi Date: Mon, 23 Nov 2015 18:11:58 -0300 Subject: [PATCH 22/35] fix icon --- public/views/backup.html | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/public/views/backup.html b/public/views/backup.html index b73e21251..42e727898 100644 --- a/public/views/backup.html +++ b/public/views/backup.html @@ -11,7 +11,9 @@
- X + + +
From 19aa16eaa3ce06a0863d71cd3c78170fec195a59 Mon Sep 17 00:00:00 2001 From: Javier Date: Tue, 24 Nov 2015 10:21:29 -0300 Subject: [PATCH 23/35] fix tab selection --- src/js/controllers/index.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/js/controllers/index.js b/src/js/controllers/index.js index 5ba636900..f9ce73712 100644 --- a/src/js/controllers/index.js +++ b/src/js/controllers/index.js @@ -1100,6 +1100,7 @@ angular.module('copayApp.controllers').controller('indexController', function($r $rootScope.$on('$stateChangeSuccess', function(ev, to, toParams, from, fromParams) { self.prevState = from.name || 'walletHome'; + self.tab = 'walletHome'; }); $rootScope.$on('Local/ClearHistory', function(event) { From 11e493ac39fdd76e900846406828a67e49208341 Mon Sep 17 00:00:00 2001 From: bechi Date: Tue, 24 Nov 2015 10:45:21 -0300 Subject: [PATCH 24/35] fix button box --- src/css/main.css | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/css/main.css b/src/css/main.css index b637c86dd..462704bfd 100644 --- a/src/css/main.css +++ b/src/css/main.css @@ -395,14 +395,12 @@ ul.tx-copayers { } .backup .button-box { - background: #fff; position: absolute; bottom: 0; left: 0; width: 100%; - padding: 1rem; + padding: 1.5rem 1rem; z-index: 9999; - border-top: 1px solid #E0E6EA; } .date-message { From 8f9c4194e6f31c587f0ce86e97a5ec1182b350ee Mon Sep 17 00:00:00 2001 From: Javier Date: Tue, 24 Nov 2015 10:53:23 -0300 Subject: [PATCH 25/35] fix try again button link --- public/views/backup.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/views/backup.html b/public/views/backup.html index 42e727898..d05ec0635 100644 --- a/public/views/backup.html +++ b/public/views/backup.html @@ -202,7 +202,7 @@
From b89e7a2ff3c92fae193aa5931f706a7e0ff3162e Mon Sep 17 00:00:00 2001 From: bechi Date: Tue, 24 Nov 2015 11:36:06 -0300 Subject: [PATCH 26/35] fix final page --- public/views/backup.html | 33 ++++++++++++++++++++++----------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/public/views/backup.html b/public/views/backup.html index d05ec0635..4f09322dc 100644 --- a/public/views/backup.html +++ b/public/views/backup.html @@ -187,6 +187,17 @@ ng-click="$root.go('walletHome');" translate>Finish + +
+
+
+ You can safely install your wallet on another device and use it from multiple devices at the same time. + + Learn more about Copay backups + +
+
+
@@ -201,20 +212,20 @@
-
-
- -
-
-
- You can safely install your wallet on another device and use it from multiple devices at the same time. - - Learn more about Copay backups - + +
+
+
+ You can safely install your wallet on another device and use it from multiple devices at the same time. + + Learn more about Copay backups + +
+
From e95f9b176e832c6b3ccccfef02cac47bf9d022bf Mon Sep 17 00:00:00 2001 From: Javier Date: Tue, 24 Nov 2015 12:12:02 -0300 Subject: [PATCH 27/35] fix button selection --- src/js/controllers/backup.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/js/controllers/backup.js b/src/js/controllers/backup.js index 1e9d490d0..6b530d9ac 100644 --- a/src/js/controllers/backup.js +++ b/src/js/controllers/backup.js @@ -9,6 +9,7 @@ angular.module('copayApp.controllers').controller('backupController', var mnemonic = null; function init() { + resetAllButtons(); customWords = []; mnemonic = null; self.xPrivKey = null; @@ -141,6 +142,14 @@ angular.module('copayApp.controllers').controller('backupController', } } + function resetAllButtons() { + var node = document.getElementById('addWord'); + node.innerHTML = ''; + lodash.each(self.mnemonicWords, function(d) { + document.getElementById(d).disabled = false; + }); + } + self.enableButton = function(word) { document.getElementById(word).disabled = false; lodash.remove(customWords, function(v) { From b090de4cd909d892a8e35d5a9f1d0aa458db9e7d Mon Sep 17 00:00:00 2001 From: bechi Date: Tue, 24 Nov 2015 12:29:40 -0300 Subject: [PATCH 28/35] fix passphrase style --- public/views/backup.html | 17 +++++++++-------- src/css/main.css | 8 ++++++++ 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/public/views/backup.html b/public/views/backup.html index 4f09322dc..45ffadda7 100644 --- a/public/views/backup.html +++ b/public/views/backup.html @@ -84,14 +84,12 @@
-
-
- +
+
- WARNING: This seed was created with a passphrase. To recover this wallet both the mnemonic and passphrase are needed. + This seed was created with a passphrase. To recover this wallet both the mnemonic and passphrase are needed. -
@@ -144,7 +142,10 @@
Enter your passphrase
-
+

+ In order to verify your wallet backup, please type your passphrase: +

+
@@ -190,7 +191,7 @@
-
+
You can safely install your wallet on another device and use it from multiple devices at the same time. Learn more about Copay backups @@ -219,7 +220,7 @@
-
+
You can safely install your wallet on another device and use it from multiple devices at the same time. Learn more about Copay backups diff --git a/src/css/main.css b/src/css/main.css index 462704bfd..59eac4d29 100644 --- a/src/css/main.css +++ b/src/css/main.css @@ -403,6 +403,14 @@ ul.tx-copayers { z-index: 9999; } +.backup input[type="text"] { + border-bottom: 1px solid #CAD4DB; +} + +.backup input[type="text"]:focus { + border-bottom: 1px solid #A5B2BF; +} + .date-message { background-color: #213140; border-radius: 3px; From 0096b3d35dc1c5ba58ea14e9bb3725d15bf789b6 Mon Sep 17 00:00:00 2001 From: Javier Date: Tue, 24 Nov 2015 12:44:44 -0300 Subject: [PATCH 29/35] reset passphrase --- src/js/controllers/backup.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/js/controllers/backup.js b/src/js/controllers/backup.js index 6b530d9ac..7dac57035 100644 --- a/src/js/controllers/backup.js +++ b/src/js/controllers/backup.js @@ -9,6 +9,7 @@ angular.module('copayApp.controllers').controller('backupController', var mnemonic = null; function init() { + $scope.passphrase = ''; resetAllButtons(); customWords = []; mnemonic = null; From 76b7411f95217a0f5c3cb399b3fbef5bde351ccc Mon Sep 17 00:00:00 2001 From: Javier Date: Wed, 25 Nov 2015 15:48:20 -0300 Subject: [PATCH 30/35] fix button appear if not words --- public/views/backup.html | 1 + 1 file changed, 1 insertion(+) diff --git a/public/views/backup.html b/public/views/backup.html index 45ffadda7..57dba0206 100644 --- a/public/views/backup.html +++ b/public/views/backup.html @@ -95,6 +95,7 @@
@@ -109,7 +109,7 @@ ## STEP 2 --> -
+
Confirm your wallet seed

@@ -130,7 +130,7 @@ ng-disabled="!wordsC.selectComplete" class="round expand m0" ng-style="{'background-color':index.backgroundColor}" - ng-click="wordsC.goToStep3();" + ng-click="wordsC.goToStep(3);" translate>Continue

@@ -140,7 +140,7 @@ ## STEP 3 --> -
+
Enter your passphrase

@@ -156,7 +156,7 @@ ng-disabled="!passphrase" ng-style="{'background-color':index.backgroundColor}" class="button round expand m0" - ng-click="wordsC.goToStep4();" + ng-click="wordsC.goToStep(4);" translate>Continue

@@ -166,13 +166,7 @@ ## STEP 4 --> -
- - +
@@ -215,7 +209,7 @@ diff --git a/src/js/controllers/backup.js b/src/js/controllers/backup.js index 169e85a30..4ade95ce5 100644 --- a/src/js/controllers/backup.js +++ b/src/js/controllers/backup.js @@ -14,10 +14,7 @@ angular.module('copayApp.controllers').controller('backupController', customWords = []; mnemonic = null; self.xPrivKey = null; - self.step1 = true; - self.step2 = false; - self.step3 = false; - self.step4 = false; + self.step = 1; self.deleted = false; self.credentialsEncrypted = false; self.selectComplete = false; @@ -42,59 +39,17 @@ angular.module('copayApp.controllers').controller('backupController', return mnemonic; } - self.goToStep = function() { - if (self.step2) { - self.goToStep1(); - } else if (self.step3) { - self.goToStep2(); + self.goToStep = function(n) { + self.step = n; + if (self.step == 1) + init(); + if (self.step == 3 && !self.mnemonicHasPassphrase) + self.step++; + if (self.step == 4) { + confirm(); } } - self.goToStep1 = function() { - init(); - $timeout(function() { - $scope.$apply(); - }, 1); - } - - self.goToStep2 = function() { - self.step1 = false; - self.step2 = true; - self.step3 = false; - self.step4 = false; - $timeout(function() { - $scope.$apply(); - }, 1); - } - - self.goToStep3 = function() { - if (self.mnemonicHasPassphrase) { - self.step1 = false; - self.step2 = false; - self.step3 = true; - self.step4 = false; - } else { - self.goToStep4(); - } - - $timeout(function() { - $scope.$apply(); - }, 1); - } - - self.goToStep4 = function() { - self.confirm(); - - self.step1 = false; - self.step2 = false; - self.step3 = false; - self.step4 = true; - - $timeout(function() { - $scope.$apply(); - }, 1); - } - function setWords(words) { if (words) { self.mnemonicWords = words.split(/[\u3000\s]+/); @@ -187,7 +142,7 @@ angular.module('copayApp.controllers').controller('backupController', self.selectComplete = false; } - self.confirm = function() { + function confirm() { self.backupError = false; var walletClient = bwcService.getClient(); From 9e73ca83fd71f0a9a779ccc8a66c3989c2667527 Mon Sep 17 00:00:00 2001 From: Javier Date: Mon, 30 Nov 2015 17:30:26 -0300 Subject: [PATCH 33/35] improve functions and variables --- public/views/backup.html | 5 +- src/js/controllers/backup.js | 120 +++++++++++++++++++---------------- 2 files changed, 68 insertions(+), 57 deletions(-) diff --git a/public/views/backup.html b/public/views/backup.html index 61051c585..621d20cb9 100644 --- a/public/views/backup.html +++ b/public/views/backup.html @@ -118,9 +118,10 @@
-
+
- + +
diff --git a/src/js/controllers/backup.js b/src/js/controllers/backup.js index 4ade95ce5..9a663f726 100644 --- a/src/js/controllers/backup.js +++ b/src/js/controllers/backup.js @@ -6,14 +6,11 @@ angular.module('copayApp.controllers').controller('backupController', var self = this; var fc = profileService.focusedClient; var customWords = []; - var mnemonic = null; function init() { $scope.passphrase = ''; resetAllButtons(); customWords = []; - mnemonic = null; - self.xPrivKey = null; self.step = 1; self.deleted = false; self.credentialsEncrypted = false; @@ -26,11 +23,13 @@ angular.module('copayApp.controllers').controller('backupController', if (fc.credentials && !fc.credentials.mnemonicEncrypted && !fc.credentials.mnemonic) self.deleted = true; - if (fc.isPrivKeyEncrypted()) { + if (fc.isPrivKeyEncrypted() && !self.deleted) { self.credentialsEncrypted = true; passwordRequest(); - } else - setWords(getMnemonic()); + } else { + if (!self.deleted) + initWords(); + } function getMnemonic() { mnemonic = fc.getMnemonic(); @@ -50,13 +49,21 @@ angular.module('copayApp.controllers').controller('backupController', } } - function setWords(words) { - if (words) { - self.mnemonicWords = words.split(/[\u3000\s]+/); - self.shuffledMnemonicWords = lodash.sortBy(self.mnemonicWords); - self.mnemonicHasPassphrase = fc.mnemonicHasPassphrase(); - self.useIdeograms = words.indexOf("\u3000") >= 0; - } + function initWords() { + var words = fc.getMnemonic(); + console.log('words: ', fc.getMnemonic()); + console.log('credentials: ', fc.credentials); + self.xPrivKey = fc.credentials.xPrivKey; + profileService.lockFC(); + + self.mnemonicWords = words.split(/[\u3000\s]+/); + self.shuffledMnemonicWords = lodash.sortBy(self.mnemonicWords);; + self.mnemonicHasPassphrase = fc.mnemonicHasPassphrase(); + self.useIdeograms = words.indexOf("\u3000") >= 0; + + console.log('self.mnemonicWords: ', self.mnemonicWords); + console.log('self.shuffledMnemonicWords: ', self.shuffledMnemonicWords); + console.log('self.mnemonicHasPassphrase: ', self.mnemonicHasPassphrase); }; self.toggle = function() { @@ -72,7 +79,7 @@ angular.module('copayApp.controllers').controller('backupController', function passwordRequest() { try { - setWords(getMnemonic()); + initWords(); } catch (e) { if (e.message && e.message.match(/encrypted/) && fc.isPrivKeyEncrypted()) { @@ -88,7 +95,7 @@ angular.module('copayApp.controllers').controller('backupController', } self.credentialsEncrypted = false; - setWords(getMnemonic()); + initWords(); $timeout(function() { $scope.$apply(); @@ -99,10 +106,10 @@ angular.module('copayApp.controllers').controller('backupController', } function resetAllButtons() { - var node = document.getElementById('addWord'); - node.innerHTML = ''; - lodash.each(self.mnemonicWords, function(d) { - document.getElementById(d).disabled = false; + document.getElementById('addWord').innerHTML = ''; + var nodes = document.getElementById("buttons").getElementsByTagName('button'); + lodash.each(nodes, function(n) { + document.getElementById(n.id).disabled = false; }); } @@ -113,15 +120,19 @@ angular.module('copayApp.controllers').controller('backupController', }); } - self.disableButton = function(word) { - document.getElementById(word).disabled = true; - customWords.push(word); - self.addButton(word); + self.disableButton = function(index, word) { + var element = { + index: index, + word: word + }; + document.getElementById(index + word).disabled = true; + customWords.push(element); + self.addButton(index, word); } - self.addButton = function(word) { - var btnhtml = ''; + self.addButton = function(index, word) { + var btnhtml = ''; var temp = $compile(btnhtml)($scope); angular.element(document.getElementById('addWord')).append(temp); self.shouldContinue(); @@ -129,9 +140,11 @@ angular.module('copayApp.controllers').controller('backupController', self.removeButton = function(event) { var id = (event.target.id); - var element = document.getElementById(id); - element.remove(); + document.getElementById(id).remove(); self.enableButton(id.substring(1)); + lodash.remove(customWords, function(d) { + return d.index == id.substring(1, 3); + }); self.shouldContinue(); } @@ -145,43 +158,40 @@ angular.module('copayApp.controllers').controller('backupController', function confirm() { self.backupError = false; + console.log('Original words: ', self.mnemonicWords); + var walletClient = bwcService.getClient(); + var separator = self.useIdeograms ? '\u3000' : ' '; + var customSentence = lodash.pluck(customWords, 'word').join(separator); + + var passphrase = $scope.passphrase || ''; + console.log('Custom: ', customSentence); try { - var formatedCustomWords = ''; - - lodash.each(customWords, function(d) { - return formatedCustomWords += ' ' + d; - }); - - var passphrase = $scope.passphrase || ''; - - walletClient.seedFromMnemonic(formatedCustomWords.trim(), { + walletClient.seedFromMnemonic(customSentence, { network: fc.credentials.network, passphrase: passphrase, account: fc.credentials.account }) - - if (walletClient.credentials.xPrivKey != self.xPrivKey) - throw 'Private key mismatch'; - } catch (err) { - $log.debug('Failed to verify backup: ', err); - self.backupError = true; - - $timeout(function() { - $scope.$apply(); - }, 1); - - return; + return backupError(err); } - var words = lodash.map(mnemonic.split(' '), function(d) { - return d; - }); - - if (lodash.isEqual(words, customWords)) { - $rootScope.$emit('Local/BackupDone'); + if (walletClient.credentials.xPrivKey != self.xPrivKey) { + console.log('wc privKey: ', walletClient.credentials.xPrivKey); + console.log('self.xPrivKey: ', self.xPrivKey); + return backupError('Private key mismatch'); } + + $rootScope.$emit('Local/BackupDone'); } + + function backupError(err) { + $log.debug('Failed to verify backup: ', err); + self.backupError = true; + + $timeout(function() { + $scope.$apply(); + }, 1); + }; }); From 0a2718eeaa37eab75027f8511eb791ffb5bc285a Mon Sep 17 00:00:00 2001 From: bechi Date: Mon, 30 Nov 2015 11:34:33 -0300 Subject: [PATCH 34/35] fix button on small device --- public/views/backup.html | 30 +++++++++++++----------------- src/css/main.css | 9 +++++++-- 2 files changed, 20 insertions(+), 19 deletions(-) diff --git a/public/views/backup.html b/public/views/backup.html index 621d20cb9..b6df0b9ec 100644 --- a/public/views/backup.html +++ b/public/views/backup.html @@ -84,7 +84,7 @@
-
+
@@ -110,7 +110,7 @@ -->
-
+
Confirm your wallet seed

Please tap the words in order to confirm your backup phrase is correctly written. @@ -118,7 +118,7 @@

-
+
@@ -200,30 +200,26 @@
-
-
Backup failed
+
Backup failed

Failed to verify backup. Please check your information

+
+
+ You can safely install your wallet on another device and use it from multiple devices at the same time. + + Learn more about Copay backups + +
+
- -
-
-
- You can safely install your wallet on another device and use it from multiple devices at the same time. - - Learn more about Copay backups - -
-
-
diff --git a/src/css/main.css b/src/css/main.css index 59eac4d29..9dd839587 100644 --- a/src/css/main.css +++ b/src/css/main.css @@ -395,11 +395,12 @@ ul.tx-copayers { } .backup .button-box { - position: absolute; + background: #F1F3F5; + position: fixed; bottom: 0; left: 0; width: 100%; - padding: 1.5rem 1rem; + padding: 0.5rem 1rem 1rem; z-index: 9999; } @@ -411,6 +412,10 @@ ul.tx-copayers { border-bottom: 1px solid #A5B2BF; } +.extra-padding-bottom { + padding-bottom: 78px; +} + .date-message { background-color: #213140; border-radius: 3px; From d12a24853a0cd1de7e3e1aa0101cf228dec79413 Mon Sep 17 00:00:00 2001 From: Javier Date: Mon, 30 Nov 2015 18:00:15 -0300 Subject: [PATCH 35/35] clean code --- public/views/backup.html | 2 +- src/js/controllers/backup.js | 20 -------------------- 2 files changed, 1 insertion(+), 21 deletions(-) diff --git a/public/views/backup.html b/public/views/backup.html index b6df0b9ec..33e4061c9 100644 --- a/public/views/backup.html +++ b/public/views/backup.html @@ -118,7 +118,7 @@
-
+
diff --git a/src/js/controllers/backup.js b/src/js/controllers/backup.js index 9a663f726..c6d1a7b5b 100644 --- a/src/js/controllers/backup.js +++ b/src/js/controllers/backup.js @@ -31,13 +31,6 @@ angular.module('copayApp.controllers').controller('backupController', initWords(); } - function getMnemonic() { - mnemonic = fc.getMnemonic(); - self.xPrivKey = fc.credentials.xPrivKey; - profileService.lockFC(); - return mnemonic; - } - self.goToStep = function(n) { self.step = n; if (self.step == 1) @@ -51,19 +44,12 @@ angular.module('copayApp.controllers').controller('backupController', function initWords() { var words = fc.getMnemonic(); - console.log('words: ', fc.getMnemonic()); - console.log('credentials: ', fc.credentials); self.xPrivKey = fc.credentials.xPrivKey; profileService.lockFC(); - self.mnemonicWords = words.split(/[\u3000\s]+/); self.shuffledMnemonicWords = lodash.sortBy(self.mnemonicWords);; self.mnemonicHasPassphrase = fc.mnemonicHasPassphrase(); self.useIdeograms = words.indexOf("\u3000") >= 0; - - console.log('self.mnemonicWords: ', self.mnemonicWords); - console.log('self.shuffledMnemonicWords: ', self.shuffledMnemonicWords); - console.log('self.mnemonicHasPassphrase: ', self.mnemonicHasPassphrase); }; self.toggle = function() { @@ -158,14 +144,10 @@ angular.module('copayApp.controllers').controller('backupController', function confirm() { self.backupError = false; - console.log('Original words: ', self.mnemonicWords); - var walletClient = bwcService.getClient(); var separator = self.useIdeograms ? '\u3000' : ' '; var customSentence = lodash.pluck(customWords, 'word').join(separator); - var passphrase = $scope.passphrase || ''; - console.log('Custom: ', customSentence); try { walletClient.seedFromMnemonic(customSentence, { @@ -178,8 +160,6 @@ angular.module('copayApp.controllers').controller('backupController', } if (walletClient.credentials.xPrivKey != self.xPrivKey) { - console.log('wc privKey: ', walletClient.credentials.xPrivKey); - console.log('self.xPrivKey: ', self.xPrivKey); return backupError('Private key mismatch'); }