aboutsummaryrefslogtreecommitdiffstats
path: root/app
diff options
context:
space:
mode:
Diffstat (limited to 'app')
-rw-r--r--app/_locales/cs/messages.json45
-rw-r--r--app/_locales/de/messages.json45
-rw-r--r--app/_locales/en/messages.json45
-rw-r--r--app/_locales/es/messages.json45
-rw-r--r--app/_locales/fr/messages.json39
-rw-r--r--app/_locales/hn/messages.json45
-rw-r--r--app/_locales/ht/messages.json39
-rw-r--r--app/_locales/it/messages.json45
-rw-r--r--app/_locales/ja/messages.json45
-rw-r--r--app/_locales/ko/messages.json45
-rw-r--r--app/_locales/nl/messages.json45
-rw-r--r--app/_locales/ph/messages.json45
-rw-r--r--app/_locales/pt/messages.json45
-rw-r--r--app/_locales/ru/messages.json45
-rw-r--r--app/_locales/sl/messages.json1073
-rw-r--r--app/_locales/th/messages.json45
-rw-r--r--app/_locales/tml/messages.json45
-rw-r--r--app/_locales/tr/messages.json45
-rw-r--r--app/_locales/vi/messages.json45
-rw-r--r--app/_locales/zh_CN/messages.json45
-rw-r--r--app/_locales/zh_TW/messages.json45
-rw-r--r--app/images/mm-secure.svg7
-rw-r--r--app/images/provider-approval-check.svg20
-rw-r--r--app/manifest.json2
-rw-r--r--app/scripts/background.js5
-rw-r--r--app/scripts/contentscript.js128
-rw-r--r--app/scripts/controllers/network/createInfuraClient.js33
-rw-r--r--app/scripts/controllers/network/network.js18
-rw-r--r--app/scripts/controllers/preferences.js8
-rw-r--r--app/scripts/controllers/provider-approval.js152
-rw-r--r--app/scripts/controllers/token-rates.js11
-rw-r--r--app/scripts/inpage.js154
-rw-r--r--app/scripts/metamask-controller.js34
-rw-r--r--app/scripts/platforms/extension.js12
34 files changed, 1738 insertions, 807 deletions
diff --git a/app/_locales/cs/messages.json b/app/_locales/cs/messages.json
index ae2413ad9..fde553c9e 100644
--- a/app/_locales/cs/messages.json
+++ b/app/_locales/cs/messages.json
@@ -1,4 +1,49 @@
{
+ "privacyMode": {
+ "message": "Režim súkromia"
+ },
+ "privacyModeDescription": {
+ "message": "Webové stránky musia požiadať o prístup k zobrazeniu informácií o vašom účte."
+ },
+ "exposeAccounts": {
+ "message": "Vystavte účty"
+ },
+ "exposeDescription": {
+ "message": "Vystavte účty na aktuální webové stránky. Užitečné pro starší dappy."
+ },
+ "confirmExpose": {
+ "message": "Opravdu chcete své účty vystavit na stávajícím webu?"
+ },
+ "confirmClear": {
+ "message": "Naozaj chcete vymazať schválené webové stránky?"
+ },
+ "clearApprovalDataSuccess": {
+ "message": "Schválené údaje webových stránek byly úspěšně zrušeny."
+ },
+ "approvalData": {
+ "message": "Údaje o schválení"
+ },
+ "approvalDataDescription": {
+ "message": "Vymažte schválené údaje webových stránek, aby všechny weby znovu požádaly o schválení."
+ },
+ "clearApprovalData": {
+ "message": "Jasné údaje o schválení"
+ },
+ "approve": {
+ "message": "Schválit"
+ },
+ "reject": {
+ "message": "Odmítnout"
+ },
+ "providerAPIRequest": {
+ "message": "Požadavek API Ethereum"
+ },
+ "reviewProviderRequest": {
+ "message": "Přečtěte si prosím tuto žádost API Ethereum."
+ },
+ "providerRequestInfo": {
+ "message": "Níže uvedená doména se pokouší požádat o přístup k API Ethereum, aby mohla komunikovat s blokádou Ethereum. Před schválením přístupu Ethereum vždy zkontrolujte, zda jste na správném místě."
+ },
"accept": {
"message": "Přijmout"
},
diff --git a/app/_locales/de/messages.json b/app/_locales/de/messages.json
index 9e1eb9eac..9404a9824 100644
--- a/app/_locales/de/messages.json
+++ b/app/_locales/de/messages.json
@@ -1,4 +1,49 @@
{
+ "privacyMode": {
+ "message": "Datenschutzmodus"
+ },
+ "privacyModeDescription": {
+ "message": "Websites müssen Zugriff anfordern, um Ihre Kontoinformationen anzuzeigen."
+ },
+ "exposeAccounts": {
+ "message": "Expose Konten"
+ },
+ "exposeDescription": {
+ "message": "Expose Konten auf der aktuellen Website. Nützlich für ältere Dapps."
+ },
+ "confirmExpose": {
+ "message": "Möchten Sie Ihre Konten wirklich der aktuellen Website zugänglich machen?"
+ },
+ "confirmClear": {
+ "message": "Möchten Sie die genehmigten Websites wirklich löschen?"
+ },
+ "clearApprovalDataSuccess": {
+ "message": "Genehmigte Website-Daten wurden erfolgreich gelöscht."
+ },
+ "approvalData": {
+ "message": "Genehmigungsdaten"
+ },
+ "approvalDataDescription": {
+ "message": "Löschen Sie die genehmigten Website-Daten, damit alle Websites erneut eine Genehmigung anfordern müssen."
+ },
+ "clearApprovalData": {
+ "message": "Genehmigungsdaten löschen"
+ },
+ "approve": {
+ "message": "Genehmigen"
+ },
+ "reject": {
+ "message": "Ablehnen"
+ },
+ "providerAPIRequest": {
+ "message": "Web3-API-Anfrage"
+ },
+ "reviewProviderRequest": {
+ "message": "Bitte lesen Sie diese Ethereum-API-Anfrage."
+ },
+ "providerRequestInfo": {
+ "message": "Die unten aufgeführte Domäne versucht, Zugriff auf die Ethereum-API anzufordern, damit sie mit der Ethereum-Blockchain interagieren kann. Überprüfen Sie immer, dass Sie sich auf der richtigen Website befinden, bevor Sie den Web3-Zugriff genehmigen."
+ },
"accept": {
"message": "Annehmen"
},
diff --git a/app/_locales/en/messages.json b/app/_locales/en/messages.json
index 26d0422cb..95c9efeeb 100644
--- a/app/_locales/en/messages.json
+++ b/app/_locales/en/messages.json
@@ -1,4 +1,43 @@
{
+ "privacyMode": {
+ "message": "Privacy Mode"
+ },
+ "privacyModeDescription": {
+ "message": "Websites must request access to view your account information."
+ },
+ "exposeAccounts": {
+ "message": "Expose Accounts"
+ },
+ "exposeDescription": {
+ "message": "Expose accounts to the current website. Useful for legacy dapps."
+ },
+ "confirmExpose": {
+ "message": "Are you sure you want to expose your accounts to the current website?"
+ },
+ "confirmClear": {
+ "message": "Are you sure you want to clear approved websites?"
+ },
+ "clearApprovalDataSuccess": {
+ "message": "Approved website data cleared successfully."
+ },
+ "approvalData": {
+ "message": "Privacy Data"
+ },
+ "approvalDataDescription": {
+ "message": "Clear privacy data so all websites must request access to view account information again."
+ },
+ "clearApprovalData": {
+ "message": "Clear Privacy Data"
+ },
+ "reject": {
+ "message": "Reject"
+ },
+ "providerRequest": {
+ "message": "$1 would like to connect to your account"
+ },
+ "providerRequestInfo": {
+ "message": "This site is requesting access to view your current account address. Always make sure you trust the sites you interact with."
+ },
"accept": {
"message": "Accept"
},
@@ -170,6 +209,9 @@
"connect": {
"message": "Connect"
},
+ "connectRequest": {
+ "message": "Connect Request"
+ },
"connecting": {
"message": "Connecting..."
},
@@ -860,9 +902,6 @@
"refundAddress": {
"message": "Your Refund Address"
},
- "reject": {
- "message": "Reject"
- },
"rejectAll": {
"message": "Reject All"
},
diff --git a/app/_locales/es/messages.json b/app/_locales/es/messages.json
index be2a29ab5..55276e1ec 100644
--- a/app/_locales/es/messages.json
+++ b/app/_locales/es/messages.json
@@ -1,4 +1,49 @@
{
+ "privacyMode": {
+ "message": "Modo privado"
+ },
+ "privacyModeDescription": {
+ "message": "Los sitios web deben solicitar acceso para ver la información de su cuenta."
+ },
+ "exposeAccounts": {
+ "message": "Exponer cuentas"
+ },
+ "exposeDescription": {
+ "message": "Exponer cuentas al sitio web actual. Útil para dapps heredados."
+ },
+ "confirmExpose": {
+ "message": "¿Seguro que quieres exponer tus cuentas al sitio web actual?"
+ },
+ "confirmClear": {
+ "message": "¿Seguro que quieres borrar los sitios web aprobados?"
+ },
+ "clearApprovalDataSuccess": {
+ "message": "Los datos aprobados del sitio web se borraron con éxito."
+ },
+ "approvalData": {
+ "message": "Datos de aprobación"
+ },
+ "approvalDataDescription": {
+ "message": "Borre los datos del sitio web aprobado para que todos los sitios deban volver a solicitar la aprobación."
+ },
+ "clearApprovalData": {
+ "message": "Borrar datos de aprobación"
+ },
+ "approve": {
+ "message": "Aprobar"
+ },
+ "reject": {
+ "message": "Rechazar"
+ },
+ "providerAPIRequest": {
+ "message": "Solicitud de API Web3"
+ },
+ "reviewProviderRequest": {
+ "message": "Por favor, revise esta solicitud API Ethereum."
+ },
+ "providerRequestInfo": {
+ "message": "El dominio que se muestra a continuación intenta solicitar acceso a la API Ethereum para que pueda interactuar con la cadena de bloques de Ethereum. Siempre verifique que esté en el sitio correcto antes de aprobar el acceso Ethereum."
+ },
"accept": {
"message": "Aceptar"
},
diff --git a/app/_locales/fr/messages.json b/app/_locales/fr/messages.json
index d418cd9aa..17306d0f2 100644
--- a/app/_locales/fr/messages.json
+++ b/app/_locales/fr/messages.json
@@ -1,4 +1,43 @@
{
+ "privacyMode": {
+ "message": "Les sites Web doivent demander un accès pour afficher les informations de votre compte."
+ },
+ "privacyModeDescription": {
+ "message": "Les sites Web doivent demander un accès pour afficher les informations de votre compte."
+ },
+ "exposeAccounts": {
+ "message": "Exposer les comptes"
+ },
+ "exposeDescription": {
+ "message": "Exposer des comptes sur le site Web actuel. Utile pour les dapps hérités."
+ },
+ "confirmExpose": {
+ "message": "Êtes-vous sûr de vouloir exposer vos comptes au site Web actuel?"
+ },
+ "confirmClear": {
+ "message": "Êtes-vous sûr de vouloir supprimer les sites Web approuvés?"
+ },
+ "clearApprovalDataSuccess": {
+ "message": "Les données de site Web approuvées ont été supprimées."
+ },
+ "approvalData": {
+ "message": "Données d'approbation"
+ },
+ "approvalDataDescription": {
+ "message": "Effacer les données de site Web approuvées afin que tous les sites doivent à nouveau demander l'approbation."
+ },
+ "clearApprovalData": {
+ "message": "Effacer les données d'approbation"
+ },
+ "providerAPIRequest": {
+ "message": "Demande d'API Web3"
+ },
+ "reviewProviderRequest": {
+ "message": "Veuillez consulter cette demande d'API Ethereum."
+ },
+ "providerRequestInfo": {
+ "message": "Le domaine répertorié ci-dessous tente de demander l'accès à l'API Ethereum pour pouvoir interagir avec la chaîne de blocs Ethereum. Vérifiez toujours que vous êtes sur le bon site avant d'autoriser l'accès à Ethereum."
+ },
"accept": {
"message": "Accepter"
},
diff --git a/app/_locales/hn/messages.json b/app/_locales/hn/messages.json
index b869560e5..8e2281418 100644
--- a/app/_locales/hn/messages.json
+++ b/app/_locales/hn/messages.json
@@ -1,4 +1,49 @@
{
+ "privacyMode": {
+ "message": "गोपनीयता मोड"
+ },
+ "privacyModeDescription": {
+ "message": "वेबसाइटों को आपकी खाता जानकारी देखने के लिए पहुंच का अनुरोध करना होगा।"
+ },
+ "exposeAccounts": {
+ "message": "खातों का पर्दाफाश करें"
+ },
+ "exposeDescription": {
+ "message": "मौजूदा वेबसाइट पर खातों का पर्दाफाश करें। विरासत डैप्स के लिए उपयोगी।"
+ },
+ "confirmExpose": {
+ "message": "क्या आप वाकई अपने खातों को वर्तमान वेबसाइट पर बेनकाब करना चाहते हैं?"
+ },
+ "confirmClear": {
+ "message": "क्या आप वाकई अनुमोदित वेबसाइटों को साफ़ करना चाहते हैं?"
+ },
+ "clearApprovalDataSuccess": {
+ "message": "स्वीकृत वेबसाइट डेटा सफलतापूर्वक मंजूरी दे दी।"
+ },
+ "approvalData": {
+ "message": "स्वीकृति डेटा"
+ },
+ "approvalDataDescription": {
+ "message": "अनुमोदित वेबसाइट डेटा साफ़ करें ताकि सभी साइटों को फिर से अनुमोदन का अनुरोध करना होगा।"
+ },
+ "clearApprovalData": {
+ "message": "अनुमोदन डेटा साफ़ करें"
+ },
+ "approve": {
+ "message": "मंजूर"
+ },
+ "reject": {
+ "message": "अस्वीकार"
+ },
+ "providerAPIRequest": {
+ "message": "वेब 3 एपीआई अनुरोध"
+ },
+ "reviewProviderRequest": {
+ "message": "कृपया इस वेब 3 एपीआई अनुरोध की समीक्षा करें।"
+ },
+ "providerRequestInfo": {
+ "message": "नीचे सूचीबद्ध डोमेन वेब 3 एपीआई तक पहुंच का अनुरोध करने का प्रयास कर रहा है ताकि यह एथेरियम ब्लॉकचेन से बातचीत कर सके। वेब 3 एक्सेस को मंजूरी देने से पहले हमेशा सही जांच करें कि आप सही साइट पर हैं।"
+ },
"accept": {
"message": "स्वीकार करें"
},
diff --git a/app/_locales/ht/messages.json b/app/_locales/ht/messages.json
index 81ce18018..ff44af903 100644
--- a/app/_locales/ht/messages.json
+++ b/app/_locales/ht/messages.json
@@ -1,4 +1,43 @@
{
+ "privacyMode": {
+ "message": "Mòd Privacy"
+ },
+ "privacyModeDescription": {
+ "message": "Sou sit entènèt yo dwe mande aksè pou wè enfòmasyon kont ou."
+ },
+ "exposeAccounts": {
+ "message": "Ekspoze Kont"
+ },
+ "exposeDescription": {
+ "message": "Ekspoze kont sou sitwèb aktyèl la. Itil pou dapps eritaj."
+ },
+ "confirmExpose": {
+ "message": "Èske ou sèten ou vle ekspoze kont ou sou sit entènèt aktyèl la?"
+ },
+ "confirmClear": {
+ "message": "Èske ou sèten ou vle klè sitwèb apwouve?"
+ },
+ "clearApprovalDataSuccess": {
+ "message": "Done sou sit wèb apwouve yo te klarifye avèk siksè."
+ },
+ "approvalData": {
+ "message": "Done sou vi prive"
+ },
+ "approvalDataDescription": {
+ "message": "Done sou vi prive klè pou tout sit entènèt yo dwe mande aksè pou wè enfòmasyon kont ankò."
+ },
+ "clearApprovalData": {
+ "message": "Klè Done sou vi prive"
+ },
+ "providerAPIRequest": {
+ "message": "Ethereum API Mande"
+ },
+ "reviewProviderRequest": {
+ "message": "Tanpri revize sa API demann Ethereum."
+ },
+ "providerRequestInfo": {
+ "message": "Domèn ki nan lis anba a ap mande pou jwenn aksè a blòkchou Ethereum ak pou wè kont ou ye kounye a. Toujou double tcheke ke ou sou sit ki kòrèk la anvan apwouve aksè."
+ },
"accept": {
"message": "Aksepte"
},
diff --git a/app/_locales/it/messages.json b/app/_locales/it/messages.json
index 06e3dc855..e97c28e42 100644
--- a/app/_locales/it/messages.json
+++ b/app/_locales/it/messages.json
@@ -1,4 +1,46 @@
{
+ "privacyMode": {
+ "message": "Modalità di privacy"
+ },
+ "privacyModeDescription": {
+ "message": "I siti Web devono richiedere l'accesso per visualizzare le informazioni del tuo account."
+ },
+ "exposeAccounts": {
+ "message": "Expose Accounts"
+ },
+ "exposeDescription": {
+ "message": "Esporre gli account al sito Web corrente. Utile per dapps legacy."
+ },
+ "confirmExpose": {
+ "message": "Sei sicuro di voler esporre i tuoi account al sito web corrente?"
+ },
+ "confirmClear": {
+ "message": "Sei sicuro di voler cancellare i siti Web approvati?"
+ },
+ "clearApprovalDataSuccess": {
+ "message": "Dati del sito Web approvati cancellati correttamente."
+ },
+ "approvalData": {
+ "message": "Dati di approvazione"
+ },
+ "approvalDataDescription": {
+ "message": "Cancella i dati del sito web approvati, quindi tutti i siti devono richiedere nuovamente l'approvazione."
+ },
+ "clearApprovalData": {
+ "message": "Cancella i dati di approvazione"
+ },
+ "reject": {
+ "message": "Rifiutare"
+ },
+ "providerAPIRequest": {
+ "message": "Richiesta API Web3"
+ },
+ "reviewProviderRequest": {
+ "message": "Si prega di rivedere questa richiesta API Ethereum."
+ },
+ "providerRequestInfo": {
+ "message": "Il dominio elencato di seguito sta tentando di richiedere l'accesso all'API Ethereum in modo che possa interagire con la blockchain di Ethereum. Controlla sempre di essere sul sito corretto prima di approvare l'accesso a Ethereum."
+ },
"accept": {
"message": "Accetta"
},
@@ -824,9 +866,6 @@
"refundAddress": {
"message": "Indirizzo di Rimborso"
},
- "reject": {
- "message": "Reject"
- },
"rejectAll": {
"message": "Reject All"
},
diff --git a/app/_locales/ja/messages.json b/app/_locales/ja/messages.json
index 7b25f386a..8ae363030 100644
--- a/app/_locales/ja/messages.json
+++ b/app/_locales/ja/messages.json
@@ -1,4 +1,49 @@
{
+ "privacyMode": {
+ "message": "プライバシーモード"
+ },
+ "privacyModeDescription": {
+ "message": "ウェブサイトはあなたのアカウント情報を閲覧するためのアクセスを要求する必要があります。"
+ },
+ "exposeAccounts": {
+ "message": "アカウントを公開する"
+ },
+ "exposeDescription": {
+ "message": "アカウントを現在のウェブサイトに公開する。従来のdappsに役立ちます。"
+ },
+ "confirmExpose": {
+ "message": "現在のウェブサイトにアカウントを公開してもよろしいですか?"
+ },
+ "confirmClear": {
+ "message": "承認されたウェブサイトをクリアしてもよろしいですか?"
+ },
+ "clearApprovalDataSuccess": {
+ "message": "承認されたウェブサイトデータが正常に消去されました。"
+ },
+ "approvalData": {
+ "message": "承認データ"
+ },
+ "approvalDataDescription": {
+ "message": "承認されたウェブサイトのデータをクリアすると、すべてのサイトで承認を再度要求する必要があります"
+ },
+ "clearApprovalData": {
+ "message": "承認データのクリア"
+ },
+ "approve": {
+ "message": "承認する"
+ },
+ "reject": {
+ "message": "拒否"
+ },
+ "providerAPIRequest": {
+ "message": "Web3 APIリクエスト"
+ },
+ "reviewProviderRequest": {
+ "message": "このEthereum APIリクエストを確認してください。"
+ },
+ "providerRequestInfo": {
+ "message": "下記のドメインは、Ethereumブロックチェーンとやり取りできるようにEthereum APIへのアクセスをリクエストしようとしています。 Web3アクセスを承認する前に、正しいサイトにいることを常に確認してください。"
+ },
"accept": {
"message": "承認"
},
diff --git a/app/_locales/ko/messages.json b/app/_locales/ko/messages.json
index c8d470188..af1c32615 100644
--- a/app/_locales/ko/messages.json
+++ b/app/_locales/ko/messages.json
@@ -1,4 +1,46 @@
{
+ "privacyMode": {
+ "message": "개인 정보 보호 모드"
+ },
+ "privacyModeDescription": {
+ "message": "웹 사이트는 계정 정보를 볼 수있는 액세스 권한을 요청해야합니다."
+ },
+ "exposeAccounts": {
+ "message": "계정 노출"
+ },
+ "exposeDescription": {
+ "message": "계정을 현재 웹 사이트에 노출하십시오. 기존 dapps에 유용합니다."
+ },
+ "confirmExpose": {
+ "message": "계정을 현재 웹 사이트에 공개 하시겠습니까?"
+ },
+ "confirmClear": {
+ "message": "승인 된 웹 사이트를 삭제 하시겠습니까?"
+ },
+ "clearApprovalDataSuccess": {
+ "message": "승인 된 웹 사이트 데이터가 성공적으로 삭제되었습니다."
+ },
+ "approvalData": {
+ "message": "승인 데이터"
+ },
+ "approvalDataDescription": {
+ "message": "승인 된 웹 사이트 데이터를 삭제하여 모든 사이트에서 승인을 다시 요청해야합니다."
+ },
+ "clearApprovalData": {
+ "message": "승인 데이터 삭제"
+ },
+ "reject": {
+ "message": "받지 않다"
+ },
+ "providerAPIRequest": {
+ "message": "Web3 API 요청"
+ },
+ "reviewProviderRequest": {
+ "message": "이 Ethereum API 요청을 검토하십시오."
+ },
+ "providerRequestInfo": {
+ "message": "아래 나열된 도메인은 Web3 API에 대한 액세스를 요청하여 Ethereum 블록 체인과 상호 작용할 수 있습니다. Ethereum 액세스를 승인하기 전에 항상 올바른 사이트에 있는지 다시 확인하십시오."
+ },
"accept": {
"message": "수락"
},
@@ -815,9 +857,6 @@
"refundAddress": {
"message": "환불받을 주소"
},
- "reject": {
- "message": "거부"
- },
"rejectAll": {
"message": "모두 거부"
},
diff --git a/app/_locales/nl/messages.json b/app/_locales/nl/messages.json
index fc3450290..5d9f1f3ab 100644
--- a/app/_locales/nl/messages.json
+++ b/app/_locales/nl/messages.json
@@ -1,4 +1,49 @@
{
+ "privacyMode": {
+ "message": "Privacy-modus"
+ },
+ "privacyModeDescription": {
+ "message": "Websites moeten toegang vragen om uw accountgegevens te bekijken."
+ },
+ "exposeAccounts": {
+ "message": "Expose Accounts"
+ },
+ "exposeDescription": {
+ "message": "Stel accounts vrij op de huidige website. Handig voor legacy dapps."
+ },
+ "confirmExpose": {
+ "message": "Weet u zeker dat u uw accounts wilt weergeven aan de huidige website?"
+ },
+ "confirmClear": {
+ "message": "Weet je zeker dat je goedgekeurde websites wilt wissen?"
+ },
+ "clearApprovalDataSuccess": {
+ "message": "Goedgekeurde websitegegevens zijn met succes gewist."
+ },
+ "approvalData": {
+ "message": "Goedkeuringsgegevens"
+ },
+ "approvalDataDescription": {
+ "message": "Goedgekeurde websitegegevens wissen zodat alle sites opnieuw goedkeuring moeten aanvragen."
+ },
+ "clearApprovalData": {
+ "message": "Gegevens over goedkeuring wissen"
+ },
+ "approve": {
+ "message": "Goedkeuren"
+ },
+ "reject": {
+ "message": "Afwijzen"
+ },
+ "providerAPIRequest": {
+ "message": "Web3 API-aanvraag"
+ },
+ "reviewProviderRequest": {
+ "message": "Bekijk deze Ethereum API-aanvraag."
+ },
+ "providerRequestInfo": {
+ "message": "Het onderstaande domein probeert toegang tot de Ethereum API te vragen zodat deze kan communiceren met de Ethereum-blockchain. Controleer altijd eerst of u op de juiste site bent voordat u Ethereum-toegang goedkeurt."
+ },
"accept": {
"message": "Aanvaarden"
},
diff --git a/app/_locales/ph/messages.json b/app/_locales/ph/messages.json
index 9a243447a..cef686868 100644
--- a/app/_locales/ph/messages.json
+++ b/app/_locales/ph/messages.json
@@ -1,4 +1,49 @@
{
+ "privacyMode": {
+ "message": "Mode ng Privacy"
+ },
+ "privacyModeDescription": {
+ "message": "Dapat humiling ng access ang mga website upang tingnan ang impormasyon ng iyong account."
+ },
+ "exposeAccounts": {
+ "message": "Ilantad ang Mga Account"
+ },
+ "exposeDescription": {
+ "message": "Ilantad ang mga account sa kasalukuyang website. Kapaki-pakinabang para sa mga dapps ng legacy."
+ },
+ "confirmExpose": {
+ "message": "Sigurado ka bang gusto mong ilantad ang iyong mga account sa kasalukuyang website?"
+ },
+ "confirmClear": {
+ "message": "Sigurado ka bang gusto mong i-clear ang mga naaprubahang website?"
+ },
+ "clearApprovalDataSuccess": {
+ "message": "Matagumpay na na-clear ang data ng aprubadong website."
+ },
+ "approvalData": {
+ "message": "Data ng Pag-apruba"
+ },
+ "approvalDataDescription": {
+ "message": "I-clear ang naaprubahang data ng website upang ang lahat ng site ay dapat humiling muli ng pag-apruba"
+ },
+ "clearApprovalData": {
+ "message": "Tanggalin ang data ng pag-apruba"
+ },
+ "approve": {
+ "message": "Aprubahan"
+ },
+ "reject": {
+ "message": "Tanggihan"
+ },
+ "providerAPIRequest": {
+ "message": "Kahilingan sa Web3 API"
+ },
+ "reviewProviderRequest": {
+ "message": "Mangyaring suriin ang kahilingan sa Ethereum API na ito."
+ },
+ "providerRequestInfo": {
+ "message": "Ang domain na nakalista sa ibaba ay sinusubukang humiling ng access sa Ethereum API upang maaari itong makipag-ugnayan sa Ethereum blockchain. Laging i-double check na ikaw ay nasa tamang site bago aprubahan ang Ethereum access."
+ },
"accept": {
"message": "Tanggapin"
},
diff --git a/app/_locales/pt/messages.json b/app/_locales/pt/messages.json
index 287ae0400..8e07aaef5 100644
--- a/app/_locales/pt/messages.json
+++ b/app/_locales/pt/messages.json
@@ -1,4 +1,49 @@
{
+ "privacyMode": {
+ "message": "Modo de privacidade"
+ },
+ "privacyModeDescription": {
+ "message": "Os sites devem solicitar acesso para visualizar as informações da sua conta."
+ },
+ "exposeAccounts": {
+ "message": "Expor contas"
+ },
+ "exposeDescription": {
+ "message": "Exponha contas ao site atual. Útil para dapps herdados."
+ },
+ "confirmExpose": {
+ "message": "Tem certeza de que deseja expor suas contas ao site atual?"
+ },
+ "confirmClear": {
+ "message": "Tem certeza de que deseja limpar sites aprovados?"
+ },
+ "clearApprovalDataSuccess": {
+ "message": "Dados aprovados do website foram limpos com sucesso."
+ },
+ "approvalData": {
+ "message": "Dados de aprovação"
+ },
+ "approvalDataDescription": {
+ "message": "Limpe os dados aprovados do website para que todos os sites solicitem aprovação novamente."
+ },
+ "clearApprovalData": {
+ "message": "Limpar dados de aprovação"
+ },
+ "approve": {
+ "message": "Aprovar"
+ },
+ "reject": {
+ "message": "Rejeitar"
+ },
+ "providerAPIRequest": {
+ "message": "Solicitação de API do Web3"
+ },
+ "reviewProviderRequest": {
+ "message": "Por favor, revise esta solicitação da API da Ethereum."
+ },
+ "providerRequestInfo": {
+ "message": "O domínio listado abaixo está tentando solicitar acesso à API Ethereum para que ele possa interagir com o blockchain Ethereum. Sempre verifique se você está no site correto antes de aprovar o acesso à Ethereum."
+ },
"accept": {
"message": "Aceitar"
},
diff --git a/app/_locales/ru/messages.json b/app/_locales/ru/messages.json
index 45bb09683..917b2b615 100644
--- a/app/_locales/ru/messages.json
+++ b/app/_locales/ru/messages.json
@@ -1,4 +1,49 @@
{
+ "privacyMode": {
+ "message": "Режим конфиденциальности"
+ },
+ "privacyModeDescription": {
+ "message": "Веб-сайты должны запрашивать доступ для просмотра информации об учетной записи."
+ },
+ "exposeAccounts": {
+ "message": "Открыть счета"
+ },
+ "exposeDescription": {
+ "message": "Выводить счета на текущий веб-сайт. Полезно для старых dapps."
+ },
+ "confirmExpose": {
+ "message": "Вы уверены, что хотите открыть свои аккаунты на текущем веб-сайте?"
+ },
+ "confirmClear": {
+ "message": "Вы уверены, что хотите очистить утвержденные веб-сайты?Tem certeza de que deseja limpar sites aprovados?"
+ },
+ "clearApprovalDataSuccess": {
+ "message": "Утвержденные данные веб-сайта успешно удалены."
+ },
+ "approvalData": {
+ "message": "Данные об утверждении"
+ },
+ "approvalDataDescription": {
+ "message": "Очистите утвержденные данные веб-сайта, чтобы все сайты снова запросили подтверждение."
+ },
+ "clearApprovalData": {
+ "message": "Четкие данные об утверждении"
+ },
+ "approve": {
+ "message": "Одобрить"
+ },
+ "reject": {
+ "message": "Отклонить"
+ },
+ "providerAPIRequest": {
+ "message": "Запрос API Web3"
+ },
+ "reviewProviderRequest": {
+ "message": "Просмотрите этот запрос API Ethereum."
+ },
+ "providerRequestInfo": {
+ "message": "Домен, указанный ниже, пытается запросить доступ к API-интерфейсу Ethereum, чтобы он мог взаимодействовать с блокчейном Ethereum. Всегда проверяйте, что вы находитесь на правильном сайте, прежде чем одобрять доступ к веб-сайту."
+ },
"accept": {
"message": "Принять"
},
diff --git a/app/_locales/sl/messages.json b/app/_locales/sl/messages.json
index 242cf66bf..b9c4ff8e0 100644
--- a/app/_locales/sl/messages.json
+++ b/app/_locales/sl/messages.json
@@ -1,1372 +1,957 @@
{
"privacyMode": {
- "message": "Način zasebnosti"
+ "message": "Režim súkromia"
},
"privacyModeDescription": {
- "message": "Spletne strani morajo zahtevati dostop za ogled podatkov o vašem računu."
+ "message": "Webové stránky musia požiadať o prístup k zobrazeniu informácií o vašom účte."
},
"exposeAccounts": {
- "message": "Razkrij račune"
+ "message": "Vystavte účty"
},
"exposeDescription": {
- "message": "Razkrij račune trenutni spletni strani. Priporočeno za starejše dApps."
+ "message": "Vystavte účty na aktuální webové stránky. Užitečné pro starší dappy."
},
"confirmExpose": {
- "message": "Ste prepričani da želite razkriti račune trenutni spletni strani?"
+ "message": "Opravdu chcete své účty vystavit na stávajícím webu?"
},
"confirmClear": {
- "message": "Ste prepričani da želite počistiti odobrene spletne strani?"
+ "message": "Naozaj chcete vymazať schválené webové stránky?"
},
"clearApprovalDataSuccess": {
- "message": "Odobrene spletne strani uspešno počiščene."
+ "message": "Schválené údaje webových stránek byly úspěšně zrušeny."
},
"approvalData": {
- "message": "Zasebni podatki"
+ "message": "Údaje o schválení"
},
"approvalDataDescription": {
- "message": "Počistite zasebne podatke, tako da bodo morale vse spletne strani ponovno zahtevati dovoljenje."
+ "message": "Vymažte schválené údaje webových stránek, aby všechny weby znovu požádaly o schválení."
},
"clearApprovalData": {
- "message": "Počisti zasebne podatke"
+ "message": "Jasné údaje o schválení"
+ },
+ "approve": {
+ "message": "Schválit"
+ },
+ "reject": {
+ "message": "Odmítnout"
},
"providerAPIRequest": {
- "message": "Zahteva za Ethereum API"
+ "message": "Požadavek API Ethereum"
},
"reviewProviderRequest": {
- "message": "Preglejte zahtevo za Ethereum API."
+ "message": "Přečtěte si prosím tuto žádost API Ethereum."
},
"providerRequestInfo": {
- "message": "Domena zahteva dostop do verige blokov in ogled vašega računa. Pred potrditvjo vedno preverite ali ste na želeni spletni strani."
+ "message": "Níže uvedená doména se pokouší požádat o přístup k API Ethereum, aby mohla komunikovat s blokádou Ethereum. Před schválením přístupu Ethereum vždy zkontrolujte, zda jste na správném místě."
},
"accept": {
- "message": "Potrdi"
- },
- "accessingYourCamera": {
- "message": "Dostopanje do vaše kamere ..."
+ "message": "Přijmout"
},
"account": {
- "message": "Račun"
+ "message": "Účet"
},
"accountDetails": {
- "message": "Podrobnosti računa"
+ "message": "Detaily účtu"
},
"accountName": {
- "message": "Ime računa"
- },
- "accountOptions": {
- "message": "Možnosti računa"
- },
- "accountSelectionRequired": {
- "message": "Izbrati morate račun!"
- },
- "activityLog": {
- "message": "dnevnik dejavnosti"
+ "message": "Název účtu"
},
"address": {
- "message": "Naslov"
+ "message": "Adresa"
},
"addCustomToken": {
- "message": "Dodaj žeton po meri"
+ "message": "Přidat vlastní token"
},
"addToken": {
- "message": "Dodaj žeton"
+ "message": "Přidat token"
},
"addTokens": {
- "message": "Dodaj žetone"
- },
- "addSuggestedTokens": {
- "message": "Dodaj priporočene žetone"
- },
- "addAcquiredTokens": {
- "message": "Dodaj žetone pridobljene z MetaMask"
+ "message": "Přidat tokeny"
},
"amount": {
- "message": "Znesek"
+ "message": "Částka"
},
"amountPlusGas": {
- "message": "Znesek + Gas"
+ "message": "Částka + palivo"
},
"appDescription": {
- "message": "Denarnica za Ethereum v brskalniku",
+ "message": "Ethereum rozšíření prohlížeče",
"description": "The description of the application"
},
"appName": {
"message": "MetaMask",
"description": "The name of the application"
},
- "approve": {
- "message": "Potrdi"
- },
"approved": {
- "message": "Potrjeno"
+ "message": "Schváleno"
},
"attemptingConnect": {
- "message": "Povezovanje z verigo blokov ..."
- },
- "attemptToCancel": {
- "message": "Želite preklicati?"
- },
- "attemptToCancelDescription": {
- "message": "Če pošljete ta poskus, ne boste zagotovili, da bo vaša prvotna transakcija preklicana. Če bo poskus preklica uspešen, se bo zaračunala zgornja transakcija."
+ "message": "Pokouším se připojit k blockchainu."
},
"attributions": {
- "message": "Dodelitve"
+ "message": "Zásluhy"
},
"available": {
- "message": "Na voljo"
+ "message": "Dostupné"
},
"back": {
- "message": "Nazaj"
+ "message": "Zpět"
},
"balance": {
- "message": "Znesek"
+ "message": "Zůstatek:"
},
"balances": {
- "message": "Znesek žetonov"
+ "message": "Zůstatek tokenu"
},
"balanceIsInsufficientGas": {
- "message": "Nezadnosten znesek za trenutni gas"
+ "message": "Nedostatek prostředků pro aktuální množství paliva"
},
"beta": {
"message": "BETA"
},
"betweenMinAndMax": {
- "message": "mora biti večji ali enak $1 in manjši ali enak $1.",
+ "message": "musí být větší nebo roven $1 a menší nebo roven $2.",
"description": "helper for inputting hex as decimal input"
},
"blockiesIdenticon": {
- "message": "Uporabi identifikacijo Blockies"
+ "message": "Použít Blockies Identicon"
},
"borrowDharma": {
- "message": "Izposoja z Dharma (Beta)"
- },
- "browserNotSupported": {
- "message": "Vaš brskalnik ni podptrt ..."
+ "message": "Pújčit si přes Dharma (Beta)"
},
"builtInCalifornia": {
- "message": "MetaMask je zasnovan in ustvarjen v Kaliforniji."
+ "message": "MetaMask je navržen a vytvořen v Kalifornii."
},
"buy": {
- "message": "Kupi"
+ "message": "Koupit"
},
"buyCoinbase": {
- "message": "Kupi na Coinbase"
+ "message": "Nákup na Coinbase"
},
"buyCoinbaseExplainer": {
- "message": "Coinbase je najpopularnejši načun za kupovanje in prodajo bitcoinov, ethereuma, in litecoina."
- },
- "bytes": {
- "message": "Bajti"
+ "message": "Coinbase je světově nejoblíbenější místo k nákupu a prodeji bitcoinu, etherea nebo litecoinu."
},
"ok": {
- "message": "V redu"
+ "message": "Ok"
},
"cancel": {
- "message": "Prekliči"
- },
- "cancelAttempt": {
- "message": "Prekliči poskus"
- },
- "cancellationGasFee": {
- "message": "Preklicani znesek gas"
- },
- "cancelN": {
- "message": "Prekliči vseh $1 transakcij"
+ "message": "Zrušit"
},
"classicInterface": {
- "message": "Uporabi klasični vmesnik"
+ "message": "Použít klasické rozhraní"
},
"clickCopy": {
- "message": "Kliknite za kopiranje"
- },
- "clickToAdd": {
- "message": "Kliknite na $1 za dodajo v vaš račun"
- },
- "close": {
- "message": "Zapri"
- },
- "chromeRequiredForHardwareWallets": {
- "message": "Za uporabo strojne denarnice potrebujete Google Chrome."
+ "message": "Kliknutím zkopírovat"
},
"confirm": {
- "message": "Potrdi"
+ "message": "Potvrdit"
},
"confirmed": {
- "message": "Potrjeno"
+ "message": "Potvrzeno"
},
"confirmContract": {
- "message": "Potrdi pogodbo"
+ "message": "Potvrdit kontrakt"
},
"confirmPassword": {
- "message": "Potrdi geslo"
+ "message": "Potvrdit heslo"
},
"confirmTransaction": {
- "message": "Potrdi transakcijo"
- },
- "connectHardwareWallet": {
- "message": "Poveži strojno denarnico"
- },
- "connect": {
- "message": "Poveži"
- },
- "connecting": {
- "message": "Povezovanje ..."
- },
- "connectingToKovan": {
- "message": "Povezovanje na testno omrežje Kovan"
- },
- "connectingToMainnet": {
- "message": "Povezovanje na glavno omrežje"
- },
- "connectingToRopsten": {
- "message": "Povezovanje na testno omrežje Ropsten"
- },
- "connectingToRinkeby": {
- "message": "Povezovanje na testno omrežje Rinkeby"
- },
- "connectingToUnknown": {
- "message": "Povezovanje na neznano omrežje"
- },
- "connectToLedger": {
- "message": "Poveži z Ledger"
- },
- "connectToTrezor": {
- "message": "Poveži z Trezor"
+ "message": "Potvrdit transakci"
},
"continue": {
- "message": "Nadaljuj"
+ "message": "Pokračovat"
},
"continueToCoinbase": {
- "message": "Nadaljuj na Coinbase"
+ "message": "Přejít na Coinbase"
},
"contractDeployment": {
- "message": "Ustvarjanje pogodbe"
+ "message": "Nasazení kontraktu"
},
"conversionProgress": {
- "message": "Pretvorba v teku"
+ "message": "Provádí se převod"
},
"copiedButton": {
- "message": "Kopirano"
+ "message": "Zkopírováno"
},
"copiedClipboard": {
- "message": "Kopirano v odložišče!"
+ "message": "Zkopírováno do schránky"
},
"copiedExclamation": {
- "message": "Kopirano!"
+ "message": "Zkopírováno!"
},
"copiedSafe": {
- "message": "Prilepil sem ga na varno"
+ "message": "Zkopíroval jsem to na bezpečné místo"
},
"copy": {
- "message": "Kopiraj"
- },
- "copyAddress": {
- "message": "Kopiraj naslov v odložišče"
+ "message": "Kopírovat"
},
"copyToClipboard": {
- "message": "Kopiraj v odložišče"
+ "message": "Kopírovat do schránky"
},
"copyButton": {
- "message": " Kopiraj "
+ "message": " Kopírovat "
},
"copyPrivateKey": {
- "message": "To je vaš zesebni ključ (kliknite za kopiranje)"
+ "message": "Toto je váš privátní klíč (kliknutím zkopírujte)"
},
"create": {
- "message": "Ustvari"
+ "message": "Vytvořit"
},
"createAccount": {
- "message": "Ustvari račun"
+ "message": "Vytvořit účet"
},
"createDen": {
- "message": "Ustvari"
+ "message": "Vytvořit"
},
"crypto": {
- "message": "Kripto",
+ "message": "Krypto",
"description": "Exchange type (cryptocurrencies)"
},
"currentConversion": {
- "message": "Trenutna pretvorba"
- },
- "currentLanguage": {
- "message": "Trenutni jezik"
+ "message": "Aktuální převod"
},
"currentNetwork": {
- "message": "Trenutno omrežje"
- },
- "currentRpc": {
- "message": "Trenutni RPC"
+ "message": "Aktuální síť"
},
"customGas": {
- "message": "Prilagodi gas"
+ "message": "Nastavit palivo"
},
"customToken": {
- "message": "Žeton po meri"
+ "message": "Vlastní token"
},
"customize": {
- "message": "Prilagodi"
+ "message": "Nastavit"
},
"customRPC": {
- "message": "RPC po meri"
+ "message": "Vlastní RPC"
},
"decimalsMustZerotoTen": {
- "message": "Decimalk mora biti med 0 in 36."
+ "message": "Desetinných míst musí být od 0 do 36."
},
"decimal": {
- "message": "Decimalna natančnost"
+ "message": "Počet desetinných míst přesnosti"
},
"defaultNetwork": {
- "message": "Privzeto omrežje za transkacije je glavno omrežje."
+ "message": "Výchozí síť pro Etherové transakce je Main Net."
},
"denExplainer": {
- "message": "Vaš DEN je z geslom šifrirana shramba v MetaMask."
+ "message": "Váš DEN je heslem šifrované uložiště v MetaMasku."
},
"deposit": {
- "message": "Vplačaj"
+ "message": "Vklad"
},
"depositBTC": {
- "message": "Vplačajte vaš BTC na spodnji naslov:"
+ "message": "Vložte BTC na níže uvedenou adresu:"
},
"depositCoin": {
- "message": "Vplačajte vaš $1 na spodnji naslov",
+ "message": "Vložte $1 na níže uvedenou adresu",
"description": "Tells the user what coin they have selected to deposit with shapeshift"
},
"depositEth": {
- "message": "Vplačilo ETH"
+ "message": "Vložit Eth"
},
"depositEther": {
- "message": "Vplačilo ethra"
+ "message": "Vložit Ether"
},
"depositFiat": {
- "message": "Vplačilo s klasičnimi valutami"
+ "message": "Vklad s fiat měnou"
},
"depositFromAccount": {
- "message": "Vplačilo iz drugega računa"
+ "message": "Vložte z jiného účtu"
},
"depositShapeShift": {
- "message": "Vplačilo z ShapeShift"
+ "message": "Vklad přes ShapeShift"
},
"depositShapeShiftExplainer": {
- "message": "Če imate druge kriptovalute, lahko Ether vplačate neposredno v MetaMask. Brez računov."
+ "message": "Pokud vlastníte jiné kryptoměny, můžete je směnit Ether a vložit ho přímo do peněženky MetaMask. Bez založení účtu."
},
"details": {
"message": "Podrobnosti"
},
"directDeposit": {
- "message": "Neposredno vplačilo"
+ "message": "Přímý vklad"
},
"directDepositEther": {
- "message": "Neposredno vplačilo ehera"
+ "message": "Vložit Ether přímo"
},
"directDepositEtherExplainer": {
- "message": "Če že imate Ether, ga lahko najhitreje dobite v MetaMask z neposrednim vplačilom."
+ "message": "Pokud už vlastníte nějaký Ether, nejrychleji ho dostanete do peněženky přímým vkladem."
},
"done": {
- "message": "Končano"
- },
- "downloadGoogleChrome": {
- "message": "Prenesi Google Chrome"
+ "message": "Hotovo"
},
"downloadStateLogs": {
- "message": "Prenesi dnevnike state"
- },
- "dontHaveAHardwareWallet": {
- "message": "Nimate strojne denarnice?"
+ "message": "Stáhnout stavové protokoly"
},
"dropped": {
- "message": "Izpusti"
+ "message": "Zrušeno"
},
"edit": {
- "message": "Uredi"
+ "message": "Upravit"
},
"editAccountName": {
- "message": "Uredi ime računa"
- },
- "editingTransaction": {
- "message": "Uredite transakcijo"
+ "message": "Upravit název účtu"
},
"emailUs": {
- "message": "Pišite nam!"
+ "message": "Napište nám e-mail!"
},
"encryptNewDen": {
- "message": "Šifrirajte vaš DEN"
- },
- "ensNameNotFound": {
- "message": "Ime ENS ni najdeno"
+ "message": "Zašifrujte svůj nový DEN"
},
"enterPassword": {
- "message": "Vnesite geslo"
+ "message": "Zadejte heslo"
},
"enterPasswordConfirm": {
- "message": "Potrdite geslo"
+ "message": "Zadejte heslo k potvrzení"
},
- "enterPasswordContinue": {
- "message": "Za nadaljevanje vnesite geslo"
+ "passwordNotLongEnough": {
+ "message": "Heslo není dost dlouhé"
},
- "eth": {
- "message": "ETH"
+ "passwordsDontMatch": {
+ "message": "Hesla nejsou stejná"
},
"etherscanView": {
- "message": "Poglej račun na Etherscan"
+ "message": "Prohlédněte si účet na Etherscan"
},
"exchangeRate": {
- "message": "Menjalni tečaj"
- },
- "expandView": {
- "message": "Razširi pogled"
+ "message": "Směnný kurz"
},
"exportPrivateKey": {
- "message": "Izvozi zasebni ključ"
+ "message": "Exportovat privátní klíč"
},
"exportPrivateKeyWarning": {
- "message": "Izvoz zasebnega ključa na lastno odgovornost."
+ "message": "Exportujte privátní klíč na vlastní riziko."
},
"failed": {
- "message": "Ni uspelo"
+ "message": "Neúspěšné"
},
"fiat": {
- "message": "Klasične",
+ "message": "FIAT",
"description": "Exchange type"
},
"fileImportFail": {
- "message": "Uvoz z datoteko ne deluje? Kliknite tukaj!",
+ "message": "Import souboru nefunguje? Klikněte sem!",
"description": "Helps user import their account from a JSON file"
},
"followTwitter": {
- "message": "Sledite nam na Twitterju"
- },
- "forgetDevice": {
- "message": "Pozabi to napravo"
+ "message": "Sledujte nás na Twitteru"
},
"from": {
"message": "Od"
},
"fromToSame": {
- "message": "Naslova pošiljatelja in prejemnika ne smeta biti enaka"
+ "message": "Adresy odesílatele a příjemce nemohou být stejné"
},
"fromShapeShift": {
- "message": "Od ShapeShift"
- },
- "functionType": {
- "message": "Vrsta funkcije"
+ "message": "Z ShapeShift"
},
"gas": {
- "message": "Gas",
+ "message": "Palivo",
"description": "Short indication of gas cost"
},
"gasFee": {
- "message": "Gas Fee"
+ "message": "Poplatek za palivo"
},
"gasLimit": {
- "message": "Gas Limit"
+ "message": "Limit paliva"
},
"gasLimitCalculation": {
- "message": "Priporočen gas limit je izračunan glede na omrežje."
+ "message": "Počítáme doporučený limit paliva na základě úspěšnosti v síti."
},
"gasLimitRequired": {
- "message": "Gas limit je zahtevan"
+ "message": "Limit paliva je povinný"
},
"gasLimitTooLow": {
- "message": "Gas limit mora biti vsaj 21000"
- },
- "gasUsed": {
- "message": "Uporabljen gas"
+ "message": "Limit paliva musí být alespoň 21000"
},
"generatingSeed": {
- "message": "Ustvarjenje seed ..."
+ "message": "Generuji klíčovou frázi..."
},
"gasPrice": {
- "message": "Gas Price (GWEI)"
+ "message": "Cena paliva (GWEI)"
},
"gasPriceCalculation": {
- "message": "Priporočen gas price je izračunan glede na omrežje."
+ "message": "Počítáme doporučenou cenu paliva na základě úspěšnosti v síti."
},
"gasPriceRequired": {
- "message": "Gas price je zahtevan"
- },
- "generatingTransaction": {
- "message": "Ustvarjanje transakcije"
+ "message": "Cena paliva je povinná"
},
"getEther": {
- "message": "Pridobi Ether"
+ "message": "Získejte Ether"
},
"getEtherFromFaucet": {
- "message": "Pridobite Ether iz fauceta za $1",
+ "message": "Získejte Ether z faucetu za $1.",
"description": "Displays network name for Ether faucet"
},
- "getHelp": {
- "message": "Get Help."
- },
"greaterThanMin": {
- "message": "mora biti večji ali enak $1.",
+ "message": "musí být větší nebo roven $1.",
"description": "helper for inputting hex as decimal input"
},
- "hardware": {
- "message": "strojna"
- },
- "hardwareWalletConnected": {
- "message": "Strojna denarnica povezana"
- },
- "hardwareWallets": {
- "message": "Poveži strojno denarnico"
- },
- "hardwareWalletsMsg": {
- "message": "Izberite vrsto strojne denarnice"
- },
- "havingTroubleConnecting": {
- "message": "Imate težave?"
- },
"here": {
- "message": "tukaj",
+ "message": "zde",
"description": "as in -click here- for more information (goes with troubleTokenBalances)"
},
"hereList": {
- "message": "Tukaj je seznam!!!!"
- },
- "hexData": {
- "message": "Hex Data"
+ "message": "Tady je seznam!!!!"
},
"hide": {
- "message": "Skrij"
+ "message": "Skrýt"
},
"hideToken": {
- "message": "Skrij žeton"
+ "message": "Skrýt token"
},
"hideTokenPrompt": {
- "message": "Skrijem žeton?"
- },
- "history": {
- "message": "Zgodovina"
+ "message": "Skrýt token?"
},
"howToDeposit": {
- "message": "Kako želite vplačati Ether?"
+ "message": "Jakým způsobem chcete vložit Ether?"
},
"holdEther": {
- "message": "Omogoča vam shranjevanje ethra in žetonov ter povezovanje decentraliziranih aplikacij."
+ "message": "Dovoluje vám držet ether a tokeny a slouží jako most k decentralizovaným aplikacím."
},
"import": {
- "message": "Uvoz",
+ "message": "Import",
"description": "Button to import an account from a selected file"
},
"importAccount": {
- "message": "Uvoz računa"
+ "message": "Import účtu"
},
"importAccountMsg": {
- "message": " Uvoženi računa ne bodo povezani s prvotnim seed phase. Preberite več o uvoženih računih "
+ "message": "Importované účty nebudou spojeny s vaší původní MetaMaskovou klíčovou frází. Zjistěte více o importovaných účtech "
},
"importAnAccount": {
- "message": "IUvozi račun"
+ "message": "Import účtu"
},
"importDen": {
- "message": "Uvozi DEN"
+ "message": "Import existujícího DEN"
},
"imported": {
- "message": "Uvoženo",
+ "message": "Importováno",
"description": "status showing that an account has been fully loaded into the keyring"
},
- "importUsingSeed": {
- "message": "Uvozi z seed phase"
- },
- "info": {
- "message": "Info"
- },
"infoHelp": {
- "message": "Info & Pomoč"
- },
- "initialTransactionConfirmed": {
- "message": "Vaša prvotna transakcija je bila potrjena. Pritisnite V redu in se vrnite nazaj."
+ "message": "Informace a nápověda"
},
"insufficientFunds": {
- "message": "Nezadostna sredstva."
+ "message": "Nedostatek finančních prostředků."
},
"insufficientTokens": {
- "message": "Nezadostni žetoni."
+ "message": "Nedostatek tokenů."
},
"invalidAddress": {
- "message": "Neveljaven naslov"
+ "message": "Neplatná adresa"
},
"invalidAddressRecipient": {
- "message": "Neveljaven nasklov prejemnika"
+ "message": "Adresa příjemce je neplatná"
},
"invalidGasParams": {
- "message": "Neveljavne gas nastavitve"
+ "message": "Neplatná parametry paliva"
},
"invalidInput": {
- "message": "Neveljaven vnos."
+ "message": "Neplatný vstup."
},
"invalidRequest": {
- "message": "Neveljavna zahteva"
+ "message": "Neplatný požadavek"
},
"invalidRPC": {
- "message": "Neveljaven RPC URL"
- },
- "invalidSeedPhrase": {
- "message": "Neveljavna seed phrase"
+ "message": "Neplatné RPC URI"
},
"jsonFail": {
- "message": "Nekaj je bilo narobe. Prepričajte se, da je datoteka JSON pravilno oblikovana."
+ "message": "Něco se pokazilo. Prosím, ujistěte se, že váš JSON soubor má správný formát."
},
"jsonFile": {
- "message": "Datoteka JSON",
+ "message": "JSON soubor",
"description": "format for importing an account"
},
"keepTrackTokens": {
- "message": "Sledite žetonom, ki ste jih pridobili z MetaMask."
+ "message": "Udržujte si záznamy o tokenech, které jste koupili s účtem v MetaMasku."
},
"kovan": {
- "message": "Testno omrežje Kovan"
+ "message": "Kovan Test Network"
},
"knowledgeDataBase": {
- "message": "Obiščite našo pomoč"
+ "message": "Navštivte naši Knowledge Base"
},
"max": {
"message": "Max"
},
"learnMore": {
- "message": "Preberite več"
- },
- "ledgerAccountRestriction": {
- "message": "Za dodajanje novega računa morate uporabiti zadnji račun."
+ "message": "Zjistěte více."
},
"lessThanMax": {
- "message": "mora biti manjši ali enak $1.",
+ "message": "musí být menší nebo roven $1.",
"description": "helper for inputting hex as decimal input"
},
"likeToAddTokens": {
- "message": "Želite dodati te žetone?"
+ "message": "Chcete přidat tyto tokeny?"
},
"links": {
- "message": "Povezave"
+ "message": "Odkazy"
},
"limit": {
- "message": "Meja"
+ "message": "Limit"
},
"loading": {
- "message": "Nalaganje ..."
+ "message": "Načítám..."
},
"loadingTokens": {
- "message": "Nalaganje žetonov ..."
+ "message": "Načítám tokeny..."
},
"localhost": {
"message": "Localhost 8545"
},
"login": {
- "message": "Prijava"
+ "message": "Přihlásit"
},
"logout": {
- "message": "Odjava"
+ "message": "Odhlásit"
},
"loose": {
- "message": "Loose"
+ "message": "Nevázané"
},
"loweCaseWords": {
- "message": "seed words lahko vsebujejo samo male črke"
+ "message": "slova klíčové fráze mají pouze malá písmena"
},
"mainnet": {
- "message": "Glavno omrežje"
- },
- "menu": {
- "message": "Meni"
+ "message": "Main Ethereum Network"
},
"message": {
- "message": "Sporočilo"
+ "message": "Zpráva"
},
"metamaskDescription": {
- "message": "MetaMask je varen identitetni sklad za Ethereum."
- },
- "metamaskSeedWords": {
- "message": "Seed Words"
- },
- "metamaskVersion": {
- "message": "Različica"
+ "message": "MetaMask je bezpečný osobní trezor pro Ethereum."
},
"min": {
- "message": "Najmanj"
- },
- "missingYourTokens": {
- "message": "Ne vidite vaših žetonov?"
+ "message": "Minimum"
},
"myAccounts": {
- "message": "Moji računi"
+ "message": "Moje účty"
},
"mustSelectOne": {
- "message": "Izbran mora biti vsaj 1 žeton."
+ "message": "Musíte zvolit aspoň 1 token."
},
"needEtherInWallet": {
- "message": "Za interakcijo z decentraliziranimi aplikacijami boste v svoji denarnici potrebovali Eter."
+ "message": "Potřebujete Ether v peněžence, abyste mohli pomocí MetaMasku interagovat s decentralizovanými aplikacemi."
},
"needImportFile": {
- "message": "Za uvoz morate izbrati datoteko.",
+ "message": "Musíte zvolit soubor k importu.",
"description": "User is important an account and needs to add a file to continue"
},
"needImportPassword": {
- "message": "Za izbrano datoteko morate vnesti geslo.",
+ "message": "Musíte zadat heslo pro zvolený soubor.",
"description": "Password and file needed to import an account"
},
"negativeETH": {
- "message": "Negativnih zneskov ETH ni mogoče poslati."
+ "message": "Nelze odeslat zápornou částku ETH."
},
"networks": {
- "message": "Omrežja"
- },
- "nevermind": {
- "message": "Pozabi"
+ "message": "Sítě"
},
"newAccount": {
- "message": "Nov račun"
+ "message": "Nový účet"
},
"newAccountNumberName": {
- "message": "Račun $1",
+ "message": "Účet $1",
"description": "Default name of next account to be created on create account screen"
},
"newContract": {
- "message": "Nova pogodba"
+ "message": "Nový kontrakt"
},
"newPassword": {
- "message": "Novo geslo (min 8 znakov)"
- },
- "newPassword8Chars": {
- "message": "Novo geslo (min 8 znakov)"
+ "message": "Nové heslo (min 8 znaků)"
},
"newRecipient": {
- "message": "Nov prejemnik"
- },
- "newNetwork": {
- "message": "Novo omrežje"
- },
- "rpcURL": {
- "message": "Nov RPC URL"
+ "message": "Nový příjemce"
},
- "showAdvancedOptions": {
- "message": "Pokaži napredne možnosti"
- },
- "hideAdvancedOptions": {
- "message": "Skrij napredne možnosti"
- },
- "optionalChainId": {
- "message": "ChainID (nezahtevano)"
- },
- "optionalSymbol": {
- "message": "Simbol (nezahtevano)"
- },
- "optionalNickname": {
- "message": "Uporabniško ime (nezahtevano)"
+ "newRPC": {
+ "message": "Nová RPC URL"
},
"next": {
- "message": "Naprej"
+ "message": "Další"
},
"noAddressForName": {
- "message": "Za to ime ni naslovov."
+ "message": "Pro toto jméno nebyla nastavena žádná adresa."
},
"noDeposits": {
- "message": "Prejetih ni nič vplačil"
- },
- "noConversionRateAvailable": {
- "message": "Menjalni tečaj ni na voljo"
+ "message": "Žádný vklad"
},
"noTransactionHistory": {
- "message": "Ni zgodovine transakcij."
+ "message": "Žádná historie transakcí."
},
"noTransactions": {
- "message": "Nimate transakcij"
- },
- "notFound": {
- "message": "Ni najdeno"
+ "message": "Žádné transakce"
},
"notStarted": {
- "message": "Ni začeto"
- },
- "noWebcamFoundTitle": {
- "message": "Spletna kamera ni najdena"
- },
- "noWebcamFound": {
- "message": "Spletna kamera ni najdena. Poskusite znova kasneje."
+ "message": "Nezačalo"
},
"oldUI": {
- "message": "Star UI"
+ "message": "Staré rozhraní"
},
"oldUIMessage": {
- "message": "Vrnili ste se v star uporabniški vmesnik. V novega se lahko vrnete z možnostjo v spustnem meniju v zgornjem desnem kotu."
- },
- "onlySendToEtherAddress": {
- "message": "Na Ethereum naslov pošljute samo ETH."
- },
- "onlySendTokensToAccountAddress": {
- "message": "Na Ethereum naslov pošljute samo $1.",
- "description": "displays token symbol"
- },
- "openInTab": {
- "message": "Odpri v zavihku"
+ "message": "Vrátili jste se ke starému rozhraní. Můžete přepnout na nové rozhraní v nastavení v pravém horním menu."
},
"or": {
- "message": "ali",
+ "message": "nebo",
"description": "choice between creating or importing a new account"
},
- "orderOneHere": {
- "message": "Naročite Trezor ali Ledger i n zavarujte svoje premoženje s strojno denarnico"
- },
- "origin": {
- "message": "Izvor"
- },
- "outgoing": {
- "message": "Odhodni"
- },
- "parameters": {
- "message": "Parametri"
- },
- "password": {
- "message": "Geslo"
- },
"passwordCorrect": {
- "message": "Prepričajte se, da je geslo pravilno."
- },
- "passwordsDontMatch": {
- "message": "Gesli se ne ujemata"
+ "message": "Ujistěte se, že je vaše heslo správně."
},
"passwordMismatch": {
- "message": "gesli se ne ujemata",
+ "message": "hesla nesouhlasí",
"description": "in password creation process, the two new password fields did not match"
},
- "passwordNotLongEnough": {
- "message": "Geslo ni dovolj dolgo"
- },
"passwordShort": {
- "message": "geslo ni dovolj dolgo",
+ "message": "heslo je krátké",
"description": "in password creation process, the password is not long enough to be secure"
},
"pastePrivateKey": {
- "message": "Tukaj prilepite vaš zasebni ključ:",
+ "message": "Vložte zde svůj privátní klíč:",
"description": "For importing an account from a private key"
},
"pasteSeed": {
- "message": "Tukaj prilepite seed phase!"
- },
- "pending": {
- "message": "v obdelavi"
+ "message": "Svou klíčovou frázi vložte zde!"
},
"personalAddressDetected": {
- "message": "Zaznan je osebni naslov. Vnesite naslov pogodbe žetona."
+ "message": "Detekována osobní adresa. Zadejte adresu kontraktu tokenu."
},
"pleaseReviewTransaction": {
- "message": "Preglejte vašo transakcijo."
+ "message": "Zkontrolujte si transakci."
},
"popularTokens": {
- "message": "Priljubljeni žetoni"
- },
- "prev": {
- "message": "Prej"
- },
- "primaryCurrencySetting": {
- "message": "Glavna valuta"
- },
- "primaryCurrencySettingDescription": {
- "message": "Izberite Native za prikaz vrednosti v privzeti valuti verige (npr. ETH). Izberite Klasične za prikaz vrednosti v izbrani klasični valuti."
+ "message": "Oblíbené tokeny"
},
"privacyMsg": {
- "message": "Zasebnost"
+ "message": "Zásady ochrany osobních údajů"
},
"privateKey": {
- "message": "Zasebni lljuč",
+ "message": "Privátní klíč",
"description": "select this type of file to use to import an account"
},
"privateKeyWarning": {
- "message": "Opozorilo: Nikoli ne razkrijte tega ključa. Kdorkoli lahko z njim ukrade vse vaše premoženje v računu."
+ "message": "Upozornění: Nikdy nezveřejněte tento klíč. Kdokoli může s vaším privátním klíčem odcizit vaše aktiva z účtu."
},
"privateNetwork": {
- "message": "Zasebno omrežje"
+ "message": "Soukromá síť"
},
"qrCode": {
- "message": "Prikaži QR kodo"
- },
- "queue": {
- "message": "Čakalna vrsta"
+ "message": "Ukázat QR kód"
},
"readdToken": {
- "message": "Ta žeton lahko dodate tudi kasneje z uporabo gumba “Dodaj žeton” v možnostih vašega računa."
+ "message": "Tento token můžete v budoucnu přidat zpět s „Přidat token“ v nastavení účtu."
},
"readMore": {
- "message": "Tukaj preberite več."
+ "message": "Přečtěte si více zde."
},
"readMore2": {
- "message": "Preberite več."
+ "message": "Přečtěte si více."
},
"receive": {
- "message": "Prejmi"
+ "message": "Obrdžet"
},
"recipientAddress": {
- "message": "Prejemnikov naslov"
+ "message": "Adresa příjemce"
},
"refundAddress": {
- "message": "Naslov za vračilo."
- },
- "reject": {
- "message": "Zavrni"
- },
- "rejectAll": {
- "message": "Zavrni vse"
- },
- "rejectTxsN": {
- "message": "Zavrni $1 transakcij"
- },
- "rejectTxsDescription": {
- "message": "Zavrnili boste $1 transakcij."
+ "message": "Adresa pro vrácení peněz"
},
"rejected": {
- "message": "Zavrnjeno"
- },
- "reset": {
- "message": "Ponastavi"
+ "message": "Odmítnuto"
},
"resetAccount": {
- "message": "Ponastavi račun"
- },
- "resetAccountDescription": {
- "message": "Ponastavljanje računa bo izbrisalo zgodovino transakcij."
+ "message": "Resetovat účet"
},
"restoreFromSeed": {
- "message": "Obnovim račun?"
+ "message": "Obnovit z seed fráze"
},
"restoreVault": {
- "message": "Obnovi shrambo"
- },
- "restoreAccountWithSeed": {
- "message": "Obnovi račun z seed phrase"
+ "message": "Obnovit trezor"
},
"required": {
- "message": "Zahtevano"
+ "message": "Povinné"
},
"retryWithMoreGas": {
- "message": "Poskusite z večjim gas price"
+ "message": "Opakujte s vyšší cenou paliva"
},
- "restore": {
- "message": "Obnovi"
+ "walletSeed": {
+ "message": "Klíčová fráze peněženky"
},
"revealSeedWords": {
- "message": "Razkrij seed words"
- },
- "revealSeedWordsTitle": {
- "message": "Seed Phrase"
- },
- "revealSeedWordsDescription": {
- "message": "Če želite zamenjati brskalnik ali računalnik, potrebujete vaš seed phase za dostop do računa. Shranite ga na varno skrito mesto."
- },
- "revealSeedWordsWarningTitle": {
- "message": "Tega ne delite z nikomer!"
+ "message": "Zobrazit slova klíčové fráze"
},
"revealSeedWordsWarning": {
- "message": "S temi besedami lahko kdorkoli ukrade vse vaše račune."
+ "message": "Nebnovujte slova klíčové fráze na veřejnosti! Tato slova mohou být použita k odcizení veškerých vyašich účtů."
},
"revert": {
- "message": "Obnovi"
+ "message": "Zvrátit"
+ },
+ "rinkeby": {
+ "message": "Rinkeby Test Network"
},
- "remove": {
- "message": "izbriši"
+ "ropsten": {
+ "message": "Ropsten Test Network"
},
- "removeAccount": {
- "message": "Izbriši račun"
+ "currentRpc": {
+ "message": "Současné RPC"
},
- "removeAccountDescription": {
- "message": "Ta račun bo izbrisan. Prepričajte se, da imate seed phase ali zasebni ključ tega računa, da ga boste lahko kasneje obnovili. "
+ "connectingToMainnet": {
+ "message": "Připojuji se k Main Ethereum Network"
},
- "readyToConnect": {
- "message": "Pripravljeni na povezovanje?"
+ "connectingToRopsten": {
+ "message": "Připojuji se k Ropsten Test Network"
},
- "rinkeby": {
- "message": "Testno omrežje Rinkeby"
+ "connectingToKovan": {
+ "message": "Připojuji se k Kovan Test Network"
},
- "ropsten": {
- "message": "Testno omrežje Ropsten"
+ "connectingToRinkeby": {
+ "message": "Připojuji se k Rinkeby Test Network"
},
- "rpc": {
- "message": "RPC po meri"
+ "connectingToUnknown": {
+ "message": "Připojuji se k neznámé síti"
},
"sampleAccountName": {
- "message": "npr. Moj račun",
+ "message": "Např. můj nový účet",
"description": "Help user understand concept of adding a human-readable name to their account"
},
"save": {
- "message": "Shrani"
+ "message": "Uložit"
+ },
+ "reprice_title": {
+ "message": "Změnit cenu transakce"
},
- "saveAsCsvFile": {
- "message": "Shrani kot CSV datoteko"
+ "reprice_subtitle": {
+ "message": "Navyšte cenu paliva ve snaze k přepsání a urychlení vyší transakce"
},
"saveAsFile": {
- "message": "Shrani kot datoteko",
+ "message": "Uložit do souboru",
"description": "Account export process"
},
"saveSeedAsFile": {
- "message": "Shrani seed words kot datoteko"
- },
- "scanInstructions": {
- "message": "Postavite QR kodo pred vašo kamero"
- },
- "scanQrCode": {
- "message": "Skeniraj QR kodo"
+ "message": "Uložit slova klíčové fráze do souboru"
},
"search": {
- "message": "Iskanje"
- },
- "searchResults": {
- "message": "Rezultati iskanja"
+ "message": "Hledat"
},
"secretPhrase": {
- "message": "Vnesite vaših dvanajst besed za obnovitev vaših računov."
+ "message": "Zadejte svých 12 slov tajné fráze k obnovení trezoru."
+ },
+ "newPassword8Chars": {
+ "message": "Nové heslo (min 8 znaků)"
},
"seedPhraseReq": {
- "message": "Seed phrase mora biti dolg 12 besed"
+ "message": "klíčové fráze mají 12 slov"
},
"select": {
- "message": "Izberi"
+ "message": "Vybrat"
},
"selectCurrency": {
- "message": "Izberi valuto"
- },
- "selectLocale": {
- "message": "Izberi jezik"
+ "message": "Vybrat měnu"
},
"selectService": {
- "message": "Izberi storitev"
+ "message": "Vybrat službu"
},
"selectType": {
- "message": "Izberi vrsto"
+ "message": "Vybrat typ"
},
"send": {
- "message": "Pošlji"
+ "message": "Odeslat"
},
"sendETH": {
- "message": "Pošlji ETH"
+ "message": "Odeslat ETH"
},
"sendTokens": {
- "message": "Pošlji žetone"
- },
- "sentEther": {
- "message": "poslani ether"
+ "message": "Odeslat tokeny"
},
- "sentTokens": {
- "message": "poslani žetoni"
- },
- "separateEachWord": {
- "message": "Vsako besedo ločite z enim presledkom"
+ "onlySendToEtherAddress": {
+ "message": "Posílejte jen ETH na Ethereum adresu."
},
"searchTokens": {
- "message": "Iskanje žetonov"
- },
- "selectAnAddress": {
- "message": "Izberi naslov"
- },
- "selectAnAccount": {
- "message": "Izberi račun"
- },
- "selectAnAccountHelp": {
- "message": "Izberi račun za prikaz v MetaMask"
- },
- "selectHdPath": {
- "message": "Izberi HD Path"
- },
- "selectPathHelp": {
- "message": "Če obstoječih Ledger ne vidite, poskusite izbrati \"Legacy (MEW / MyCrypto)\""
+ "message": "Hledat tokeny"
},
"sendTokensAnywhere": {
- "message": "Pošljite žetone komurkoli z Ethereum naslovom"
+ "message": "Posílejte tokeny komukoli s Ethereum účtem"
},
"settings": {
- "message": "Nastavitve"
+ "message": "Nastavení"
+ },
+ "info": {
+ "message": "Informace"
},
"shapeshiftBuy": {
- "message": "Kupi z Shapeshift"
+ "message": "Nakoupit na ShapeShift"
},
"showPrivateKeys": {
- "message": "Pokaži zasebni ključ"
+ "message": "Zobrazit privátní klíče"
},
"showQRCode": {
- "message": "Pokaži QR kodo"
- },
- "showHexData": {
- "message": "Pokaži Hex Data"
- },
- "showHexDataDescription": {
- "message": "Izberite za prikaz hex podatkov na zaslonu za pošiljanje"
+ "message": "Zobrazit QR kód"
},
"sign": {
- "message": "Podpiši"
- },
- "signatureRequest": {
- "message": "Zahteva za podpis"
+ "message": "Podepsat"
},
"signed": {
- "message": "Podpisano"
+ "message": "Podepsáno"
},
"signMessage": {
- "message": "Podpiši sporočilo"
+ "message": "Podepsat zprávu"
},
"signNotice": {
- "message": "To podpisovanje lahko povzroči \nnevarne stranske učinke. Podpisujte samo sporočila \nstrani, ki jim zaupate s svojim celotnim računom.\n Ta nevarna funkcija bo odstranjena v prihodnji različici. "
+ "message": "Podepsání zprávy může mít \nnebezpečný vedlejší učinek. Podepisujte zprávy pouze ze \nstránek, kterým plně důvěřujete celým svým účtem.\n Tato nebezpečná metoda bude odebrána v budoucí verzi. "
},
"sigRequest": {
- "message": "Zahteva za podpis"
+ "message": "Požadavek podpisu"
},
"sigRequested": {
- "message": "Podpis zahtevan"
+ "message": "Požádáno o podpis"
},
"spaceBetween": {
- "message": "med besedami je lahko samo presledek"
- },
- "speedUp": {
- "message": "pospeši"
- },
- "speedUpTitle": {
- "message": "Pospeši transakcijo"
- },
- "speedUpSubtitle": {
- "message": "Povečajte gas prise za pospešitev transakcije"
+ "message": "mezi slovy může být pouze mezera"
},
"status": {
- "message": "Status"
+ "message": "Stav"
},
"stateLogs": {
- "message": "State dnevniki"
+ "message": "Stavové protokoly"
},
"stateLogsDescription": {
- "message": "State vsebujejo vaš javni nasklov in zgodovino transakcij."
+ "message": "Stavové protokoly obsahují vaše veřejné adresy účtů a odeslané transakce."
},
"stateLogError": {
- "message": "Napaka pri pridobivanju state dnevnikov."
- },
- "step1HardwareWallet": {
- "message": "1. Povežite strojno denarnico"
- },
- "step1HardwareWalletMsg": {
- "message": "Z računalnikom povežite strojno denarnico."
- },
- "step2HardwareWallet": {
- "message": "2. Izberite račun"
- },
- "step2HardwareWalletMsg": {
- "message": "Izberite račun, ki ga želute uporabiti. Trenutno lahko izberete le en račun na enkrat."
- },
- "step3HardwareWallet": {
- "message": "3. Začnite uporabljati dApps in več!"
- },
- "step3HardwareWalletMsg": {
- "message": "Uporabite strojno denarnico kot katerikoli drug Ethereum račun. Prijavite se v dApps, pošljite Ether in ERC20 žetone in žetone kot CryptoKitties."
+ "message": "Chyba během získávání stavových protokolů."
},
"submit": {
- "message": "Potrdi"
+ "message": "Odeslat"
},
"submitted": {
- "message": "Potrjeno"
+ "message": "Odesláno"
},
"supportCenter": {
- "message": "Obiščite naše središče za podporo"
+ "message": "Navštivte naše centrum podpory"
},
"symbolBetweenZeroTen": {
- "message": "Simbol mora imeti med 0 in 10 znakov."
+ "message": "Symbol musí být mezi 0 a 10 znaky."
},
"takesTooLong": {
- "message": "Trava predolgo?"
+ "message": "Trvá to dlouho?"
},
"terms": {
- "message": "Pogoji uporabe"
+ "message": "Podmínky použití"
},
"testFaucet": {
- "message": "Testni faucet"
+ "message": "Testovací faucet"
},
"to": {
- "message": "Za"
+ "message": "Komu"
},
"toETHviaShapeShift": {
- "message": "$1 v ETH prek ShapeShift",
+ "message": "$1 na ETH přes ShapeShift",
"description": "system will fill in deposit type in start of message"
},
- "token": {
- "message": "Žeton"
- },
"tokenAddress": {
- "message": "Naslov žetona"
+ "message": "Adresa tokenu"
},
"tokenAlreadyAdded": {
- "message": "Žeton je bil že dodan."
+ "message": "Token byl už přidán."
},
"tokenBalance": {
- "message": "Vaš znesek žetonov je:"
+ "message": "Váš zůstatek tokenu je:"
},
"tokenSelection": {
- "message": "Iščite žetone ali pa jih izberite iz seznama priljubljenih."
+ "message": "Vyhledejte token nebo je vyberte z našeho seznamu oblíbených tokenů."
},
"tokenSymbol": {
- "message": "Simbol žetona"
+ "message": "Symbol tokenu"
},
"tokenWarning1": {
- "message": "Sledite žetonom, ki ste jih kupili z MetaMask metamask računom. Če ste jih kupili drugje, ne bodo prikazani tukaj."
+ "message": "Mějte přehled o tokenech, které jste koupili s účtem MetaMasku. Pokud jste koupili tokeny s jiným účtem, tyto tokeny se zde nezobrazí."
},
"total": {
- "message": "Skupno"
- },
- "transaction": {
- "message": "transakcija"
- },
- "transactionConfirmed": {
- "message": "Transakcija potrjena na $2."
- },
- "transactionCreated": {
- "message": "Transakcija z vrednostjo $1 ustvarjena na $2."
- },
- "transactionWithNonce": {
- "message": "Transakcija $1"
- },
- "transactionDropped": {
- "message": "Transakcija na $2 preklicana."
- },
- "transactionSubmitted": {
- "message": "Transakcija na $2 oddana."
- },
- "transactionUpdated": {
- "message": "Transakcija na $2 spremenjena."
- },
- "transactionUpdatedGas": {
- "message": "Transakcija spremenjena z gas price $1 na $2."
- },
- "transactionErrored": {
- "message": "Napaka pri transakciji."
+ "message": "Celkem"
},
"transactions": {
- "message": "transakcije"
+ "message": "transakce"
},
"transactionError": {
- "message": "Napaka pri transakciji. Izjema sprožena v kodi pogodbe."
+ "message": "Chyba transakce. Vyhozena výjimka v kódu kontraktu."
},
"transactionMemo": {
- "message": "Opomba transakcije (nezahtevano)"
+ "message": "Poznámka transakce (nepovinné)"
},
"transactionNumber": {
- "message": "Številka transakcije"
- },
- "transfer": {
- "message": "Prenesi"
- },
- "transferFrom": {
- "message": "Prenesi od"
+ "message": "Číslo transakce"
},
"transfers": {
- "message": "Prenosi"
- },
- "trezorHardwareWallet": {
- "message": "Strojna denarnica TREZOR"
+ "message": "Převody"
},
"troubleTokenBalances": {
- "message": "Če imate težave pri ogledu zneskov žetonov si jih lahko ogledate ",
+ "message": "Měli jsme problém s načtením vašich tokenových zůstatků. Můžete je vidět ",
"description": "Followed by a link (here) to view token balances"
},
- "tryAgain": {
- "message": "Poskusi znova"
- },
"twelveWords": {
- "message": "Edini način za obnovitev MetaMask računa, je teh 12 besed.\nShranite jih na varno in skrivno mesto."
+ "message": "Těchto 12 slov je jedinou možností, jak obnovit MetaMask účet. \nUložte je na bezpečné a neveřejné místo."
},
"typePassword": {
- "message": "Vnesite vaše MetaMask geslo"
+ "message": "Zadejte své heslo"
},
"uiWelcome": {
- "message": "Dobrodošli v nov UI (Beta)"
+ "message": "Vítejte v novém rozhraní (Beta)"
},
"uiWelcomeMessage": {
- "message": "Uporabljate nov uporabniški vmesnik."
+ "message": "Používáte nyní nové rozhraní MetaMasku. Rozhlédněte se kolem, vyzkoušejte nové funkce, jako jsou zasílání tokenů, a dejte nám vědět, pokud narazíte na problém."
},
"unapproved": {
- "message": "Neodobreno"
+ "message": "Neschváleno"
},
"unavailable": {
- "message": "Ni na voljo"
- },
- "units": {
- "message": "enote"
+ "message": "Nedostupné"
},
"unknown": {
- "message": "Neznano"
- },
- "unknownFunction": {
- "message": "Neznana funkcija"
+ "message": "Neznámé"
},
"unknownNetwork": {
- "message": "Neznano zasebno omrežje"
+ "message": "Neznámá soukromá síť"
},
"unknownNetworkId": {
- "message": "Neznan ID omrežja"
- },
- "unknownQrCode": {
- "message": "Napaka: Te QR kode ni bilo mogoče prepoznati"
- },
- "unknownCameraErrorTitle": {
- "message": "Ooops! Nekaj je šlo narobe ...."
- },
- "unknownCameraError": {
- "message": "Pri dostopanju do vaše kamere je prišlo do napake. Poskusite znova kasneje ..."
- },
- "unlock": {
- "message": "Odkleni"
- },
- "unlockMessage": {
- "message": "Decentralizirana spletna denarnica"
- },
- "updatedWithDate": {
- "message": "Posodobljeno $1"
+ "message": "Neznámé ID sítě"
},
"uriErrorMsg": {
- "message": "URI zahtevajo ustrezno HTTP/HTTPS predpono."
+ "message": "URI vyžadují korektní HTTP/HTTPS prefix."
},
"usaOnly": {
- "message": "Samo za ZDA",
+ "message": "jen v USA",
"description": "Using this exchange is limited to people inside the USA"
},
"usedByClients": {
- "message": "Uporabljen s strani večih različnih odjemalcev"
+ "message": "Používána různými klienty"
},
"useOldUI": {
- "message": "Uporabi star UI"
+ "message": "Použijte staré rozhraní"
},
"validFileImport": {
- "message": "Za uvoz morate izbrati pravilno datoteko."
+ "message": "Musíte vybrat validní soubor k importu."
},
"vaultCreated": {
- "message": "Račun je ustvarjen"
+ "message": "Trezor vytvořen"
},
"viewAccount": {
- "message": "Poglej račun"
- },
- "viewOnEtherscan": {
- "message": "Poglej na Etherscan"
+ "message": "Zobrazit účet"
},
"visitWebSite": {
- "message": "Obiščite našo spletno stran"
- },
- "walletSeed": {
- "message": "Wallet Seed"
+ "message": "Navštivte naši stránku"
},
"warning": {
- "message": "Opozorilo"
- },
- "welcomeBack": {
- "message": "Dobrodošli nazaj!"
+ "message": "Varování"
},
"welcomeBeta": {
- "message": "Dobrodošli v MetaMask Beta"
+ "message": "Vítejte v MetaMask Beta"
},
"whatsThis": {
- "message": "Kaj je to?"
- },
- "yesLetsTry": {
- "message": "Pa poskusimo"
- },
- "youNeedToAllowCameraAccess": {
- "message": "Za uporabo te funkcije boste potrebovali dostop do kamere."
+ "message": "Co to je?"
},
"yourSigRequested": {
- "message": "Zahtevan je bil vaš podpis"
+ "message": "Je vyžadován váš podpis"
},
"youSign": {
- "message": "Podpisali boste"
- },
- "yourPrivateSeedPhrase": {
- "message": "Vaš zasebni seed phrase"
+ "message": "Podepisujete"
}
-}
+} \ No newline at end of file
diff --git a/app/_locales/th/messages.json b/app/_locales/th/messages.json
index a9f2f1022..7fabe4eac 100644
--- a/app/_locales/th/messages.json
+++ b/app/_locales/th/messages.json
@@ -1,4 +1,49 @@
{
+ "privacyMode": {
+ "message": "โหมดความเป็นส่วนตัว"
+ },
+ "privacyModeDescription": {
+ "message": "เว็บไซต์ต้องขอเข้าถึงเพื่อดูข้อมูลบัญชีของคุณ"
+ },
+ "exposeAccounts": {
+ "message": "เปิดเผยบัญชี"
+ },
+ "exposeDescription": {
+ "message": "เปิดเผยบัญชีไปยังเว็บไซต์ปัจจุบัน มีประโยชน์สำหรับ dapps แบบเดิม"
+ },
+ "confirmExpose": {
+ "message": "คุณแน่ใจหรือไม่ว่าต้องการเปิดเผยบัญชีของคุณไปยังเว็บไซต์ปัจจุบัน"
+ },
+ "confirmClear": {
+ "message": "คุณแน่ใจหรือไม่ว่าต้องการล้างเว็บไซต์ที่ผ่านการอนุมัติ"
+ },
+ "clearApprovalDataSuccess": {
+ "message": "อนุมัติข้อมูลเว็บไซต์ที่ได้รับอนุมัติแล้ว"
+ },
+ "approvalData": {
+ "message": "ข้อมูลการอนุมัติ"
+ },
+ "approvalDataDescription": {
+ "message": "ล้างข้อมูลเว็บไซต์ที่ได้รับการอนุมัติเพื่อให้ทุกไซต์ต้องขออนุมัติอีกครั้ง"
+ },
+ "clearApprovalData": {
+ "message": "ล้างข้อมูลการอนุมัติ"
+ },
+ "approve": {
+ "message": "อนุมัติ"
+ },
+ "reject": {
+ "message": "ปฏิเสธ"
+ },
+ "providerAPIRequest": {
+ "message": "คำขอ Web3 API"
+ },
+ "reviewProviderRequest": {
+ "message": "โปรดอ่านคำขอ Ethereum API นี้"
+ },
+ "providerRequestInfo": {
+ "message": "โดเมนที่แสดงด้านล่างกำลังพยายามขอเข้าถึง API ของ Ethereum เพื่อให้สามารถโต้ตอบกับบล็อค Ethereum ได้ ตรวจสอบว่าคุณอยู่ในไซต์ที่ถูกต้องก่อนที่จะอนุมัติการเข้าถึง Ethereum เสมอ"
+ },
"accept": {
"message": "ยอมรับ"
},
diff --git a/app/_locales/tml/messages.json b/app/_locales/tml/messages.json
index 8dc242c10..0643ce205 100644
--- a/app/_locales/tml/messages.json
+++ b/app/_locales/tml/messages.json
@@ -1,4 +1,49 @@
{
+ "privacyMode": {
+ "message": "தனியுரிமை முறை"
+ },
+ "privacyModeDescription": {
+ "message": "உங்கள் கணக்குத் தகவலை பார்வையிட வலைத்தளங்கள் அணுகலைக் கோர வேண்டும்."
+ },
+ "exposeAccounts": {
+ "message": "கணக்குகளை அம்பலப்படுத்துங்கள்"
+ },
+ "exposeDescription": {
+ "message": "தற்போதைய இணையதளத்திற்கு கணக்குகளை அம்பலப்படுத்துங்கள். மரபணு டாப்ஸ் பயன்படுத்த."
+ },
+ "confirmExpose": {
+ "message": "நிச்சயமாக உங்கள் கணக்குகளை தற்போதைய இணையத்தளத்தில் அம்பலப்படுத்த விரும்புகிறீர்களா?"
+ },
+ "confirmClear": {
+ "message": "அங்கீகரிக்கப்பட்ட வலைத்தளங்களை நிச்சயமாக நீக்க விரும்புகிறீர்களா?"
+ },
+ "clearApprovalDataSuccess": {
+ "message": "அங்கீகரிக்கப்பட்ட வலைத்தள தரவு வெற்றிகரமாக அழிக்கப்பட்டது."
+ },
+ "approvalData": {
+ "message": "ஒப்புதல் தரவு"
+ },
+ "approvalDataDescription": {
+ "message": "அங்கீகரிக்கப்பட்ட வலைத்தள தரவை அழிக்கவும், அனைத்து தளங்களும் ஒப்புதல் மீண்டும் கோர வேண்டும்."
+ },
+ "clearApprovalData": {
+ "message": "ஒப்புதல் தரவை அழி"
+ },
+ "approve": {
+ "message": "ஒப்புதல்"
+ },
+ "reject": {
+ "message": "நிராகரி"
+ },
+ "providerAPIRequest": {
+ "message": "Web3 API கோரிக்கை"
+ },
+ "reviewProviderRequest": {
+ "message": "இந்த வலை 3 API கோரிக்கையை மதிப்பாய்வு செய்யவும்."
+ },
+ "providerRequestInfo": {
+ "message": "கீழே பட்டியலிடப்பட்டுள்ள டொமைன் Web3 ஏபிஐ அணுகலைக் கோருவதற்கு முயற்சிக்கிறது, எனவே இது Ethereum blockchain உடன் தொடர்பு கொள்ள முடியும். Web3 அணுகுமுறையை அங்கீகரிப்பதற்கு முன் சரியான தளத்தில் இருப்பதை எப்போதும் இருமுறை சரிபார்க்கவும்."
+ },
"accept": {
"message": "ஏற்கவும்"
},
diff --git a/app/_locales/tr/messages.json b/app/_locales/tr/messages.json
index 0dac139dd..1bb149eaa 100644
--- a/app/_locales/tr/messages.json
+++ b/app/_locales/tr/messages.json
@@ -1,4 +1,49 @@
{
+ "privacyMode": {
+ "message": "Gizlilik modu"
+ },
+ "privacyModeDescription": {
+ "message": "Web siteleri, hesap bilgilerinizi görmek için erişim istemek zorundadır."
+ },
+ "exposeAccounts": {
+ "message": "Hesapları Açığa Çıkar"
+ },
+ "exposeDescription": {
+ "message": "Hesapları mevcut web sitesine gösterin. Eski dapps için kullanışlıdır."
+ },
+ "confirmExpose": {
+ "message": "Hesaplarınızı mevcut web sitesine taşımak istediğinizden emin misiniz?"
+ },
+ "confirmClear": {
+ "message": "Onaylanmış web sitelerini silmek istediğinizden emin misiniz?"
+ },
+ "clearApprovalDataSuccess": {
+ "message": "Onaylanan web sitesi verileri başarıyla temizlendi."
+ },
+ "approvalData": {
+ "message": "Onay Verileri"
+ },
+ "approvalDataDescription": {
+ "message": "Onaylanan web sitesi verilerini temizle, tüm sitelerin tekrar onay isteğinde bulunması gerekir."
+ },
+ "clearApprovalData": {
+ "message": "Onay verilerini temizle"
+ },
+ "approve": {
+ "message": "Onaylamak"
+ },
+ "reject": {
+ "message": "Reddetmek"
+ },
+ "providerAPIRequest": {
+ "message": "Web3 API İsteği"
+ },
+ "reviewProviderRequest": {
+ "message": "Lütfen bu Ethereum API isteğini inceleyin."
+ },
+ "providerRequestInfo": {
+ "message": "Aşağıda listelenen etki alanı, Ethereum API'sine erişim talep etmeye çalışmaktadır, böylece Ethereum blockchain ile etkileşime girebilir. Web3 erişimini onaylamadan önce her zaman doğru sitede olduğunuzu kontrol edin."
+ },
"accept": {
"message": "Kabul et"
},
diff --git a/app/_locales/vi/messages.json b/app/_locales/vi/messages.json
index 782dfd119..f0837ba98 100644
--- a/app/_locales/vi/messages.json
+++ b/app/_locales/vi/messages.json
@@ -1,4 +1,49 @@
{
+ "privacyMode": {
+ "message": "Chế độ riêng tư"
+ },
+ "privacyModeDescription": {
+ "message": "Trang web phải yêu cầu quyền truy cập để xem thông tin tài khoản của bạn."
+ },
+ "exposeAccounts": {
+ "message": "Hiển thị tài khoản"
+ },
+ "exposeDescription": {
+ "message": "Hiển thị tài khoản cho trang web hiện tại. Hữu ích cho các ứng dụng cũ."
+ },
+ "confirmExpose": {
+ "message": "Bạn có chắc chắn muốn hiển thị tài khoản của mình cho trang web hiện tại không?"
+ },
+ "confirmClear": {
+ "message": "Bạn có chắc chắn muốn xóa các trang web được phê duyệt không?"
+ },
+ "clearApprovalDataSuccess": {
+ "message": "Đã xóa thành công dữ liệu trang web được phê duyệt."
+ },
+ "approvalData": {
+ "message": "Dữ liệu phê duyệt"
+ },
+ "approvalDataDescription": {
+ "message": "Xóa dữ liệu trang web được phê duyệt để tất cả các trang web phải yêu cầu phê duyệt lại."
+ },
+ "clearApprovalData": {
+ "message": "Xóa dữ liệu phê duyệt"
+ },
+ "approve": {
+ "message": "Phê duyệt"
+ },
+ "reject": {
+ "message": "Từ chối"
+ },
+ "providerAPIRequest": {
+ "message": "Yêu cầu API Web3"
+ },
+ "reviewProviderRequest": {
+ "message": "Vui lòng xem lại yêu cầu API Ethereum này."
+ },
+ "providerRequestInfo": {
+ "message": "Miền được liệt kê bên dưới đang cố gắng yêu cầu quyền truy cập vào API Ethereum để nó có thể tương tác với chuỗi khối Ethereum. Luôn kiểm tra kỹ xem bạn có đang ở đúng trang web trước khi phê duyệt quyền truy cập Ethereum hay không."
+ },
"accept": {
"message": "Chấp nhận"
},
diff --git a/app/_locales/zh_CN/messages.json b/app/_locales/zh_CN/messages.json
index 90ac2a55b..911ddf476 100644
--- a/app/_locales/zh_CN/messages.json
+++ b/app/_locales/zh_CN/messages.json
@@ -1,4 +1,49 @@
{
+ "privacyMode": {
+ "message": "隐私模式"
+ },
+ "privacyModeDescription": {
+ "message": "网站必须请求访问权限才能查看您的帐户信息。"
+ },
+ "exposeAccounts": {
+ "message": "公开账户"
+ },
+ "exposeDescription": {
+ "message": "将帐户公开给当前网站。对传统dapps很有用。"
+ },
+ "confirmExpose": {
+ "message": "您确定要将帐户公开到当前网站吗?"
+ },
+ "confirmClear": {
+ "message": "您确定要清除已批准的网站吗?"
+ },
+ "clearApprovalDataSuccess": {
+ "message": "已批准的网站数据已成功清除。"
+ },
+ "approvalData": {
+ "message": "审批数据"
+ },
+ "approvalDataDescription": {
+ "message": "清除已批准的网站数据,以便所有网站都必须再次申请"
+ },
+ "clearApprovalData": {
+ "message": "清除批准数据"
+ },
+ "approve": {
+ "message": "批准"
+ },
+ "reject": {
+ "message": "拒绝"
+ },
+ "providerAPIRequest": {
+ "message": "Web3 API请求"
+ },
+ "reviewProviderRequest": {
+ "message": "请查看此Ethereum API请求。"
+ },
+ "providerRequestInfo": {
+ "message": "下面列出的域正在尝试请求访问Ethereum API,以便它可以与以太坊区块链进行交互。在批准Ethereum访问之前,请务必仔细检查您是否在正确的站点上。"
+ },
"accept": {
"message": "接受"
},
diff --git a/app/_locales/zh_TW/messages.json b/app/_locales/zh_TW/messages.json
index f71ce311f..3b048fd91 100644
--- a/app/_locales/zh_TW/messages.json
+++ b/app/_locales/zh_TW/messages.json
@@ -1,4 +1,49 @@
{
+ "privacyMode": {
+ "message": "隱私模式"
+ },
+ "privacyModeDescription": {
+ "message": "網站必須請求訪問權限才能查看您的帳戶信息。"
+ },
+ "exposeAccounts": {
+ "message": "公開賬戶"
+ },
+ "exposeDescription": {
+ "message": "將帳戶公開給當前網站。對傳統dapps很有用。"
+ },
+ "confirmExpose": {
+ "message": "您確定要將帳戶公開到當前網站嗎?"
+ },
+ "confirmClear": {
+ "message": "您確定要清除已批准的網站嗎?"
+ },
+ "clearApprovalDataSuccess": {
+ "message": "已批准的網站數據已成功清除。"
+ },
+ "approvalData": {
+ "message": "審批數據"
+ },
+ "approvalDataDescription": {
+ "message": "清除已批准的網站數據,以便所有網站都必須再次申請"
+ },
+ "clearApprovalData": {
+ "message": "清除批准數據"
+ },
+ "approve": {
+ "message": "批准"
+ },
+ "reject": {
+ "message": "拒絕"
+ },
+ "providerAPIRequest": {
+ "message": "Web3 API請求"
+ },
+ "reviewProviderRequest": {
+ "message": "請查看此Ethereum API請求。"
+ },
+ "providerRequestInfo": {
+ "message": "下面列出的域正在嘗試請求訪問Ethereum API,以便它可以與以太坊區塊鏈進行交互。在批准Ethereum訪問之前,請務必仔細檢查您是否在正確的站點上。"
+ },
"accept": {
"message": "接受"
},
diff --git a/app/images/mm-secure.svg b/app/images/mm-secure.svg
new file mode 100644
index 000000000..1345b75b2
--- /dev/null
+++ b/app/images/mm-secure.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg width="78" height="22" viewBox="0 0 78 22" fill="none" xmlns="http://www.w3.org/2000/svg">
+ <path d="M29.5488 2.89062L31.375 8.04688L33.1914 2.89062H35.1152V10H33.6455V8.05664L33.792 4.70215L31.873 10H30.8672L28.9531 4.70703L29.0996 8.05664V10H27.6348V2.89062H29.5488ZM38.7334 10.0977C37.9587 10.0977 37.3271 9.86003 36.8389 9.38477C36.3538 8.90951 36.1113 8.27637 36.1113 7.48535V7.34863C36.1113 6.81803 36.2139 6.3444 36.4189 5.92773C36.624 5.50781 36.9137 5.18555 37.2881 4.96094C37.6657 4.73307 38.0954 4.61914 38.5771 4.61914C39.2998 4.61914 39.8678 4.84701 40.2812 5.30273C40.6979 5.75846 40.9062 6.40462 40.9062 7.24121V7.81738H37.542C37.5876 8.16243 37.7243 8.43913 37.9521 8.64746C38.1833 8.85579 38.4746 8.95996 38.8262 8.95996C39.3698 8.95996 39.7946 8.76302 40.1006 8.36914L40.7939 9.14551C40.5824 9.44499 40.2959 9.67936 39.9346 9.84863C39.5732 10.0146 39.1729 10.0977 38.7334 10.0977ZM38.5723 5.76172C38.2923 5.76172 38.0645 5.85612 37.8887 6.04492C37.7161 6.23372 37.6055 6.50391 37.5566 6.85547H39.5195V6.74316C39.513 6.43066 39.4284 6.18978 39.2656 6.02051C39.1029 5.84798 38.8717 5.76172 38.5723 5.76172ZM43.4014 3.41797V4.7168H44.3047V5.75195H43.4014V8.38867C43.4014 8.58398 43.4388 8.72396 43.5137 8.80859C43.5885 8.89323 43.7318 8.93555 43.9434 8.93555C44.0996 8.93555 44.238 8.92415 44.3584 8.90137V9.9707C44.0817 10.0553 43.7969 10.0977 43.5039 10.0977C42.5143 10.0977 42.0098 9.59798 41.9902 8.59863V5.75195H41.2188V4.7168H41.9902V3.41797H43.4014ZM48.1523 10C48.0872 9.87305 48.04 9.71517 48.0107 9.52637C47.6689 9.90723 47.2246 10.0977 46.6777 10.0977C46.1602 10.0977 45.7305 9.94792 45.3887 9.64844C45.0501 9.34896 44.8809 8.97135 44.8809 8.51562C44.8809 7.95573 45.0876 7.52604 45.501 7.22656C45.9176 6.92708 46.5182 6.77572 47.3027 6.77246H47.9521V6.46973C47.9521 6.22559 47.8887 6.03027 47.7617 5.88379C47.638 5.7373 47.4411 5.66406 47.1709 5.66406C46.9333 5.66406 46.7461 5.72103 46.6094 5.83496C46.4759 5.94889 46.4092 6.10514 46.4092 6.30371H44.998C44.998 5.99772 45.0924 5.71452 45.2812 5.4541C45.4701 5.19368 45.737 4.99023 46.082 4.84375C46.4271 4.69401 46.8145 4.61914 47.2441 4.61914C47.8952 4.61914 48.4111 4.78353 48.792 5.1123C49.1761 5.43783 49.3682 5.89681 49.3682 6.48926V8.7793C49.3714 9.2806 49.4414 9.65983 49.5781 9.91699V10H48.1523ZM46.9854 9.01855C47.1937 9.01855 47.3857 8.97298 47.5615 8.88184C47.7373 8.78743 47.8675 8.66211 47.9521 8.50586V7.59766H47.4248C46.7184 7.59766 46.3424 7.8418 46.2969 8.33008L46.292 8.41309C46.292 8.58887 46.3538 8.73372 46.4775 8.84766C46.6012 8.96159 46.7705 9.01855 46.9854 9.01855ZM52.459 2.89062L54.2852 8.04688L56.1016 2.89062H58.0254V10H56.5557V8.05664L56.7021 4.70215L54.7832 10H53.7773L51.8633 4.70703L52.0098 8.05664V10H50.5449V2.89062H52.459ZM62.2734 10C62.2083 9.87305 62.1611 9.71517 62.1318 9.52637C61.79 9.90723 61.3457 10.0977 60.7988 10.0977C60.2812 10.0977 59.8516 9.94792 59.5098 9.64844C59.1712 9.34896 59.002 8.97135 59.002 8.51562C59.002 7.95573 59.2087 7.52604 59.6221 7.22656C60.0387 6.92708 60.6393 6.77572 61.4238 6.77246H62.0732V6.46973C62.0732 6.22559 62.0098 6.03027 61.8828 5.88379C61.7591 5.7373 61.5622 5.66406 61.292 5.66406C61.0544 5.66406 60.8672 5.72103 60.7305 5.83496C60.597 5.94889 60.5303 6.10514 60.5303 6.30371H59.1191C59.1191 5.99772 59.2135 5.71452 59.4023 5.4541C59.5911 5.19368 59.8581 4.99023 60.2031 4.84375C60.5482 4.69401 60.9355 4.61914 61.3652 4.61914C62.0163 4.61914 62.5322 4.78353 62.9131 5.1123C63.2972 5.43783 63.4893 5.89681 63.4893 6.48926V8.7793C63.4925 9.2806 63.5625 9.65983 63.6992 9.91699V10H62.2734ZM61.1064 9.01855C61.3148 9.01855 61.5068 8.97298 61.6826 8.88184C61.8584 8.78743 61.9886 8.66211 62.0732 8.50586V7.59766H61.5459C60.8395 7.59766 60.4635 7.8418 60.418 8.33008L60.4131 8.41309C60.4131 8.58887 60.4749 8.73372 60.5986 8.84766C60.7223 8.96159 60.8916 9.01855 61.1064 9.01855ZM67.4346 8.54004C67.4346 8.36751 67.3483 8.23242 67.1758 8.13477C67.0065 8.03385 66.7331 7.94434 66.3555 7.86621C65.099 7.60254 64.4707 7.06868 64.4707 6.26465C64.4707 5.7959 64.6644 5.40527 65.0518 5.09277C65.4424 4.77702 65.9518 4.61914 66.5801 4.61914C67.2507 4.61914 67.7861 4.77702 68.1865 5.09277C68.5902 5.40853 68.792 5.81868 68.792 6.32324H67.3809C67.3809 6.12142 67.3158 5.9554 67.1855 5.8252C67.0553 5.69173 66.8519 5.625 66.5752 5.625C66.3376 5.625 66.1536 5.67871 66.0234 5.78613C65.8932 5.89355 65.8281 6.03027 65.8281 6.19629C65.8281 6.35254 65.9014 6.47949 66.0479 6.57715C66.1976 6.67155 66.4482 6.75456 66.7998 6.82617C67.1514 6.89453 67.4476 6.97266 67.6885 7.06055C68.4339 7.33398 68.8066 7.80762 68.8066 8.48145C68.8066 8.96322 68.5999 9.35384 68.1865 9.65332C67.7731 9.94954 67.2393 10.0977 66.585 10.0977C66.1423 10.0977 65.7484 10.0195 65.4033 9.86328C65.0615 9.70378 64.793 9.4873 64.5977 9.21387C64.4023 8.93717 64.3047 8.63932 64.3047 8.32031H65.6426C65.6556 8.57096 65.7484 8.76302 65.9209 8.89648C66.0934 9.02995 66.3245 9.09668 66.6143 9.09668C66.8844 9.09668 67.0879 9.04622 67.2246 8.94531C67.3646 8.84115 67.4346 8.70605 67.4346 8.54004ZM71.6387 7.88086L71.1309 8.38867V10H69.7197V2.5H71.1309V6.65527L71.4043 6.30371L72.7568 4.7168H74.4512L72.542 6.91895L74.6172 10H72.9961L71.6387 7.88086ZM31.3213 18.1348C31.3213 17.8581 31.2236 17.6465 31.0283 17.5C30.833 17.3503 30.4814 17.194 29.9736 17.0312C29.4658 16.8652 29.0638 16.7025 28.7676 16.543C27.9603 16.1068 27.5566 15.5192 27.5566 14.7803C27.5566 14.3962 27.6641 14.0544 27.8789 13.7549C28.097 13.4521 28.4079 13.2161 28.8115 13.0469C29.2184 12.8776 29.6742 12.793 30.1787 12.793C30.6865 12.793 31.139 12.8857 31.5361 13.0713C31.9333 13.2536 32.2409 13.5124 32.459 13.8477C32.6803 14.1829 32.791 14.5638 32.791 14.9902H31.3262C31.3262 14.6647 31.2236 14.4124 31.0186 14.2334C30.8135 14.0511 30.5254 13.96 30.1543 13.96C29.7962 13.96 29.5179 14.0365 29.3193 14.1895C29.1208 14.3392 29.0215 14.5378 29.0215 14.7852C29.0215 15.0163 29.137 15.21 29.3682 15.3662C29.6025 15.5225 29.946 15.6689 30.3984 15.8057C31.2318 16.0563 31.8389 16.3672 32.2197 16.7383C32.6006 17.1094 32.791 17.5716 32.791 18.125C32.791 18.7402 32.5583 19.2236 32.0928 19.5752C31.6273 19.9235 31.0007 20.0977 30.2129 20.0977C29.666 20.0977 29.168 19.9984 28.7188 19.7998C28.2695 19.598 27.9261 19.3229 27.6885 18.9746C27.4541 18.6263 27.3369 18.2227 27.3369 17.7637H28.8066C28.8066 18.5482 29.2754 18.9404 30.2129 18.9404C30.5612 18.9404 30.833 18.8704 31.0283 18.7305C31.2236 18.5872 31.3213 18.3887 31.3213 18.1348ZM36.126 20.0977C35.3512 20.0977 34.7197 19.86 34.2314 19.3848C33.7464 18.9095 33.5039 18.2764 33.5039 17.4854V17.3486C33.5039 16.818 33.6064 16.3444 33.8115 15.9277C34.0166 15.5078 34.3063 15.1855 34.6807 14.9609C35.0583 14.7331 35.488 14.6191 35.9697 14.6191C36.6924 14.6191 37.2604 14.847 37.6738 15.3027C38.0905 15.7585 38.2988 16.4046 38.2988 17.2412V17.8174H34.9346C34.9801 18.1624 35.1169 18.4391 35.3447 18.6475C35.5758 18.8558 35.8672 18.96 36.2188 18.96C36.7624 18.96 37.1872 18.763 37.4932 18.3691L38.1865 19.1455C37.9749 19.445 37.6885 19.6794 37.3271 19.8486C36.9658 20.0146 36.5654 20.0977 36.126 20.0977ZM35.9648 15.7617C35.6849 15.7617 35.457 15.8561 35.2812 16.0449C35.1087 16.2337 34.998 16.5039 34.9492 16.8555H36.9121V16.7432C36.9056 16.4307 36.821 16.1898 36.6582 16.0205C36.4954 15.848 36.2643 15.7617 35.9648 15.7617ZM41.3018 18.96C41.5622 18.96 41.7738 18.8883 41.9365 18.7451C42.0993 18.6019 42.1839 18.4115 42.1904 18.1738H43.5137C43.5104 18.5319 43.4128 18.8607 43.2207 19.1602C43.0286 19.4564 42.765 19.6875 42.4297 19.8535C42.0977 20.0163 41.7298 20.0977 41.3262 20.0977C40.571 20.0977 39.9753 19.8584 39.5391 19.3799C39.1029 18.8981 38.8848 18.234 38.8848 17.3877V17.2949C38.8848 16.4811 39.1012 15.8317 39.5342 15.3467C39.9671 14.8617 40.5612 14.6191 41.3164 14.6191C41.9772 14.6191 42.5062 14.8079 42.9033 15.1855C43.3037 15.5599 43.5072 16.0596 43.5137 16.6846H42.1904C42.1839 16.4111 42.0993 16.1898 41.9365 16.0205C41.7738 15.848 41.5589 15.7617 41.292 15.7617C40.9632 15.7617 40.7142 15.8822 40.5449 16.123C40.3789 16.3607 40.2959 16.748 40.2959 17.2852V17.4316C40.2959 17.9753 40.3789 18.3659 40.5449 18.6035C40.7109 18.8411 40.9632 18.96 41.3018 18.96ZM47.4834 19.4629C47.1351 19.8861 46.6533 20.0977 46.0381 20.0977C45.4717 20.0977 45.0387 19.9349 44.7393 19.6094C44.443 19.2839 44.2917 18.807 44.2852 18.1787V14.7168H45.6963V18.1299C45.6963 18.68 45.9469 18.9551 46.4482 18.9551C46.9268 18.9551 47.2555 18.7891 47.4346 18.457V14.7168H48.8506V20H47.5225L47.4834 19.4629ZM52.8838 16.04C52.6917 16.014 52.5225 16.001 52.376 16.001C51.8421 16.001 51.4922 16.1816 51.3262 16.543V20H49.915V14.7168H51.248L51.2871 15.3467C51.5703 14.8617 51.9626 14.6191 52.4639 14.6191C52.6201 14.6191 52.7666 14.6403 52.9033 14.6826L52.8838 16.04ZM55.9014 20.0977C55.1266 20.0977 54.4951 19.86 54.0068 19.3848C53.5218 18.9095 53.2793 18.2764 53.2793 17.4854V17.3486C53.2793 16.818 53.3818 16.3444 53.5869 15.9277C53.792 15.5078 54.0817 15.1855 54.4561 14.9609C54.8337 14.7331 55.2633 14.6191 55.7451 14.6191C56.4678 14.6191 57.0358 14.847 57.4492 15.3027C57.8659 15.7585 58.0742 16.4046 58.0742 17.2412V17.8174H54.71C54.7555 18.1624 54.8923 18.4391 55.1201 18.6475C55.3512 18.8558 55.6426 18.96 55.9941 18.96C56.5378 18.96 56.9626 18.763 57.2686 18.3691L57.9619 19.1455C57.7503 19.445 57.4639 19.6794 57.1025 19.8486C56.7412 20.0146 56.3408 20.0977 55.9014 20.0977ZM55.7402 15.7617C55.4603 15.7617 55.2324 15.8561 55.0566 16.0449C54.8841 16.2337 54.7734 16.5039 54.7246 16.8555H56.6875V16.7432C56.681 16.4307 56.5964 16.1898 56.4336 16.0205C56.2708 15.848 56.0397 15.7617 55.7402 15.7617Z" fill="#A2A4AC"/>
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M0 2.65498L0 8.69867C0 14.9252 4.19995 20.1981 10 22C15.7999 20.1981 20 14.9252 20 8.69867L20 2.65498L10 0L0 2.65498Z" fill="#A2A4AC"/>
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M8.47027 11.6L7.38462 12.093L8.92308 12.5429L8.47027 11.6ZM11.2204 11.6L10.7692 12.5429L12.3077 12.093L11.2204 11.6ZM10.4442 13.8H9.24372L9.0357 13.9633L8.92308 15.0571L9.02705 14.9484H10.6609L10.7692 15.0571L10.6522 13.9633L10.4442 13.8ZM15.6234 9.86253L15.388 9.69497L15.7646 9.35535L15.4774 9.13192L15.8541 8.84816L15.6046 8.66202L16 6.76348L15.4068 5L11.5888 6.40985L8.41115 6.40985L4.59313 5L4 6.76348L4.40012 8.66202L4.1459 8.84816L4.52253 9.13192L4.23536 9.35535L4.612 9.69497L4.37656 9.86253L4.91795 10.4907L4.09886 13.0127L4.85682 15.5859L7.52607 14.86L8.04391 15.2788L9.09844 16H10.9015L11.9561 15.2788L12.4739 14.86L15.1432 15.5859L15.9058 13.0127L15.082 10.4907L15.6234 9.86253Z" fill="white"/>
+</svg>
diff --git a/app/images/provider-approval-check.svg b/app/images/provider-approval-check.svg
new file mode 100644
index 000000000..c3df71f59
--- /dev/null
+++ b/app/images/provider-approval-check.svg
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g filter="url(#filter0_d)">
+<path d="M34.5 19C34.5 27.0081 28.0081 33.5 20 33.5C11.9919 33.5 5.5 27.0081 5.5 19C5.5 10.9919 11.9919 4.5 20 4.5C28.0081 4.5 34.5 10.9919 34.5 19Z" fill="#61BA00" stroke="#61BA00"/>
+<path d="M13.2998 19.7195L16.813 23.3195L26.1998 14.0195" stroke="white" stroke-width="2"/>
+</g>
+<defs>
+<filter id="filter0_d" x="0" y="0" width="40" height="40" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+<feFlood flood-opacity="0" result="BackgroundImageFix"/>
+<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"/>
+<feOffset dy="1"/>
+<feGaussianBlur stdDeviation="2.5"/>
+<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.25 0"/>
+<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow"/>
+<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow" result="shape"/>
+</filter>
+</defs>
+</svg>
+
diff --git a/app/manifest.json b/app/manifest.json
index aabacd49a..2a9800400 100644
--- a/app/manifest.json
+++ b/app/manifest.json
@@ -1,7 +1,7 @@
{
"name": "__MSG_appName__",
"short_name": "__MSG_appName__",
- "version": "4.16.0",
+ "version": "5.0.0",
"manifest_version": 2,
"author": "https://metamask.io",
"description": "__MSG_appDescription__",
diff --git a/app/scripts/background.js b/app/scripts/background.js
index 2a3c5b08b..078e84928 100644
--- a/app/scripts/background.js
+++ b/app/scripts/background.js
@@ -256,7 +256,8 @@ function setupController (initState, initLangCode) {
showUnconfirmedMessage: triggerUi,
unlockAccountMessage: triggerUi,
showUnapprovedTx: triggerUi,
- showWatchAssetUi: showWatchAssetUi,
+ openPopup: openPopup,
+ closePopup: notificationManager.closePopup.bind(notificationManager),
// initial state
initState,
// initial locale code
@@ -447,7 +448,7 @@ function triggerUi () {
* Opens the browser popup for user confirmation of watchAsset
* then it waits until user interact with the UI
*/
-function showWatchAssetUi () {
+function openPopup () {
triggerUi()
return new Promise(
(resolve) => {
diff --git a/app/scripts/contentscript.js b/app/scripts/contentscript.js
index 33523eb46..efb14233d 100644
--- a/app/scripts/contentscript.js
+++ b/app/scripts/contentscript.js
@@ -7,10 +7,12 @@ const PongStream = require('ping-pong-stream/pong')
const ObjectMultiplex = require('obj-multiplex')
const extension = require('extensionizer')
const PortStream = require('extension-port-stream')
+const TransformStream = require('stream').Transform
const inpageContent = fs.readFileSync(path.join(__dirname, '..', '..', 'dist', 'chrome', 'inpage.js')).toString()
const inpageSuffix = '//# sourceURL=' + extension.extension.getURL('inpage.js') + '\n'
const inpageBundle = inpageContent + inpageSuffix
+let isEnabled = false
// Eventually this streaming injection could be replaced with:
// https://developer.mozilla.org/en-US/docs/Mozilla/Tech/XPCOM/Language_Bindings/Components.utils.exportFunction
@@ -20,24 +22,27 @@ const inpageBundle = inpageContent + inpageSuffix
// MetaMask will be much faster loading and performant on Firefox.
if (shouldInjectWeb3()) {
- setupInjection()
+ injectScript(inpageBundle)
setupStreams()
+ listenForProviderRequest()
+ checkPrivacyMode()
}
/**
- * Creates a script tag that injects inpage.js
+ * Injects a script tag into the current document
+ *
+ * @param {string} content - Code to be executed in the current document
*/
-function setupInjection () {
+function injectScript (content) {
try {
- // inject in-page script
- var scriptTag = document.createElement('script')
- scriptTag.textContent = inpageBundle
- scriptTag.onload = function () { this.parentNode.removeChild(this) }
- var container = document.head || document.documentElement
- // append as first child
+ const container = document.head || document.documentElement
+ const scriptTag = document.createElement('script')
+ scriptTag.setAttribute('async', false)
+ scriptTag.textContent = content
container.insertBefore(scriptTag, container.children[0])
+ container.removeChild(scriptTag)
} catch (e) {
- console.error('Metamask injection failed.', e)
+ console.error('MetaMask script injection failed', e)
}
}
@@ -54,10 +59,22 @@ function setupStreams () {
const pluginPort = extension.runtime.connect({ name: 'contentscript' })
const pluginStream = new PortStream(pluginPort)
+ // Filter out selectedAddress until this origin is enabled
+ const approvalTransform = new TransformStream({
+ objectMode: true,
+ transform: (data, _, done) => {
+ if (typeof data === 'object' && data.name && data.name === 'publicConfig' && !isEnabled) {
+ data.data.selectedAddress = undefined
+ }
+ done(null, { ...data })
+ },
+ })
+
// forward communication plugin->inpage
pump(
pageStream,
pluginStream,
+ approvalTransform,
pageStream,
(err) => logStreamDisconnectWarning('MetaMask Contentscript Forwarding', err)
)
@@ -97,6 +114,69 @@ function setupStreams () {
mux.ignoreStream('publicConfig')
}
+/**
+ * Establishes listeners for requests to fully-enable the provider from the dapp context
+ * and for full-provider approvals and rejections from the background script context. Dapps
+ * should not post messages directly and should instead call provider.enable(), which
+ * handles posting these messages internally.
+ */
+function listenForProviderRequest () {
+ window.addEventListener('message', ({ source, data }) => {
+ if (source !== window || !data || !data.type) { return }
+ switch (data.type) {
+ case 'ETHEREUM_ENABLE_PROVIDER':
+ extension.runtime.sendMessage({
+ action: 'init-provider-request',
+ force: data.force,
+ origin: source.location.hostname,
+ siteImage: getSiteIcon(source),
+ siteTitle: getSiteName(source),
+ })
+ break
+ case 'ETHEREUM_IS_APPROVED':
+ extension.runtime.sendMessage({
+ action: 'init-is-approved',
+ origin: source.location.hostname,
+ })
+ break
+ case 'METAMASK_IS_UNLOCKED':
+ extension.runtime.sendMessage({
+ action: 'init-is-unlocked',
+ })
+ break
+ }
+ })
+
+ extension.runtime.onMessage.addListener(({ action = '', isApproved, caching, isUnlocked }) => {
+ switch (action) {
+ case 'approve-provider-request':
+ isEnabled = true
+ window.postMessage({ type: 'ethereumprovider' }, '*')
+ break
+ case 'reject-provider-request':
+ window.postMessage({ type: 'ethereumprovider', error: 'User rejected provider access' }, '*')
+ break
+ case 'answer-is-approved':
+ window.postMessage({ type: 'ethereumisapproved', isApproved, caching }, '*')
+ break
+ case 'answer-is-unlocked':
+ window.postMessage({ type: 'metamaskisunlocked', isUnlocked }, '*')
+ break
+ case 'metamask-set-locked':
+ isEnabled = false
+ window.postMessage({ type: 'metamasksetlocked' }, '*')
+ break
+ }
+ })
+}
+
+/**
+ * Checks if MetaMask is currently operating in "privacy mode", meaning
+ * dapps must call ethereum.enable in order to access user accounts
+ */
+function checkPrivacyMode () {
+ extension.runtime.sendMessage({ action: 'init-privacy-request' })
+}
/**
* Error handler for page to plugin stream disconnections
@@ -210,3 +290,31 @@ function redirectToPhishingWarning () {
href: window.location.href,
})}`
}
+
+function getSiteName (window) {
+ const document = window.document
+ const siteName = document.querySelector('head > meta[property="og:site_name"]')
+ if (siteName) {
+ return siteName.content
+ }
+
+ return document.title
+}
+
+function getSiteIcon (window) {
+ const document = window.document
+
+ // Use the site's favicon if it exists
+ const shortcutIcon = document.querySelector('head > link[rel="shortcut icon"]')
+ if (shortcutIcon) {
+ return shortcutIcon.href
+ }
+
+ // Search through available icons in no particular order
+ const icon = Array.from(document.querySelectorAll('head > link[rel="icon"]')).find((icon) => Boolean(icon.href))
+ if (icon) {
+ return icon.href
+ }
+
+ return null
+}
diff --git a/app/scripts/controllers/network/createInfuraClient.js b/app/scripts/controllers/network/createInfuraClient.js
index 326bcb355..c70fa9e38 100644
--- a/app/scripts/controllers/network/createInfuraClient.js
+++ b/app/scripts/controllers/network/createInfuraClient.js
@@ -1,4 +1,5 @@
const mergeMiddleware = require('json-rpc-engine/src/mergeMiddleware')
+const createScaffoldMiddleware = require('json-rpc-engine/src/createScaffoldMiddleware')
const createBlockReRefMiddleware = require('eth-json-rpc-middleware/block-ref')
const createRetryOnEmptyMiddleware = require('eth-json-rpc-middleware/retryOnEmpty')
const createBlockCacheMiddleware = require('eth-json-rpc-middleware/block-cache')
@@ -16,6 +17,7 @@ function createInfuraClient ({ network }) {
const blockTracker = new BlockTracker({ provider: infuraProvider })
const networkMiddleware = mergeMiddleware([
+ createNetworkAndChainIdMiddleware({ network }),
createBlockCacheMiddleware({ blockTracker }),
createInflightMiddleware(),
createBlockReRefMiddleware({ blockTracker, provider: infuraProvider }),
@@ -25,3 +27,34 @@ function createInfuraClient ({ network }) {
])
return { networkMiddleware, blockTracker }
}
+
+function createNetworkAndChainIdMiddleware({ network }) {
+ let chainId
+ let netId
+
+ switch (network) {
+ case 'mainnet':
+ netId = '1'
+ chainId = '0x01'
+ break
+ case 'ropsten':
+ netId = '3'
+ chainId = '0x03'
+ break
+ case 'rinkeby':
+ netId = '4'
+ chainId = '0x04'
+ break
+ case 'kovan':
+ netId = '42'
+ chainId = '0x2a'
+ break
+ default:
+ throw new Error(`createInfuraClient - unknown network "${network}"`)
+ }
+
+ return createScaffoldMiddleware({
+ eth_chainId: chainId,
+ net_version: netId,
+ })
+}
diff --git a/app/scripts/controllers/network/network.js b/app/scripts/controllers/network/network.js
index c21e9c764..b459b8013 100644
--- a/app/scripts/controllers/network/network.js
+++ b/app/scripts/controllers/network/network.js
@@ -107,20 +107,10 @@ module.exports = class NetworkController extends EventEmitter {
}
var { type } = this.providerStore.getState()
const ethQuery = new EthQuery(this._provider)
- // first attempt to perform lookup via eth_chainId
- ethQuery.sendAsync({ method: 'eth_chainId' }, (err, chainIdHex) => {
- if (err) {
- // if eth_chainId is not supported, fallback to net_verion
- ethQuery.sendAsync({ method: 'net_version' }, (err, network) => {
- if (err) return this.setNetworkState('loading')
- log.info(`net_version returned ${network}`)
- this.setNetworkState(network, type)
- })
- return
- }
- const chainId = Number.parseInt(chainIdHex, 16)
- log.info(`net_version returned ${chainId}`)
- this.setNetworkState(chainId, type)
+ ethQuery.sendAsync({ method: 'net_version' }, (err, network) => {
+ if (err) return this.setNetworkState('loading')
+ log.info('web3.getNetwork returned ' + network)
+ this.setNetworkState(network, type)
})
}
diff --git a/app/scripts/controllers/preferences.js b/app/scripts/controllers/preferences.js
index eaeaee499..ffb593b09 100644
--- a/app/scripts/controllers/preferences.js
+++ b/app/scripts/controllers/preferences.js
@@ -46,7 +46,7 @@ class PreferencesController {
this.diagnostics = opts.diagnostics
this.network = opts.network
this.store = new ObservableStore(initState)
- this.showWatchAssetUi = opts.showWatchAssetUi
+ this.openPopup = opts.openPopup
this._subscribeProviderType()
}
// PUBLIC METHODS
@@ -567,7 +567,7 @@ class PreferencesController {
}
const tokenOpts = { rawAddress, decimals, symbol, image }
this.addSuggestedERC20Asset(tokenOpts)
- return this.showWatchAssetUi().then(() => {
+ return this.openPopup().then(() => {
const tokenAddresses = this.getTokens().filter(token => token.address === normalizeAddress(rawAddress))
return tokenAddresses.length > 0
})
@@ -583,8 +583,8 @@ class PreferencesController {
*/
_validateERC20AssetParams (opts) {
const { rawAddress, symbol, decimals } = opts
- if (!rawAddress || !symbol || !decimals) throw new Error(`Cannot suggest token without address, symbol, and decimals`)
- if (!(symbol.length < 6)) throw new Error(`Invalid symbol ${symbol} more than five characters`)
+ if (!rawAddress || !symbol || typeof decimals === 'undefined') throw new Error(`Cannot suggest token without address, symbol, and decimals`)
+ if (!(symbol.length < 7)) throw new Error(`Invalid symbol ${symbol} more than six characters`)
const numDecimals = parseInt(decimals, 10)
if (isNaN(numDecimals) || numDecimals > 36 || numDecimals < 0) {
throw new Error(`Invalid decimals ${decimals} must be at least 0, and not over 36`)
diff --git a/app/scripts/controllers/provider-approval.js b/app/scripts/controllers/provider-approval.js
new file mode 100644
index 000000000..d3b7f6dff
--- /dev/null
+++ b/app/scripts/controllers/provider-approval.js
@@ -0,0 +1,152 @@
+const ObservableStore = require('obs-store')
+
+/**
+ * A controller that services user-approved requests for a full Ethereum provider API
+ */
+class ProviderApprovalController {
+ /**
+ * Determines if caching is enabled
+ */
+ caching = true
+
+ /**
+ * Creates a ProviderApprovalController
+ *
+ * @param {Object} [config] - Options to configure controller
+ */
+ constructor ({ closePopup, keyringController, openPopup, platform, preferencesController, publicConfigStore } = {}) {
+ this.approvedOrigins = {}
+ this.closePopup = closePopup
+ this.keyringController = keyringController
+ this.openPopup = openPopup
+ this.platform = platform
+ this.preferencesController = preferencesController
+ this.publicConfigStore = publicConfigStore
+ this.store = new ObservableStore()
+
+ if (platform && platform.addMessageListener) {
+ platform.addMessageListener(({ action = '', force, origin, siteTitle, siteImage }) => {
+ switch (action) {
+ case 'init-provider-request':
+ this._handleProviderRequest(origin, siteTitle, siteImage, force)
+ break
+ case 'init-is-approved':
+ this._handleIsApproved(origin)
+ break
+ case 'init-is-unlocked':
+ this._handleIsUnlocked()
+ break
+ case 'init-privacy-request':
+ this._handlePrivacyRequest()
+ break
+ }
+ })
+ }
+ }
+
+ /**
+ * Called when a tab requests access to a full Ethereum provider API
+ *
+ * @param {string} origin - Origin of the window requesting full provider access
+ * @param {string} siteTitle - The title of the document requesting full provider access
+ * @param {string} siteImage - The icon of the window requesting full provider access
+ */
+ _handleProviderRequest (origin, siteTitle, siteImage, force) {
+ this.store.updateState({ providerRequests: [{ origin, siteTitle, siteImage }] })
+ const isUnlocked = this.keyringController.memStore.getState().isUnlocked
+ if (!force && this.approvedOrigins[origin] && this.caching && isUnlocked) {
+ this.approveProviderRequest(origin)
+ return
+ }
+ this.openPopup && this.openPopup()
+ }
+
+ /**
+ * Called by a tab to determine if an origin has been approved in the past
+ *
+ * @param {string} origin - Origin of the window
+ */
+ _handleIsApproved (origin) {
+ this.platform && this.platform.sendMessage({
+ action: 'answer-is-approved',
+ isApproved: this.approvedOrigins[origin] && this.caching,
+ caching: this.caching,
+ }, { active: true })
+ }
+
+ /**
+ * Called by a tab to determine if MetaMask is currently locked or unlocked
+ */
+ _handleIsUnlocked () {
+ const isUnlocked = this.keyringController.memStore.getState().isUnlocked
+ this.platform && this.platform.sendMessage({ action: 'answer-is-unlocked', isUnlocked }, { active: true })
+ }
+
+ /**
+ * Called to check privacy mode; if privacy mode is off, this will automatically enable the provider (legacy behavior)
+ */
+ _handlePrivacyRequest () {
+ const privacyMode = this.preferencesController.getFeatureFlags().privacyMode
+ if (!privacyMode) {
+ this.platform && this.platform.sendMessage({ action: 'approve-provider-request' }, { active: true })
+ this.publicConfigStore.emit('update', this.publicConfigStore.getState())
+ }
+ }
+
+ /**
+ * Called when a user approves access to a full Ethereum provider API
+ *
+ * @param {string} origin - Origin of the target window to approve provider access
+ */
+ approveProviderRequest (origin) {
+ this.closePopup && this.closePopup()
+ const requests = this.store.getState().providerRequests || []
+ this.platform && this.platform.sendMessage({ action: 'approve-provider-request' }, { active: true })
+ this.publicConfigStore.emit('update', this.publicConfigStore.getState())
+ const providerRequests = requests.filter(request => request.origin !== origin)
+ this.store.updateState({ providerRequests })
+ this.approvedOrigins[origin] = true
+ }
+
+ /**
+ * Called when a tab rejects access to a full Ethereum provider API
+ *
+ * @param {string} origin - Origin of the target window to reject provider access
+ */
+ rejectProviderRequest (origin) {
+ this.closePopup && this.closePopup()
+ const requests = this.store.getState().providerRequests || []
+ this.platform && this.platform.sendMessage({ action: 'reject-provider-request' }, { active: true })
+ const providerRequests = requests.filter(request => request.origin !== origin)
+ this.store.updateState({ providerRequests })
+ delete this.approvedOrigins[origin]
+ }
+
+ /**
+ * Clears any cached approvals for user-approved origins
+ */
+ clearApprovedOrigins () {
+ this.approvedOrigins = {}
+ }
+
+ /**
+ * Determines if a given origin should have accounts exposed
+ *
+ * @param {string} origin - Domain origin to check for approval status
+ * @returns {boolean} - True if the origin has been approved
+ */
+ shouldExposeAccounts (origin) {
+ const privacyMode = this.preferencesController.getFeatureFlags().privacyMode
+ return !privacyMode || this.approvedOrigins[origin]
+ }
+
+ /**
+ * Tells all tabs that MetaMask is now locked. This is primarily used to set
+ * internal flags in the contentscript and inpage script.
+ */
+ setLocked () {
+ this.platform.sendMessage({ action: 'metamask-set-locked' })
+ }
+}
+
+module.exports = ProviderApprovalController
diff --git a/app/scripts/controllers/token-rates.js b/app/scripts/controllers/token-rates.js
index 87d716aa6..b6f084841 100644
--- a/app/scripts/controllers/token-rates.js
+++ b/app/scripts/controllers/token-rates.js
@@ -1,5 +1,5 @@
const ObservableStore = require('obs-store')
-const { warn } = require('loglevel')
+const log = require('loglevel')
// By default, poll every 3 minutes
const DEFAULT_INTERVAL = 180 * 1000
@@ -26,8 +26,11 @@ class TokenRatesController {
async updateExchangeRates () {
if (!this.isActive) { return }
const contractExchangeRates = {}
- for (const i in this._tokens) {
- const address = this._tokens[i].address
+ // copy array to ensure its not modified during iteration
+ const tokens = this._tokens.slice()
+ for (const token of tokens) {
+ if (!token) return log.error(`TokenRatesController - invalid tokens state:\n${JSON.stringify(tokens, null, 2)}`)
+ const address = token.address
contractExchangeRates[address] = await this.fetchExchangeRate(address)
}
this.store.putState({ contractExchangeRates })
@@ -44,7 +47,7 @@ class TokenRatesController {
const json = await response.json()
return json && json.length ? json[0].averagePrice : 0
} catch (error) {
- warn(`MetaMask - TokenRatesController exchange rate fetch failed for ${address}.`, error)
+ log.warn(`MetaMask - TokenRatesController exchange rate fetch failed for ${address}.`, error)
return 0
}
}
diff --git a/app/scripts/inpage.js b/app/scripts/inpage.js
index b885a7e05..a7c0b0416 100644
--- a/app/scripts/inpage.js
+++ b/app/scripts/inpage.js
@@ -6,14 +6,36 @@ const LocalMessageDuplexStream = require('post-message-stream')
const setupDappAutoReload = require('./lib/auto-reload.js')
const MetamaskInpageProvider = require('metamask-inpage-provider')
+let isEnabled = false
+let warned = false
+let providerHandle
+let isApprovedHandle
+let isUnlockedHandle
+
restoreContextAfterImports()
log.setDefaultLevel(process.env.METAMASK_DEBUG ? 'debug' : 'warn')
-console.warn('ATTENTION: In an effort to improve user privacy, MetaMask will ' +
-'stop exposing user accounts to dapps by default beginning November 2nd, 2018. ' +
-'Dapps should call provider.enable() in order to view and use accounts. Please see ' +
-'https://bit.ly/2QQHXvF for complete information and up-to-date example code.')
+console.warn('ATTENTION: In an effort to improve user privacy, MetaMask ' +
+'stopped exposing user accounts to dapps if "privacy mode" is enabled on ' +
+'November 2nd, 2018. Dapps should now call provider.enable() in order to view and use ' +
+'accounts. Please see https://bit.ly/2QQHXvF for complete information and up-to-date ' +
+'example code.')
+
+/**
+ * Adds a postMessage listener for a specific message type
+ *
+ * @param {string} messageType - postMessage type to listen for
+ * @param {Function} handler - event handler
+ * @param {boolean} remove - removes this handler after being triggered
+ */
+function onMessage(messageType, handler, remove) {
+ window.addEventListener('message', function ({ data: { type } }) {
+ if (type !== messageType) { return }
+ remove && window.removeEventListener('message', handler)
+ handler.apply(window, arguments)
+ })
+}
//
// setup plugin communication
@@ -27,26 +49,113 @@ var metamaskStream = new LocalMessageDuplexStream({
// compose the inpage provider
var inpageProvider = new MetamaskInpageProvider(metamaskStream)
+
// set a high max listener count to avoid unnecesary warnings
inpageProvider.setMaxListeners(100)
-// Augment the provider with its enable method
-inpageProvider.enable = function (options = {}) {
+// set up a listener for when MetaMask is locked
+onMessage('metamasksetlocked', () => { isEnabled = false })
+
+// augment the provider with its enable method
+inpageProvider.enable = function ({ force } = {}) {
return new Promise((resolve, reject) => {
- if (options.mockRejection) {
- reject('User rejected account access')
- } else {
- inpageProvider.sendAsync({ method: 'eth_accounts', params: [] }, (error, response) => {
- if (error) {
- reject(error)
- } else {
- resolve(response.result)
- }
- })
+ providerHandle = ({ data: { error } }) => {
+ if (typeof error !== 'undefined') {
+ reject(error)
+ } else {
+ window.removeEventListener('message', providerHandle)
+ // wait for the publicConfig store to populate with an account
+ const publicConfig = new Promise((resolve) => {
+ const { selectedAddress } = inpageProvider.publicConfigStore.getState()
+ inpageProvider._metamask.isUnlocked().then(unlocked => {
+ if (!unlocked || selectedAddress) {
+ resolve()
+ } else {
+ inpageProvider.publicConfigStore.on('update', ({ selectedAddress }) => {
+ selectedAddress && resolve()
+ })
+ }
+ })
+ })
+
+ // wait for the background to update with an account
+ const ethAccounts = new Promise((resolveAccounts, rejectAccounts) => {
+ inpageProvider.sendAsync({ method: 'eth_accounts', params: [] }, (error, response) => {
+ if (error) {
+ rejectAccounts(error)
+ } else {
+ resolveAccounts(response.result)
+ }
+ })
+ })
+
+ Promise.all([ethAccounts, publicConfig])
+ .then(([selectedAddress]) => {
+ isEnabled = true
+ resolve(selectedAddress)
+ })
+ .catch(reject)
+ }
}
+ onMessage('ethereumprovider', providerHandle, true)
+ window.postMessage({ type: 'ETHEREUM_ENABLE_PROVIDER', force }, '*')
})
}
+// add metamask-specific convenience methods
+inpageProvider._metamask = new Proxy({
+ /**
+ * Determines if this domain is currently enabled
+ *
+ * @returns {boolean} - true if this domain is currently enabled
+ */
+ isEnabled: function () {
+ return isEnabled
+ },
+
+ /**
+ * Determines if this domain has been previously approved
+ *
+ * @returns {Promise<boolean>} - Promise resolving to true if this domain has been previously approved
+ */
+ isApproved: function() {
+ return new Promise((resolve) => {
+ isApprovedHandle = ({ data: { caching, isApproved } }) => {
+ if (caching) {
+ resolve(!!isApproved)
+ } else {
+ resolve(false)
+ }
+ }
+ onMessage('ethereumisapproved', isApprovedHandle, true)
+ window.postMessage({ type: 'ETHEREUM_IS_APPROVED' }, '*')
+ })
+ },
+
+ /**
+ * Determines if MetaMask is unlocked by the user
+ *
+ * @returns {Promise<boolean>} - Promise resolving to true if MetaMask is currently unlocked
+ */
+ isUnlocked: function () {
+ return new Promise((resolve) => {
+ isUnlockedHandle = ({ data: { isUnlocked } }) => {
+ resolve(!!isUnlocked)
+ }
+ onMessage('metamaskisunlocked', isUnlockedHandle, true)
+ window.postMessage({ type: 'METAMASK_IS_UNLOCKED' }, '*')
+ })
+ },
+}, {
+ get: function(obj, prop) {
+ !warned && console.warn('Heads up! ethereum._metamask exposes methods that have ' +
+ 'not been standardized yet. This means that these methods may not be implemented ' +
+ 'in other dapp browsers and may be removed from MetaMask in the future.')
+ warned = true
+ return obj[prop]
+ },
+})
+
// Work around for web3@1.0 deleting the bound `sendAsync` but not the unbound
// `sendAsync` method on the prototype, causing `this` reference issues with drizzle
const proxiedInpageProvider = new Proxy(inpageProvider, {
@@ -57,6 +166,19 @@ const proxiedInpageProvider = new Proxy(inpageProvider, {
window.ethereum = proxiedInpageProvider
+// detect eth_requestAccounts and pipe to enable for now
+function detectAccountRequest(method) {
+ const originalMethod = inpageProvider[method]
+ inpageProvider[method] = function ({ method }) {
+ if (method === 'eth_requestAccounts') {
+ return window.ethereum.enable()
+ }
+ return originalMethod.apply(this, arguments)
+ }
+}
+detectAccountRequest('send')
+detectAccountRequest('sendAsync')
+
//
// setup web3
//
diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js
index 1f6a8659b..5ae0f608d 100644
--- a/app/scripts/metamask-controller.js
+++ b/app/scripts/metamask-controller.js
@@ -37,6 +37,7 @@ const TransactionController = require('./controllers/transactions')
const BalancesController = require('./controllers/computed-balances')
const TokenRatesController = require('./controllers/token-rates')
const DetectTokensController = require('./controllers/detect-tokens')
+const ProviderApprovalController = require('./controllers/provider-approval')
const nodeify = require('./lib/nodeify')
const accountImporter = require('./account-import-strategies')
const getBuyEthUrl = require('./lib/buy-eth-url')
@@ -89,7 +90,7 @@ module.exports = class MetamaskController extends EventEmitter {
this.preferencesController = new PreferencesController({
initState: initState.PreferencesController,
initLangCode: opts.initLangCode,
- showWatchAssetUi: opts.showWatchAssetUi,
+ openPopup: opts.openPopup,
network: this.networkController,
})
@@ -219,6 +220,15 @@ module.exports = class MetamaskController extends EventEmitter {
this.typedMessageManager = new TypedMessageManager({ networkController: this.networkController })
this.publicConfigStore = this.initPublicConfigStore()
+ this.providerApprovalController = new ProviderApprovalController({
+ closePopup: opts.closePopup,
+ keyringController: this.keyringController,
+ openPopup: opts.openPopup,
+ platform: opts.platform,
+ preferencesController: this.preferencesController,
+ publicConfigStore: this.publicConfigStore,
+ })
+
this.store.updateStructure({
TransactionController: this.txController.store,
KeyringController: this.keyringController.store,
@@ -248,6 +258,7 @@ module.exports = class MetamaskController extends EventEmitter {
NoticeController: this.noticeController.memStore,
ShapeshiftController: this.shapeshiftController.store,
InfuraController: this.infuraController.store,
+ ProviderApprovalController: this.providerApprovalController.store,
})
this.memStore.subscribe(this.sendUpdate.bind(this))
}
@@ -263,7 +274,11 @@ module.exports = class MetamaskController extends EventEmitter {
},
version,
// account mgmt
- getAccounts: async () => {
+ getAccounts: async ({ origin }) => {
+ // Expose no accounts if this origin has not been approved, preventing
+ // account-requring RPC methods from completing successfully
+ const exposeAccounts = this.providerApprovalController.shouldExposeAccounts(origin)
+ if (origin !== 'MetaMask' && !exposeAccounts) { return [] }
const isUnlocked = this.keyringController.memStore.getState().isUnlocked
const selectedAddress = this.preferencesController.getSelectedAddress()
// only show address if account is unlocked
@@ -349,6 +364,7 @@ module.exports = class MetamaskController extends EventEmitter {
const noticeController = this.noticeController
const addressBookController = this.addressBookController
const networkController = this.networkController
+ const providerApprovalController = this.providerApprovalController
return {
// etc
@@ -406,7 +422,7 @@ module.exports = class MetamaskController extends EventEmitter {
setAddressBook: nodeify(addressBookController.setAddressBook, addressBookController),
// KeyringController
- setLocked: nodeify(keyringController.setLocked, keyringController),
+ setLocked: nodeify(this.setLocked, this),
createNewVaultAndKeychain: nodeify(this.createNewVaultAndKeychain, this),
createNewVaultAndRestore: nodeify(this.createNewVaultAndRestore, this),
addNewKeyring: nodeify(keyringController.addNewKeyring, keyringController),
@@ -437,6 +453,10 @@ module.exports = class MetamaskController extends EventEmitter {
// notices
checkNotices: noticeController.updateNoticesList.bind(noticeController),
markNoticeRead: noticeController.markNoticeRead.bind(noticeController),
+
+ approveProviderRequest: providerApprovalController.approveProviderRequest.bind(providerApprovalController),
+ clearApprovedOrigins: providerApprovalController.clearApprovedOrigins.bind(providerApprovalController),
+ rejectProviderRequest: providerApprovalController.rejectProviderRequest.bind(providerApprovalController),
}
}
@@ -1556,4 +1576,12 @@ module.exports = class MetamaskController extends EventEmitter {
whitelistPhishingDomain (hostname) {
return this.blacklistController.whitelistDomain(hostname)
}
+
+ /**
+ * Locks MetaMask
+ */
+ setLocked() {
+ this.providerApprovalController.setLocked()
+ return this.keyringController.setLocked()
+ }
}
diff --git a/app/scripts/platforms/extension.js b/app/scripts/platforms/extension.js
index 71b162dd0..9ef0d22c9 100644
--- a/app/scripts/platforms/extension.js
+++ b/app/scripts/platforms/extension.js
@@ -57,6 +57,18 @@ class ExtensionPlatform {
}
}
+ addMessageListener (cb) {
+ extension.runtime.onMessage.addListener(cb)
+ }
+
+ sendMessage (message, query = {}) {
+ extension.tabs.query(query, tabs => {
+ tabs.forEach(tab => {
+ extension.tabs.sendMessage(tab.id, message)
+ })
+ })
+ }
+
_showConfirmedTransaction (txMeta) {
this._subscribeToNotificationClicked()