diff --git a/public/views/backup.html b/public/views/backup.html
index c1394ddc9..64c5e730b 100644
--- a/public/views/backup.html
+++ b/public/views/backup.html
@@ -47,8 +47,8 @@
-
- The wallet seed not available on this device. You can still export the wallet to backup it.
+
+ Wallet seed not available. You can still export it from Advanced > Export .
diff --git a/src/js/controllers/create.js b/src/js/controllers/create.js
index f14e30591..11aff3e46 100644
--- a/src/js/controllers/create.js
+++ b/src/js/controllers/create.js
@@ -6,7 +6,7 @@ angular.module('copayApp.controllers').controller('createController',
var self = this;
var defaults = configService.getDefaults();
this.isWindowsPhoneApp = isMobile.Windows() && isCordova;
-
+
/* For compressed keys, m*73 + n*34 <= 496 */
var COPAYER_PAIR_LIMITS = {
1: 1,
@@ -35,7 +35,7 @@ angular.module('copayApp.controllers').controller('createController',
$scope.requiredCopayers = Math.min(parseInt(n / 2 + 1), maxReq);
};
- this.externalIndexValues = lodash.range(0,ledger.MAX_SLOT);
+ this.externalIndexValues = lodash.range(0, ledger.MAX_SLOT);
$scope.externalIndex = 0;
this.TCValues = lodash.range(2, defaults.limits.totalCopayers + 1);
$scope.totalCopayers = defaults.wallet.totalCopayers;
@@ -61,18 +61,23 @@ angular.module('copayApp.controllers').controller('createController',
networkName: form.isTestnet.$modelValue ? 'testnet' : 'livenet',
};
var setSeed = form.setSeed.$modelValue;
- if (setSeed) {
- opts.mnemonic = form.privateKey.$modelValue;
+ if (setSeed) {
+ var words = form.privateKey.$modelValue;
+ if (words.indexOf(' ') == -1 && words.indexOf('prv') == 1 && words.length > 108) {
+ opts.extendedPrivateKey = words;
+ } else {
+ opts.mnemonic = words;
+ }
opts.passphrase = form.passphrase.$modelValue;
} else {
opts.passphrase = form.createPassphrase.$modelValue;
}
- if (setSeed && !opts.mnemonic) {
+ if (setSeed && !opts.mnemonic && !opts.extendedPrivateKey) {
this.error = gettext('Please enter the wallet seed');
return;
}
-
+
if (form.hwLedger.$modelValue) {
self.ledger = true;
ledger.getInfoForNewWallet($scope.externalIndex, function(err, lopts) {
@@ -90,7 +95,7 @@ angular.module('copayApp.controllers').controller('createController',
}
};
- this._create = function (opts) {
+ this._create = function(opts) {
self.loading = true;
$timeout(function() {
profileService.createWallet(opts, function(err, secret, walletId) {
@@ -104,9 +109,8 @@ angular.module('copayApp.controllers').controller('createController',
$timeout(function() {
$rootScope.$apply();
});
- }
- else {
- if ( ( opts.mnemonic && opts.n==1) || opts.externalSource ) {
+ } else {
+ if (opts.n == 1 && (opts.mnemonic || opts.externalSource || opts.extendedPrivateKey)) {
$rootScope.$emit('Local/WalletImported', walletId);
} else {
go.walletHome();
@@ -115,18 +119,16 @@ angular.module('copayApp.controllers').controller('createController',
});
}, 100);
}
-
+
this.formFocus = function(what) {
if (!this.isWindowsPhoneApp) return
if (what && what == 'my-name') {
this.hideWalletName = true;
this.hideTabs = true;
- }
- else if (what && what == 'wallet-name'){
+ } else if (what && what == 'wallet-name') {
this.hideTabs = true;
- }
- else {
+ } else {
this.hideWalletName = false;
this.hideTabs = false;
}
diff --git a/src/js/controllers/import.js b/src/js/controllers/import.js
index 8ffeff5c6..94e0c67af 100644
--- a/src/js/controllers/import.js
+++ b/src/js/controllers/import.js
@@ -63,11 +63,32 @@ angular.module('copayApp.controllers').controller('importController',
};
+ var _importExtendedPrivateKey = function(xPrivKey) {
+ self.loading = true;
+
+ $timeout(function() {
+ profileService.importExtendedPrivateKey(xPrivKey, 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);
+ };
+
+
+
var _importMnemonic = function(words, opts) {
self.loading = true;
$timeout(function() {
- profileService.importWalletMnemonic(words, opts, function(err, walletId) {
+ profileService.importMnemonic(words, opts, function(err, walletId) {
self.loading = false;
if (err) {
self.error = err;
@@ -140,7 +161,11 @@ angular.module('copayApp.controllers').controller('importController',
if (!words) {
this.error = gettext('Please enter the seed words');
+ } else if (words.indexOf(' ') == -1 && words.indexOf('prv') == 1 && words.length > 108) {
+ return _importExtendedPrivateKey(words)
} else {
+
+ console.log('[import.js.167]', words.indexOf(' '), words.indexOf('prv')); //TODO
var wordList = words.split(/ /).filter(function(v) {
return v.length > 0;
});
diff --git a/src/js/controllers/index.js b/src/js/controllers/index.js
index 661d30e8a..536806f51 100644
--- a/src/js/controllers/index.js
+++ b/src/js/controllers/index.js
@@ -660,7 +660,7 @@ angular.module('copayApp.controllers').controller('indexController', function($r
skip = skip || 0;
fc.getTxHistory({
skip: skip,
- limit: step,
+ limit: step,
}, function(err, txs) {
if (err) return cb(err);
if (txs && txs.length > 0) {
@@ -737,7 +737,7 @@ angular.module('copayApp.controllers').controller('indexController', function($r
});
};
- self.showErrorPopup = function (msg, cb) {
+ self.showErrorPopup = function(msg, cb) {
$log.warn('Showing err popup:' + msg);
self.showAlert = {
msg: msg,
@@ -1015,7 +1015,9 @@ angular.module('copayApp.controllers').controller('indexController', function($r
self.needsBackup = false;
storageService.setBackupFlag(walletId, function() {
addressService.expireAddress(walletId, function(err) {
- self.startScan(walletId);
+ $timeout(function() {
+ self.startScan(walletId);
+ }, 500);
});
});
});
@@ -1108,7 +1110,7 @@ angular.module('copayApp.controllers').controller('indexController', function($r
});
$rootScope.$on('Local/ShowAlert', function(event, msg, cb) {
- self.showErrorPopup(msg,cb);
+ self.showErrorPopup(msg, cb);
});
$rootScope.$on('Local/NeedsPassword', function(event, isSetup, cb) {
diff --git a/src/js/controllers/join.js b/src/js/controllers/join.js
index 9e875270b..3f7c0ecce 100644
--- a/src/js/controllers/join.js
+++ b/src/js/controllers/join.js
@@ -158,13 +158,18 @@ angular.module('copayApp.controllers').controller('joinController',
var setSeed = form.setSeed.$modelValue;
if (setSeed) {
- opts.mnemonic = form.privateKey.$modelValue;
+ var words = form.privateKey.$modelValue;
+ if (words.indexOf(' ') == -1 && words.indexOf('prv') == 1 && words.length > 108) {
+ opts.extendedPrivateKey = words;
+ } else {
+ opts.mnemonic = words;
+ }
opts.passphrase = form.passphrase.$modelValue;
} else {
opts.passphrase = form.createPassphrase.$modelValue;
}
- if (setSeed && !opts.mnemonic) {
+ if (setSeed && !opts.mnemonic && !opts.extendedPrivateKey) {
this.error = gettext('Please enter the wallet seed');
return;
}
@@ -197,7 +202,7 @@ angular.module('copayApp.controllers').controller('joinController',
}
$timeout(function() {
var fc = profileService.focusedClient;
- if ( ( opts.mnemonic || opts.externalSource ) && fc.isComplete()) {
+ if ( fc.isComplete() && (opts.mnemonic || opts.externalSource || opts.extendedPrivateKey)) {
$rootScope.$emit('Local/WalletImported', fc.credentials.walletId);
} else {
go.walletHome();
diff --git a/src/js/services/profileService.js b/src/js/services/profileService.js
index 371af925b..3184414cd 100644
--- a/src/js/services/profileService.js
+++ b/src/js/services/profileService.js
@@ -177,6 +177,13 @@ angular.module('copayApp.services')
$log.info(ex);
return cb(gettext('Could not create: Invalid wallet seed'));
}
+ } else if (opts.extendedPrivateKey) {
+ try {
+ walletClient.seedFromExtendedPrivateKey(opts.extendedPrivateKey);
+ } catch (ex) {
+ $log.warn(ex);
+ return cb(gettext('Could not create using the specified extended private key'));
+ }
} else if (opts.extendedPublicKey) {
try {
walletClient.seedFromExtendedPublicKey(opts.extendedPublicKey, opts.externalSource, opts.externalIndex, opts.entropySource);
@@ -344,7 +351,21 @@ angular.module('copayApp.services')
root._addWalletClient(walletClient, cb);
};
- root.importWalletMnemonic = function(words, opts, cb) {
+ root.importExtendedPrivateKey = function(xPrivKey, cb) {
+ var walletClient = bwcService.getClient();
+ $log.debug('Importing Wallet xPrivKey');
+
+ walletClient.importFromExtendedPrivateKey(xPrivKey, function(err) {
+ if (err)
+ return bwsError.cb(err, gettext('Could not import'), cb);
+
+ root._addWalletClient(walletClient, cb);
+ });
+ };
+
+
+
+ root.importMnemonic = function(words, opts, cb) {
var walletClient = bwcService.getClient();
$log.debug('Importing Wallet Mnemonic');