commit
481d9ba457
19 changed files with 75 additions and 50 deletions
|
|
@ -15,6 +15,7 @@ var templates = {
|
|||
'.desktop': 'webkitbuilds/',
|
||||
'setup-win.iss': 'webkitbuilds/',
|
||||
'build-macos.sh': 'webkitbuilds/',
|
||||
'manifest.json': 'chrome-app/',
|
||||
// 'bower.json': '/',
|
||||
};
|
||||
var configDir = process.argv[2] || 'copay';
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
"manifest_version": 2,
|
||||
"name": "*PACKAGENAME*",
|
||||
"description": "*PACKAGEDESCRIPTION*",
|
||||
"description": "*DESCRIPTION*",
|
||||
"version": "*VERSION*",
|
||||
"permissions": [
|
||||
"storage",
|
||||
|
|
|
|||
|
|
@ -1,8 +1,9 @@
|
|||
'use strict';
|
||||
|
||||
angular.module('copayApp.controllers').controller('addressbookListController', function($scope, $log, $timeout, addressbookService, lodash, popupService, gettextCatalog) {
|
||||
angular.module('copayApp.controllers').controller('addressbookListController', function($scope, $log, $timeout, addressbookService, lodash, popupService, gettextCatalog, platformInfo) {
|
||||
|
||||
var contacts;
|
||||
$scope.isChromeApp = platformInfo.isChromeApp;
|
||||
|
||||
var initAddressbook = function() {
|
||||
addressbookService.list(function(err, ab) {
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
'use strict';
|
||||
|
||||
angular.module('copayApp.controllers').controller('addressbookViewController', function($scope, $state, $timeout, $stateParams, lodash, addressbookService, popupService, $ionicHistory) {
|
||||
|
||||
angular.module('copayApp.controllers').controller('addressbookViewController', function($scope, $state, $timeout, $stateParams, lodash, addressbookService, popupService, $ionicHistory, platformInfo) {
|
||||
$scope.isChromeApp = platformInfo.isChromeApp;
|
||||
$scope.addressbookEntry = {};
|
||||
$scope.addressbookEntry.name = $stateParams.name;
|
||||
$scope.addressbookEntry.email = $stateParams.email;
|
||||
|
|
|
|||
|
|
@ -7,6 +7,7 @@ angular.module('copayApp.controllers').controller('amountController', function($
|
|||
var satToBtc;
|
||||
var SMALL_FONT_SIZE_LIMIT = 10;
|
||||
var LENGTH_EXPRESSION_LIMIT = 19;
|
||||
$scope.isChromeApp = platformInfo.isChromeApp;
|
||||
|
||||
$scope.$on('$ionicView.leave', function() {
|
||||
angular.element($window).off('keydown');
|
||||
|
|
|
|||
|
|
@ -36,7 +36,7 @@ angular.module('copayApp.controllers').controller('importController',
|
|||
id: 'trezor',
|
||||
label: 'Trezor Hardware Wallet',
|
||||
});
|
||||
$scope.seedSource = $scope.seedOptions[0];
|
||||
$scope.formData.seedSource = $scope.seedOptions[0];
|
||||
}
|
||||
};
|
||||
|
||||
|
|
@ -281,16 +281,16 @@ angular.module('copayApp.controllers').controller('importController',
|
|||
};
|
||||
|
||||
$scope.importHW = function(form) {
|
||||
if (form.$invalid || $scope.formData.ccount < 0) {
|
||||
if (form.$invalid || $scope.formData.account < 0) {
|
||||
popupService.showAlert(gettextCatalog.getString('Error'), gettextCatalog.getString('There is an error in the form'));
|
||||
return;
|
||||
}
|
||||
|
||||
$scope.importErr = false;
|
||||
|
||||
var account = $scope.formData.ccount;
|
||||
var account = $scope.formData.account;
|
||||
|
||||
if ($scope.seedSource.id == 'trezor') {
|
||||
if ($scope.formData.seedSource.id == 'trezor') {
|
||||
if (account < 1) {
|
||||
popupService.showAlert(gettextCatalog.getString('Error'), gettextCatalog.getString('Invalid account number'));
|
||||
return;
|
||||
|
|
@ -298,7 +298,7 @@ angular.module('copayApp.controllers').controller('importController',
|
|||
account = account - 1;
|
||||
}
|
||||
|
||||
switch ($scope.seedSource.id) {
|
||||
switch ($scope.formData.seedSource.id) {
|
||||
case ('ledger'):
|
||||
ongoingProcess.set('connectingledger', true);
|
||||
$scope.importLedger(account);
|
||||
|
|
|
|||
|
|
@ -1,11 +1,11 @@
|
|||
'use strict';
|
||||
|
||||
angular.module('copayApp.controllers').controller('tabSendController', function($scope, $rootScope, $log, $timeout, $ionicScrollDelegate, addressbookService, profileService, lodash, $state, walletService, incomingData, popupService) {
|
||||
angular.module('copayApp.controllers').controller('tabSendController', function($scope, $rootScope, $log, $timeout, $ionicScrollDelegate, addressbookService, profileService, lodash, $state, walletService, incomingData, popupService, platformInfo) {
|
||||
|
||||
var originalList;
|
||||
var CONTACTS_SHOW_LIMIT;
|
||||
var currentContactsPage;
|
||||
|
||||
$scope.isChromeApp = platformInfo.isChromeApp;
|
||||
|
||||
var updateList = function() {
|
||||
CONTACTS_SHOW_LIMIT = 10;
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
'use strict';
|
||||
|
||||
angular.module('copayApp.services')
|
||||
.factory('hwWallet', function($log, bwcService) {
|
||||
.factory('hwWallet', function($log, bwcService) {
|
||||
var root = {};
|
||||
|
||||
// Ledger magic number to get xPub without user confirmation
|
||||
|
|
@ -11,8 +11,7 @@ angular.module('copayApp.services')
|
|||
root.LIVENET_PATH = 0;
|
||||
|
||||
root._err = function(data) {
|
||||
var msg = 'Hardware Wallet Error: ' + (data.error || data.message || 'unknown');
|
||||
$log.warn(msg);
|
||||
var msg = data.error || data.message || 'unknown';
|
||||
return msg;
|
||||
};
|
||||
|
||||
|
|
@ -21,13 +20,13 @@ angular.module('copayApp.services')
|
|||
if (!isMultisig) return root.UNISIG_ROOTPATH;
|
||||
|
||||
// Compat
|
||||
if (device == 'ledger' && account ==0) return root.UNISIG_ROOTPATH;
|
||||
if (device == 'ledger' && account == 0) return root.UNISIG_ROOTPATH;
|
||||
|
||||
return root.MULTISIG_ROOTPATH;
|
||||
};
|
||||
|
||||
root.getAddressPath = function(device, isMultisig, account) {
|
||||
return root.getRootPath(device,isMultisig,account) + "'/" + root.LIVENET_PATH + "'/" + account + "'";
|
||||
return root.getRootPath(device, isMultisig, account) + "'/" + root.LIVENET_PATH + "'/" + account + "'";
|
||||
}
|
||||
|
||||
root.getEntropyPath = function(device, isMultisig, account) {
|
||||
|
|
@ -35,9 +34,9 @@ angular.module('copayApp.services')
|
|||
|
||||
// Old ledger wallet compat
|
||||
if (device == 'ledger' && account == 0)
|
||||
return root.ENTROPY_INDEX_PATH + "0'";
|
||||
return root.ENTROPY_INDEX_PATH + "0'";
|
||||
|
||||
return root.ENTROPY_INDEX_PATH + root.getRootPath(device,isMultisig,account) + "'/" + account + "'";
|
||||
return root.ENTROPY_INDEX_PATH + root.getRootPath(device, isMultisig, account) + "'/" + account + "'";
|
||||
};
|
||||
|
||||
root.pubKeyToEntropySource = function(xPubKey) {
|
||||
|
|
|
|||
|
|
@ -17,7 +17,7 @@ angular.module('copayApp.services')
|
|||
if (!data.success)
|
||||
return callback(hwWallet._err(data));
|
||||
|
||||
return callback(null, hwWallet.pubKeyToEntropySource(data.xpubkey));
|
||||
return callback(null, hwWallet.pubKeyToEntropySource(data.xpubkey));
|
||||
});
|
||||
};
|
||||
|
||||
|
|
@ -27,21 +27,18 @@ angular.module('copayApp.services')
|
|||
root._messageAfterSession({
|
||||
command: "get_xpubkey",
|
||||
path: path
|
||||
})
|
||||
});
|
||||
};
|
||||
|
||||
|
||||
root.getInfoForNewWallet = function(isMultisig, account, callback) {
|
||||
var opts = {};
|
||||
root.getEntropySource(isMultisig, account, function(err, entropySource) {
|
||||
if (err) return callback(err);
|
||||
|
||||
opts.entropySource = entropySource;
|
||||
root.getXPubKey(hwWallet.getAddressPath('ledger', isMultisig, account), function(data) {
|
||||
if (!data.success) {
|
||||
$log.warn(data.message);
|
||||
return callback(data);
|
||||
}
|
||||
if (!data.success) return callback(data);
|
||||
|
||||
var opts = {};
|
||||
opts.entropySource = entropySource;
|
||||
opts.extendedPublicKey = data.xpubkey;
|
||||
opts.externalSource = 'ledger';
|
||||
opts.account = account;
|
||||
|
|
@ -130,7 +127,7 @@ angular.module('copayApp.services')
|
|||
root._should_poll_session = false;
|
||||
} else if (typeof root.callbacks[data.command] == "function") {
|
||||
root.callbacks[data.command](data);
|
||||
}
|
||||
} else {}
|
||||
} else {
|
||||
root._should_poll_session = false;
|
||||
Object.keys(root.callbacks).forEach(function(key) {
|
||||
|
|
|
|||
|
|
@ -636,6 +636,7 @@ angular.module('copayApp.services')
|
|||
};
|
||||
|
||||
root._normalizeMnemonic = function(words) {
|
||||
if (!words || !words.indexOf) return words;
|
||||
var isJA = words.indexOf('\u3000') > -1;
|
||||
var wordList = words.split(/[\u3000\s]+/);
|
||||
|
||||
|
|
|
|||
|
|
@ -19,7 +19,11 @@ angular.module('copayApp.services')
|
|||
|
||||
root.getXPubKey = function(path, callback) {
|
||||
$log.debug('TREZOR deriving xPub path:', path);
|
||||
TrezorConnect.getXPubKey(path, callback);
|
||||
try {
|
||||
TrezorConnect.getXPubKey(path, callback);
|
||||
} catch (e) {
|
||||
callback('Error connecting Trezor');
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -130,4 +130,20 @@
|
|||
display: block;
|
||||
color: $mid-gray;
|
||||
}
|
||||
.big-icon-svg {
|
||||
padding: 0 7px;
|
||||
> .bg {
|
||||
background-color: #f2f2f2;
|
||||
border-radius: 50%;
|
||||
width: 70px;
|
||||
height: 70px;
|
||||
box-shadow: 0px 1px 5px rgba($mid-gray, .1);
|
||||
background-repeat: no-repeat;
|
||||
background-clip: padding-box;
|
||||
background-size: 103%;
|
||||
&.green {
|
||||
background: rgb(1, 209, 162);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
BIN
www/img/icon-chrome-128.png
Normal file
BIN
www/img/icon-chrome-128.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 6.3 KiB |
|
|
@ -37,7 +37,8 @@
|
|||
<ion-item ng-repeat="addrEntry in addressbook"
|
||||
class="item-icon-right item-avatar"
|
||||
ui-sref="tabs.addressbook.view({address:addrEntry.address, email: addrEntry.email, name: addrEntry.name})">
|
||||
<gravatar name="{{addrEntry.name}}" width="50" email="{{addrEntry.email}}"></gravatar>
|
||||
<img src="img/contact-placeholder.svg" class="bg"/ ng-if="isChromeApp">
|
||||
<gravatar name="{{addrEntry.name}}" width="50" email="{{addrEntry.email}}" ng-if="!isChromeApp"></gravatar>
|
||||
<h2>{{addrEntry.name}}</h2>
|
||||
<p>{{addrEntry.address}}</p>
|
||||
<i class="icon bp-arrow-right"></i>
|
||||
|
|
|
|||
|
|
@ -8,7 +8,10 @@
|
|||
</ion-nav-bar>
|
||||
<ion-content scroll="false">
|
||||
<div class="gravatar-content">
|
||||
<gravatar name="{{addressbookEntry.name}}" width="80" email="{{addressbookEntry.email}}"></gravatar>
|
||||
<i class="icon big-icon-svg" ng-if="isChromeApp">
|
||||
<img src="img/contact-placeholder.svg" class="bg"/>
|
||||
</i>
|
||||
<gravatar name="{{addressbookEntry.name}}" width="80" email="{{addressbookEntry.email}}" ng-if="!isChromeApp"></gravatar>
|
||||
</div>
|
||||
<div class="list">
|
||||
<div class="item item-text-wrap">
|
||||
|
|
|
|||
|
|
@ -22,7 +22,10 @@
|
|||
<img src="img/icon-wallet.svg" ng-style="{'background-color': toColor}" class="bg"/>
|
||||
</i>
|
||||
<span ng-if="!isWallet && !isGiftCard && !isGlidera">
|
||||
<gravatar ng-if="!cardId" class="send-gravatar" name="{{toName}}" height="30" width="30" email="{{toEmail}}"></gravatar>
|
||||
<i class="icon big-icon-svg" ng-if="isChromeApp">
|
||||
<img src="img/contact-placeholder.svg" class="bg"/>
|
||||
</i>
|
||||
<gravatar ng-if="!cardId && !isChromeApp" class="send-gravatar" name="{{toName}}" height="30" width="30" email="{{toEmail}}"></gravatar>
|
||||
<i ng-if="cardId" class="icon big-icon-svg">
|
||||
<div class="bg icon-bitpay-card"></div>
|
||||
</i>
|
||||
|
|
|
|||
|
|
@ -1,19 +1,16 @@
|
|||
|
||||
<span ng-show="wallet.isShared" class="size-12"><span translate>{{wallet.m}}-of-{{wallet.n}}</span></span>
|
||||
<span ng-show="wallet.isSingleAddress" class="size-12"><span translate>Auditable</span></span>
|
||||
<img style="height:0.6em; margin-right: 1px;" ng-show="wallet.network != 'livenet'" src="img/icon-testnet-white.svg">
|
||||
<img style="height:0.6em; margin-right: 1px;" ng-show="!wallet.canSign() && !wallet.isPrivKeyExternal()"
|
||||
src="img/icon-read-only-white.svg">
|
||||
<span ng-show="wallet.status.wallet.singleAddress" class="size-12"><span translate>Auditable</span></span>
|
||||
<img style="height:0.6em; margin-right: 1px;" ng-show="wallet.network != 'livenet'" src="img/icon-testnet-white.svg">
|
||||
<img style="height:0.6em; margin-right: 1px;" ng-show="!wallet.canSign() && !wallet.isPrivKeyExternal()" src="img/icon-read-only-white.svg">
|
||||
|
||||
<img style="height:0.6em; margin-right: 1px;" ng-show="wallet.getPrivKeyExternalSourceName() == 'trezor'"
|
||||
src="img/icon-trezor-white.svg">
|
||||
<img style="height:0.6em; margin-right: 1px;" ng-show="wallet.getPrivKeyExternalSourceName() == 'ledger'"
|
||||
src="img/icon-ledger-white.svg">
|
||||
<span class="size-12 dib" style="height:0.6em; margin-right: 1px;" ng-show="wallet.account">#{{wallet.account || 0}} </span>
|
||||
<img style="height:0.6em; margin-right: 1px;" ng-show="wallet.getPrivKeyExternalSourceName() == 'trezor'" src="img/icon-trezor-white.svg">
|
||||
<img style="height:0.6em; margin-right: 1px;" ng-show="wallet.getPrivKeyExternalSourceName() == 'ledger'" src="img/icon-ledger-white.svg">
|
||||
<span ng-show="wallet.credentials.n > 1" class="size-12"><span translate>{{wallet.m}}-of-{{wallet.n}}</span></span>
|
||||
<span class="size-12 dib" style="height:0.6em; margin-right: 1px;" ng-show="wallet.credentials.account">#{{wallet.credentials.account || 0}} </span>
|
||||
|
||||
<img style="height:0.6em; margin-right: 1px;" ng-show="wallet.isPrivKeyEncrypted()" src="img/icon-lock-white.svg">
|
||||
<img style="height:0.6em; margin-right: 1px;" ng-show="wallet.isPrivKeyEncrypted()" src="img/icon-lock-white.svg">
|
||||
|
||||
<!-- <img style="height:1em" ng-show="wallet.preferences.email" src="img/icon-email.svg"> -->
|
||||
<img style="height:0.6em; margin-right: 1px;" ng-show="wallet.usingCustomBWS" src="img/icon-bws-white.svg">
|
||||
<!-- <img style="height:1em" ng-show="wallet.preferences.email" src="img/icon-email.svg"> -->
|
||||
<img style="height:0.6em; margin-right: 1px;" ng-show="wallet.usingCustomBWS" src="img/icon-bws-white.svg">
|
||||
|
||||
<img style="height:0.6em" ng-show="updatingTxHistory" src="img/icon-sync-white.svg">
|
||||
<img style="height:0.6em" ng-show="updatingTxHistory" src="img/icon-sync-white.svg">
|
||||
|
|
|
|||
|
|
@ -12,15 +12,15 @@
|
|||
Wallet Type
|
||||
</div>
|
||||
|
||||
<select ng-model="seedSource" ng-options="seed as seed.label for seed in seedOptions"></select>
|
||||
<select ng-model="formData.seedSource" ng-options="seed as seed.label for seed in seedOptions"></select>
|
||||
</label>
|
||||
|
||||
<label class="item item-input item-stacked-label" ng-show="seedSource.id == 'trezor' || seedSource.id == 'ledger'">
|
||||
<label class="item item-input item-stacked-label" ng-show="formData.seedSource.id == 'trezor' || formData.seedSource.id == 'ledger'">
|
||||
<span class="input-label" translate>Account Number</span>
|
||||
<input type="number" ng-model="formData.account" ignore-mouse-wheel>
|
||||
</label>
|
||||
|
||||
<ion-toggle ng-show="seedSource.id == 'trezor'" ng-model="formData.isMultisig" toggle-class="toggle-positive">
|
||||
<ion-toggle ng-show="formData.seedSource.id == 'trezor'" ng-model="formData.isMultisig" toggle-class="toggle-positive">
|
||||
<span translate>Shared Wallet</span>
|
||||
</ion-toggle>
|
||||
|
||||
|
|
|
|||
|
|
@ -44,7 +44,8 @@
|
|||
</a>
|
||||
<a class="item item-icon-left item-icon-right" ng-repeat="item in list" ng-if="hasContacts && !item.isWallet" ng-click="goToAmount(item)">
|
||||
<i class="icon big-icon-svg">
|
||||
<gravatar class="send-gravatar" name="{{item.name}}" width="30" email="{{item.email}}"></gravatar>
|
||||
<img src="img/contact-placeholder.svg" class="bg"/ ng-if="isChromeApp">
|
||||
<gravatar class="send-gravatar" name="{{item.name}}" width="30" email="{{item.email}}" ng-if="!isChromeApp"></gravatar>
|
||||
</i>
|
||||
{{item.name}}
|
||||
<i class="icon bp-arrow-right"></i>
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue