diff --git a/public/views/create.html b/public/views/create.html index 6f26bf575..fb5ef4b47 100644 --- a/public/views/create.html +++ b/public/views/create.html @@ -103,12 +103,12 @@
-
-
+
@@ -17,7 +17,7 @@ Importing wallet...
-
+
@@ -26,26 +26,14 @@
- Connecting to Ledger Wallet... + Connecting to {{import.hwWallet}} Wallet...
- -
+
Ledger + ng-class="{'selected': type=='hwWallet'}" + ng-click="import.setType('hwWallet')" translate>Hardware Wallet
-
- -
- -
@@ -166,14 +149,15 @@
-
+
- -
- - {{import.error|translate}} - -
+
+ + {{import.error|translate}} + +
+ +
+
+ + +
+
+ +
diff --git a/public/views/join.html b/public/views/join.html index ec9be8f5c..cc3999a04 100644 --- a/public/views/join.html +++ b/public/views/join.html @@ -6,7 +6,7 @@
-
+
@@ -19,7 +19,7 @@
-
+
@@ -28,7 +28,7 @@
- Connecting to Ledger Wallet... + Connecting to {{join.hwWallet}} Wallet...
@@ -76,12 +76,17 @@
-
- -
+
+ + + + -
- -
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;