diff --git a/app-template/bitpay/appConfig.json b/app-template/bitpay/appConfig.json
index ec47bfdcc..1e1b40255 100644
--- a/app-template/bitpay/appConfig.json
+++ b/app-template/bitpay/appConfig.json
@@ -22,8 +22,8 @@
"windowsAppId": "2d1002d7-ee34-4f60-bd29-0c871ba0c195",
"pushSenderId": "1036948132229",
"description": "Secure Bitcoin Wallet",
- "version": "3.4.0",
- "androidVersion": "340001",
+ "version": "3.5.0",
+ "androidVersion": "350000",
"_extraCSS": null,
"_enabledExtensions": {
"coinbase": true,
diff --git a/app-template/config-template.xml b/app-template/config-template.xml
index b8bbf823e..210eab38d 100644
--- a/app-template/config-template.xml
+++ b/app-template/config-template.xml
@@ -33,6 +33,9 @@
+
+
+
diff --git a/app-template/copay/appConfig.json b/app-template/copay/appConfig.json
index cde53fefa..deab492ac 100644
--- a/app-template/copay/appConfig.json
+++ b/app-template/copay/appConfig.json
@@ -22,8 +22,8 @@
"windowsAppId": "804636ee-b017-4cad-8719-e58ac97ffa5c",
"pushSenderId": "1036948132229",
"description": "A Secure Bitcoin Wallet",
- "version": "3.4.0",
- "androidVersion": "340001",
+ "version": "3.5.0",
+ "androidVersion": "350000",
"_extraCSS": null,
"_enabledExtensions": {
"coinbase": true,
diff --git a/app-template/package-template.json b/app-template/package-template.json
index a7a28f7c7..41bd595e2 100644
--- a/app-template/package-template.json
+++ b/app-template/package-template.json
@@ -56,7 +56,7 @@
"bezier-easing": "^2.0.3",
"bhttp": "^1.2.1",
"bitauth": "^0.2.1",
- "bitcore-wallet-client": "5.2.1",
+ "bitcore-wallet-client": "5.3.0",
"bower": "^1.7.9",
"cordova-android": "5.1.1",
"cordova-custom-config": "^3.0.5",
@@ -107,7 +107,7 @@
"run:android": "cordova run android --device",
"run:android-release": "cordova run android --device --release",
"log:android": "adb logcat | grep chromium",
- "sign:android": "rm -f platforms/android/build/outputs/apk/android-release-signed-aligned.apk; jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore ../copay.keystore -signedjar platforms/android/build/outputs/apk/android-release-signed.apk platforms/android/build/outputs/apk/android-release-unsigned.apk copay_play && ../android-sdk-macosx/build-tools/21.1.1/zipalign -v 4 platforms/android/build/outputs/apk/android-release-signed.apk platforms/android/build/outputs/apk/android-release-signed-aligned.apk",
+ "sign:android": "rm -f platforms/android/build/outputs/apk/android-release-signed-aligned.apk; jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore ../copay.keystore -signedjar platforms/android/build/outputs/apk/android-release-signed.apk platforms/android/build/outputs/apk/android-release-unsigned.apk copay_play && ../android-sdk-macosx/build-tools/25.0.3/zipalign -v 4 platforms/android/build/outputs/apk/android-release-signed.apk platforms/android/build/outputs/apk/android-release-signed-aligned.apk",
"apply:copay": "npm i fs-extra && cd app-template && node apply.js copay && npm i && cordova prepare",
"apply:bitpay": "npm i fs-extra && cd app-template && node apply.js bitpay && npm i && cordova prepare",
"apply:bitcoincom": "npm i fs-extra && cd app-template && node apply.js bitcoincom && npm i && cordova prepare",
diff --git a/src/js/controllers/import.js b/src/js/controllers/import.js
index c5657d5cf..65f3732e5 100644
--- a/src/js/controllers/import.js
+++ b/src/js/controllers/import.js
@@ -1,7 +1,7 @@
'use strict';
angular.module('copayApp.controllers').controller('importController',
- function($scope, $timeout, $log, $state, $stateParams, $ionicHistory, $ionicScrollDelegate, profileService, configService, sjcl, ledger, trezor, derivationPathHelper, platformInfo, bwcService, ongoingProcess, walletService, popupService, gettextCatalog, appConfigService) {
+ function($scope, $timeout, $log, $state, $stateParams, $ionicHistory, $ionicScrollDelegate, profileService, configService, sjcl, ledger, trezor, derivationPathHelper, platformInfo, bwcService, ongoingProcess, walletService, popupService, gettextCatalog, appConfigService, hwWallet) {
var reader = new FileReader();
var defaults = configService.getDefaults();
@@ -17,6 +17,7 @@ angular.module('copayApp.controllers').controller('importController',
$scope.formData.account = 1;
$scope.importErr = false;
$scope.isCopay = appConfigService.name == 'copay';
+ $scope.fromHardwareWallet = { value: false };
if ($stateParams.code)
$scope.processWalletInfo($stateParams.code);
@@ -38,6 +39,21 @@ angular.module('copayApp.controllers').controller('importController',
$scope.formData.seedSource = $scope.seedOptions[0];
}
+
+ $scope.seedOptionsAll = [];
+
+ $scope.seedOptionsAll.push({
+ id: walletService.externalSource.ledger.id,
+ label: walletService.externalSource.ledger.longName,
+ });
+
+ $scope.seedOptionsAll.push({
+ id: walletService.externalSource.trezor.id,
+ label: walletService.externalSource.trezor.longName,
+ });
+ $scope.formData.seedSourceAll = $scope.seedOptionsAll[0];
+
+
$timeout(function() {
$scope.$apply();
});
@@ -159,6 +175,7 @@ angular.module('copayApp.controllers').controller('importController',
$timeout(function() {
profileService.importMnemonic(words, opts, function(err, client) {
+
ongoingProcess.set('importingWallet', false);
if (err) {
@@ -177,7 +194,7 @@ angular.module('copayApp.controllers').controller('importController',
};
$scope.setDerivationPath = function() {
- $scope.formData.derivationPath = $scope.formData.testnetEnabled ? derivationPathHelper.defaultTestnet : derivationPathHelper.default;
+ $scope.formData.testnetEnabled ? derivationPathHelper.defaultTestnet : derivationPathHelper.default;
};
$scope.getFile = function() {
@@ -256,6 +273,17 @@ angular.module('copayApp.controllers').controller('importController',
}
opts.passphrase = $scope.formData.passphrase || null;
+
+ if ($scope.fromHardwareWallet.value) {
+ $log.debug('Importing seed from hardware wallet');
+ $log.warn('This wont work for Intel TEE wallets');
+
+ var id = $scope.formData.seedSourceAll.id;
+ var isMultisig = opts.derivationStrategy =='BIP48';
+ var account = opts.account;
+ opts.entropySourcePath = 'm/' + hwWallet.getEntropyPath(id, isMultisig, account);
+ }
+
_importMnemonic(words, opts);
};
@@ -269,6 +297,7 @@ angular.module('copayApp.controllers').controller('importController',
lopts.externalSource = walletService.externalSource.trezor.id;
lopts.bwsurl = $scope.formData.bwsurl;
+ lopts.account = account;
ongoingProcess.set('importingWallet', true);
$log.debug('Import opts', lopts);
@@ -325,6 +354,7 @@ angular.module('copayApp.controllers').controller('importController',
lopts.externalSource = lopts.externalSource = walletService.externalSource.ledger.id;
lopts.bwsurl = $scope.formData.bwsurl;
+ lopts.account = account;
ongoingProcess.set('importingWallet', true);
$log.debug('Import opts', lopts);
diff --git a/src/js/controllers/lockSetup.js b/src/js/controllers/lockSetup.js
index cb6ff03cd..39b86de61 100644
--- a/src/js/controllers/lockSetup.js
+++ b/src/js/controllers/lockSetup.js
@@ -36,7 +36,7 @@ angular.module('copayApp.controllers').controller('lockSetupController', functio
function getSavedMethod() {
var config = configService.getSync();
- if (config.lock) return config.lock.method;
+ if (config.lock && config.lock.method) return config.lock.method;
return 'none';
};
diff --git a/src/js/controllers/tab-send.js b/src/js/controllers/tab-send.js
index 96694847f..5c2f576ec 100644
--- a/src/js/controllers/tab-send.js
+++ b/src/js/controllers/tab-send.js
@@ -128,6 +128,16 @@ angular.module('copayApp.controllers').controller('tabSendController', function(
updateWalletsList();
};
+ $scope.searchInFocus = function() {
+ $scope.searchFocus = true;
+ };
+
+ $scope.searchBlurred = function() {
+ if ($scope.formData.search == null) {
+ $scope.searchFocus = false;
+ }
+ };
+
$scope.findContact = function(search) {
if (incomingData.redir(search)) {
diff --git a/src/js/services/applicationService.js b/src/js/services/applicationService.js
index fe364a514..9bb9b5048 100644
--- a/src/js/services/applicationService.js
+++ b/src/js/services/applicationService.js
@@ -50,19 +50,15 @@ angular.module('copayApp.services')
});
scope.openModal = function() {
scope.fingerprintCheckModal.show();
- checkFingerprint();
+ scope.checkFingerprint();
};
scope.hideModal = function() {
root.isModalOpen = false;
scope.fingerprintCheckModal.hide();
};
-
- function checkFingerprint() {
+ scope.checkFingerprint = function() {
fingerprintService.check('unlockingApp', function(err) {
- if (err) {
- checkFingerprint();
- return;
- }
+ if (err) return;
scope.hideModal();
});
}
diff --git a/src/js/services/profileService.js b/src/js/services/profileService.js
index 6ef9b96b0..8c5a93662 100644
--- a/src/js/services/profileService.js
+++ b/src/js/services/profileService.js
@@ -208,9 +208,9 @@ angular.module('copayApp.services')
};
var shouldSkipValidation = function(walletId) {
- return root.profile.isChecked(platformInfo.ua, walletId) || isIOS || isWP;
- }
- // Used when reading wallets from the profile
+ return root.profile.isChecked(platformInfo.ua, walletId) || isIOS || isWP;
+ }
+ // Used when reading wallets from the profile
root.bindWallet = function(credentials, cb) {
if (!credentials.walletId || !credentials.m)
return cb('bindWallet should receive credentials JSON');
@@ -618,6 +618,8 @@ angular.module('copayApp.services')
walletClient.importFromMnemonic(words, {
network: opts.networkName,
passphrase: opts.passphrase,
+ entropySourcePath: opts.entropySourcePath,
+ derivationStrategy: opts.derivationStrategy || 'BIP44',
account: opts.account || 0,
}, function(err) {
if (err) {
diff --git a/src/js/services/trezor.js b/src/js/services/trezor.js
index 0411386fc..3d40d88d1 100644
--- a/src/js/services/trezor.js
+++ b/src/js/services/trezor.js
@@ -93,7 +93,6 @@ angular.module('copayApp.services')
outputs = [];
var tmpOutputs = [];
-
if (txp.type && txp.type != 'simple') {
return callback('Only TXPs type SIMPLE are supported in TREZOR');
} else if (txp.outputs) {
@@ -170,7 +169,6 @@ angular.module('copayApp.services')
return '';
});
-
inputs = lodash.map(txp.inputs, function(i) {
$log.debug("Trezor TX input path:", i.path);
var pathArr = i.path.split('/');
@@ -180,12 +178,12 @@ angular.module('copayApp.services')
inAmount += i.satoshis;
var orderedPubKeys = root._orderPubKeys(xPubKeys, np);
- var pubkeys = lodash(orderedPubKeys.map(function(v) {
+ var pubkeys = orderedPubKeys.map(function(v) {
return {
node: v,
address_n: np,
};
- }));
+ });
return {
address_n: n,
@@ -208,12 +206,12 @@ angular.module('copayApp.services')
var np = n.slice(3);
var orderedPubKeys = root._orderPubKeys(xPubKeys, np);
- var pubkeys = lodash(orderedPubKeys.map(function(v) {
+ var pubkeys = orderedPubKeys.map(function(v) {
return {
node: v,
address_n: np,
};
- }));
+ });
tmpOutputs.push({
address_n: n,
diff --git a/src/sass/views/bitpayCard.scss b/src/sass/views/bitpayCard.scss
index a602a2238..a1ae39918 100644
--- a/src/sass/views/bitpayCard.scss
+++ b/src/sass/views/bitpayCard.scss
@@ -101,6 +101,7 @@
height: 40px;
border-radius: 40px;
border: 1px solid;
+ color: #9b9bab;
&.no-border {
border: none;
.svg {
diff --git a/src/sass/views/includes/pin.scss b/src/sass/views/includes/pin.scss
index 8a3547de8..fe8cc118b 100644
--- a/src/sass/views/includes/pin.scss
+++ b/src/sass/views/includes/pin.scss
@@ -1,5 +1,9 @@
#pin {
background-color: #FAFAFA;
+ width: 100%;
+ height: 100%;
+ top: 0;
+ left: 0;
.content {
text-align: center;
position: fixed;
diff --git a/src/sass/views/tab-send.scss b/src/sass/views/tab-send.scss
index dbda43f2e..8bba3cee6 100644
--- a/src/sass/views/tab-send.scss
+++ b/src/sass/views/tab-send.scss
@@ -35,7 +35,50 @@
.send-heading {
font-size: 14px;
font-weight: bold;
- padding-bottom: 0;
+ padding: 0 0 16px 0;
+ border: none;
+ }
+ .send-header-wrapper {
+ padding: 10px;
+ background-color: white;
+ box-shadow: 0px 5px 10px 0px #cccccc;
+ }
+ .search-wrapper {
+ background-color: #f2f2f2;
+ border-radius: 3px;
+ border: none;
+ .svg#Bitcoin_Symbol {
+ width: 14px;
+ .st0 {
+ fill: #cccccc;
+ }
+ }
+ &.focus {
+ background: none;
+ .svg#Bitcoin_Symbol {
+ display: none;
+ }
+ .search-input {
+ padding-left: 0;
+ &:focus::-webkit-input-placeholder {
+ opacity: 0;
+ }
+ }
+ }
+ }
+ .abs-v-center {
+ position: absolute;
+ top: 50%;
+ transform: translateY(-50%);
+ }
+ .search-input {
+ background-color: transparent;
+ padding-left: 30px;
+ }
+ .separator-left {
+ border-left: 1px solid #d9d9df;
+ padding-left: 10px;
+ height: 70%;
}
.bitcoin-address {
border-top: none;
diff --git a/www/img/mcc-icons/airplane.svg b/www/img/mcc-icons/airplane.svg
index 1d096a5f1..ed1ee3a70 100644
--- a/www/img/mcc-icons/airplane.svg
+++ b/www/img/mcc-icons/airplane.svg
@@ -5,7 +5,7 @@
Created with Sketch.
-
+
diff --git a/www/img/mcc-icons/art.svg b/www/img/mcc-icons/art.svg
index 399d09c7d..4437f7a61 100644
--- a/www/img/mcc-icons/art.svg
+++ b/www/img/mcc-icons/art.svg
@@ -5,7 +5,7 @@
Created with Sketch.
-
+
diff --git a/www/img/mcc-icons/bicycle.svg b/www/img/mcc-icons/bicycle.svg
index 2460bfc20..26e8a9431 100644
--- a/www/img/mcc-icons/bicycle.svg
+++ b/www/img/mcc-icons/bicycle.svg
@@ -5,7 +5,7 @@
Created with Sketch.
-
+
diff --git a/www/img/mcc-icons/bitcoin-topup.svg b/www/img/mcc-icons/bitcoin-topup.svg
index 17c97917c..024dcd512 100644
--- a/www/img/mcc-icons/bitcoin-topup.svg
+++ b/www/img/mcc-icons/bitcoin-topup.svg
@@ -5,7 +5,7 @@
Created with Sketch.
-
+
diff --git a/www/img/mcc-icons/boat.svg b/www/img/mcc-icons/boat.svg
index 4c4df0585..5fc321e47 100644
--- a/www/img/mcc-icons/boat.svg
+++ b/www/img/mcc-icons/boat.svg
@@ -5,7 +5,7 @@
Created with Sketch.
-
+
diff --git a/www/img/mcc-icons/books.svg b/www/img/mcc-icons/books.svg
index ef2d319eb..217c5642b 100644
--- a/www/img/mcc-icons/books.svg
+++ b/www/img/mcc-icons/books.svg
@@ -5,7 +5,7 @@
Created with Sketch.
-
+
diff --git a/www/img/mcc-icons/bowling.svg b/www/img/mcc-icons/bowling.svg
index c3d438dc8..6d8f171fa 100644
--- a/www/img/mcc-icons/bowling.svg
+++ b/www/img/mcc-icons/bowling.svg
@@ -5,7 +5,7 @@
Created with Sketch.
-
+
diff --git a/www/img/mcc-icons/bug.svg b/www/img/mcc-icons/bug.svg
index 6cea4c70e..e1aed95c2 100644
--- a/www/img/mcc-icons/bug.svg
+++ b/www/img/mcc-icons/bug.svg
@@ -5,7 +5,7 @@
Created with Sketch.
-
+
diff --git a/www/img/mcc-icons/bus.svg b/www/img/mcc-icons/bus.svg
index bb32445e9..fa69bd7a9 100644
--- a/www/img/mcc-icons/bus.svg
+++ b/www/img/mcc-icons/bus.svg
@@ -5,7 +5,7 @@
Created with Sketch.
-
+
diff --git a/www/img/mcc-icons/camera.svg b/www/img/mcc-icons/camera.svg
index 9abb6dc75..5c518bbfc 100644
--- a/www/img/mcc-icons/camera.svg
+++ b/www/img/mcc-icons/camera.svg
@@ -5,7 +5,7 @@
Created with Sketch.
-
+
diff --git a/www/img/mcc-icons/car.svg b/www/img/mcc-icons/car.svg
index 299164f0f..df7094476 100644
--- a/www/img/mcc-icons/car.svg
+++ b/www/img/mcc-icons/car.svg
@@ -5,7 +5,7 @@
Created with Sketch.
-
+
diff --git a/www/img/mcc-icons/clean.svg b/www/img/mcc-icons/clean.svg
index 2ca8b4179..2bf263eb4 100644
--- a/www/img/mcc-icons/clean.svg
+++ b/www/img/mcc-icons/clean.svg
@@ -5,7 +5,7 @@
Created with Sketch.
-
+
diff --git a/www/img/mcc-icons/clock.svg b/www/img/mcc-icons/clock.svg
index 2fd640f72..abfae8e81 100644
--- a/www/img/mcc-icons/clock.svg
+++ b/www/img/mcc-icons/clock.svg
@@ -5,7 +5,7 @@
Created with Sketch.
-
+
clock
diff --git a/www/img/mcc-icons/cocktail.svg b/www/img/mcc-icons/cocktail.svg
index c332c169c..ac72141c8 100644
--- a/www/img/mcc-icons/cocktail.svg
+++ b/www/img/mcc-icons/cocktail.svg
@@ -5,7 +5,7 @@
Created with Sketch.
-
+
diff --git a/www/img/mcc-icons/coins.svg b/www/img/mcc-icons/coins.svg
index 692866c8e..8753a2cd8 100644
--- a/www/img/mcc-icons/coins.svg
+++ b/www/img/mcc-icons/coins.svg
@@ -5,7 +5,7 @@
Created with Sketch.
-
+
diff --git a/www/img/mcc-icons/computer.svg b/www/img/mcc-icons/computer.svg
index a897e1644..442e7f36a 100644
--- a/www/img/mcc-icons/computer.svg
+++ b/www/img/mcc-icons/computer.svg
@@ -5,7 +5,7 @@
Created with Sketch.
-
+
diff --git a/www/img/mcc-icons/default.svg b/www/img/mcc-icons/default.svg
index 379fa3d0c..1458e3115 100644
--- a/www/img/mcc-icons/default.svg
+++ b/www/img/mcc-icons/default.svg
@@ -5,7 +5,7 @@
Created with Sketch.
-
+
diff --git a/www/img/mcc-icons/diamond-ring.svg b/www/img/mcc-icons/diamond-ring.svg
index 380d77351..c8acf7c60 100644
--- a/www/img/mcc-icons/diamond-ring.svg
+++ b/www/img/mcc-icons/diamond-ring.svg
@@ -5,7 +5,7 @@
Created with Sketch.
-
+
diff --git a/www/img/mcc-icons/dollar-topup.svg b/www/img/mcc-icons/dollar-topup.svg
index 06d7eef77..2dd9cf755 100644
--- a/www/img/mcc-icons/dollar-topup.svg
+++ b/www/img/mcc-icons/dollar-topup.svg
@@ -5,7 +5,7 @@
Created with Sketch.
-
+
diff --git a/www/img/mcc-icons/euro-topup.svg b/www/img/mcc-icons/euro-topup.svg
index 30f2782a1..07d7f65bf 100644
--- a/www/img/mcc-icons/euro-topup.svg
+++ b/www/img/mcc-icons/euro-topup.svg
@@ -5,7 +5,7 @@
Created with Sketch.
-
+
diff --git a/www/img/mcc-icons/film.svg b/www/img/mcc-icons/film.svg
index c66e4cbed..71595e207 100644
--- a/www/img/mcc-icons/film.svg
+++ b/www/img/mcc-icons/film.svg
@@ -5,7 +5,7 @@
Created with Sketch.
-
+
diff --git a/www/img/mcc-icons/food.svg b/www/img/mcc-icons/food.svg
index d78db31fc..b75ddfa89 100644
--- a/www/img/mcc-icons/food.svg
+++ b/www/img/mcc-icons/food.svg
@@ -7,7 +7,7 @@
-
+
@@ -15,7 +15,7 @@
-
+
diff --git a/www/img/mcc-icons/football.svg b/www/img/mcc-icons/football.svg
index b790ee7eb..98cdc5733 100644
--- a/www/img/mcc-icons/football.svg
+++ b/www/img/mcc-icons/football.svg
@@ -5,7 +5,7 @@
Created with Sketch.
-
+