├── README.md
├── _headers
├── app
├── app.js
├── controllers.js
├── modules
│ ├── angular-blockies.js
│ ├── angular-qrcode.js
│ ├── angular-route.min.js
│ └── angular-sweet-alert.js
├── services
│ ├── lang.js
│ └── storage.js
└── views
│ ├── create.html
│ ├── encrypt.html
│ ├── link.html
│ ├── main.html
│ ├── new.html
│ ├── restore.html
│ ├── setting.html
│ ├── unlock.html
│ └── validate.html
├── index.html
└── skin
├── css
├── angular-csp.css
├── bootstrap.min.css
├── fontawesome-all.min.css
├── sweet-alert.css
└── tezbox.css
├── images
├── bg.png
├── icon-128.png
├── icon-16.png
├── icon-19.png
├── icon-38.png
├── icon.png
├── ledger-icon.png
├── ledger-logo.svg
├── logo.jpg
├── logo.png
└── trezor-logo.svg
├── js
├── angular
│ └── angular.min.js
├── blockies.min.js
├── bootstrap
│ └── bootstrap.min.js
├── eztz.min.js
├── jquery
│ └── jquery.min.js
├── ledger.xtz.js
├── protobuf.min.js
├── qrcode.js
├── sjcl.js
├── sweet-alert.min.js
├── tezbox.js
├── trezor.xtz.js
├── trezor
│ └── protob
│ │ ├── messages-bootloader.proto
│ │ ├── messages-common.proto
│ │ ├── messages-debug.proto
│ │ ├── messages-management.proto
│ │ ├── messages-tezos.proto
│ │ ├── messages.proto
│ │ └── trezor.tezos.proto
└── underscore
│ └── underscore.js
└── webfonts
├── VisbyCF-Bold.eot
├── VisbyCF-Bold.ttf
├── VisbyCF-Bold.woff
├── VisbyCF-Bold.woff2
├── VisbyCF-BoldOblique.ttf
├── VisbyCF-DemiBold.eot
├── VisbyCF-DemiBold.ttf
├── VisbyCF-DemiBold.woff
├── VisbyCF-DemiBold.woff2
├── VisbyCF-DemiBoldOblique.eot
├── VisbyCF-DemiBoldOblique.ttf
├── VisbyCF-DemiBoldOblique.woff
├── VisbyCF-DemiBoldOblique.woff2
├── VisbyCF-ExtraBold.eot
├── VisbyCF-ExtraBold.ttf
├── VisbyCF-ExtraBold.woff
├── VisbyCF-ExtraBold.woff2
├── VisbyCF-ExtraBoldOblique.eot
├── VisbyCF-ExtraBoldOblique.ttf
├── VisbyCF-ExtraBoldOblique.woff
├── VisbyCF-ExtraBoldOblique.woff2
├── VisbyCF-Heavy.eot
├── VisbyCF-Heavy.ttf
├── VisbyCF-Heavy.woff
├── VisbyCF-Heavy.woff2
├── VisbyCF-HeavyOblique.eot
├── VisbyCF-HeavyOblique.ttf
├── VisbyCF-HeavyOblique.woff
├── VisbyCF-HeavyOblique.woff2
├── VisbyCF-Light.eot
├── VisbyCF-Light.ttf
├── VisbyCF-Light.woff
├── VisbyCF-Light.woff2
├── VisbyCF-LightOblique.eot
├── VisbyCF-LightOblique.ttf
├── VisbyCF-LightOblique.woff
├── VisbyCF-LightOblique.woff2
├── VisbyCF-Medium.eot
├── VisbyCF-Medium.ttf
├── VisbyCF-Medium.woff
├── VisbyCF-Medium.woff2
├── VisbyCF-MediumOblique.eot
├── VisbyCF-MediumOblique.ttf
├── VisbyCF-MediumOblique.woff
├── VisbyCF-MediumOblique.woff2
├── VisbyCF-Thin.eot
├── VisbyCF-Thin.ttf
├── VisbyCF-Thin.woff
├── VisbyCF-Thin.woff2
├── VisbyCF-ThinOblique.eot
├── VisbyCF-ThinOblique.ttf
├── VisbyCF-ThinOblique.woff
├── VisbyCF-ThinOblique.woff2
├── fa-brands-400.eot
├── fa-brands-400.svg
├── fa-brands-400.ttf
├── fa-brands-400.woff
├── fa-brands-400.woff2
├── fa-regular-400.eot
├── fa-regular-400.svg
├── fa-regular-400.ttf
├── fa-regular-400.woff
├── fa-regular-400.woff2
├── fa-solid-900.eot
├── fa-solid-900.svg
├── fa-solid-900.ttf
├── fa-solid-900.woff
└── fa-solid-900.woff2
/README.md:
--------------------------------------------------------------------------------
1 | # TezBox Web Wallet
2 | This is the official repo for the TezBox web wallet
3 |
--------------------------------------------------------------------------------
/_headers:
--------------------------------------------------------------------------------
1 | /*
2 | X-Frame-Options: DENY
3 | X-XSS-Protection: 1; mode=block
4 | Content-Security-Policy: frame-ancestors 'none'
5 | X-Content-Type-Options: nosniff
--------------------------------------------------------------------------------
/app/app.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | var app = angular.module('popup', [
3 | 'ngRoute',
4 | 'angular-blockies',
5 | 'monospaced.qrcode',
6 | 'oitozero.ngSweetAlert'
7 | ])
8 | .run(function($rootScope, Lang) {
9 | $rootScope.translate = Lang.translate;
10 | })
11 | .config(function($routeProvider, $compileProvider) {
12 | $compileProvider.imgSrcSanitizationWhitelist(/^\s*(https?|local|data|chrome-extension|moz-extension|file):/);
13 | $routeProvider
14 | .when("/new", {
15 | templateUrl : "app/views/new.html",
16 | controller : "NewController",
17 | })
18 | .when("/create", {
19 | templateUrl : "app/views/create.html",
20 | controller : "CreateController",
21 | })
22 | .when("/restore", {
23 | templateUrl : "app/views/restore.html",
24 | controller : "RestoreController",
25 | })
26 | .when("/link", {
27 | templateUrl : "app/views/link.html",
28 | controller : "LinkController",
29 | })
30 | .when("/validate", {
31 | templateUrl : "app/views/validate.html",
32 | controller : "ValidateController",
33 | })
34 | .when("/encrypt", {
35 | templateUrl : "app/views/encrypt.html",
36 | controller : "EncryptController",
37 | })
38 | .when("/main", {
39 | templateUrl : "app/views/main.html",
40 | controller : "MainController",
41 | })
42 | .when("/unlock", {
43 | templateUrl : "app/views/unlock.html",
44 | controller : "UnlockController",
45 | })
46 | .when("/setting", {
47 | templateUrl : "app/views/setting.html",
48 | controller : "SettingController",
49 | })
50 | .otherwise({
51 | redirectTo: '/new'
52 | });
53 | })
54 | .directive('tooltip', function(){
55 | return {
56 | restrict: 'A',
57 | link: function(scope, element, attrs){
58 | element.hover(function(){
59 | element.tooltip('show');
60 | }, function(){
61 | element.tooltip('hide');
62 | });
63 | }
64 | };
65 | })
66 | .directive('numberSelect', function() {
67 | return {
68 | require: 'ngModel',
69 | link: function(scope, element, attrs, ngModel) {
70 | ngModel.$parsers.push(function(val) {
71 | return val != null ? parseFloat(val, 10) : null;
72 | });
73 | ngModel.$formatters.push(function(val) {
74 | return val != null ? '' + val : null;
75 | });
76 | }
77 | };
78 | });
--------------------------------------------------------------------------------
/app/modules/angular-blockies.js:
--------------------------------------------------------------------------------
1 | angular.module('angular-blockies', [])
2 | .directive('blocky', function($compile) {
3 |
4 | function link(scope, element, attrs) {
5 |
6 | function buildBlock() {
7 | var icon = blockies.create({
8 | seed: attrs.seed,
9 | size: attrs.size,
10 | scale: attrs.scale,
11 | spotcolor: '#000'
12 | });
13 |
14 | var compiled = $compile(icon)(scope);
15 | element.replaceWith(compiled);
16 | element = compiled;
17 | }
18 |
19 | // watch all the attributes within a single $watch
20 | scope.$watch(function() {
21 | return [attrs.seed, attrs.color, attrs.bgcolor, attrs.size, attrs.scale];
22 | }, buildBlock, true);
23 |
24 | };
25 |
26 | return {
27 | restrict: 'EA',
28 | replace: false,
29 | link: link
30 | };
31 | });
--------------------------------------------------------------------------------
/app/modules/angular-qrcode.js:
--------------------------------------------------------------------------------
1 | /*
2 | * angular-qrcode
3 | * (c) 2017 Monospaced http://monospaced.com
4 | * License: MIT
5 | */
6 |
7 | if (typeof module !== 'undefined' &&
8 | typeof exports !== 'undefined' &&
9 | module.exports === exports){
10 | module.exports = 'monospaced.qrcode';
11 | }
12 |
13 | angular.module('monospaced.qrcode', [])
14 | .directive('qrcode', ['$window', function($window) {
15 |
16 | var canvas2D = !!$window.CanvasRenderingContext2D,
17 | levels = {
18 | 'L': 'Low',
19 | 'M': 'Medium',
20 | 'Q': 'Quartile',
21 | 'H': 'High'
22 | },
23 | draw = function(context, qr, modules, tile, color) {
24 | for (var row = 0; row < modules; row++) {
25 | for (var col = 0; col < modules; col++) {
26 | var w = (Math.ceil((col + 1) * tile) - Math.floor(col * tile)),
27 | h = (Math.ceil((row + 1) * tile) - Math.floor(row * tile));
28 |
29 | context.fillStyle = qr.isDark(row, col) ? color.foreground : color.background;
30 | context.fillRect(Math.round(col * tile),
31 | Math.round(row * tile), w, h);
32 | }
33 | }
34 | };
35 |
36 | return {
37 | restrict: 'E',
38 | template: ' ',
39 | link: function(scope, element, attrs) {
40 | var domElement = element[0],
41 | $canvas = element.find('canvas'),
42 | canvas = $canvas[0],
43 | context = canvas2D ? canvas.getContext('2d') : null,
44 | download = 'download' in attrs,
45 | href = attrs.href,
46 | link = download || href ? document.createElement('a') : '',
47 | trim = /^\s+|\s+$/g,
48 | error,
49 | version,
50 | errorCorrectionLevel,
51 | data,
52 | size,
53 | modules,
54 | tile,
55 | qr,
56 | $img,
57 | color = {
58 | foreground: '#000',
59 | background: '#fff'
60 | },
61 | setColor = function(value) {
62 | color.foreground = value || color.foreground;
63 | },
64 | setBackground = function(value) {
65 | color.background = value || color.background;
66 | },
67 | setVersion = function(value) {
68 | version = Math.max(1, Math.min(parseInt(value, 10), 40)) || 5;
69 | },
70 | setErrorCorrectionLevel = function(value) {
71 | errorCorrectionLevel = value in levels ? value : 'M';
72 | },
73 | setData = function(value) {
74 | if (!value) {
75 | return;
76 | }
77 |
78 | data = value.replace(trim, '');
79 | qr = qrcode(version, errorCorrectionLevel);
80 | qr.addData(data);
81 |
82 | try {
83 | qr.make();
84 | } catch (e) {
85 | var newVersion;
86 | if (version >= 40) {
87 | throw new Error('Data is too long', e);
88 | }
89 | newVersion = version + 1;
90 | setVersion(newVersion);
91 | console.warn('qrcode version is too low and has been incremented to', newVersion)
92 | setData(value);
93 | return;
94 | }
95 |
96 | error = false;
97 | modules = qr.getModuleCount();
98 | },
99 | setSize = function(value) {
100 | size = parseInt(value, 10) || modules * 2;
101 | tile = size / modules;
102 | canvas.width = canvas.height = size;
103 | },
104 | render = function() {
105 | if (!qr) {
106 | return;
107 | }
108 |
109 | if (error) {
110 | if (link) {
111 | link.removeAttribute('download');
112 | link.title = '';
113 | link.href = '#_';
114 | }
115 | if (!canvas2D) {
116 | domElement.innerHTML = ' ';
119 | }
120 | scope.$emit('qrcode:error', error);
121 | return;
122 | }
123 |
124 | if (download) {
125 | domElement.download = 'qrcode.png';
126 | domElement.title = 'Download QR code';
127 | }
128 |
129 | if (canvas2D) {
130 | draw(context, qr, modules, tile, color);
131 |
132 | if (download) {
133 | domElement.href = canvas.toDataURL('image/png');
134 | return;
135 | }
136 | } else {
137 | domElement.innerHTML = qr.createImgTag(tile, 0);
138 | $img = element.find('img');
139 | $img.addClass('qrcode');
140 |
141 | if (download) {
142 | domElement.href = $img[0].src;
143 | return;
144 | }
145 | }
146 |
147 | if (href) {
148 | domElement.href = href;
149 | }
150 | };
151 |
152 | if (link) {
153 | link.className = 'qrcode-link';
154 | $canvas.wrap(link);
155 | domElement = domElement.firstChild;
156 | }
157 |
158 | setColor(attrs.color);
159 | setBackground(attrs.background);
160 | setVersion(attrs.version);
161 | setErrorCorrectionLevel(attrs.errorCorrectionLevel);
162 | setSize(attrs.size);
163 |
164 | attrs.$observe('version', function(value) {
165 | if (!value) {
166 | return;
167 | }
168 |
169 | setVersion(value);
170 | setData(data);
171 | setSize(size);
172 | render();
173 | });
174 |
175 | attrs.$observe('errorCorrectionLevel', function(value) {
176 | if (!value) {
177 | return;
178 | }
179 |
180 | setErrorCorrectionLevel(value);
181 | setData(data);
182 | setSize(size);
183 | render();
184 | });
185 |
186 | attrs.$observe('data', function(value) {
187 | if (!value) {
188 | return;
189 | }
190 |
191 | setData(value);
192 | setSize(size);
193 | render();
194 | });
195 |
196 | attrs.$observe('size', function(value) {
197 | if (!value) {
198 | return;
199 | }
200 |
201 | setSize(value);
202 | render();
203 | });
204 |
205 | attrs.$observe('color', function(value) {
206 | if (!value) {
207 | return;
208 | }
209 |
210 | setColor(value);
211 | render();
212 | });
213 |
214 | attrs.$observe('background', function(value) {
215 | if (!value) {
216 | return;
217 | }
218 |
219 | setBackground(value);
220 | render();
221 | });
222 |
223 | attrs.$observe('href', function(value) {
224 | if (!value) {
225 | return;
226 | }
227 |
228 | href = value;
229 | render();
230 | });
231 | }
232 | };
233 | }]);
234 |
--------------------------------------------------------------------------------
/app/modules/angular-route.min.js:
--------------------------------------------------------------------------------
1 | /*
2 | AngularJS v1.2.28
3 | (c) 2010-2014 Google, Inc. http://angularjs.org
4 | License: MIT
5 | */
6 | (function(n,e,A){'use strict';function x(s,g,h){return{restrict:"ECA",terminal:!0,priority:400,transclude:"element",link:function(a,c,b,f,w){function y(){p&&(p.remove(),p=null);k&&(k.$destroy(),k=null);l&&(h.leave(l,function(){p=null}),p=l,l=null)}function v(){var b=s.current&&s.current.locals;if(e.isDefined(b&&b.$template)){var b=a.$new(),d=s.current;l=w(b,function(d){h.enter(d,null,l||c,function(){!e.isDefined(t)||t&&!a.$eval(t)||g()});y()});k=d.scope=b;k.$emit("$viewContentLoaded");k.$eval(u)}else y()}
7 | var k,l,p,t=b.autoscroll,u=b.onload||"";a.$on("$routeChangeSuccess",v);v()}}}function z(e,g,h){return{restrict:"ECA",priority:-400,link:function(a,c){var b=h.current,f=b.locals;c.html(f.$template);var w=e(c.contents());b.controller&&(f.$scope=a,f=g(b.controller,f),b.controllerAs&&(a[b.controllerAs]=f),c.data("$ngControllerController",f),c.children().data("$ngControllerController",f));w(a)}}}n=e.module("ngRoute",["ng"]).provider("$route",function(){function s(a,c){return e.extend(new (e.extend(function(){},
8 | {prototype:a})),c)}function g(a,e){var b=e.caseInsensitiveMatch,f={originalPath:a,regexp:a},h=f.keys=[];a=a.replace(/([().])/g,"\\$1").replace(/(\/)?:(\w+)([\?\*])?/g,function(a,e,b,c){a="?"===c?c:null;c="*"===c?c:null;h.push({name:b,optional:!!a});e=e||"";return""+(a?"":e)+"(?:"+(a?e:"")+(c&&"(.+?)"||"([^/]+)")+(a||"")+")"+(a||"")}).replace(/([\/$\*])/g,"\\$1");f.regexp=RegExp("^"+a+"$",b?"i":"");return f}var h={};this.when=function(a,c){h[a]=e.extend({reloadOnSearch:!0},c,a&&g(a,c));if(a){var b=
9 | "/"==a[a.length-1]?a.substr(0,a.length-1):a+"/";h[b]=e.extend({redirectTo:a},g(b,c))}return this};this.otherwise=function(a){this.when(null,a);return this};this.$get=["$rootScope","$location","$routeParams","$q","$injector","$http","$templateCache","$sce",function(a,c,b,f,g,n,v,k){function l(){var d=p(),m=r.current;if(d&&m&&d.$$route===m.$$route&&e.equals(d.pathParams,m.pathParams)&&!d.reloadOnSearch&&!u)m.params=d.params,e.copy(m.params,b),a.$broadcast("$routeUpdate",m);else if(d||m)u=!1,a.$broadcast("$routeChangeStart",
10 | d,m),(r.current=d)&&d.redirectTo&&(e.isString(d.redirectTo)?c.path(t(d.redirectTo,d.params)).search(d.params).replace():c.url(d.redirectTo(d.pathParams,c.path(),c.search())).replace()),f.when(d).then(function(){if(d){var a=e.extend({},d.resolve),c,b;e.forEach(a,function(d,c){a[c]=e.isString(d)?g.get(d):g.invoke(d)});e.isDefined(c=d.template)?e.isFunction(c)&&(c=c(d.params)):e.isDefined(b=d.templateUrl)&&(e.isFunction(b)&&(b=b(d.params)),b=k.getTrustedResourceUrl(b),e.isDefined(b)&&(d.loadedTemplateUrl=
11 | b,c=n.get(b,{cache:v}).then(function(a){return a.data})));e.isDefined(c)&&(a.$template=c);return f.all(a)}}).then(function(c){d==r.current&&(d&&(d.locals=c,e.copy(d.params,b)),a.$broadcast("$routeChangeSuccess",d,m))},function(c){d==r.current&&a.$broadcast("$routeChangeError",d,m,c)})}function p(){var a,b;e.forEach(h,function(f,h){var q;if(q=!b){var g=c.path();q=f.keys;var l={};if(f.regexp)if(g=f.regexp.exec(g)){for(var k=1,p=g.length;k
Terms and Privacy Policy ",
60 | "create_your_tezbox" : "Create your Account",
61 | "new_mnemonic" : "New Mnemonic",
62 | "continue" : "Continue",
63 | "cancel" : "Cancel",
64 | "validate_your_tezbox" : "Validate your Account",
65 | "secure_your_tezbox" : "Secure Your TezBox",
66 | "encrypt_wallet" : "Encrypt TezBox",
67 | "link_your_tezbox" : "Link your Account",
68 | "connect_tezbox" : "Connect Account",
69 | "unlock_wallet" : "Unlock Wallet",
70 | "clear_tezbox" : "Clear TezBox",
71 | "back" : "Back",
72 | "show" : "Show",
73 | "hide" : "Hide",
74 | "seed_words_mnenomic" : "Seed Words/Mnenomic (leave a space between each word)",
75 | "seed_words_mnenomic_placeholder" : "Enter Seed Words",
76 | "optional_passphrase" : "Optional Passphrase",
77 | "optional_passphrase_tooltip" : "The optional passphrase will add an additional layer of security to your private key, and will also need to used to restore your account (so write this down as well). This is not the same as an encryption password.",
78 | "optional_passphrase_tooltip2" : "If no passphrase was set, just leave this blank",
79 | "password" : "Password",
80 | "password_tooltip2" : "Your password needs to be at least 8 characters long, and include at least one lowercase, one uppercase, and one special character (numeric or symbol), and must not contain blank spaces.",
81 | "password_again" : "Repeat Password",
82 | "hd_derivation_path" : "HD Derivation Path",
83 | "address" : "Address",
84 | "enter_password" : "Enter Password",
85 | "enter_password_to_show" : "Enter your password to show",
86 | "rpc_address" : "RPC Address",
87 | "ledger" : "Ledger",
88 | "trezor" : "Trezor",
89 | "offline_signer" : "Offline Signer",
90 | "trezor_coming_soon" : "Trezor support coming soon...",
91 | "warning" : "Be warned that you are dealing with the mainnet, which is a LIVE NETWORK. All transactions on this network are final.",
92 | "create_info" : "Please write your seed words below and store them in a secure place. These can be used to restore your wallet. If you choose to use a Passphrase, this will need to be noted down and stored as well",
93 | "validate_info" : "Please re-enter your seed words and passphrase in full from the previous step. This is to confirm that you have correctly recorded these down.",
94 | "secure_your_tezbox_info" : "Please enter a password to encrypt your private data. This password is only used to unlock your wallet (not required to restore it).",
95 | "ledger_info" : "Currently only the Ledger Nano S is supported - please also ensure the Tezos Wallet app has been setup on your Ledger, is updated and is currently open.",
96 | "trezor_info" : "Currently only the Trezor T is supported - please also ensure the firmware one your Trezor T has been updated to the latest version, and is plugged in and unlocked.",
97 | "hd_derivation_path_info" : "Advanced option to access different addresses - leave as it is to use the default key",
98 | "offline_signer_info" : "This method is effectively a view-only wallet. You can use an offline signing tool (an official TezBox tool is currently being developed).",
99 | "tezbox_settings_info" : "Please be careful with changing or interacting with these settings.",
100 | "export_private_key_info" : "Please be careful with this option, as anyone viewing your screen will see the private key below. NOTE: this will only export the private key for this manager account!",
101 | "rpc_address_info" : "When running your own node, you can use your IP/domain here to connect to it by default. This needs to be available via SSL (HTTPS) to work with this wallet.",
102 | "tezbox_settings" : "TezBox Settings",
103 | "restore_your_tezbox" : "Restore your TezBox",
104 | "export_private_key" : "Export Private Key",
105 | "ico_fundraiser_wallet" : "ICO/Fundraiser Wallet",
106 | "seed_phrase" : "Seed Phrase",
107 | "private_key" : "Private Key",
108 | "ico_fundraiser_wallet_info" : "If you have a Fundraiser/ICO wallet, you must use this option everytime to restore your wallet. Please enter your seed words, email address, password and address/public key hash from the Fundraiser PDF. If your account has not been activated, please enter the activation code below as well.",
109 | "15_word_secret_key" : "15 Word Secret Key/Seed (leave a space between each word)",
110 | "email" : "Email",
111 | "email_tooltip" : "From the Fundraiser PDF, must be entered in exactly",
112 | "password_tooltip" : "This is the password you entered when you contributed to the ICO/Fundraiser. This may not be the same password as the account you created to complete KYC, and is not recorded on the Fundraiser PDF.",
113 | "public_key_hash" : "Public Key Hash",
114 | "public_key_hash_tooltip" : "From the Fundraiser PDF, must be entered in exactly",
115 | "activation_code" : "Activation Code",
116 | "activation_code_tooltip" : "Only enter if you haven't already activated your account",
117 | "seed_phrase_info" : "Please enter your seed and passphrase below and we will attempt to restore your wallet. If you are trying to restore your Fundraiser/ICO wallet please select the 'Fundraiser Wallet' tab instead (even if you have restored it previously)",
118 | "private_key_info" : "Please enter your private key and we will attempt to restore your wallet. This option is for those users who have exported a private key from the Tezos client (or have generated one elsewhere). Currently we only accept the \"edsk...\" and the \"edesk...\" variants. You will need to enter your encryption password if you are trying to import an encrypted private key (\"edesk..\")",
119 | "private_key_tooltip" : "Your private key can be exported from the Tezos Client or other wallets, and will start with edesk or edsk",
120 | "encryption_password" : "Encryption Password",
121 | "encryption_password_tooltip" : "This is the password used in the Tezos Client to encrypt your private key",
122 | "restore_tezbox" : "Restore Account",
123 | "activation_successful" : "Activation was successful - please keep in mind that it may take a few minutes for your balance to show!",
124 | "activation_unsuccessful" : "Activation was unsuccessful - please ensure the code is right, or leave it blank if you have already activated your account!",
125 | "restoring" : "Restoring...",
126 | "linking" : "Linking...",
127 | "ledger_confirm_transaction" : "Please confirm the transaction on your Ledger Nano S Device",
128 | "trezor_confirm_transaction" : "Please confirm the transaction on your Trezor T Device",
129 | "ledger_verify_address" : "Please verify the address on your Ledger Nano S Device",
130 | "trezor_verify_address" : "Please verify the address on your Trezor T Device",
131 | "ledger_retreived_address" : "We have retreived the following address from your hardware wallet",
132 | "ledger_error_connect" : "There was an issue connecting to your Ledger device. Please ensure your device is connected, and the Tezos Wallet app is selected.",
133 | "trezor_error_connect" : "There was an issue connecting to your hardware wallet. Please ensure your device is connected, and you are running the latest firmware.",
134 | "ledger_error_signing" : "There was an error signing this operation with your Ledger",
135 | "details_dont_match" : "Sorry, those details do not match - please try again, or go back and create a new account again",
136 | "please_enter_password" : "Please enter your password",
137 | "incorrect_password" : "Incorrect password",
138 | "clear_tezbox_warning" : "You are about to clear you TezBox - note, unless you've backed up your seed words or private key you'll no longer have access to your accounts",
139 | "yes_clear_it" : "Yes, clear it!",
140 | "my_accounts" : "My Accounts",
141 | "add_account" : "Add Account",
142 | "level" : "Level",
143 | "disclaimer" : "Disclaimer",
144 | "terms" : "Terms",
145 | "privacy" : "Privacy",
146 | "view_on_tezosid" : "View on Tezos.ID",
147 | "account_notadded" : "This account has not been added to the blockchain yet - please wait for a baker to include this in a block before you can use this account. This error may also show if your device can't connect to the Tezos Network.",
148 | "transactions" : "Transactions",
149 | "send" : "Send",
150 | "delegate" : "Delegate",
151 | "options" : "Options",
152 | "no_transactions" : "No transactions available",
153 | "received" : "RECEIVED",
154 | "sent" : "SENT",
155 | "from" : "From",
156 | "to" : "To",
157 | "last_20_transactions" : "Only the last 20 transactions are being displayed.",
158 | "view_more_here" : "View more here",
159 | "destination_address" : "Destination Address",
160 | "destination_tooltip" : "This is the address you want to send to - please enter a valid KT1 or tz address",
161 | "enter_address" : "Enter Address",
162 | "amount" : "Amount",
163 | "amount_tooltip" : "Please enter an amount in tez. When sending from a tz address, you must leave at least 0.000001 behind",
164 | "max" : "Max",
165 | "fee" : "Fee",
166 | "fee_tooltip" : "This is the total fee to paid for the transaction. Currently 0 tez fees are accepted.",
167 | "custom_fee" : "Custom Fee",
168 | "fee_options" : "Fee Options",
169 | "no_fee" : "No Fee",
170 | "low" : "Low",
171 | "medium" : "Medium",
172 | "high" : "High",
173 | "show_advanced_options" : "Show Advanced Options",
174 | "hide_advanced_options" : "Hide Advanced Options",
175 | "parameters" : "Parameters",
176 | "parameters_tooltip" : "Optional parameters to send as input - this is only required for some smart contracts.",
177 | "gas_limit" : "Gas Limit",
178 | "gas_limit_tooltip" : "Set the gas limit for this operations. For simple transactions, you can leave this as the default",
179 | "storage_limit" : "Storage Limit",
180 | "storage_limit_tooltip" : "Set the storage limit for this operations. For simple transactions, you can leave this as the default",
181 | "clear" : "Clear",
182 | "ensure_delegate" : "Please ensure the delegate you are entering has been registered to participate in the baking protocol.",
183 | "endorse_delegate" : "TezBox doesn't endorse any of the listed delegation services listed below - please ensure you are doing your own research into each one.",
184 | "disabled_delegate" : "Delegation from this address is not allowed (lowercase tz addresses) - these are referred to as implicit addresses and the protocol doesn't allow them to delegate to another key. Please create an account (KT address) to use for delegation.",
185 | "comingsoon_delegate" : "Delegation has changed with the Babylon upgrade - you can now delegate directly from your tz* address. If you want to change your delegate, please transfer your funds to your tz* address and delegate from there. We will re-add delegation for KT1 addresses in the future.",
186 | "delegate_options" : "Delegate Options",
187 | "delegate_options_tooltip" : "Delegate your account to participate in the baking process. Select a pre-set baker, or enter your own",
188 | "custom_delegate" : "Custom Delegate",
189 | "custom_delegate_tooltip" : "Enter your custom delegate address here - it must start with tz...",
190 | "update_delegate" : "Update Delegate",
191 | "title" : "Title",
192 | "update_title" : "Update Title",
193 | "import_kt1_account" : "Import KT1 Account",
194 | "import_kt1_account_msg" : "You can use this to import KT1 addresses that have been originated else where (or after you have restored your account). You can view all of your originated KT1 addresses on",
195 | "import" : "Import",
196 | "remove_account" : "Remove Account",
197 | "remove_account_warning" : "You are about to remove this account from your wallet! (You can always restore this account in future)",
198 | "remove_conract" : "Remove Contract",
199 | "connected_to" : "Connected to",
200 | "not_connected" : "Not Connected",
201 | "remove_conract_warning" : "You are about to remove this contract from your wallet! (You can always restore this account in future by going to Options > Import)",
202 | "yes_remove_it" : "Yes, remove it!",
203 | "originate_warning" : "Creating a new account incurs a fee of 0.26ꜩ. Do you want to continue?)",
204 | "yes_continue" : "Yes, continue!",
205 | "new_account_originated" : "Your new account has been originated - this may take a few minutes to be included on the blockchain",
206 | "origination_error" : "There was an error adding account. Please ensure your main account has funds available",
207 | "loading" : "Loading...",
208 | "copy_clipboard" : "The address has been copied to your clipboard",
209 | "confirm" : "Confirm",
210 | "yes_send_it" : "Yes, send it!",
211 | "transaction_sent" : "Transaction has been sent - this may take a few minutes to be included on the blockchain",
212 | "operation_failed" : "Operation Failed!",
213 | "operation_failed2" : "Operation Failed! Please check your inputs",
214 | "delegation_success" : "Delegation operation was successful - this may take a few minutes to update",
215 | "delegation_failed" : "Delegation Failed",
216 | "import_kt_address" : "Import KT addresses",
217 | "import_kt_address_info" : "We have found $$ KT1 address(es) linked to your public key - would you like to import them now? (You can also manually import these by going to Options > Import)",
218 | "yes_import_them" : "Yes, import them!",
219 | "ico_restore_success" : "You have successfully restored your ICO wallet. If you have just activated your account, please note that this may take some time to show.",
220 | "transaction_confirm_info" : "You are about to send $$ꜩ to $$ - this transaction is irreversible",
221 | "transaction_confirm_lowtz" : "You are sending to an empty implicit (tz) account - this will incur an additional fee of 0.257ꜩ. Do you want to continue?",
222 | "extra_fee" : "Additional fees!",
223 | "create_manager" : "Create Account",
224 | "restore_manager" : "Restore Account",
225 | "connect_hardware" : "Connect Ledger/Trezor",
226 | "sub_accounts" : "Accounts",
227 | "settings" : "Settings",
228 | "lock_wallet" : "Lock Wallet",
229 | "last_account_error" : "You can't remove this account as you must have at least one manager account! You can log out then click Clear TezBox if you want to complete delete your TezBox data.",
230 | "error_baby_originate" : "The new Babylon upgrade means you can delegate directly from your tz* address, and contract origination is now reserved for more complex purposes. We are working on smart contract support currently.",
231 | "link_tezbox" : "Use Ledger/Trezor",
232 | "restore_tezbox2" : "Restore Existing Account",
233 | "create_tezbox" : "Create New Account",
234 | "hd_path" : "Hardware Wallet HD Path",
235 | "hd_path_info" : "Your HD path is the unique identifier to access your account on your Hardware Wallet - this is not the same as the private seed/key, which is also needed and should be kept somewhere secure.",
236 | "error_send_to_tz" : "KT addresses can only be used to send to tz* addresses at the moment",
237 | "error_param_send" : "KT addresses can't send custom parameters currently",
238 | "kt_send_fees" : "Sending from KT addresses require additional gas and a higher fee. Please use around 30k gas and a Medium fee.",
239 | }
240 |
241 | },
242 | r = {};
243 | r.setLang = function(l){
244 | _lang = l;
245 | };
246 | r.getLangs = _langs;
247 | r.translate = function(id, rep){
248 | if (typeof rep != 'undefined' && typeof _translations[_lang][id] != 'undefined'){
249 | var tt = _translations[_lang][id];
250 | for(var i = 0; i < rep.length; i++){
251 | tt = tt.replace("$$", rep[i]);
252 | }
253 | return tt;
254 | } else return (typeof _translations[_lang][id] != 'undefined' ? _translations[_lang][id] : _lang + "." + id);
255 | };
256 | return r;
257 | }]);
258 |
--------------------------------------------------------------------------------
/app/services/storage.js:
--------------------------------------------------------------------------------
1 | app.service('Storage', function() {
2 | var r = {};
3 | var tempaccount = false, tempkey;
4 | r.newKey = false;
5 | r.storageVersion = 3;
6 | r.loaded = false;
7 | r.data = false;
8 | r.settings = {};
9 |
10 | r.keys = [];
11 | r.password = '';
12 | r.restored = false;
13 | r.ico = false;
14 |
15 | r.load = function(){
16 | if (!r.loaded){
17 | r.loadSetting();
18 | r.loadStore();
19 | r.updateStore();
20 | r.loaded = true;
21 | }
22 | }
23 | r.updateStore = function(){
24 | //V1 update
25 | if (!r.data) return;
26 | if (typeof r.data.version == 'undefined'){
27 | //Test - add storage version
28 | r.data.version = 1;
29 | r.setStore();
30 | console.log("Updated storage to version 1");
31 | }
32 |
33 | //v2 update
34 | if (r.data.version == 1){
35 | //Test - increment storage version
36 | r.data.version = 2;
37 | r.setStore();
38 | console.log("Updated storage to version 2");
39 | }
40 |
41 | //v3 update
42 | if (r.data.version == 2){
43 | //Actual first version increment
44 | //Multi-account change - migrate accounts to multiple array
45 | var tempensk = r.data.ensk;
46 | delete r.data.ensk;
47 | var newData = {
48 | account : 0,
49 | accounts : [r.data],
50 | oldEnsk : true,
51 | ensk : tempensk,
52 | version : 3,
53 | };
54 | r.setStore(newData);
55 | console.log("Updated storage to version 3");
56 | }
57 | }
58 | r.loadStore = function(){
59 | var dd = JSON.parse(localStorage.getItem('tbstore'));
60 | if (dd){
61 | r.data = dd;
62 | }
63 | return r.data;
64 | };
65 | r.clearNewAccount = function(){
66 | r.newKey = false;
67 | tempaccount = '';
68 | tempkey = '';
69 | }
70 | r.checkNewPkh = function(pkh){
71 | if (!r.newKey) return false;
72 | return (pkh == tempkey.pkh);
73 | }
74 | r.newAccount = function(v, k){
75 | tempaccount = v;
76 | tempkey = k;
77 | r.newKey = true;
78 | };
79 | r.addNewAccount = function(v, k){
80 | if (typeof v != 'undefined') tempaccount = v;
81 | if (typeof k != 'undefined') tempkey = k;
82 | if (!r.data) r.data = {
83 | accounts : [],
84 | account : 0,
85 | };
86 | r.data.accounts.push(tempaccount);
87 | r.keys.push(tempkey);
88 | r.data.account = (r.data.accounts.length-1);
89 | r.newKey = false;
90 | tempaccount = '';
91 | tempkey = '';
92 | r.setStore();
93 | };
94 |
95 | r.setStore = function(v, k, p){
96 | if (typeof v != 'undefined') r.data = v;
97 | if (typeof k != 'undefined') r.keys = k;
98 | if (typeof p != 'undefined') r.password = p;
99 | if (typeof r.data.version == 'undefined') r.data.version = r.storageVersion;
100 | localStorage.setItem('tbstore', JSON.stringify(r.data));
101 | };
102 | r.clearStore = function(){
103 | r.keys = [];
104 | r.password = '';
105 | r.restored = false;
106 | r.ico = false;
107 | r.data = false;
108 | var s = r.settings;
109 | localStorage.clear();
110 | r.setSetting(s);
111 | };
112 | r.setSetting = function(v){
113 | r.settings = v;
114 | localStorage.setItem('tbsetting', JSON.stringify(v));
115 | };
116 | r.loadSetting = function(){
117 | r.settings = JSON.parse(localStorage.getItem('tbsetting'));
118 | return r.settings;
119 | };
120 | r.load();
121 | return r;
122 | });
123 |
--------------------------------------------------------------------------------
/app/views/create.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
12 |
13 |
{{translate("create_your_tezbox")}}
14 |
15 |
16 |
17 |
{{translate("create_info")}}
18 |
19 |
27 |
28 |
36 |
37 |
38 |
--------------------------------------------------------------------------------
/app/views/encrypt.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
12 |
13 |
{{translate('secure_your_tezbox')}}
14 |
15 |
16 |
17 |
{{translate("secure_your_tezbox_info")}}
18 |
19 |
29 |
30 |
38 |
39 |
40 |
--------------------------------------------------------------------------------
/app/views/link.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
12 |
13 |
{{translate('link_your_tezbox')}}
14 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
{{translate('ledger_info')}}
42 |
43 |
50 |
51 |
52 |
53 |
{{translate('trezor_info')}}
54 |
55 |
62 |
63 |
64 |
65 |
{{translate('offline_signer_info')}}
66 |
67 |
72 |
73 |
81 |
82 |
83 |
84 |
85 |
--------------------------------------------------------------------------------
/app/views/new.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
TezBox
9 | {{translate("secure_tezos_wallet")}}
10 |
11 |
12 |
13 |
14 |
15 |
20 |
25 |
26 |
27 |
{{translate("link_hardware_wallet")}}
28 |
29 |
30 |
35 |
44 |
49 |
50 |
51 |
52 |
{{translate("warning")}}
53 |
Please read and accept the Terms and Privacy Policy to continue
54 |
55 |
58 |
59 |
60 |
--------------------------------------------------------------------------------
/app/views/restore.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
12 |
13 |
{{translate('restore_your_tezbox')}}
14 |
21 |
22 |
37 |
38 |
39 |
40 |
41 |
42 |
{{translate('ico_fundraiser_wallet_info')}}
43 |
44 |
45 |
46 | {{translate('15_word_secret_key')}} *
47 |
48 |
49 |
50 |
51 |
52 | {{translate('email')}} *
53 |
54 |
55 |
56 |
57 |
58 | {{translate('password')}} *
59 |
60 |
61 |
62 |
63 |
64 | {{translate('public_key_hash')}} *
65 |
66 |
67 |
68 |
69 |
70 | {{translate('activation_code')}}
71 |
72 |
73 |
74 |
75 |
76 |
77 |
{{translate('seed_phrase_info')}}
78 |
79 |
80 |
81 | {{translate('seed_words_mnenomic')}} *
82 |
83 |
84 |
85 | {{translate('optional_passphrase')}}
86 |
87 |
88 |
89 |
90 |
91 |
92 |
{{translate('private_key_info')}}
93 |
94 |
105 |
106 |
114 |
115 |
116 |
117 |
118 |
--------------------------------------------------------------------------------
/app/views/setting.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
12 |
13 |
{{translate('tezbox_settings')}}
14 |
15 |
16 |
17 |
{{translate('tezbox_settings_info')}}
18 |
19 |
30 |
33 |
34 |
35 |
36 |
--------------------------------------------------------------------------------
/app/views/unlock.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
TezBox
9 | {{translate("secure_tezos_wallet")}}
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
{{translate("welcome_back")}}
19 |
20 |
21 |
22 | {{translate('enter_password')}}
23 |
26 |
27 |
28 |
31 |
34 |
35 |
36 |
37 |
38 |
--------------------------------------------------------------------------------
/app/views/validate.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
12 |
13 |
{{translate('validate_your_tezbox')}}
14 |
15 |
16 |
17 |
{{translate("validate_info")}}
18 |
19 |
20 |
21 | {{translate('seed_words_mnenomic')}} *
22 |
23 |
24 |
25 | {{translate('optional_passphrase')}}
26 |
27 |
28 |
29 |
30 |
38 |
39 |
40 |
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 | TezBox - Wallet Application
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
40 |
41 |
42 |
--------------------------------------------------------------------------------
/skin/css/angular-csp.css:
--------------------------------------------------------------------------------
1 | /* Include this file in your html if you are using the CSP mode. */
2 |
3 | @charset "UTF-8";
4 |
5 | [ng\:cloak], [ng-cloak], [data-ng-cloak], [x-ng-cloak],
6 | .ng-cloak, .x-ng-cloak,
7 | .ng-hide {
8 | display: none !important;
9 | }
10 |
11 | ng\:form {
12 | display: block;
13 | }
14 |
15 | .ng-animate-block-transitions {
16 | transition:0s all!important;
17 | -webkit-transition:0s all!important;
18 | }
19 |
20 | /* show the element during a show/hide animation when the
21 | * animation is ongoing, but the .ng-hide class is active */
22 | .ng-hide-add-active, .ng-hide-remove {
23 | display: block!important;
24 | }
25 |
--------------------------------------------------------------------------------
/skin/css/sweet-alert.css:
--------------------------------------------------------------------------------
1 | @import url(//fonts.googleapis.com/css?family=Open+Sans:400,600,700,300);
2 | .sweet-overlay {
3 | background-color: rgba(0, 0, 0, 0.4);
4 | position: fixed;
5 | left: 0;
6 | right: 0;
7 | top: 0;
8 | bottom: 0;
9 | display: none;
10 | z-index: 1000; }
11 |
12 | .sweet-alert {
13 | background-color: white;
14 | font-family: 'Open Sans', sans-serif;
15 | width: 478px;
16 | padding: 17px;
17 | border-radius: 5px;
18 | text-align: center;
19 | position: fixed;
20 | left: 50%;
21 | top: 50%;
22 | margin-left: -256px;
23 | margin-top: -200px;
24 | overflow: hidden;
25 | display: none;
26 | z-index: 2000; }
27 | @media all and (max-width: 540px) {
28 | .sweet-alert {
29 | width: auto;
30 | margin-left: 0;
31 | margin-right: 0;
32 | left: 15px;
33 | right: 15px; } }
34 | .sweet-alert h2 {
35 | color: #575757;
36 | font-size: 30px;
37 | text-align: center;
38 | font-weight: 600;
39 | text-transform: none;
40 | position: relative; }
41 | .sweet-alert p {
42 | color: #797979;
43 | font-size: 16px;
44 | text-align: center;
45 | font-weight: 300;
46 | position: relative;
47 | margin: 0;
48 | line-height: normal; }
49 | .sweet-alert button {
50 | background-color: #8F015E;
51 | color: white;
52 | border: none;
53 | box-shadow: none;
54 | font-size: 17px;
55 | font-weight: 500;
56 | border-radius: 5px;
57 | padding: 10px 32px;
58 | margin: 26px 5px 0 5px;
59 | cursor: pointer; }
60 | .sweet-alert button:focus {
61 | outline: none;
62 | box-shadow: 0 0 2px rgba(128, 179, 235, 0.5), inset 0 0 0 1px rgba(0, 0, 0, 0.05); }
63 | .sweet-alert button:hover {
64 | background-color: #a1d9f2; }
65 | .sweet-alert button:active {
66 | background-color: #81ccee; }
67 | .sweet-alert button.cancel {
68 | background-color: #D0D0D0; }
69 | .sweet-alert button.cancel:hover {
70 | background-color: #c8c8c8; }
71 | .sweet-alert button.cancel:active {
72 | background-color: #b6b6b6; }
73 | .sweet-alert button.cancel:focus {
74 | box-shadow: rgba(197, 205, 211, 0.8) 0px 0px 2px, rgba(0, 0, 0, 0.0470588) 0px 0px 0px 1px inset !important; }
75 | .sweet-alert[data-has-cancel-button=false] button {
76 | box-shadow: none !important; }
77 | .sweet-alert .icon {
78 | width: 80px;
79 | height: 80px;
80 | border: 4px solid gray;
81 | border-radius: 50%;
82 | margin: 20px auto;
83 | position: relative;
84 | box-sizing: content-box; }
85 | .sweet-alert .icon.error {
86 | border-color: #EB1459; }
87 | .sweet-alert .icon.error .x-mark {
88 | position: relative;
89 | display: block; }
90 | .sweet-alert .icon.error .line {
91 | position: absolute;
92 | height: 5px;
93 | width: 47px;
94 | background-color: #EB1459;
95 | display: block;
96 | top: 37px;
97 | border-radius: 2px; }
98 | .sweet-alert .icon.error .line.left {
99 | -webkit-transform: rotate(45deg);
100 | transform: rotate(45deg);
101 | left: 17px; }
102 | .sweet-alert .icon.error .line.right {
103 | -webkit-transform: rotate(-45deg);
104 | transform: rotate(-45deg);
105 | right: 16px; }
106 | .sweet-alert .icon.warning {
107 | border-color: #EB1459; }
108 | .sweet-alert .icon.warning .body {
109 | position: absolute;
110 | width: 5px;
111 | height: 47px;
112 | left: 50%;
113 | top: 10px;
114 | border-radius: 2px;
115 | margin-left: -2px;
116 | background-color: #EB1459; }
117 | .sweet-alert .icon.warning .dot {
118 | position: absolute;
119 | width: 7px;
120 | height: 7px;
121 | border-radius: 50%;
122 | margin-left: -3px;
123 | left: 50%;
124 | bottom: 10px;
125 | background-color: #EB1459; }
126 | .sweet-alert .icon.info {
127 | border-color: #6CDBFE; }
128 | .sweet-alert .icon.info::before {
129 | content: "";
130 | position: absolute;
131 | width: 5px;
132 | height: 29px;
133 | left: 50%;
134 | bottom: 17px;
135 | border-radius: 2px;
136 | margin-left: -2px;
137 | background-color: #6CDBFE; }
138 | .sweet-alert .icon.info::after {
139 | content: "";
140 | position: absolute;
141 | width: 7px;
142 | height: 7px;
143 | border-radius: 50%;
144 | margin-left: -3px;
145 | top: 19px;
146 | background-color: #6CDBFE; }
147 | .sweet-alert .icon.success {
148 | border-color: #14D2B8; }
149 | .sweet-alert .icon.success::before, .sweet-alert .icon.success::after {
150 | content: '';
151 | border-radius: 50%;
152 | position: absolute;
153 | width: 60px;
154 | height: 120px;
155 | background: white;
156 | transform: rotate(45deg); }
157 | .sweet-alert .icon.success::before {
158 | border-radius: 120px 0 0 120px;
159 | top: -7px;
160 | left: -33px;
161 | -webkit-transform: rotate(-45deg);
162 | transform: rotate(-45deg);
163 | -webkit-transform-origin: 60px 60px;
164 | transform-origin: 60px 60px; }
165 | .sweet-alert .icon.success::after {
166 | border-radius: 0 120px 120px 0;
167 | top: -11px;
168 | left: 30px;
169 | -webkit-transform: rotate(-45deg);
170 | transform: rotate(-45deg);
171 | -webkit-transform-origin: 0px 60px;
172 | transform-origin: 0px 60px; }
173 | .sweet-alert .icon.success .placeholder {
174 | width: 80px;
175 | height: 80px;
176 | border: 4px solid rgba(165, 220, 134, 0.2);
177 | border-radius: 50%;
178 | box-sizing: content-box;
179 | position: absolute;
180 | left: -4px;
181 | top: -4px;
182 | z-index: 2; }
183 | .sweet-alert .icon.success .fix {
184 | width: 5px;
185 | height: 90px;
186 | background-color: white;
187 | position: absolute;
188 | left: 28px;
189 | top: 8px;
190 | z-index: 1;
191 | -webkit-transform: rotate(-45deg);
192 | transform: rotate(-45deg); }
193 | .sweet-alert .icon.success .line {
194 | height: 5px;
195 | background-color: #14D2B8;
196 | display: block;
197 | border-radius: 2px;
198 | position: absolute;
199 | z-index: 2; }
200 | .sweet-alert .icon.success .line.tip {
201 | width: 25px;
202 | left: 14px;
203 | top: 46px;
204 | -webkit-transform: rotate(45deg);
205 | transform: rotate(45deg); }
206 | .sweet-alert .icon.success .line.long {
207 | width: 47px;
208 | right: 8px;
209 | top: 38px;
210 | -webkit-transform: rotate(-45deg);
211 | transform: rotate(-45deg); }
212 | .sweet-alert .icon.custom {
213 | background-size: contain;
214 | border-radius: 0;
215 | border: none;
216 | background-position: center center;
217 | background-repeat: no-repeat; }
218 |
219 | /*
220 | * Animations
221 | */
222 | @-webkit-keyframes showSweetAlert {
223 | 0% {
224 | transform: scale(0.7);
225 | -webkit-transform: scale(0.7); }
226 | 45% {
227 | transform: scale(1.05);
228 | -webkit-transform: scale(1.05); }
229 | 80% {
230 | transform: scale(0.95);
231 | -webkit-tranform: scale(0.95); }
232 | 100% {
233 | transform: scale(1);
234 | -webkit-transform: scale(1); } }
235 | @-moz-keyframes showSweetAlert {
236 | 0% {
237 | transform: scale(0.7);
238 | -webkit-transform: scale(0.7); }
239 | 45% {
240 | transform: scale(1.05);
241 | -webkit-transform: scale(1.05); }
242 | 80% {
243 | transform: scale(0.95);
244 | -webkit-tranform: scale(0.95); }
245 | 100% {
246 | transform: scale(1);
247 | -webkit-transform: scale(1); } }
248 | @keyframes showSweetAlert {
249 | 0% {
250 | transform: scale(0.7);
251 | -webkit-transform: scale(0.7); }
252 | 45% {
253 | transform: scale(1.05);
254 | -webkit-transform: scale(1.05); }
255 | 80% {
256 | transform: scale(0.95);
257 | -webkit-tranform: scale(0.95); }
258 | 100% {
259 | transform: scale(1);
260 | -webkit-transform: scale(1); } }
261 | @-webkit-keyframes hideSweetAlert {
262 | 0% {
263 | transform: scale(1);
264 | -webkit-transform: scale(1); }
265 | 100% {
266 | transform: scale(0.5);
267 | -webkit-transform: scale(0.5); } }
268 | @-moz-keyframes hideSweetAlert {
269 | 0% {
270 | transform: scale(1);
271 | -webkit-transform: scale(1); }
272 | 100% {
273 | transform: scale(0.5);
274 | -webkit-transform: scale(0.5); } }
275 | @keyframes hideSweetAlert {
276 | 0% {
277 | transform: scale(1);
278 | -webkit-transform: scale(1); }
279 | 100% {
280 | transform: scale(0.5);
281 | -webkit-transform: scale(0.5); } }
282 | .showSweetAlert {
283 | -webkit-animation: showSweetAlert 0.3s;
284 | -moz-animation: showSweetAlert 0.3s;
285 | animation: showSweetAlert 0.3s; }
286 |
287 | .hideSweetAlert {
288 | -webkit-animation: hideSweetAlert 0.2s;
289 | -moz-animation: hideSweetAlert 0.2s;
290 | animation: hideSweetAlert 0.2s; }
291 |
292 | @-webkit-keyframes animateSuccessTip {
293 | 0% {
294 | width: 0;
295 | left: 1px;
296 | top: 19px; }
297 | 54% {
298 | width: 0;
299 | left: 1px;
300 | top: 19px; }
301 | 70% {
302 | width: 50px;
303 | left: -8px;
304 | top: 37px; }
305 | 84% {
306 | width: 17px;
307 | left: 21px;
308 | top: 48px; }
309 | 100% {
310 | width: 25px;
311 | left: 14px;
312 | top: 45px; } }
313 | @-moz-keyframes animateSuccessTip {
314 | 0% {
315 | width: 0;
316 | left: 1px;
317 | top: 19px; }
318 | 54% {
319 | width: 0;
320 | left: 1px;
321 | top: 19px; }
322 | 70% {
323 | width: 50px;
324 | left: -8px;
325 | top: 37px; }
326 | 84% {
327 | width: 17px;
328 | left: 21px;
329 | top: 48px; }
330 | 100% {
331 | width: 25px;
332 | left: 14px;
333 | top: 45px; } }
334 | @keyframes animateSuccessTip {
335 | 0% {
336 | width: 0;
337 | left: 1px;
338 | top: 19px; }
339 | 54% {
340 | width: 0;
341 | left: 1px;
342 | top: 19px; }
343 | 70% {
344 | width: 50px;
345 | left: -8px;
346 | top: 37px; }
347 | 84% {
348 | width: 17px;
349 | left: 21px;
350 | top: 48px; }
351 | 100% {
352 | width: 25px;
353 | left: 14px;
354 | top: 45px; } }
355 | @-webkit-keyframes animateSuccessLong {
356 | 0% {
357 | width: 0;
358 | right: 46px;
359 | top: 54px; }
360 | 65% {
361 | width: 0;
362 | right: 46px;
363 | top: 54px; }
364 | 84% {
365 | width: 55px;
366 | right: 0px;
367 | top: 35px; }
368 | 100% {
369 | width: 47px;
370 | right: 8px;
371 | top: 38px; } }
372 | @-moz-keyframes animateSuccessLong {
373 | 0% {
374 | width: 0;
375 | right: 46px;
376 | top: 54px; }
377 | 65% {
378 | width: 0;
379 | right: 46px;
380 | top: 54px; }
381 | 84% {
382 | width: 55px;
383 | right: 0px;
384 | top: 35px; }
385 | 100% {
386 | width: 47px;
387 | right: 8px;
388 | top: 38px; } }
389 | @keyframes animateSuccessLong {
390 | 0% {
391 | width: 0;
392 | right: 46px;
393 | top: 54px; }
394 | 65% {
395 | width: 0;
396 | right: 46px;
397 | top: 54px; }
398 | 84% {
399 | width: 55px;
400 | right: 0px;
401 | top: 35px; }
402 | 100% {
403 | width: 47px;
404 | right: 8px;
405 | top: 38px; } }
406 | @-webkit-keyframes rotatePlaceholder {
407 | 0% {
408 | transform: rotate(-45deg);
409 | -webkit-transform: rotate(-45deg); }
410 | 5% {
411 | transform: rotate(-45deg);
412 | -webkit-transform: rotate(-45deg); }
413 | 12% {
414 | transform: rotate(-405deg);
415 | -webkit-transform: rotate(-405deg); }
416 | 100% {
417 | transform: rotate(-405deg);
418 | -webkit-transform: rotate(-405deg); } }
419 | @-moz-keyframes rotatePlaceholder {
420 | 0% {
421 | transform: rotate(-45deg);
422 | -webkit-transform: rotate(-45deg); }
423 | 5% {
424 | transform: rotate(-45deg);
425 | -webkit-transform: rotate(-45deg); }
426 | 12% {
427 | transform: rotate(-405deg);
428 | -webkit-transform: rotate(-405deg); }
429 | 100% {
430 | transform: rotate(-405deg);
431 | -webkit-transform: rotate(-405deg); } }
432 | @keyframes rotatePlaceholder {
433 | 0% {
434 | transform: rotate(-45deg);
435 | -webkit-transform: rotate(-45deg); }
436 | 5% {
437 | transform: rotate(-45deg);
438 | -webkit-transform: rotate(-45deg); }
439 | 12% {
440 | transform: rotate(-405deg);
441 | -webkit-transform: rotate(-405deg); }
442 | 100% {
443 | transform: rotate(-405deg);
444 | -webkit-transform: rotate(-405deg); } }
445 | .animateSuccessTip {
446 | -webkit-animation: animateSuccessTip 0.75s;
447 | -moz-animation: animateSuccessTip 0.75s;
448 | animation: animateSuccessTip 0.75s; }
449 |
450 | .animateSuccessLong {
451 | -webkit-animation: animateSuccessLong 0.75s;
452 | -moz-animation: animateSuccessLong 0.75s;
453 | animation: animateSuccessLong 0.75s; }
454 |
455 | .icon.success.animate::after {
456 | -webkit-animation: rotatePlaceholder 4.25s ease-in;
457 | -moz-animation: rotatePlaceholder 4.25s ease-in;
458 | animation: rotatePlaceholder 4.25s ease-in; }
459 |
460 | @-webkit-keyframes animateErrorIcon {
461 | 0% {
462 | transform: rotateX(100deg);
463 | -webkit-transform: rotateX(100deg);
464 | opacity: 0; }
465 | 100% {
466 | transform: rotateX(0deg);
467 | -webkit-transform: rotateX(0deg);
468 | opacity: 1; } }
469 | @-moz-keyframes animateErrorIcon {
470 | 0% {
471 | transform: rotateX(100deg);
472 | -webkit-transform: rotateX(100deg);
473 | opacity: 0; }
474 | 100% {
475 | transform: rotateX(0deg);
476 | -webkit-transform: rotateX(0deg);
477 | opacity: 1; } }
478 | @keyframes animateErrorIcon {
479 | 0% {
480 | transform: rotateX(100deg);
481 | -webkit-transform: rotateX(100deg);
482 | opacity: 0; }
483 | 100% {
484 | transform: rotateX(0deg);
485 | -webkit-transform: rotateX(0deg);
486 | opacity: 1; } }
487 | .animateErrorIcon {
488 | -webkit-animation: animateErrorIcon 0.5s;
489 | -moz-animation: animateErrorIcon 0.5s;
490 | animation: animateErrorIcon 0.5s; }
491 |
492 | @-webkit-keyframes animateXMark {
493 | 0% {
494 | transform: scale(0.4);
495 | -webkit-transform: scale(0.4);
496 | margin-top: 26px;
497 | opacity: 0; }
498 | 50% {
499 | transform: scale(0.4);
500 | -webkit-transform: scale(0.4);
501 | margin-top: 26px;
502 | opacity: 0; }
503 | 80% {
504 | transform: scale(1.15);
505 | -webkit-transform: scale(1.15);
506 | margin-top: -6px; }
507 | 100% {
508 | transform: scale(1);
509 | -webkit-transform: scale(1);
510 | margin-top: 0;
511 | opacity: 1; } }
512 | @-moz-keyframes animateXMark {
513 | 0% {
514 | transform: scale(0.4);
515 | -webkit-transform: scale(0.4);
516 | margin-top: 26px;
517 | opacity: 0; }
518 | 50% {
519 | transform: scale(0.4);
520 | -webkit-transform: scale(0.4);
521 | margin-top: 26px;
522 | opacity: 0; }
523 | 80% {
524 | transform: scale(1.15);
525 | -webkit-transform: scale(1.15);
526 | margin-top: -6px; }
527 | 100% {
528 | transform: scale(1);
529 | -webkit-transform: scale(1);
530 | margin-top: 0;
531 | opacity: 1; } }
532 | @keyframes animateXMark {
533 | 0% {
534 | transform: scale(0.4);
535 | -webkit-transform: scale(0.4);
536 | margin-top: 26px;
537 | opacity: 0; }
538 | 50% {
539 | transform: scale(0.4);
540 | -webkit-transform: scale(0.4);
541 | margin-top: 26px;
542 | opacity: 0; }
543 | 80% {
544 | transform: scale(1.15);
545 | -webkit-transform: scale(1.15);
546 | margin-top: -6px; }
547 | 100% {
548 | transform: scale(1);
549 | -webkit-transform: scale(1);
550 | margin-top: 0;
551 | opacity: 1; } }
552 | .animateXMark {
553 | -webkit-animation: animateXMark 0.5s;
554 | -moz-animation: animateXMark 0.5s;
555 | animation: animateXMark 0.5s; }
556 |
557 | /*@include keyframes(simpleRotate) {
558 | 0% { transform: rotateY(0deg); }
559 | 100% { transform: rotateY(-360deg); }
560 | }
561 | .simpleRotate {
562 | @include animation('simpleRotate 0.75s');
563 | }*/
564 | @-webkit-keyframes pulseWarning {
565 | 0% {
566 | border-color: #EB1459; }
567 | 100% {
568 | border-color: #EB1459; } }
569 | @-moz-keyframes pulseWarning {
570 | 0% {
571 | border-color: #EB1459; }
572 | 100% {
573 | border-color: #EB1459; } }
574 | @keyframes pulseWarning {
575 | 0% {
576 | border-color: #EB1459; }
577 | 100% {
578 | border-color: #EB1459; } }
579 | .pulseWarning {
580 | -webkit-animation: pulseWarning 0.75s infinite alternate;
581 | -moz-animation: pulseWarning 0.75s infinite alternate;
582 | animation: pulseWarning 0.75s infinite alternate; }
583 |
584 | @-webkit-keyframes pulseWarningIns {
585 | 0% {
586 | background-color: #EB1459; }
587 | 100% {
588 | background-color: #EB1459; } }
589 | @-moz-keyframes pulseWarningIns {
590 | 0% {
591 | background-color: #EB1459; }
592 | 100% {
593 | background-color: #F8BB86; } }
594 | @keyframes pulseWarningIns {
595 | 0% {
596 | background-color: #EB1459; }
597 | 100% {
598 | background-color: #EB1459; } }
599 | .pulseWarningIns {
600 | -webkit-animation: pulseWarningIns 0.75s infinite alternate;
601 | -moz-animation: pulseWarningIns 0.75s infinite alternate;
602 | animation: pulseWarningIns 0.75s infinite alternate; }
--------------------------------------------------------------------------------
/skin/css/tezbox.css:
--------------------------------------------------------------------------------
1 | #loadingSpinnerContainer{
2 | display: block;
3 | position: absolute;
4 | top: 0;
5 | bottom: 0;
6 | left: 0;
7 | right: 0;
8 | display:none;
9 | }
10 | #loadingSpinnerContainer .bg{
11 | background-color:#000;
12 | opacity:.2;
13 | position: absolute;
14 | top: 0;
15 | bottom: 0;
16 | left: 0;
17 | right: 0;
18 | z-index: 100;
19 | }
20 | #loading-bar-spinner.spinner {
21 | left: 50%;
22 | margin-left: -20px;
23 | top: 50%;
24 | margin-top: -20px;
25 | position: absolute;
26 | z-index: 19 !important;
27 | animation: loading-bar-spinner 400ms linear infinite;
28 | }
29 | #loading-bar-spinner.spinner .spinner-icon {
30 | width: 40px;
31 | height: 40px;
32 | border: solid 4px transparent;
33 | border-top-color: #EB1459 !important;
34 | border-left-color: #EB1459 !important;
35 | border-radius: 50%;
36 | }
37 | @keyframes loading-bar-spinner {
38 | 0% { transform: rotate(0deg); transform: rotate(0deg); }
39 | 100% { transform: rotate(360deg); transform: rotate(360deg); }
40 | }
41 | body{
42 | font-family: 'Poppins', sans-serif;
43 | }
44 | .mb-20{
45 | margin-bottom: 20px;
46 | }
47 | .mt-50{
48 | margin-top: 50px;
49 | }
50 | .mt-20{
51 | margin-top: 20px;
52 | }
53 | .form-group {
54 | text-align: left;
55 | }
56 | label {
57 | color: #6C7B8A!important;
58 | }
59 | /* Buttons */
60 | .btn {
61 | margin-bottom: 10px;
62 | font-weight: bold;
63 | text-transform: uppercase;
64 | border: 1px solid!important;
65 | }
66 | .btn-icon {
67 | border:0!important;
68 | }
69 | .btn-primary {
70 | background-image: linear-gradient(to right, #EB1459 , #672B90)!important;
71 | background-color: #672B90!important;
72 | border-color: transparent!important;
73 | border-radius: 30px!important;
74 | color: #fff!important;
75 | }
76 | .btn-primary:hover {
77 | background-image:none!important;
78 | background-color: #EB1459!important;
79 | color: #fff!important;
80 | border-color: #EB1459!important;
81 | border-radius: 30px!important;
82 | transition: all 0.5s ease;
83 | }
84 | .btn-secondary {
85 | background-color: #fff!important;
86 | border-color: #EB1459!important;
87 | border-radius: 30px!important;
88 | color: #EB1459!important;
89 | }
90 | .btn-secondary:hover {
91 | background-color: #EB1459!important;
92 | color: #fff!important;
93 | border-color: #EB1459!important;
94 | border-radius: 30px!important;
95 |
96 | transition: all 0.5s ease;
97 | }
98 | a:hover {
99 | color:#672B90!important;
100 | }
101 | a {
102 | color: #EB1459;
103 | text-decoration: none!important;
104 | font-weight: bold!important;
105 | cursor: pointer;
106 | transition: all 0.5s ease;
107 | }
108 | /* Alerts */
109 | .main .alert{
110 | text-align: left;
111 | padding-left: 55px;
112 | position: relative;
113 | min-height: 55px;
114 | }
115 | .main .alert .leftIcon {
116 | position: absolute;
117 | left: 15px;
118 | top: 15px;
119 | font-size: 25px;
120 | color: #6CDBFE;
121 | }
122 | .main .alert-info {
123 | color: #1D1D1D;
124 | background-color: #EDFAFF;
125 | border-color: #6CDBFE;
126 | }
127 | .main .alert-danger {
128 | color: #1D1D1D;
129 | background-color: #F7EAEE;
130 | border-color: #EB1459;
131 | }
132 | .main .alert-danger .leftIcon {
133 | color: #EB1459;
134 | }
135 | .sweet-alert h2{
136 | color: #EB1459!important;
137 | font-size: 40px!important;
138 | }
139 | .sweet-alert .logoSmall{
140 | width:70px;
141 | display:block;
142 | margin: 0 auto;
143 | }
144 | .sweet-alert p {
145 | color: #1D1D1D!important;
146 | }
147 | .sweet-alert .buttons {
148 | margin: 0 -17px -17px;
149 | margin-top: 50px;
150 | padding: 20px;
151 | background-color:#EEF0F6!important;
152 | border-top:1px solid #1d1d1d;
153 | }
154 | .sweet-alert button {
155 | width: 200px!important;
156 | margin-top:0!important;
157 | font-size: 14px!important;
158 | }
159 | .sweet-alert {
160 | border-radius: 15px!important;
161 | }
162 |
163 | /* Main Layout */
164 | .mainArea .toparea {
165 | padding-top:50px;
166 | }
167 | .mainArea {
168 | position: absolute;
169 | top: 0;
170 | left: 300px;
171 | right: 0;
172 | bottom: 0;
173 | }
174 | .mainContainer{
175 | position: absolute;
176 | top: 230px;
177 | left: 15px;
178 | right: 15px;
179 | bottom: 40px;
180 | overflow: hidden;
181 | }
182 | .mainBody {
183 | position:absolute;
184 | top:70px;
185 | bottom:0;
186 | left:0;
187 | right:0;
188 | }
189 | .mainBody>.container {
190 | padding-left:300px;
191 | position: relative;
192 | height:100%;
193 | }
194 |
195 | .mainBody>.container>.side h3{
196 | padding: 10px 35px 0;
197 | }
198 | .mainBody>.container>.side {
199 | position: absolute;
200 | left: 0;
201 | top:0;
202 | bottom:0;
203 | width:300px;
204 | background-color:#EEF0F6!important;
205 | padding-bottom:100px;
206 | overflow: hidden;
207 | }
208 | .mainBody>.container>.side .bottom{
209 | position: absolute;
210 | bottom: 0px;
211 | right: 0;
212 | left: 0;
213 | padding-bottom: 20px;
214 | font-size: 12px;
215 | padding-left: 35px;
216 | padding-right: 35px;
217 | padding-top: 19px;
218 | background-color: #f5f5f5;
219 | }
220 | .toggleArrow {
221 | position: absolute;
222 | right: 13px;
223 | font-size: 25px;
224 | top: 25px;
225 | }
226 | .side-min{
227 | position: absolute;
228 | left: 0;
229 | top: 0;
230 | width: 50px;
231 | height: 100px;
232 | overflow: hidden;
233 | z-index: 10000;
234 | }
235 | .myAccounts li.account a span{
236 | display: block;
237 | color: #1d1d1d;
238 | overflow: hidden;
239 | text-overflow: ellipsis;
240 | text-transform: none;
241 | }
242 | .myAccounts li.account a:hover{
243 | color: #EB1459;
244 | }
245 | .myAccounts li.account a{
246 | position: relative;
247 | padding:10px;
248 | padding-left: 60px;
249 | height: 70px;
250 | font-size: 14px;
251 | display:block;
252 | text-transform: uppercase;
253 | }
254 | .accountOffline {
255 | position: absolute;
256 | top: 5px;
257 | left: 125px;
258 | font-size: 35px;
259 | color: #EB1459;
260 | }
261 | .tx{
262 | height:80px;
263 | border-bottom: 1px solid #DDDDDD;
264 | margin: 0 -30px;
265 | padding-bottom: 15px;
266 | padding-top: 15px;
267 | }
268 | .tx .txLeft {
269 | position:relative;
270 | padding-left: 120px;
271 | }
272 | .tx .txLeft.received {
273 | color: #14D2B8;
274 | }
275 | .tx .txLeft.sent {
276 | color: #EB1459;
277 | }
278 | .tx canvas{
279 | width: 50px;
280 | height: 50px;
281 | border-radius: 50%;
282 | border: 3px solid #fff;
283 | position:absolute;
284 | left: 60px;
285 | }
286 | .tx .txAmount{
287 | font-size:20px;
288 | line-height:40px;
289 | }
290 | .tx .txAmount.sent {
291 | color: #EB1459;
292 | }
293 | .tx .txAmount.received {
294 | color: #14D2B8;
295 | }
296 | .tx .opHash{
297 | line-height:40px;
298 | }
299 | .tx .txAddress{
300 | width:100%;
301 | overflow: hidden;
302 | text-overflow: ellipsis;
303 | display: block;
304 | white-space: nowrap;
305 | font-weight: bold;
306 | line-height:40px;
307 | }
308 | .accountsContainer{
309 | width: 100%;
310 | height: 100%;
311 | position: relative;
312 | overflow: hidden;
313 | }
314 | #dropdownAccounts{
315 | width: 250px;
316 | margin-left: 25px;
317 | top: 30px;
318 | left: -300px;
319 | }
320 |
321 |
322 | .myAccountsDrop li.account{
323 | padding-left:15px;
324 | padding-right:15px;
325 | }
326 | .myAccountsDrop li.account canvas{
327 | width: 30px;
328 | height: 30px;
329 | border-radius: 50%;
330 | border: 2px solid #fff;
331 | position: absolute;
332 | top:12px;
333 | left:0;
334 | }
335 | .myAccountsDrop li.sideButton i{
336 | color: #EB1459;
337 | position: absolute;
338 | right: 25px;
339 | }
340 | .myAccountsDrop li a{
341 | color: #EB1459!important;
342 | font-size:12px;
343 | }
344 | .myAccountsDrop li.sideButton a{
345 | display: block;
346 | color: #1d1d1d!important;
347 | border-left: 5px solid #EB1459;
348 | padding-left: 30px;
349 | padding-bottom: 5px;
350 | }
351 | .myAccountsDrop {
352 | list-style: none;
353 | padding: 0;
354 | }
355 | .myAccountsDrop:hover li{
356 | opacity:.7;
357 | transition: all 0.5s ease;
358 | }
359 | .myAccountsDrop li:hover {
360 | opacity:1;
361 | transition: all 0.5s ease;
362 | }
363 | .myAccountsDrop:hover {
364 | transition: all 0.5s ease;
365 | }
366 | .myAccountsDrop li.account a span{
367 | display: block;
368 | color: #1d1d1d;
369 | overflow: hidden;
370 | text-overflow: ellipsis;
371 | text-transform: none;
372 | }
373 | .myAccountsDrop li.account a:hover{
374 | color: #EB1459;
375 | }
376 | .myAccountsDrop li.account a{
377 | position: relative;
378 | padding:10px;
379 | padding-left: 40px;
380 | height: 50px;
381 | font-size: 12px;
382 | display:block;
383 | text-transform: uppercase;
384 | }
385 |
386 |
387 | #managerAccount{
388 | padding-left:35px;
389 | padding-right:35px;
390 | }
391 | #managerAccount canvas{
392 | width: 50px;
393 | height: 50px;
394 | border-radius: 50%;
395 | border: 2px solid #EB1459; position: absolute;
396 | top:10px;
397 | left:0;
398 | }
399 | #managerAccount span{
400 | display: block;
401 | color: #1d1d1d;
402 | overflow: hidden;
403 | text-overflow: ellipsis;
404 | text-transform: none;
405 | }
406 | #managerAccount{
407 | position: absolute;
408 | top: -22px;
409 | right: 0;
410 | font-size: 14px;
411 | display: block;
412 | }
413 | .myAccounts li.account{
414 | padding-left:35px;
415 | padding-right:35px;
416 | }
417 | .myAccounts li.account canvas{
418 | width: 50px;
419 | height: 50px;
420 | border-radius: 50%;
421 | border: 3px solid #fff;
422 | position: absolute;
423 | top:10px;
424 | left:0;
425 | }
426 | .myAccounts li.add i{
427 | color: #EB1459;
428 | margin-left: 15px;
429 |
430 | }
431 | .myAccounts li a{
432 | color: #EB1459!important;
433 | }
434 | .myAccounts li.add a{
435 | display:block;
436 | color: #1d1d1d!important;
437 | background-color: #fff;
438 | border:1px solid #EB1459;
439 | border-left: 5px solid #EB1459;
440 | padding: 8px;
441 | padding-left:30px;
442 | padding-right:35px;
443 | }
444 | .myAccounts {
445 | position: absolute;
446 | list-style: none;
447 | padding: 0;
448 | top: 0;
449 | left: 0;
450 | right: -17px;
451 | bottom: 120px;
452 | overflow-y: scroll;
453 | overflow-x: hidden;
454 | }
455 | }
456 | .transition{
457 | transition: all 0.5s ease;
458 | }
459 | .myAccounts:hover li{
460 | opacity:.5;
461 | transition: all 0.5s ease;
462 | }
463 | .myAccounts li:hover {
464 | opacity:1;
465 | transition: all 0.5s ease;
466 | }
467 | .myAccounts li.account a span{
468 | display: block;
469 | color: #1d1d1d;
470 | overflow: hidden;
471 | text-overflow: ellipsis;
472 | text-transform: none;
473 | }
474 | .myAccounts li.account a:hover{
475 | color: #EB1459;
476 | }
477 | .myAccounts li.account a{
478 | position: relative;
479 | padding:10px;
480 | padding-left: 60px;
481 | height: 70px;
482 | font-size: 14px;
483 | display:block;
484 | text-transform: uppercase;
485 | }
486 |
487 |
488 | .mainTabs{
489 | padding-left: 20px;
490 | margin: 0 -15px;
491 | }
492 | .mainTabs li a:hover{
493 | color: #1d1d1d!important;
494 | opacity: 1;
495 | transition: opacity 0.5s ease;
496 | }
497 | .mainTabs li a{
498 | color: #1d1d1d;
499 | border:0!important;
500 | opacity: .5;
501 | padding-left: 20px;
502 | padding-right: 20px;
503 | min-width:150px;
504 | text-align: center;
505 | display:inline-block;
506 | border-bottom:3px solid transparent;
507 | transition: none;
508 | }
509 | .mainTabs li.active {
510 | margin-bottom:-3px;
511 | }
512 | .mainTabs li.active a{
513 | opacity: 1;
514 | color: #EB1459!important;
515 | border-bottom:3px solid #EB1459!important;
516 | }
517 | .tab-pane#transactions {
518 | padding:0;
519 | }
520 | .tab-pane, .tab-pane#transactions>p {
521 | padding: 30px;
522 | }
523 | .blocky-container canvas {
524 | border-radius: 100%;
525 | border: 3px solid #fafafa;
526 | }
527 | .addressDetails .blocky-container{
528 | position: absolute;
529 | left: 20px;
530 | TOP:0;
531 | }
532 | .addressDetails h1{
533 | margin-top:0;
534 | color: #EB1459;
535 | text-transform: uppercase;
536 | margin-top: 0;
537 | color: #EB1459;
538 | text-transform: uppercase;
539 | overflow: hidden;
540 | text-overflow: ellipsis;
541 | max-height: 39px;
542 | }
543 | h1.balance >a{
544 | font-size: 20px;
545 | }
546 | h1.balance{
547 | margin-top:0;
548 | color: #1d1d1d;
549 | }
550 | .tab-content{
551 | padding: 0 30px;
552 | position: absolute;
553 | top: 43px;
554 | left: 0;
555 | right: -17px;
556 | bottom: 0;
557 | overflow-y: scroll;
558 | overflow-x: hidden;
559 | }
560 | .addressDetails h5.address>a{
561 | position: absolute;
562 | left:0;
563 | top:0;
564 | font-size: 25px;
565 | }
566 | .addressDetails h5.address{
567 | margin-top:0;
568 | color: #1d1d1d;
569 | overflow: hidden;
570 | text-overflow: ellipsis;
571 | position: relative;
572 | font-size: 15px;
573 | color: #1d1d1d;
574 | padding-left: 35px;
575 | line-height: 25px;
576 | font-weight: bold;
577 | }
578 | .addressDetails{
579 | position: relative;
580 | padding-left: 170px!important;
581 | }
582 | .main{
583 | background: url("../images/bg.png") no-repeat;
584 | background-position: center 100px;
585 | background-size: cover;
586 | position: absolute;
587 | top:0;
588 | left:0;
589 | right:0;
590 | bottom:0;
591 | min-width: 1024px!important;
592 | }
593 | .mainBgCover{
594 | position: absolute;
595 | background-color: #EEF0F6;
596 | opacity: .5;
597 | top:0;
598 | left:0;
599 | right:0;
600 | bottom:0;
601 | z-index: -1;
602 | }
603 | .no-container, .med-container, .lrg-container {
604 | margin: 0 auto;
605 | }
606 | .no-container {
607 | width: 500px;
608 | margin-top: 150px;
609 | }
610 | .med-container {
611 | width: 750px!important;
612 | margin-top: 150px!important;
613 | }
614 | .lrg-container {
615 | width: 1000px!important;
616 | margin-top: 120px!important;
617 | }
618 | .container-box {
619 | background-color: #fff!important;
620 | border-radius: 3px;
621 | box-shadow: 0 5px 8px 0 rgba(0,0,0,0.2),0 6px 20px 0 rgba(0,0,0,0.19) !important;
622 | padding: 30px;
623 | min-height: 300px;
624 | }
625 |
626 | .mainLogo {
627 | position: relative;
628 | padding-left: 120px;
629 | margin-bottom: 50px;
630 | left:30px;
631 | }
632 | .mainLogo .logo {
633 | width:100px;
634 | position: absolute;
635 | left: 10px;
636 | }
637 | .mainLogo h2 {
638 | margin-top: 0;
639 | font-size: 20px;
640 | padding-left:10px;
641 | }
642 | .mainLogo h1 {
643 | margin-bottom:0;
644 | padding-right:25px;
645 | padding-top:5px;
646 | font-size: 60px;
647 | text-transform: uppercase;
648 | background: -webkit-gradient(linear, left top, right top, from(#EB1459), to(#672B90));
649 | -webkit-background-clip: text;
650 | -webkit-text-fill-color: transparent;C
651 | }
652 | .display-privatekey {
653 | overflow-wrap: break-word;
654 | text-align: center;
655 | padding:10px 0;
656 | font-size:10px;
657 | padding:5px;
658 | background-color: #f0f0f0;
659 | }
660 | h3.sm-title {
661 | font-weight: bold;
662 | font-size: 40px!important;
663 |
664 | }
665 | h2.med-title {
666 | color: #EB1459;
667 | font-weight: bold;
668 | text-align: center;
669 | margin-bottom:30px;
670 | font-size: 40px;
671 | }
672 |
673 | .header {
674 | text-align: left;
675 | margin: 0;
676 | position: absolute;
677 | top: 0;
678 | left: 0;
679 | right: 0;
680 | height: 70px;
681 | background-color: #fff;
682 | border-bottom: 2px solid #EB1459;
683 | padding: 10px;
684 | z-index:20;
685 | }
686 | .header .logo{
687 | font-size: 28px;
688 | background: -webkit-gradient(linear, left top, right top, from(#EB1459), to(#672B90));
689 | -webkit-background-clip: text;
690 | -webkit-text-fill-color: transparent;C
691 | }
692 | .header img.logoSmall {
693 | height: 52px;
694 | position: relative;
695 | top: -2px;
696 | }
697 | .header a {
698 | color: #1d1d1d!important;
699 | font-size: 30px;
700 | }
701 | .header a:hover {
702 | color: #EB1459!important;
703 | opacity:1;
704 | }
705 | .mnemonic>span {
706 | padding: 5px;
707 | font-size: 1.7rem;
708 | color: #EB1459;
709 | background-color: #EACCD5;
710 | display: inline-block;
711 | border-radius: 4px;
712 | margin: 5px;
713 | }
714 |
715 | .tabChoices a{
716 | text-transform: uppercase;
717 | color: #6C7B8A;
718 | padding-top: 20px;
719 | padding-bottom: 20px;
720 | display: block;
721 | width: 100%;
722 | border-bottom: 3px solid transparent;
723 | }
724 | .tabChoices a.selected{
725 | color: #EB1459;
726 | background-color: #fff;
727 | border-bottom: 3px solid #EB1459;
728 | }
--------------------------------------------------------------------------------
/skin/images/bg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tezbox/web-wallet/feef1dc7abd6e6cd4658dbe59fb3b0b4e503ecdc/skin/images/bg.png
--------------------------------------------------------------------------------
/skin/images/icon-128.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tezbox/web-wallet/feef1dc7abd6e6cd4658dbe59fb3b0b4e503ecdc/skin/images/icon-128.png
--------------------------------------------------------------------------------
/skin/images/icon-16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tezbox/web-wallet/feef1dc7abd6e6cd4658dbe59fb3b0b4e503ecdc/skin/images/icon-16.png
--------------------------------------------------------------------------------
/skin/images/icon-19.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tezbox/web-wallet/feef1dc7abd6e6cd4658dbe59fb3b0b4e503ecdc/skin/images/icon-19.png
--------------------------------------------------------------------------------
/skin/images/icon-38.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tezbox/web-wallet/feef1dc7abd6e6cd4658dbe59fb3b0b4e503ecdc/skin/images/icon-38.png
--------------------------------------------------------------------------------
/skin/images/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tezbox/web-wallet/feef1dc7abd6e6cd4658dbe59fb3b0b4e503ecdc/skin/images/icon.png
--------------------------------------------------------------------------------
/skin/images/ledger-icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tezbox/web-wallet/feef1dc7abd6e6cd4658dbe59fb3b0b4e503ecdc/skin/images/ledger-icon.png
--------------------------------------------------------------------------------
/skin/images/ledger-logo.svg:
--------------------------------------------------------------------------------
1 |
3 |
6 | Fichier 8
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
19 |
22 |
26 |
29 |
31 |
32 |
33 |
34 |
--------------------------------------------------------------------------------
/skin/images/logo.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tezbox/web-wallet/feef1dc7abd6e6cd4658dbe59fb3b0b4e503ecdc/skin/images/logo.jpg
--------------------------------------------------------------------------------
/skin/images/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tezbox/web-wallet/feef1dc7abd6e6cd4658dbe59fb3b0b4e503ecdc/skin/images/logo.png
--------------------------------------------------------------------------------
/skin/images/trezor-logo.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/skin/js/blockies.min.js:
--------------------------------------------------------------------------------
1 | !function(){function e(e){for(var o=0;o>19^e^e>>8,(c[3]>>>0)/(1<<31>>>0)}function r(){var e=Math.floor(360*o()),r=60*o()+40+"%",t=25*(o()+o()+o()+o())+"%",l="hsl("+e+","+r+","+t+")";return l}function t(e){for(var r=e,t=e,l=Math.ceil(r/2),n=r-l,a=[],c=0;t>c;c++){for(var i=[],f=0;l>f;f++)i[f]=Math.floor(2.3*o());var s=i.slice(0,n);s.reverse(),i=i.concat(s);for(var h=0;h= 0 ? (parseInt(ps[i]) | 0x80000000) >>> 0 : parseInt(ps[i])));
157 | }
158 | return r;
159 | }
160 | function buildPackets(id, data){
161 | data = encodeProtobugMessage(id, data || {});
162 | data = Array.prototype.slice.call(data, 0);
163 | var header = [35, 35];
164 | header = header.concat([id >> 8, id % 255]);
165 | header = header.concat(toBytesInt32(data.length));
166 | data = header.concat(data);
167 | var pak = [];
168 | var packets = [];
169 | for (var i = 0; i < Math.ceil((data.length)/63); i++){
170 | pak = data.slice(i * 63, (i * 63) + 63);
171 | pak = pad_array(pak, 63, 0);
172 | packets.push(pak);
173 | }
174 | return packets;
175 | }
176 | function pad_array(arr,len,fill) {
177 | return arr.concat(Array(len).fill(fill)).slice(0,len);
178 | }
179 | function encodeProtobugMessage(messageId, message){
180 | var pbm = pbroot.lookupType(msgidToPb[messageId]);
181 | return pbm.encode(message).finish();
182 | }
183 | function decodeProtobugMessage(messageId, message){
184 | var pbm = pbroot.lookupType(msgidToPb[messageId]);
185 | return pbm.toObject(pbm.decode(message));
186 | }
187 | function buf2int(b){
188 | var count = 0;
189 | for(var i = 0; i < b.length; i++){
190 | count = (count << 8) + b[i];
191 | }
192 | return count;
193 | }
194 | function toBytesInt32 (num) {
195 | return [
196 | (num & 0xff000000) >> 24,
197 | (num & 0x00ff0000) >> 16,
198 | (num & 0x0000ff00) >> 8,
199 | (num & 0x000000ff)
200 | ];
201 | }
202 |
203 | //web only
204 | function trezorQuery(id, data){
205 | return new Promise(async function(resolve, reject){
206 | var packets = buildPackets(trezToMsgid[id], data || false);
207 | for(var i = 0; i < packets.length; i++){
208 | await device.transferOut(outep, new Uint8Array([63].concat(packets[i])));
209 | }
210 | const timeoutID = setTimeout(function(){
211 | reject("Timeout");
212 | }, 120 * 1000)
213 | var currentMessageData, currentMessageId, currentMessageLength;
214 | while (true) {
215 | var incoming = await device.transferIn(inep, 64);
216 | d = new Uint8Array(incoming.data.buffer);
217 | if (d[0] != 63) {
218 | reject("Bad message");
219 | clearTimeout(timeoutID);
220 | break;
221 | }
222 | d = d.slice(1);
223 | if (d[0] == 35 && d[1] == 35) {
224 | currentMessageId = buf2int(d.slice(2, 4));
225 | currentMessageLength = buf2int(d.slice(4, 8));
226 | d = d.slice(8);
227 | currentMessageData = [];
228 | }
229 | if (currentMessageId){
230 | currentMessageData = currentMessageData.concat(buf2array(d));
231 | if (currentMessageData.length >= currentMessageLength){
232 | if (currentMessageId == 26){
233 | trezorQuery("acknowledge").then(resolve).catch(reject);
234 | } else if (currentMessageId == 41){
235 | if (currentMessageData[1]){
236 | trezorQuery("acknowledgePassphrase").then(resolve).catch(reject);
237 | } else {
238 | var passphrase = prompt("Please enter your passpharse");
239 | if (passphrase != null) {
240 | trezorQuery("acknowledgePassphrase", {
241 | passphrase : passphrase
242 | }).then(resolve);
243 | } else {
244 | reject("Invalid passphrase");
245 | }
246 | }
247 | } else if (currentMessageId == 77){
248 | trezorQuery("acknowledgePassphraseState").then(resolve).catch(reject);
249 | } else {
250 | currentMessageData = currentMessageData.slice(0, currentMessageLength);
251 | resolve(decodeProtobugMessage(currentMessageId, new Uint8Array(currentMessageData)));
252 | }
253 | clearTimeout(timeoutID);
254 | break;
255 | }
256 | }
257 | }
258 | });
259 | }
260 | function buf2array(buf){
261 | var a = [];
262 | for(var i = 0; i < buf.length; i++){
263 | a.push(buf[i]);
264 | }
265 | return a;
266 | }
267 | return tezFns;
268 | }
269 | var teztrezor = initTezTrezor();
--------------------------------------------------------------------------------
/skin/js/trezor/protob/messages-bootloader.proto:
--------------------------------------------------------------------------------
1 | syntax = "proto2";
2 | package hw.trezor.messages.bootloader;
3 |
4 | // Sugar for easier handling in Java
5 | option java_package = "com.satoshilabs.trezor.lib.protobuf";
6 | option java_outer_classname = "TrezorMessageBootloader";
7 |
8 | /**
9 | * Request: Ask device to erase its firmware (so it can be replaced via FirmwareUpload)
10 | * @start
11 | * @next FirmwareRequest
12 | */
13 | message FirmwareErase {
14 | optional uint32 length = 1; // length of new firmware
15 | }
16 |
17 | /**
18 | * Response: Ask for firmware chunk
19 | * @next FirmwareUpload
20 | */
21 | message FirmwareRequest {
22 | optional uint32 offset = 1; // offset of requested firmware chunk
23 | optional uint32 length = 2; // length of requested firmware chunk
24 | }
25 |
26 | /**
27 | * Request: Send firmware in binary form to the device
28 | * @next FirmwareRequest
29 | * @next Success
30 | * @next Failure
31 | */
32 | message FirmwareUpload {
33 | required bytes payload = 1; // firmware to be loaded into device
34 | optional bytes hash = 2; // hash of the payload
35 | }
36 |
37 | /**
38 | * Request: Perform a device self-test
39 | * @next Success
40 | * @next Failure
41 | */
42 | message SelfTest {
43 | optional bytes payload = 1; // payload to be used in self-test
44 | }
45 |
--------------------------------------------------------------------------------
/skin/js/trezor/protob/messages-common.proto:
--------------------------------------------------------------------------------
1 | syntax = "proto2";
2 | package hw.trezor.messages.common;
3 |
4 | /**
5 | * Response: Success of the previous request
6 | * @end
7 | */
8 | message Success {
9 | optional string message = 1; // human readable description of action or request-specific payload
10 | }
11 |
12 | /**
13 | * Response: Failure of the previous request
14 | * @end
15 | */
16 | message Failure {
17 | optional FailureType code = 1; // computer-readable definition of the error state
18 | optional string message = 2; // human-readable message of the error state
19 | enum FailureType {
20 | Failure_UnexpectedMessage = 1;
21 | Failure_ButtonExpected = 2;
22 | Failure_DataError = 3;
23 | Failure_ActionCancelled = 4;
24 | Failure_PinExpected = 5;
25 | Failure_PinCancelled = 6;
26 | Failure_PinInvalid = 7;
27 | Failure_InvalidSignature = 8;
28 | Failure_ProcessError = 9;
29 | Failure_NotEnoughFunds = 10;
30 | Failure_NotInitialized = 11;
31 | Failure_PinMismatch = 12;
32 | Failure_FirmwareError = 99;
33 | }
34 | }
35 |
36 | /**
37 | * Response: Device is waiting for HW button press.
38 | * @auxstart
39 | * @next ButtonAck
40 | */
41 | message ButtonRequest {
42 | optional ButtonRequestType code = 1;
43 | optional string data = 2;
44 | /**
45 | * Type of button request
46 | */
47 | enum ButtonRequestType {
48 | ButtonRequest_Other = 1;
49 | ButtonRequest_FeeOverThreshold = 2;
50 | ButtonRequest_ConfirmOutput = 3;
51 | ButtonRequest_ResetDevice = 4;
52 | ButtonRequest_ConfirmWord = 5;
53 | ButtonRequest_WipeDevice = 6;
54 | ButtonRequest_ProtectCall = 7;
55 | ButtonRequest_SignTx = 8;
56 | ButtonRequest_FirmwareCheck = 9;
57 | ButtonRequest_Address = 10;
58 | ButtonRequest_PublicKey = 11;
59 | ButtonRequest_MnemonicWordCount = 12;
60 | ButtonRequest_MnemonicInput = 13;
61 | ButtonRequest_PassphraseType = 14;
62 | ButtonRequest_UnknownDerivationPath = 15;
63 | }
64 | }
65 |
66 | /**
67 | * Request: Computer agrees to wait for HW button press
68 | * @auxend
69 | */
70 | message ButtonAck {
71 | }
72 |
73 | /**
74 | * Response: Device is asking computer to show PIN matrix and awaits PIN encoded using this matrix scheme
75 | * @auxstart
76 | * @next PinMatrixAck
77 | */
78 | message PinMatrixRequest {
79 | optional PinMatrixRequestType type = 1;
80 | /**
81 | * Type of PIN request
82 | */
83 | enum PinMatrixRequestType {
84 | PinMatrixRequestType_Current = 1;
85 | PinMatrixRequestType_NewFirst = 2;
86 | PinMatrixRequestType_NewSecond = 3;
87 | }
88 | }
89 |
90 | /**
91 | * Request: Computer responds with encoded PIN
92 | * @auxend
93 | */
94 | message PinMatrixAck {
95 | required string pin = 1; // matrix encoded PIN entered by user
96 | }
97 |
98 | /**
99 | * Response: Device awaits encryption passphrase
100 | * @auxstart
101 | * @next PassphraseAck
102 | */
103 | message PassphraseRequest {
104 | optional bool on_device = 1; // passphrase is being entered on the device
105 | }
106 |
107 | /**
108 | * Request: Send passphrase back
109 | * @next PassphraseStateRequest
110 | */
111 | message PassphraseAck {
112 | optional string passphrase = 1;
113 | optional bytes state = 2; // expected device state
114 | }
115 |
116 | /**
117 | * Response: Device awaits passphrase state
118 | * @next PassphraseStateAck
119 | */
120 | message PassphraseStateRequest {
121 | optional bytes state = 1; // actual device state
122 | }
123 |
124 | /**
125 | * Request: Send passphrase state back
126 | * @auxend
127 | */
128 | message PassphraseStateAck {
129 | }
130 |
131 | /**
132 | * Structure representing BIP32 (hierarchical deterministic) node
133 | * Used for imports of private key into the device and exporting public key out of device
134 | * @embed
135 | */
136 | message HDNodeType {
137 | required uint32 depth = 1;
138 | required uint32 fingerprint = 2;
139 | required uint32 child_num = 3;
140 | required bytes chain_code = 4;
141 | optional bytes private_key = 5;
142 | optional bytes public_key = 6;
143 | }
144 |
--------------------------------------------------------------------------------
/skin/js/trezor/protob/messages-debug.proto:
--------------------------------------------------------------------------------
1 | syntax = "proto2";
2 | package hw.trezor.messages.debug;
3 |
4 | // Sugar for easier handling in Java
5 | option java_package = "com.satoshilabs.trezor.lib.protobuf";
6 | option java_outer_classname = "TrezorMessageDebug";
7 |
8 | import "messages-common.proto";
9 |
10 | /**
11 | * Request: "Press" the button on the device
12 | * @start
13 | * @next Success
14 | */
15 | message DebugLinkDecision {
16 | optional bool yes_no = 1; // true for "Confirm", false for "Cancel"
17 | optional bool up_down = 2; // true for scroll up, false for scroll down
18 | optional string input = 3; // keyboard input
19 | }
20 |
21 | /**
22 | * Request: Computer asks for device state
23 | * @start
24 | * @next DebugLinkState
25 | */
26 | message DebugLinkGetState {
27 | }
28 |
29 | /**
30 | * Response: Device current state
31 | * @end
32 | */
33 | message DebugLinkState {
34 | optional bytes layout = 1; // raw buffer of display
35 | optional string pin = 2; // current PIN, blank if PIN is not set/enabled
36 | optional string matrix = 3; // current PIN matrix
37 | optional string mnemonic = 4; // current BIP-39 mnemonic
38 | optional hw.trezor.messages.common.HDNodeType node = 5; // current BIP-32 node
39 | optional bool passphrase_protection = 6; // is node/mnemonic encrypted using passphrase?
40 | optional string reset_word = 7; // word on device display during ResetDevice workflow
41 | optional bytes reset_entropy = 8; // current entropy during ResetDevice workflow
42 | optional string recovery_fake_word = 9; // (fake) word on display during RecoveryDevice workflow
43 | optional uint32 recovery_word_pos = 10; // index of mnemonic word the device is expecting during RecoveryDevice workflow
44 | optional uint32 reset_word_pos = 11; // index of mnemonic word the device is expecting during ResetDevice workflow
45 | }
46 |
47 | /**
48 | * Request: Ask device to restart
49 | * @start
50 | */
51 | message DebugLinkStop {
52 | }
53 |
54 | /**
55 | * Response: Device wants host to log event
56 | * @ignore
57 | */
58 | message DebugLinkLog {
59 | optional uint32 level = 1;
60 | optional string bucket = 2;
61 | optional string text = 3;
62 | }
63 |
64 | /**
65 | * Request: Read memory from device
66 | * @start
67 | * @next DebugLinkMemory
68 | */
69 | message DebugLinkMemoryRead {
70 | optional uint32 address = 1;
71 | optional uint32 length = 2;
72 | }
73 |
74 | /**
75 | * Response: Device sends memory back
76 | * @end
77 | */
78 | message DebugLinkMemory {
79 | optional bytes memory = 1;
80 | }
81 |
82 | /**
83 | * Request: Write memory to device.
84 | * WARNING: Writing to the wrong location can irreparably break the device.
85 | * @start
86 | * @next Success
87 | * @next Failure
88 | */
89 | message DebugLinkMemoryWrite {
90 | optional uint32 address = 1;
91 | optional bytes memory = 2;
92 | optional bool flash = 3;
93 | }
94 |
95 | /**
96 | * Request: Erase block of flash on device
97 | * WARNING: Writing to the wrong location can irreparably break the device.
98 | * @start
99 | * @next Success
100 | * @next Failure
101 | */
102 | message DebugLinkFlashErase {
103 | optional uint32 sector = 1;
104 | }
105 |
--------------------------------------------------------------------------------
/skin/js/trezor/protob/messages-management.proto:
--------------------------------------------------------------------------------
1 | syntax = "proto2";
2 | package hw.trezor.messages.management;
3 |
4 | // Sugar for easier handling in Java
5 | option java_package = "com.satoshilabs.trezor.lib.protobuf";
6 | option java_outer_classname = "TrezorMessageManagement";
7 |
8 | import "messages-common.proto";
9 |
10 | /**
11 | * Request: Reset device to default state and ask for device details
12 | * @start
13 | * @next Features
14 | */
15 | message Initialize {
16 | optional bytes state = 1; // assumed device state, clear session if set and different
17 | optional bool skip_passphrase = 2; // this session should always assume empty passphrase
18 | }
19 |
20 | /**
21 | * Request: Ask for device details (no device reset)
22 | * @start
23 | * @next Features
24 | */
25 | message GetFeatures {
26 | }
27 |
28 | /**
29 | * Response: Reports various information about the device
30 | * @end
31 | */
32 | message Features {
33 | optional string vendor = 1; // name of the manufacturer, e.g. "trezor.io"
34 | optional uint32 major_version = 2; // major version of the firmware/bootloader, e.g. 1
35 | optional uint32 minor_version = 3; // minor version of the firmware/bootloader, e.g. 0
36 | optional uint32 patch_version = 4; // patch version of the firmware/bootloader, e.g. 0
37 | optional bool bootloader_mode = 5; // is device in bootloader mode?
38 | optional string device_id = 6; // device's unique identifier
39 | optional bool pin_protection = 7; // is device protected by PIN?
40 | optional bool passphrase_protection = 8; // is node/mnemonic encrypted using passphrase?
41 | optional string language = 9; // device language
42 | optional string label = 10; // device description label
43 | optional bool initialized = 12; // does device contain seed?
44 | optional bytes revision = 13; // SCM revision of firmware
45 | optional bytes bootloader_hash = 14; // hash of the bootloader
46 | optional bool imported = 15; // was storage imported from an external source?
47 | optional bool pin_cached = 16; // is PIN already cached in session?
48 | optional bool passphrase_cached = 17; // is passphrase already cached in session?
49 | optional bool firmware_present = 18; // is valid firmware loaded?
50 | optional bool needs_backup = 19; // does storage need backup? (equals to Storage.needs_backup)
51 | optional uint32 flags = 20; // device flags (equals to Storage.flags)
52 | optional string model = 21; // device hardware model
53 | optional uint32 fw_major = 22; // reported firmware version if in bootloader mode
54 | optional uint32 fw_minor = 23; // reported firmware version if in bootloader mode
55 | optional uint32 fw_patch = 24; // reported firmware version if in bootloader mode
56 | optional string fw_vendor = 25; // reported firmware vendor if in bootloader mode
57 | optional bytes fw_vendor_keys = 26; // reported firmware vendor keys (their hash)
58 | optional bool unfinished_backup = 27; // report unfinished backup (equals to Storage.unfinished_backup)
59 | optional bool no_backup = 28; // report no backup (equals to Storage.no_backup)
60 | }
61 |
62 | /**
63 | * Request: clear session (removes cached PIN, passphrase, etc).
64 | * @start
65 | * @next Success
66 | */
67 | message ClearSession {
68 | }
69 |
70 | /**
71 | * Request: change language and/or label of the device
72 | * @start
73 | * @next Success
74 | * @next Failure
75 | */
76 | message ApplySettings {
77 | optional string language = 1;
78 | optional string label = 2;
79 | optional bool use_passphrase = 3;
80 | optional bytes homescreen = 4;
81 | optional PassphraseSourceType passphrase_source = 5;
82 | optional uint32 auto_lock_delay_ms = 6;
83 | /**
84 | * Structure representing passphrase source
85 | */
86 | enum PassphraseSourceType {
87 | ASK = 0;
88 | DEVICE = 1;
89 | HOST = 2;
90 | }
91 | }
92 |
93 | /**
94 | * Request: set flags of the device
95 | * @start
96 | * @next Success
97 | * @next Failure
98 | */
99 | message ApplyFlags {
100 | optional uint32 flags = 1; // bitmask, can only set bits, not unset
101 | }
102 |
103 | /**
104 | * Request: Starts workflow for setting/changing/removing the PIN
105 | * @start
106 | * @next Success
107 | * @next Failure
108 | */
109 | message ChangePin {
110 | optional bool remove = 1; // is PIN removal requested?
111 | }
112 |
113 | /**
114 | * Request: Test if the device is alive, device sends back the message in Success response
115 | * @start
116 | * @next Success
117 | */
118 | message Ping {
119 | optional string message = 1; // message to send back in Success message
120 | optional bool button_protection = 2; // ask for button press
121 | optional bool pin_protection = 3; // ask for PIN if set in device
122 | optional bool passphrase_protection = 4; // ask for passphrase if set in device
123 | }
124 |
125 | /**
126 | * Request: Abort last operation that required user interaction
127 | * @start
128 | * @next Failure
129 | */
130 | message Cancel {
131 | }
132 |
133 | /**
134 | * Request: Request a sample of random data generated by hardware RNG. May be used for testing.
135 | * @start
136 | * @next Entropy
137 | * @next Failure
138 | */
139 | message GetEntropy {
140 | required uint32 size = 1; // size of requested entropy
141 | }
142 |
143 | /**
144 | * Response: Reply with random data generated by internal RNG
145 | * @end
146 | */
147 | message Entropy {
148 | required bytes entropy = 1; // chunk of random generated bytes
149 | }
150 |
151 | /**
152 | * Request: Request device to wipe all sensitive data and settings
153 | * @start
154 | * @next Success
155 | * @next Failure
156 | */
157 | message WipeDevice {
158 | }
159 |
160 | /**
161 | * Request: Load seed and related internal settings from the computer
162 | * @start
163 | * @next Success
164 | * @next Failure
165 | */
166 | message LoadDevice {
167 | optional string mnemonic = 1; // seed encoded as BIP-39 mnemonic (12, 18 or 24 words)
168 | optional hw.trezor.messages.common.HDNodeType node = 2; // BIP-32 node
169 | optional string pin = 3; // set PIN protection
170 | optional bool passphrase_protection = 4; // enable master node encryption using passphrase
171 | optional string language = 5 [default='english']; // device language
172 | optional string label = 6; // device label
173 | optional bool skip_checksum = 7; // do not test mnemonic for valid BIP-39 checksum
174 | optional uint32 u2f_counter = 8; // U2F counter
175 | }
176 |
177 | /**
178 | * Request: Ask device to do initialization involving user interaction
179 | * @start
180 | * @next EntropyRequest
181 | * @next Failure
182 | */
183 | message ResetDevice {
184 | optional bool display_random = 1; // display entropy generated by the device before asking for additional entropy
185 | optional uint32 strength = 2 [default=256]; // strength of seed in bits
186 | optional bool passphrase_protection = 3; // enable master node encryption using passphrase
187 | optional bool pin_protection = 4; // enable PIN protection
188 | optional string language = 5 [default='english']; // device language
189 | optional string label = 6; // device label
190 | optional uint32 u2f_counter = 7; // U2F counter
191 | optional bool skip_backup = 8; // postpone seed backup to BackupDevice workflow
192 | optional bool no_backup = 9; // indicate that no backup is going to be made
193 | }
194 |
195 | /**
196 | * Request: Perform backup of the device seed if not backed up using ResetDevice
197 | * @start
198 | * @next Success
199 | */
200 | message BackupDevice {
201 | }
202 |
203 | /**
204 | * Response: Ask for additional entropy from host computer
205 | * @next EntropyAck
206 | */
207 | message EntropyRequest {
208 | }
209 |
210 | /**
211 | * Request: Provide additional entropy for seed generation function
212 | * @next Success
213 | */
214 | message EntropyAck {
215 | optional bytes entropy = 1; // 256 bits (32 bytes) of random data
216 | }
217 |
218 | /**
219 | * Request: Start recovery workflow asking user for specific words of mnemonic
220 | * Used to recovery device safely even on untrusted computer.
221 | * @start
222 | * @next WordRequest
223 | */
224 | message RecoveryDevice {
225 | optional uint32 word_count = 1; // number of words in BIP-39 mnemonic
226 | optional bool passphrase_protection = 2; // enable master node encryption using passphrase
227 | optional bool pin_protection = 3; // enable PIN protection
228 | optional string language = 4 [default='english']; // device language
229 | optional string label = 5; // device label
230 | optional bool enforce_wordlist = 6; // enforce BIP-39 wordlist during the process
231 | // 7 reserved for unused recovery method
232 | optional RecoveryDeviceType type = 8; // supported recovery type
233 | optional uint32 u2f_counter = 9; // U2F counter
234 | optional bool dry_run = 10; // perform dry-run recovery workflow (for safe mnemonic validation)
235 | /**
236 | * Type of recovery procedure. These should be used as bitmask, e.g.,
237 | * `RecoveryDeviceType_ScrambledWords | RecoveryDeviceType_Matrix`
238 | * listing every method supported by the host computer.
239 | *
240 | * Note that ScrambledWords must be supported by every implementation
241 | * for backward compatibility; there is no way to not support it.
242 | */
243 | enum RecoveryDeviceType {
244 | // use powers of two when extending this field
245 | RecoveryDeviceType_ScrambledWords = 0; // words in scrambled order
246 | RecoveryDeviceType_Matrix = 1; // matrix recovery type
247 | }
248 | }
249 |
250 | /**
251 | * Response: Device is waiting for user to enter word of the mnemonic
252 | * Its position is shown only on device's internal display.
253 | * @next WordAck
254 | */
255 | message WordRequest {
256 | optional WordRequestType type = 1;
257 | /**
258 | * Type of Recovery Word request
259 | */
260 | enum WordRequestType {
261 | WordRequestType_Plain = 0;
262 | WordRequestType_Matrix9 = 1;
263 | WordRequestType_Matrix6 = 2;
264 | }
265 | }
266 |
267 | /**
268 | * Request: Computer replies with word from the mnemonic
269 | * @next WordRequest
270 | * @next Success
271 | * @next Failure
272 | */
273 | message WordAck {
274 | required string word = 1; // one word of mnemonic on asked position
275 | }
276 |
277 | /**
278 | * Request: Set U2F counter
279 | * @start
280 | * @next Success
281 | */
282 | message SetU2FCounter {
283 | optional uint32 u2f_counter = 1; // counter
284 | }
285 |
--------------------------------------------------------------------------------
/skin/js/trezor/protob/messages-tezos.proto:
--------------------------------------------------------------------------------
1 | syntax = "proto2";
2 | package hw.trezor.messages.tezos;
3 |
4 | // Sugar for easier handling in Java
5 | option java_package = "com.satoshilabs.trezor.lib.protobuf";
6 | option java_outer_classname = "TrezorMessageTezos";
7 |
8 | /**
9 | * Request: Ask device for Tezos address corresponding to address_n path
10 | * @start
11 | * @next TezosAddress
12 | * @next Failure
13 | */
14 | message TezosGetAddress {
15 | repeated uint32 address_n = 1; // BIP-32 path to derive the key from master node
16 | optional bool show_display = 2; // optionally show on display before sending the result
17 | }
18 |
19 | /**
20 | * Response: Contains Tezos address derived from device private seed
21 | * @end
22 | */
23 | message TezosAddress {
24 | optional string address = 1; // Coin address in Base58 encoding
25 | }
26 |
27 | /**
28 | * Request: Ask device for Tezos public key corresponding to address_n path
29 | * @start
30 | * @next TezosPublicKey
31 | */
32 | message TezosGetPublicKey {
33 | repeated uint32 address_n = 1; // BIP-32 path to derive the key from master node
34 | optional bool show_display = 2; // Optionally show on display before sending the result
35 | }
36 |
37 | /**
38 | * Response: Contains Tezos public key derived from device private seed
39 | * @end
40 | */
41 | message TezosPublicKey {
42 | optional string public_key = 1; // b58 encoded Tezos public key with prefix
43 | }
44 |
45 | /**
46 | * Request: Ask device to sign Tezos transaction
47 | * @start
48 | * @next TezosSignedTx
49 | */
50 | message TezosSignTx {
51 | repeated uint32 address_n = 1; // BIP-32 path to derive the key from master node
52 | optional bytes branch = 2;
53 |
54 | optional TezosRevealOp reveal = 3; // Tezos reveal operation (may be bundled with other op)
55 | optional TezosTransactionOp transaction = 4; // Tezos transaction operation
56 | optional TezosOriginationOp origination = 5; // Tezos origination operation
57 | optional TezosDelegationOp delegation = 6; // Tezos delegation operation
58 | /*
59 | * Tezos contract ID
60 | */
61 | message TezosContractID {
62 | optional TezosContractType tag = 1;
63 | optional bytes hash = 2; // Implicit = 21B, originated = 20B + 1B padding
64 | /*
65 | * Type of Tezos Contract type
66 | */
67 | enum TezosContractType {
68 | Implicit = 0;
69 | Originated = 1;
70 | }
71 | }
72 | /**
73 | * Structure representing information for reveal
74 | */
75 | message TezosRevealOp {
76 | optional TezosContractID source = 1;
77 | optional uint64 fee = 2;
78 | optional uint64 counter = 3;
79 | optional uint64 gas_limit = 4;
80 | optional uint64 storage_limit = 5;
81 | optional bytes public_key = 6;
82 | }
83 | /**
84 | * Structure representing information for transaction
85 | */
86 | message TezosTransactionOp {
87 | optional TezosContractID source = 1;
88 | optional uint64 fee = 2;
89 | optional uint64 counter = 3;
90 | optional uint64 gas_limit = 4;
91 | optional uint64 storage_limit = 5;
92 | optional uint64 amount = 6;
93 | optional TezosContractID destination = 7;
94 | optional bytes parameters = 8;
95 | }
96 | /**
97 | * Structure representing information for origination
98 | */
99 | message TezosOriginationOp {
100 | optional TezosContractID source = 1;
101 | optional uint64 fee = 2;
102 | optional uint64 counter = 3;
103 | optional uint64 gas_limit = 4;
104 | optional uint64 storage_limit = 5;
105 | optional bytes manager_pubkey = 6;
106 | optional uint64 balance = 7;
107 | optional bool spendable = 8;
108 | optional bool delegatable = 9;
109 | optional bytes delegate = 10;
110 | optional bytes script = 11;
111 | }
112 | /**
113 | * Structure representing information for delegation
114 | */
115 | message TezosDelegationOp {
116 | optional TezosContractID source = 1;
117 | optional uint64 fee = 2;
118 | optional uint64 counter = 3;
119 | optional uint64 gas_limit = 4;
120 | optional uint64 storage_limit = 5;
121 | optional bytes delegate = 6;
122 | }
123 | }
124 |
125 | /**
126 | * Response: Contains Tezos transaction signature
127 | * @end
128 | */
129 | message TezosSignedTx {
130 | optional string signature = 1; // Tezos b58 encoded transaction signature with prefix
131 | optional bytes sig_op_contents = 2; // operation_bytes + signed operation_bytes
132 | optional string operation_hash = 3; // b58 encoded hashed operation contents with prefix
133 | }
134 |
--------------------------------------------------------------------------------
/skin/js/trezor/protob/messages.proto:
--------------------------------------------------------------------------------
1 | syntax = "proto2";
2 | package hw.trezor.messages;
3 |
4 | /**
5 | * Messages for TREZOR communication
6 | */
7 |
8 | // Sugar for easier handling in Java
9 | option java_package = "com.satoshilabs.trezor.lib.protobuf";
10 | option java_outer_classname = "TrezorMessage";
11 |
12 | import "google/protobuf/descriptor.proto";
13 |
14 | /**
15 | * Options for specifying message direction and type of wire (normal/debug)
16 | */
17 | extend google.protobuf.EnumValueOptions {
18 | optional bool wire_in = 50002; // message can be transmitted via wire from PC to TREZOR
19 | optional bool wire_out = 50003; // message can be transmitted via wire from TREZOR to PC
20 | optional bool wire_debug_in = 50004; // message can be transmitted via debug wire from PC to TREZOR
21 | optional bool wire_debug_out = 50005; // message can be transmitted via debug wire from TREZOR to PC
22 | optional bool wire_tiny = 50006; // message is handled by TREZOR when the USB stack is in tiny mode
23 | optional bool wire_bootloader = 50007; // message is only handled by TREZOR Bootloader
24 | optional bool wire_no_fsm = 50008; // message is not handled by TREZOR unless the USB stack is in tiny mode
25 | }
26 |
27 | /**
28 | * Mapping between TREZOR wire identifier (uint) and a protobuf message
29 | */
30 | enum MessageType {
31 |
32 | // Management
33 | MessageType_Initialize = 0 [(wire_in) = true, (wire_tiny) = true];
34 | MessageType_Ping = 1 [(wire_in) = true];
35 | MessageType_Success = 2 [(wire_out) = true];
36 | MessageType_Failure = 3 [(wire_out) = true];
37 | MessageType_ChangePin = 4 [(wire_in) = true];
38 | MessageType_WipeDevice = 5 [(wire_in) = true];
39 | MessageType_GetEntropy = 9 [(wire_in) = true];
40 | MessageType_Entropy = 10 [(wire_out) = true];
41 | MessageType_LoadDevice = 13 [(wire_in) = true];
42 | MessageType_ResetDevice = 14 [(wire_in) = true];
43 | MessageType_Features = 17 [(wire_out) = true];
44 | MessageType_PinMatrixRequest = 18 [(wire_out) = true];
45 | MessageType_PinMatrixAck = 19 [(wire_in) = true, (wire_tiny) = true, (wire_no_fsm) = true];
46 | MessageType_Cancel = 20 [(wire_in) = true, (wire_tiny) = true];
47 | MessageType_ClearSession = 24 [(wire_in) = true];
48 | MessageType_ApplySettings = 25 [(wire_in) = true];
49 | MessageType_ButtonRequest = 26 [(wire_out) = true];
50 | MessageType_ButtonAck = 27 [(wire_in) = true, (wire_tiny) = true, (wire_no_fsm) = true];
51 | MessageType_ApplyFlags = 28 [(wire_in) = true];
52 | MessageType_BackupDevice = 34 [(wire_in) = true];
53 | MessageType_EntropyRequest = 35 [(wire_out) = true];
54 | MessageType_EntropyAck = 36 [(wire_in) = true];
55 | MessageType_PassphraseRequest = 41 [(wire_out) = true];
56 | MessageType_PassphraseAck = 42 [(wire_in) = true, (wire_tiny) = true, (wire_no_fsm) = true];
57 | MessageType_PassphraseStateRequest = 77 [(wire_out) = true];
58 | MessageType_PassphraseStateAck = 78 [(wire_in) = true, (wire_tiny) = true, (wire_no_fsm) = true];
59 | MessageType_RecoveryDevice = 45 [(wire_in) = true];
60 | MessageType_WordRequest = 46 [(wire_out) = true];
61 | MessageType_WordAck = 47 [(wire_in) = true];
62 | MessageType_GetFeatures = 55 [(wire_in) = true];
63 | MessageType_SetU2FCounter = 63 [(wire_in) = true];
64 |
65 | // Bootloader
66 | MessageType_FirmwareErase = 6 [(wire_in) = true, (wire_bootloader) = true];
67 | MessageType_FirmwareUpload = 7 [(wire_in) = true, (wire_bootloader) = true];
68 | MessageType_FirmwareRequest = 8 [(wire_out) = true, (wire_bootloader) = true];
69 | MessageType_SelfTest = 32 [(wire_in) = true, (wire_bootloader) = true];
70 |
71 | // Bitcoin
72 | MessageType_GetPublicKey = 11 [(wire_in) = true];
73 | MessageType_PublicKey = 12 [(wire_out) = true];
74 | MessageType_SignTx = 15 [(wire_in) = true];
75 | MessageType_TxRequest = 21 [(wire_out) = true];
76 | MessageType_TxAck = 22 [(wire_in) = true];
77 | MessageType_GetAddress = 29 [(wire_in) = true];
78 | MessageType_Address = 30 [(wire_out) = true];
79 | MessageType_SignMessage = 38 [(wire_in) = true];
80 | MessageType_VerifyMessage = 39 [(wire_in) = true];
81 | MessageType_MessageSignature = 40 [(wire_out) = true];
82 |
83 | // Crypto
84 | MessageType_CipherKeyValue = 23 [(wire_in) = true];
85 | MessageType_CipheredKeyValue = 48 [(wire_out) = true];
86 | MessageType_SignIdentity = 53 [(wire_in) = true];
87 | MessageType_SignedIdentity = 54 [(wire_out) = true];
88 | MessageType_GetECDHSessionKey = 61 [(wire_in) = true];
89 | MessageType_ECDHSessionKey = 62 [(wire_out) = true];
90 | MessageType_CosiCommit = 71 [(wire_in) = true];
91 | MessageType_CosiCommitment = 72 [(wire_out) = true];
92 | MessageType_CosiSign = 73 [(wire_in) = true];
93 | MessageType_CosiSignature = 74 [(wire_out) = true];
94 |
95 | // Debug
96 | MessageType_DebugLinkDecision = 100 [(wire_debug_in) = true, (wire_tiny) = true, (wire_no_fsm) = true];
97 | MessageType_DebugLinkGetState = 101 [(wire_debug_in) = true, (wire_tiny) = true];
98 | MessageType_DebugLinkState = 102 [(wire_debug_out) = true];
99 | MessageType_DebugLinkStop = 103 [(wire_debug_in) = true];
100 | MessageType_DebugLinkLog = 104 [(wire_debug_out) = true];
101 | MessageType_DebugLinkMemoryRead = 110 [(wire_debug_in) = true];
102 | MessageType_DebugLinkMemory = 111 [(wire_debug_out) = true];
103 | MessageType_DebugLinkMemoryWrite = 112 [(wire_debug_in) = true];
104 | MessageType_DebugLinkFlashErase = 113 [(wire_debug_in) = true];
105 |
106 | // Ethereum
107 | MessageType_EthereumGetAddress = 56 [(wire_in) = true];
108 | MessageType_EthereumAddress = 57 [(wire_out) = true];
109 | MessageType_EthereumSignTx = 58 [(wire_in) = true];
110 | MessageType_EthereumTxRequest = 59 [(wire_out) = true];
111 | MessageType_EthereumTxAck = 60 [(wire_in) = true];
112 | MessageType_EthereumSignMessage = 64 [(wire_in) = true];
113 | MessageType_EthereumVerifyMessage = 65 [(wire_in) = true];
114 | MessageType_EthereumMessageSignature = 66 [(wire_out) = true];
115 |
116 | // NEM
117 | MessageType_NEMGetAddress = 67 [(wire_in) = true];
118 | MessageType_NEMAddress = 68 [(wire_out) = true];
119 | MessageType_NEMSignTx = 69 [(wire_in) = true];
120 | MessageType_NEMSignedTx = 70 [(wire_out) = true];
121 | MessageType_NEMDecryptMessage = 75 [(wire_in) = true];
122 | MessageType_NEMDecryptedMessage = 76 [(wire_out) = true];
123 |
124 | // Lisk
125 | MessageType_LiskGetAddress = 114 [(wire_in) = true];
126 | MessageType_LiskAddress = 115 [(wire_out) = true];
127 | MessageType_LiskSignTx = 116 [(wire_in) = true];
128 | MessageType_LiskSignedTx = 117 [(wire_out) = true];
129 | MessageType_LiskSignMessage = 118 [(wire_in) = true];
130 | MessageType_LiskMessageSignature = 119 [(wire_out) = true];
131 | MessageType_LiskVerifyMessage = 120 [(wire_in) = true];
132 | MessageType_LiskGetPublicKey = 121 [(wire_in) = true];
133 | MessageType_LiskPublicKey = 122 [(wire_out) = true];
134 |
135 | // Tezos
136 | MessageType_TezosGetAddress = 150 [(wire_in) = true];
137 | MessageType_TezosAddress = 151 [(wire_out) = true];
138 | MessageType_TezosSignTx = 152 [(wire_in) = true];
139 | MessageType_TezosSignedTx = 153 [(wire_out) = true];
140 | MessageType_TezosGetPublicKey = 154 [(wire_in) = true];
141 | MessageType_TezosPublicKey = 155 [(wire_out) = true];
142 |
143 | // Stellar
144 | MessageType_StellarSignTx = 202 [(wire_in) = true];
145 | MessageType_StellarTxOpRequest = 203 [(wire_out) = true];
146 | MessageType_StellarGetAddress = 207 [(wire_in) = true];
147 | MessageType_StellarAddress = 208 [(wire_out) = true];
148 | MessageType_StellarCreateAccountOp = 210 [(wire_in) = true];
149 | MessageType_StellarPaymentOp = 211 [(wire_in) = true];
150 | MessageType_StellarPathPaymentOp = 212 [(wire_in) = true];
151 | MessageType_StellarManageOfferOp = 213 [(wire_in) = true];
152 | MessageType_StellarCreatePassiveOfferOp = 214 [(wire_in) = true];
153 | MessageType_StellarSetOptionsOp = 215 [(wire_in) = true];
154 | MessageType_StellarChangeTrustOp = 216 [(wire_in) = true];
155 | MessageType_StellarAllowTrustOp = 217 [(wire_in) = true];
156 | MessageType_StellarAccountMergeOp = 218 [(wire_in) = true];
157 | // omitted: StellarInflationOp is not a supported operation, would be 219
158 | MessageType_StellarManageDataOp = 220 [(wire_in) = true];
159 | MessageType_StellarBumpSequenceOp = 221 [(wire_in) = true];
160 | MessageType_StellarSignedTx = 230 [(wire_out) = true];
161 |
162 | // TRON
163 | MessageType_TronGetAddress = 250 [(wire_in) = true];
164 | MessageType_TronAddress = 251 [(wire_out) = true];
165 | MessageType_TronSignTx = 252 [(wire_in) = true];
166 | MessageType_TronSignedTx = 253 [(wire_out) = true];
167 |
168 | // Cardano
169 | // dropped Sign/VerifyMessage ids 300-302
170 | MessageType_CardanoSignTx = 303 [(wire_in) = true];
171 | MessageType_CardanoTxRequest = 304 [(wire_out) = true];
172 | MessageType_CardanoGetPublicKey = 305 [(wire_in) = true];
173 | MessageType_CardanoPublicKey = 306 [(wire_out) = true];
174 | MessageType_CardanoGetAddress = 307 [(wire_in) = true];
175 | MessageType_CardanoAddress = 308 [(wire_out) = true];
176 | MessageType_CardanoTxAck = 309 [(wire_in) = true];
177 | MessageType_CardanoSignedTx = 310 [(wire_out) = true];
178 |
179 | // Ontology
180 | MessageType_OntologyGetAddress = 350 [(wire_in) = true];
181 | MessageType_OntologyAddress = 351 [(wire_out) = true];
182 | MessageType_OntologyGetPublicKey = 352 [(wire_in) = true];
183 | MessageType_OntologyPublicKey = 353 [(wire_out) = true];
184 | MessageType_OntologySignTransfer = 354 [(wire_in) = true];
185 | MessageType_OntologySignedTransfer = 355 [(wire_out) = true];
186 | MessageType_OntologySignWithdrawOng = 356 [(wire_in) = true];
187 | MessageType_OntologySignedWithdrawOng = 357 [(wire_out) = true];
188 | MessageType_OntologySignOntIdRegister = 358 [(wire_in) = true];
189 | MessageType_OntologySignedOntIdRegister = 359 [(wire_out) = true];
190 | MessageType_OntologySignOntIdAddAttributes = 360 [(wire_in) = true];
191 | MessageType_OntologySignedOntIdAddAttributes = 361 [(wire_out) = true];
192 |
193 | // Ripple
194 | MessageType_RippleGetAddress = 400 [(wire_in) = true];
195 | MessageType_RippleAddress = 401 [(wire_out) = true];
196 | MessageType_RippleSignTx = 402 [(wire_in) = true];
197 | MessageType_RippleSignedTx = 403 [(wire_in) = true];
198 |
199 | // Monero
200 | MessageType_MoneroTransactionInitRequest = 501 [(wire_out) = true];
201 | MessageType_MoneroTransactionInitAck = 502 [(wire_out) = true];
202 | MessageType_MoneroTransactionSetInputRequest = 503 [(wire_out) = true];
203 | MessageType_MoneroTransactionSetInputAck = 504 [(wire_out) = true];
204 | MessageType_MoneroTransactionInputsPermutationRequest = 505 [(wire_out) = true];
205 | MessageType_MoneroTransactionInputsPermutationAck = 506 [(wire_out) = true];
206 | MessageType_MoneroTransactionInputViniRequest = 507 [(wire_out) = true];
207 | MessageType_MoneroTransactionInputViniAck = 508 [(wire_out) = true];
208 | MessageType_MoneroTransactionAllInputsSetRequest = 509 [(wire_out) = true];
209 | MessageType_MoneroTransactionAllInputsSetAck = 510 [(wire_out) = true];
210 | MessageType_MoneroTransactionSetOutputRequest = 511 [(wire_out) = true];
211 | MessageType_MoneroTransactionSetOutputAck = 512 [(wire_out) = true];
212 | MessageType_MoneroTransactionAllOutSetRequest = 513 [(wire_out) = true];
213 | MessageType_MoneroTransactionAllOutSetAck = 514 [(wire_out) = true];
214 | MessageType_MoneroTransactionSignInputRequest = 515 [(wire_out) = true];
215 | MessageType_MoneroTransactionSignInputAck = 516 [(wire_out) = true];
216 | MessageType_MoneroTransactionFinalRequest = 517 [(wire_out) = true];
217 | MessageType_MoneroTransactionFinalAck = 518 [(wire_out) = true];
218 | MessageType_MoneroKeyImageExportInitRequest = 530 [(wire_out) = true];
219 | MessageType_MoneroKeyImageExportInitAck = 531 [(wire_out) = true];
220 | MessageType_MoneroKeyImageSyncStepRequest = 532 [(wire_out) = true];
221 | MessageType_MoneroKeyImageSyncStepAck = 533 [(wire_out) = true];
222 | MessageType_MoneroKeyImageSyncFinalRequest = 534 [(wire_out) = true];
223 | MessageType_MoneroKeyImageSyncFinalAck = 535 [(wire_out) = true];
224 | MessageType_MoneroGetAddress = 540 [(wire_in) = true];
225 | MessageType_MoneroAddress = 541 [(wire_out) = true];
226 | MessageType_MoneroGetWatchKey = 542 [(wire_in) = true];
227 | MessageType_MoneroWatchKey = 543 [(wire_out) = true];
228 | MessageType_DebugMoneroDiagRequest = 546 [(wire_in) = true];
229 | MessageType_DebugMoneroDiagAck = 547 [(wire_out) = true];
230 | }
231 |
--------------------------------------------------------------------------------
/skin/js/trezor/protob/trezor.tezos.proto:
--------------------------------------------------------------------------------
1 | syntax = "proto2";
2 | package trezor.tezos;
3 | import "messages-bootloader.proto";
4 | import "messages-common.proto";
5 | import "messages-debug.proto";
6 | import "messages-management.proto";
7 | import "messages-tezos.proto";
--------------------------------------------------------------------------------
/skin/js/underscore/underscore.js:
--------------------------------------------------------------------------------
1 | // Underscore.js 1.9.1
2 | // http://underscorejs.org
3 | // (c) 2009-2018 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
4 | // Underscore may be freely distributed under the MIT license.
5 | !function(){var n="object"==typeof self&&self.self===self&&self||"object"==typeof global&&global.global===global&&global||this||{},r=n._,e=Array.prototype,o=Object.prototype,s="undefined"!=typeof Symbol?Symbol.prototype:null,u=e.push,c=e.slice,p=o.toString,i=o.hasOwnProperty,t=Array.isArray,a=Object.keys,l=Object.create,f=function(){},h=function(n){return n instanceof h?n:this instanceof h?void(this._wrapped=n):new h(n)};"undefined"==typeof exports||exports.nodeType?n._=h:("undefined"!=typeof module&&!module.nodeType&&module.exports&&(exports=module.exports=h),exports._=h),h.VERSION="1.9.1";var v,y=function(u,i,n){if(void 0===i)return u;switch(null==n?3:n){case 1:return function(n){return u.call(i,n)};case 3:return function(n,r,t){return u.call(i,n,r,t)};case 4:return function(n,r,t,e){return u.call(i,n,r,t,e)}}return function(){return u.apply(i,arguments)}},d=function(n,r,t){return h.iteratee!==v?h.iteratee(n,r):null==n?h.identity:h.isFunction(n)?y(n,r,t):h.isObject(n)&&!h.isArray(n)?h.matcher(n):h.property(n)};h.iteratee=v=function(n,r){return d(n,r,1/0)};var g=function(u,i){return i=null==i?u.length-1:+i,function(){for(var n=Math.max(arguments.length-i,0),r=Array(n),t=0;t":">",'"':""","'":"'","`":"`"},P=h.invert(L),W=function(r){var t=function(n){return r[n]},n="(?:"+h.keys(r).join("|")+")",e=RegExp(n),u=RegExp(n,"g");return function(n){return n=null==n?"":""+n,e.test(n)?n.replace(u,t):n}};h.escape=W(L),h.unescape=W(P),h.result=function(n,r,t){h.isArray(r)||(r=[r]);var e=r.length;if(!e)return h.isFunction(t)?t.call(n):t;for(var u=0;u/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var J=/(.)^/,U={"'":"'","\\":"\\","\r":"r","\n":"n","\u2028":"u2028","\u2029":"u2029"},V=/\\|'|\r|\n|\u2028|\u2029/g,$=function(n){return"\\"+U[n]};h.template=function(i,n,r){!n&&r&&(n=r),n=h.defaults({},n,h.templateSettings);var t,e=RegExp([(n.escape||J).source,(n.interpolate||J).source,(n.evaluate||J).source].join("|")+"|$","g"),o=0,a="__p+='";i.replace(e,function(n,r,t,e,u){return a+=i.slice(o,u).replace(V,$),o=u+n.length,r?a+="'+\n((__t=("+r+"))==null?'':_.escape(__t))+\n'":t?a+="'+\n((__t=("+t+"))==null?'':__t)+\n'":e&&(a+="';\n"+e+"\n__p+='"),n}),a+="';\n",n.variable||(a="with(obj||{}){\n"+a+"}\n"),a="var __t,__p='',__j=Array.prototype.join,"+"print=function(){__p+=__j.call(arguments,'');};\n"+a+"return __p;\n";try{t=new Function(n.variable||"obj","_",a)}catch(n){throw n.source=a,n}var u=function(n){return t.call(this,n,h)},c=n.variable||"obj";return u.source="function("+c+"){\n"+a+"}",u},h.chain=function(n){var r=h(n);return r._chain=!0,r};var G=function(n,r){return n._chain?h(r).chain():r};h.mixin=function(t){return h.each(h.functions(t),function(n){var r=h[n]=t[n];h.prototype[n]=function(){var n=[this._wrapped];return u.apply(n,arguments),G(this,r.apply(h,n))}}),h},h.mixin(h),h.each(["pop","push","reverse","shift","sort","splice","unshift"],function(r){var t=e[r];h.prototype[r]=function(){var n=this._wrapped;return t.apply(n,arguments),"shift"!==r&&"splice"!==r||0!==n.length||delete n[0],G(this,n)}}),h.each(["concat","join","slice"],function(n){var r=e[n];h.prototype[n]=function(){return G(this,r.apply(this._wrapped,arguments))}}),h.prototype.value=function(){return this._wrapped},h.prototype.valueOf=h.prototype.toJSON=h.prototype.value,h.prototype.toString=function(){return String(this._wrapped)},"function"==typeof define&&define.amd&&define("underscore",[],function(){return h})}();
--------------------------------------------------------------------------------
/skin/webfonts/VisbyCF-Light.woff2:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/skin/webfonts/VisbyCF-Thin.woff2:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/skin/webfonts/fa-brands-400.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tezbox/web-wallet/feef1dc7abd6e6cd4658dbe59fb3b0b4e503ecdc/skin/webfonts/fa-brands-400.eot
--------------------------------------------------------------------------------
/skin/webfonts/fa-brands-400.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tezbox/web-wallet/feef1dc7abd6e6cd4658dbe59fb3b0b4e503ecdc/skin/webfonts/fa-brands-400.ttf
--------------------------------------------------------------------------------
/skin/webfonts/fa-brands-400.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tezbox/web-wallet/feef1dc7abd6e6cd4658dbe59fb3b0b4e503ecdc/skin/webfonts/fa-brands-400.woff
--------------------------------------------------------------------------------
/skin/webfonts/fa-brands-400.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tezbox/web-wallet/feef1dc7abd6e6cd4658dbe59fb3b0b4e503ecdc/skin/webfonts/fa-brands-400.woff2
--------------------------------------------------------------------------------
/skin/webfonts/fa-regular-400.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tezbox/web-wallet/feef1dc7abd6e6cd4658dbe59fb3b0b4e503ecdc/skin/webfonts/fa-regular-400.eot
--------------------------------------------------------------------------------
/skin/webfonts/fa-regular-400.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tezbox/web-wallet/feef1dc7abd6e6cd4658dbe59fb3b0b4e503ecdc/skin/webfonts/fa-regular-400.ttf
--------------------------------------------------------------------------------
/skin/webfonts/fa-regular-400.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tezbox/web-wallet/feef1dc7abd6e6cd4658dbe59fb3b0b4e503ecdc/skin/webfonts/fa-regular-400.woff
--------------------------------------------------------------------------------
/skin/webfonts/fa-regular-400.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tezbox/web-wallet/feef1dc7abd6e6cd4658dbe59fb3b0b4e503ecdc/skin/webfonts/fa-regular-400.woff2
--------------------------------------------------------------------------------
/skin/webfonts/fa-solid-900.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tezbox/web-wallet/feef1dc7abd6e6cd4658dbe59fb3b0b4e503ecdc/skin/webfonts/fa-solid-900.eot
--------------------------------------------------------------------------------
/skin/webfonts/fa-solid-900.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tezbox/web-wallet/feef1dc7abd6e6cd4658dbe59fb3b0b4e503ecdc/skin/webfonts/fa-solid-900.ttf
--------------------------------------------------------------------------------
/skin/webfonts/fa-solid-900.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tezbox/web-wallet/feef1dc7abd6e6cd4658dbe59fb3b0b4e503ecdc/skin/webfonts/fa-solid-900.woff
--------------------------------------------------------------------------------
/skin/webfonts/fa-solid-900.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tezbox/web-wallet/feef1dc7abd6e6cd4658dbe59fb3b0b4e503ecdc/skin/webfonts/fa-solid-900.woff2
--------------------------------------------------------------------------------