-
-
- Use Ledger hardware wallet
-
-
-
+
+
+ Use Ledger hardware wallet
+
+
+
+
+ Use TREZOR hardware wallet
+
+
+
-
diff --git a/src/js/controllers/create.js b/src/js/controllers/create.js
index b747b5f85..a7c5492d1 100644
--- a/src/js/controllers/create.js
+++ b/src/js/controllers/create.js
@@ -1,7 +1,7 @@
'use strict';
angular.module('copayApp.controllers').controller('createController',
- function($scope, $rootScope, $location, $timeout, $log, lodash, go, profileService, configService, isMobile, isCordova, gettext, isChromeApp, ledger, trezor) {
+ function($scope, $rootScope, $location, $timeout, $log, lodash, go, profileService, configService, isCordova, gettext, ledger, trezor, isMobile) {
var self = this;
var defaults = configService.getDefaults();
@@ -42,10 +42,6 @@ angular.module('copayApp.controllers').controller('createController',
updateRCSelect(tc);
};
- this.isChromeApp = function() {
- return isChromeApp;
- };
-
this.create = function(form) {
if (form && form.$invalid) {
this.error = gettext('Please enter the required fields');
diff --git a/src/js/controllers/import.js b/src/js/controllers/import.js
index 1965f5ce3..31242e8d4 100644
--- a/src/js/controllers/import.js
+++ b/src/js/controllers/import.js
@@ -1,12 +1,11 @@
'use strict';
angular.module('copayApp.controllers').controller('importController',
- function($scope, $rootScope, $location, $timeout, $log, profileService, notification, go, isMobile, isCordova, sjcl, gettext, lodash, ledger) {
+ function($scope, $rootScope, $location, $timeout, $log, profileService, notification, go, isMobile, sjcl, gettext, lodash, ledger, trezor) {
var self = this;
this.isSafari = isMobile.Safari();
- this.isCordova = isCordova;
var reader = new FileReader();
window.ignoreMobilePause = true;
@@ -182,6 +181,44 @@ angular.module('copayApp.controllers').controller('importController',
_importMnemonic(words, opts);
};
+ this.importTrezor = function(form) {
+ var self = this;
+ if (form.$invalid) {
+ this.error = gettext('There is an error in the form');
+ $timeout(function() {
+ $scope.$apply();
+ });
+ return;
+ }
+ self.hwWallet = 'Trezor';
+ // TODO account
+ trezor.getInfoForNewWallet(0, function(err, lopts) {
+ self.hwWallet = false;
+ if (err) {
+ self.error = err;
+ $scope.$apply();
+ return;
+ }
+ lopts.externalSource = 'trezor';
+ 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);
+ };
+
+
+
this.importLedger = function(form) {
var self = this;
if (form.$invalid) {
@@ -191,16 +228,15 @@ angular.module('copayApp.controllers').controller('importController',
});
return;
}
- self.ledger = true;
+ self.hwWallet = 'Ledger';
// TODO account
ledger.getInfoForNewWallet(0, function(err, lopts) {
- self.ledger = false;
+ self.hwWallet = false;
if (err) {
self.error = err;
$scope.$apply();
return;
}
- lopts.externalIndex = $scope.externalIndex;
lopts.externalSource = 'ledger';
self.loading = true;
$log.debug('Import opts', lopts);
diff --git a/src/js/controllers/join.js b/src/js/controllers/join.js
index c3f852371..45e0c6cb2 100644
--- a/src/js/controllers/join.js
+++ b/src/js/controllers/join.js
@@ -1,14 +1,10 @@
'use strict';
angular.module('copayApp.controllers').controller('joinController',
- function($scope, $rootScope, $timeout, go, isMobile, notification, profileService, isCordova, isChromeApp, $modal, gettext, lodash, ledger) {
+ function($scope, $rootScope, $timeout, go, notification, profileService, isCordova, $modal, gettext, lodash, ledger, trezor) {
var self = this;
- this.isChromeApp = function() {
- return isChromeApp;
- };
-
this.onQrCodeScanned = function(data) {
$scope.secret = data;
$scope.joinForm.secret.$setViewValue(data);
@@ -45,11 +41,13 @@ angular.module('copayApp.controllers').controller('joinController',
return;
}
- if (form.hwLedger.$modelValue) {
- self.ledger = true;
- // TODO account / network
- ledger.getInfoForNewWallet(0, opts.networkName, function(err, lopts) {
- self.ledger = false;
+ if (form.hwLedger.$modelValue || form.hwTrezor.$modelValue) {
+ self.hwWallet = form.hwLedger.$modelValue ? 'Leger' : 'TREZOR';
+ var src= form.hwLedger.$modelValue ? leger : trezor;
+
+ var account = 0;
+ src.getInfoForNewWallet(account, function(err, lopts) {
+ self.hwWallet = false;
if (err) {
self.error = err;
$scope.$apply();
diff --git a/src/js/services/bwsError.js b/src/js/services/bwsError.js
index a4fde659d..896914145 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('Wallet already registered');
+ body = gettextCatalog.getString('Key already associated with an existing wallet');
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 dbb677d84..907483da2 100644
--- a/src/js/services/profileService.js
+++ b/src/js/services/profileService.js
@@ -268,6 +268,7 @@ console.log('[profileService.js.239:walletClient:]',walletClient); //TODO
return cb(gettext('Cannot join the same wallet more that once'));
}
} catch (ex) {
+ $log.debug(ex);
return cb(gettext('Bad wallet invitation'));
}
opts.networkName = walletData.network;
@@ -568,7 +569,11 @@ console.log('[profileService.js.239:walletClient:]',walletClient); //TODO
var fc = root.focusedClient;
$log.info('Requesting Trezor to sign the transaction');
- trezor.signTx(txp, 0, function(result) {
+console.log('[profileService.js.570] xPub:', fc.credentials.xPubKey); //TODO
+ var xPubKeys = lodash.pluck(fc.credentials.publicKeyRing,'xPubKey');
+console.log('[profileService.js.571:xPubKeys:]',xPubKeys); //TODO
+
+ trezor.signTx(xPubKeys, txp, 0, function(result) {
$log.debug('Trezor response',result);
if (!result.success)
return cb(result.error || result);
diff --git a/src/js/services/trezor.js b/src/js/services/trezor.js
index 385428042..54b9df534 100644
--- a/src/js/services/trezor.js
+++ b/src/js/services/trezor.js
@@ -58,8 +58,8 @@ angular.module('copayApp.services')
};
- root.signTx = function(txp, account, callback) {
- console.log('[trezor.js.66:txp:]', txp); //TODO
+ root.signTx = function(xPubKeys, txp, account, callback) {
+ console.log('[trezor.js.66:txp:]', xPubKeys, txp); //TODO
var inputs = [],
outputs = [];
@@ -109,7 +109,65 @@ angular.module('copayApp.services')
}
} else {
- $log.error('TODO: multisig');
+
+ // P2SH Wallet
+ var inAmount = 0;
+
+ var sigs = xPubKeys.map(function(v) {
+ return '';
+ });
+
+
+ inputs = lodash.map(txp.inputs, function(i) {
+ var pathArr = i.path.split('/');
+ var n = [44 | 0x80000000, 0 | 0x80000000, account | 0x80000000, parseInt(pathArr[1]), parseInt(pathArr[2])];
+// var np = [parseInt(pathArr[1]), parseInt(pathArr[2])];
+ inAmount += i.satoshis;
+
+ var pubkeys = lodash(xPubKeys.map(function(v) {
+ return {
+ node: v,
+ address_n: n,
+ };
+ })).reverse().value();
+console.log('[trezor.js.121:pubkeys:]',pubkeys); //TODO
+
+ return {
+ address_n: n,
+ prev_index: i.vout,
+ prev_hash: i.txid,
+ script_type: 'SPENDMULTISIG',
+ multisig: {
+ pubkeys: pubkeys,
+ signatures: sigs,
+ m: txp.requiredSignatures,
+ }
+ };
+ });
+
+ var change = inAmount - txp.fee - txp.amount;
+ if (change > 0) {
+ var pathArr = txp.changeAddress.path.split('/');
+ var n = [44 | 0x80000000, 0 | 0x80000000, account | 0x80000000, parseInt(pathArr[1]), parseInt(pathArr[2])];
+
+ var pubkeys = lodash(xPubKeys.map(function(v) {
+ return {
+ node: v,
+ address_n: n,
+ };
+ })).reverse().value();
+
+ tmpOutputs.push({
+ address_n: n,
+ amount: change,
+ script_type: 'PAYTOMULTISIG',
+ multisig: {
+ pubkeys: pubkeys,
+ signatures: sigs,
+ m: txp.requiredSignatures,
+ }
+ });
+ }
}
// Shuffle outputs for improved privacy
@@ -118,7 +176,7 @@ angular.module('copayApp.services')
outputs[order] = tmpOutputs.shift();
});
- if (tmpOutputs.length)
+ if (tmpOutputs.length)
return cb("Error creating transaction: tmpOutput order");
} else {
outputs = tmpOutputs;