aboutsummaryrefslogtreecommitdiffstats
path: root/app
diff options
context:
space:
mode:
authorVimal <vtiwari@coinswitch.co>2018-11-12 20:20:37 +0800
committerVimal <vtiwari@coinswitch.co>2018-11-12 20:20:37 +0800
commit6bb92a8672edf23465fb109c8966d2e56500ea86 (patch)
tree6f5c4e348fb58fcf23b27278ffae1c1b912ad08e /app
parent82b11b69a5dea38a4a036096528354a5a291a447 (diff)
parentda1036f2c4b20748407b7fa89b60df5e321fcab7 (diff)
downloadtangerine-wallet-browser-6bb92a8672edf23465fb109c8966d2e56500ea86.tar.gz
tangerine-wallet-browser-6bb92a8672edf23465fb109c8966d2e56500ea86.tar.zst
tangerine-wallet-browser-6bb92a8672edf23465fb109c8966d2e56500ea86.zip
merging upstream branch
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.json95
-rw-r--r--app/_locales/es/messages.json59
-rw-r--r--app/_locales/fr/messages.json39
-rw-r--r--app/_locales/hn/messages.json45
-rw-r--r--app/_locales/ht/messages.json2602
-rw-r--r--app/_locales/index.json41
-rw-r--r--app/_locales/it/messages.json524
-rw-r--r--app/_locales/ja/messages.json45
-rw-r--r--app/_locales/ko/messages.json131
-rw-r--r--app/_locales/nl/messages.json47
-rw-r--r--app/_locales/ph/messages.json45
-rw-r--r--app/_locales/pl/messages.json1213
-rw-r--r--app/_locales/pt/messages.json45
-rw-r--r--app/_locales/ru/messages.json45
-rw-r--r--app/_locales/sl/messages.json654
-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/home.html1
-rw-r--r--app/images/eth.svg14
-rw-r--r--app/images/mm-secure.svg7
-rw-r--r--app/images/provider-approval-check.svg20
-rw-r--r--app/loading.html12
-rw-r--r--app/manifest.json4
-rw-r--r--app/notification.html1
-rw-r--r--app/popup.html1
-rw-r--r--app/scripts/background.js30
-rw-r--r--app/scripts/contentscript.js151
-rw-r--r--app/scripts/controllers/blacklist.js25
-rw-r--r--app/scripts/controllers/currency.js80
-rw-r--r--app/scripts/controllers/network/createInfuraClient.js33
-rw-r--r--app/scripts/controllers/network/createMetamaskMiddleware.js2
-rw-r--r--app/scripts/controllers/network/network.js60
-rw-r--r--app/scripts/controllers/preferences.js106
-rw-r--r--app/scripts/controllers/provider-approval.js158
-rw-r--r--app/scripts/controllers/token-rates.js11
-rw-r--r--app/scripts/controllers/transactions/index.js35
-rw-r--r--app/scripts/controllers/transactions/tx-gas-utils.js35
-rw-r--r--app/scripts/controllers/transactions/tx-state-manager.js5
-rw-r--r--app/scripts/inpage.js142
-rw-r--r--app/scripts/lib/ens-ipfs/contracts/registrar.js (renamed from app/scripts/lib/contracts/registrar.js)0
-rw-r--r--app/scripts/lib/ens-ipfs/contracts/resolver.js (renamed from app/scripts/lib/contracts/resolver.js)0
-rw-r--r--app/scripts/lib/ens-ipfs/resolver.js54
-rw-r--r--app/scripts/lib/ens-ipfs/setup.js63
-rw-r--r--app/scripts/lib/ipfsContent.js46
-rw-r--r--app/scripts/lib/reportFailedTxToSentry.js6
-rw-r--r--app/scripts/lib/resolver.js71
-rw-r--r--app/scripts/lib/setupFetchDebugging.js36
-rw-r--r--app/scripts/lib/setupSentry.js (renamed from app/scripts/lib/setupRaven.js)75
-rw-r--r--app/scripts/metamask-controller.js88
-rw-r--r--app/scripts/platforms/extension.js12
-rw-r--r--app/scripts/ui.js14
57 files changed, 5523 insertions, 1865 deletions
diff --git a/app/_locales/cs/messages.json b/app/_locales/cs/messages.json
index 88e62c28a..40679a01d 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 919b66b3e..f4a69c106 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 e53bd4405..48b247187 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"
},
@@ -146,6 +185,9 @@
"clickCopy": {
"message": "Click to Copy"
},
+ "clickToAdd": {
+ "message": "Click on $1 to add them to your account"
+ },
"close": {
"message": "Close"
},
@@ -173,6 +215,9 @@
"connect": {
"message": "Connect"
},
+ "connectRequest": {
+ "message": "Connect Request"
+ },
"connecting": {
"message": "Connecting..."
},
@@ -370,6 +415,9 @@
"enterPasswordContinue": {
"message": "Enter password to continue"
},
+ "eth": {
+ "message": "ETH"
+ },
"etherscanView": {
"message": "View account on Etherscan"
},
@@ -389,7 +437,7 @@
"message": "Failed"
},
"fiat": {
- "message": "FIAT",
+ "message": "Fiat",
"description": "Exchange type"
},
"fileImportFail": {
@@ -433,6 +481,9 @@
"gasLimitTooLow": {
"message": "Gas limit must be at least 21000"
},
+ "gasUsed": {
+ "message": "Gas Used"
+ },
"generatingSeed": {
"message": "Generating Seed..."
},
@@ -644,6 +695,9 @@
"min": {
"message": "Minimum"
},
+ "missingYourTokens": {
+ "message": "Don't see your tokens?"
+ },
"myAccounts": {
"message": "My Accounts"
},
@@ -689,9 +743,27 @@
"newRecipient": {
"message": "New Recipient"
},
- "newRPC": {
+ "newNetwork": {
+ "message": "New Network"
+ },
+ "rpcURL": {
"message": "New RPC URL"
},
+ "showAdvancedOptions": {
+ "message": "Show Advanced Options"
+ },
+ "hideAdvancedOptions": {
+ "message": "Hide Advanced Options"
+ },
+ "optionalChainId": {
+ "message": "ChainID (optional)"
+ },
+ "optionalSymbol": {
+ "message": "Symbol (optional)"
+ },
+ "optionalNickname": {
+ "message": "Nickname (optional)"
+ },
"next": {
"message": "Next"
},
@@ -796,6 +868,12 @@
"prev": {
"message": "Prev"
},
+ "primaryCurrencySetting": {
+ "message": "Primary Currency"
+ },
+ "primaryCurrencySettingDescription": {
+ "message": "Select native to prioritize displaying values in the native currency of the chain (e.g. ETH). Select Fiat to prioritize displaying values in your selected fiat currency."
+ },
"privacyMsg": {
"message": "Privacy Policy"
},
@@ -804,7 +882,7 @@
"description": "select this type of file to use to import an account"
},
"privateKeyWarning": {
- "message": "Warning: Never disclose this key. Anyone with your private keys can take steal any assets held in your account."
+ "message": "Warning: Never disclose this key. Anyone with your private keys can steal any assets held in your account."
},
"privateNetwork": {
"message": "Private Network"
@@ -833,9 +911,6 @@
"refundAddress": {
"message": "Your Refund Address"
},
- "reject": {
- "message": "Reject"
- },
"rejectAll": {
"message": "Reject All"
},
@@ -1160,12 +1235,18 @@
"transactionUpdatedGas": {
"message": "Transaction updated with a gas price of $1 on $2."
},
+ "transactionErrored": {
+ "message": "Transaction encountered an error."
+ },
"transactions": {
"message": "transactions"
},
"transactionError": {
"message": "Transaction Error. Exception thrown in contract code."
},
+ "transactionErrorNoContract": {
+ "message": "Trying to call a function on a non-contract address."
+ },
"transactionMemo": {
"message": "Transaction memo (optional)"
},
@@ -1195,7 +1276,7 @@
"message": "These 12 words are the only way to restore your MetaMask accounts.\nSave them somewhere safe and secret."
},
"typePassword": {
- "message": "Type Your Password"
+ "message": "Type your MetaMask password"
},
"uiWelcome": {
"message": "Welcome to the New UI (Beta)"
diff --git a/app/_locales/es/messages.json b/app/_locales/es/messages.json
index 7dc186f3e..b8ad6f268 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"
},
@@ -165,7 +210,7 @@
"message": " Copiar "
},
"copyPrivateKey": {
- "message": "Ésta es tu llave privada (haz click para copiar)"
+ "message": "Ésta es tu clave privada (haz click para copiar)"
},
"copyToClipboard": {
"message": "Copiar al portapapeles"
@@ -287,10 +332,10 @@
"message": "Tipo de cambio"
},
"exportPrivateKey": {
- "message": "Exportar llave privada"
+ "message": "Exportar clave privada"
},
"exportPrivateKeyWarning": {
- "message": "Exportar llaves privadas bajo TU PROPIO riesgo"
+ "message": "Exportar claves privadas bajo TU PROPIO riesgo"
},
"failed": {
"message": "Fallo"
@@ -588,8 +633,8 @@
"description": "En el proceso de creación de contraseña, esta no es lo suficientemente larga para ser segura"
},
"pastePrivateKey": {
- "message": "Pega tu llave privada aqui",
- "description": "Para importar una cuenta desde una llave privada"
+ "message": "Pega tu clave privada aqui",
+ "description": "Para importar una cuenta desde una clave privada"
},
"pasteSeed": {
"message": "¡Pega tu frase semilla aquí!"
@@ -604,7 +649,7 @@
"message": "Política de privacidad"
},
"privateKey": {
- "message": "Llave privada",
+ "message": "Clave privada",
"description": "Selecciona este tupo de archivo para importar una cuenta"
},
"privateKeyWarning": {
@@ -721,7 +766,7 @@
"message": "Comprar con ShapeShift"
},
"showPrivateKeys": {
- "message": "Mostrar llaves privadas"
+ "message": "Mostrar claves privadas"
},
"showQRCode": {
"message": "Mostrar codigo QR"
diff --git a/app/_locales/fr/messages.json b/app/_locales/fr/messages.json
index 171f63b39..32b0a3109 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 4d36eaf5d..5e8b65374 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 45f25d624..5688e725e 100644
--- a/app/_locales/ht/messages.json
+++ b/app/_locales/ht/messages.json
@@ -1,1246 +1,1360 @@
{
- "accept": {
- "message": "Aksepte"
- },
- "accessingYourCamera": {
- "message": "Aksè a Kamera"
- },
- "account": {
- "message": "Kont"
- },
- "accountDetails": {
- "message": "Detay Kont"
- },
- "accountName": {
- "message": "Non Kont"
- },
- "accountSelectionRequired": {
- "message": "Ou bezwen chwazi yon kont!"
- },
- "activityLog": {
- "message": "aktivite ki fèt"
- },
- "address": {
- "message": "Adrès"
- },
- "addCustomToken": {
- "message": "Ajoute token"
- },
- "addToken": {
- "message": "Ajoute Token"
- },
- "addTokens": {
- "message": "Ajoute Token"
- },
- "addSuggestedTokens": {
- "message": "Ajoute Token Yo Sikjere W"
- },
- "addAcquiredTokens": {
- "message": "Ajoute tokens yo ou te achte lè l sèvi avèk MetaMask"
- },
- "amount": {
- "message": "Kantite lajan"
- },
- "amountPlusGas": {
- "message": "Kantite lajan + Gaz"
- },
- "appDescription": {
- "message": "Ethereum Ekstansyon Navigatè",
- "description": "The description of the application"
- },
- "appName": {
- "message": "MetaMask",
- "description": "The name of the application"
- },
- "approve": {
- "message": "Apwouve"
- },
- "approved": {
- "message": "Apwouve"
- },
- "attemptingConnect": {
- "message": "Eseye konekte nan blockchain."
- },
- "attributions": {
- "message": "Atribisyon"
- },
- "available": {
- "message": "Disponib"
- },
- "back": {
- "message": "Retounen"
- },
- "balance": {
- "message": "Balans"
- },
- "balances": {
- "message": "Balans Token"
- },
- "balanceIsInsufficientGas": {
- "message": "Ensifizan balans pou total gaz aktyèl la"
- },
- "beta": {
- "message": "BETA"
- },
- "betweenMinAndMax": {
- "message": "dwe plis pase oswa egal a $ 1 mwens ke oswa egal a $ 2.",
- "description": "helper for inputting hex as decimal input"
- },
- "blockiesIdenticon": {
- "message": "Itilize Blockies Identicon"
- },
- "borrowDharma": {
- "message": "Prete Avèk Dharma (Beta)"
- },
- "browserNotSupported": {
- "message": "Navigatè ou a pa sipòte..."
- },
- "builtInCalifornia": {
- "message": "MetaMask fèt e bati nan California."
- },
- "buy": {
- "message": "Achte"
- },
- "buyCoinbase": {
- "message": "Achte sou Coinbase"
- },
- "buyCoinbaseExplainer": {
- "message": "Coinbase se fason ki pi popilè nan mond lan yo achte ak vann Bitcoin, Ethereum, ak Litecoin."
- },
- "buyCoinSwitch": {
- "message": "Achte sou CoinSwitch"
- },
- "buyCoinSwitchExplainer": {
- "message": "CoinSwitch se destinasyon nan yon sèl-Stop nan echanj plis pase 300 kriptoksèr nan pousantaj la pi byen."
- },
- "bytes": {
- "message": "Bytes"
- },
- "ok": {
- "message": "Oke"
- },
- "cancel": {
- "message": "Anile"
- },
- "classicInterface": {
- "message": "Sèvi ak fas klasik la"
- },
- "clickCopy": {
- "message": "Klike sou kopi"
- },
- "close": {
- "message": "Fèmen"
- },
- "chromeRequiredForHardwareWallets": {
- "message": "Ou bezwen sèvi ak MetaMask sou Google Chrome yo nan lòd yo konekte sou Hardware Wallet."
- },
- "confirm": {
- "message": "Konfime"
- },
- "confirmed": {
- "message": "Konfime"
- },
- "confirmContract": {
- "message": "Konfime Kontra"
- },
- "confirmPassword": {
- "message": "Konfime Modpas"
- },
- "confirmTransaction": {
- "message": "Konfime Tranzaksyon"
- },
- "connectHardwareWallet": {
- "message": "Konekte Hardware Wallet"
- },
- "connect": {
- "message": "Konekte"
- },
- "connecting": {
- "message": "Koneksyon..."
- },
- "connectToLedger": {
- "message": "Konekte ak Ledger"
- },
- "connectToTrezor": {
- "message": "Konekte ak Trezor"
- },
- "continue": {
- "message": "Kontinye"
- },
- "continueToCoinbase": {
- "message": "Kontinye Coinbase"
- },
- "continueToCoinSwitch": {
- "message": "Kontinye CoinSwitch"
- },
- "contractDeployment": {
- "message": "Kontra Deplwaman"
- },
- "conversionProgress": {
- "message": "Konvèsyon nan Pwogrè"
- },
- "copiedButton": {
- "message": "Kopye"
- },
- "copiedClipboard": {
- "message": "Kopi nan Clipboard"
- },
- "copiedExclamation": {
- "message": "Kopye!"
- },
- "copiedSafe": {
- "message": "Mwen te kopye li yon kote ki san danje"
- },
- "copy": {
- "message": "Kopye"
- },
- "copyAddress": {
- "message": "Kopi adrès clipboard"
- },
- "copyToClipboard": {
- "message": "Kopi clipboard"
- },
- "copyButton": {
- "message": " Kopi "
- },
- "copyPrivateKey": {
- "message": "Sa a se kle prive ou (klike pou ou kopye)"
- },
- "create": {
- "message": "Kreye"
- },
- "createAccount": {
- "message": "Kreye Kont"
- },
- "createDen": {
- "message": "Kreye"
- },
- "crypto": {
- "message": "Crypto",
- "description": "Change tip (cryptocurrencies)"
- },
- "currentConversion": {
- "message": "Konvèsyon aktyèl"
- },
- "currentNetwork": {
- "message": "Rezo aktyèl"
- },
- "customGas": {
- "message": "Koutim Gaz"
- },
- "customToken": {
- "message": "Koutim Token"
- },
- "customize": {
- "message": "Koutim"
- },
- "customRPC": {
- "message": "Koutim RPC"
- },
- "decimalsMustZerotoTen": {
- "message": "Desimal yo dwe omwen 0, epi pa dwe plis pase 36."
- },
- "decimal": {
- "message": "Presizyon desimal la"
- },
- "defaultNetwork": {
- "message": "Dfo rezo a pou tranzaksyon Ether se Mainnet."
- },
- "denExplainer": {
- "message": "DEN ou se depo modpas avèk chif ou nan MetaMask."
- },
- "deposit": {
- "message": "Depo"
- },
- "depositBTC": {
- "message": "Depoze BTC ou nan adrès ki anba a:"
- },
- "depositCoin": {
- "message": "Depoze $1 ou nan adrès ki anba a",
- "description": "Tells the user what coin they have selected to deposit with shapeshift"
- },
- "depositEth": {
- "message": "Depo Eth"
- },
- "depositEther": {
- "message": "Depo Ether"
- },
- "depositFiat": {
- "message": "Depo ak Fiat"
- },
- "depositFromAccount": {
- "message": "Depo nan yon lòt kont"
- },
- "depositShapeShift": {
- "message": "Depo avèk ShapeShift"
- },
- "depositShapeShiftExplainer": {
- "message": "Si ou posede lòt cryptocurrencies, ou ka chanje ak depo Ether dirèkteman nan Wallet MetaMask ou. Pa gen kont ki nesesè."
- },
- "details": {
- "message": "Detay yo"
- },
- "directDeposit": {
- "message": "Depo Dirèk"
- },
- "directDepositEther": {
- "message": "Dirèkteman Depo Ether"
- },
- "directDepositEtherExplainer": {
- "message": "Si ou deja gen kèk Ether, fason ki pi rapid yo ka resevwa Ether nan nouvo Wallet ou pa depo dirèk."
- },
- "done": {
- "message": "Fini"
- },
- "downloadGoogleChrome": {
- "message": "Telechaje Google Chrome"
- },
- "downloadStateLogs": {
- "message": "Telechaje State Logs"
- },
- "dontHaveAHardwareWallet": {
- "message": "Pa gen yon materyèl bous?"
- },
- "dropped": {
- "message": "Tonbe"
- },
- "edit": {
- "message": "Korije"
- },
- "editAccountName": {
- "message": "Korije Non Kont"
- },
- "editingTransaction": {
- "message": "Fè chanjman nan tranzaksyon ou"
- },
- "emailUs": {
- "message": "Imèl nou!"
- },
- "encryptNewDen": {
- "message": "Ankripte nouvo DEN ou"
- },
- "ensNameNotFound": {
- "message": "Nou pa jwenn non ENS ou a"
- },
- "enterPassword": {
- "message": "Mete modpas"
- },
- "enterPasswordConfirm": {
- "message": "Antre nan modpas ou a konfime"
- },
- "enterPasswordContinue": {
- "message": "Mete modpas pou kontinye"
- },
- "parameters": {
- "message": "Paramèt"
- },
- "passwordNotLongEnough": {
- "message": "Modpas la pa ase"
- },
- "passwordsDontMatch": {
- "message": "Modpas Pa Koresponn ak"
- },
- "etherscanView": {
- "message": "Gade kont sou Etherscan"
- },
- "exchangeRate": {
- "message": "Chanje to"
- },
- "exportPrivateKey": {
- "message": "Voye Kòd Prive"
- },
- "exportPrivateKeyWarning": {
- "message": "Voye kle prive ak pwòp risk ou."
- },
- "failed": {
- "message": "Tonbe"
- },
- "fiat": {
- "message": "FIAT",
- "description": "Exchange type"
- },
- "fileImportFail": {
- "message": "Enpòte dosye ki pa travay? Klike la a!",
- "description": "Helps user import their account from a JSON file"
- },
- "followTwitter": {
- "message": "Swiv nou sou Twitter"
- },
- "forgetDevice": {
- "message": "Bliye aparèy sa a"
- },
- "from": {
- "message": "Soti nan"
- },
- "fromToSame": {
- "message": "Adrès orijinal le ak sa ou resevwa pake menm"
- },
- "fromShapeShift": {
- "message": "Soti nan ShapeShift"
- },
- "functionType": {
- "message": "Kalite Fonksyon"
- },
- "gas": {
- "message": "Gaz",
- "description": "Short indication of gas cost"
- },
- "gasFee": {
- "message": "Frè gaz"
- },
- "gasLimit": {
- "message": "Limit gaz"
- },
- "gasLimitCalculation": {
- "message": "Nou kalkile gaz limit sijere a ki baze sou pousantaj siksè rezo a."
- },
- "gasLimitRequired": {
- "message": "Limit gaz nesesè"
- },
- "gasLimitTooLow": {
- "message": "Limit gaz dwe omwen 21000"
- },
- "generatingSeed": {
- "message": "Génération Seed..."
- },
- "gasPrice": {
- "message": "Pri gaz (GWEI)"
- },
- "gasPriceCalculation": {
- "message": "Nou kalkile pri yo gaz ki sijere ki baze sou pousantaj siksè rezo."
- },
- "gasPriceRequired": {
- "message": "Pri Gaz la Egzije"
- },
- "generatingTransaction": {
- "message": "Tranzaksyon kap fè"
- },
- "getEther": {
- "message": "Jwenn Ether"
- },
- "getEtherFromFaucet": {
- "message": "Jwenn Ether nan yon tiyo pou $1 la",
- "description": "Displays network name for Ether faucet"
- },
- "getHelp": {
- "message": "Jwenn èd."
- },
- "greaterThanMin": {
- "message": "dwe pi gran pase oswa egal a $ 1.",
- "description": "helper for inputting hex as decimal input"
- },
- "hardware": {
- "message": "hardware"
- },
- "hardwareWalletConnected": {
- "message": "Hardware Wallet konekte"
- },
- "hardwareWallets": {
- "message": "Hardware Wallet konekte"
- },
- "hardwareWalletsMsg": {
- "message": "Chwazi yon Hardware Wallet ou ta renmen itilize ak MetaMask"
- },
- "havingTroubleConnecting": {
- "message": "Èske w gen pwoblèm pou konekte?"
- },
- "here": {
- "message": "isit la",
- "description": "as in -click here- for more information (goes with troubleTokenBalances)"
- },
- "hereList": {
- "message": "Isit la nan yon lis !!!!"
- },
- "hexData": {
- "message": "Hex Data"
- },
- "hide": {
- "message": "Kache"
- },
- "hideToken": {
- "message": "Kache Token"
- },
- "hideTokenPrompt": {
- "message": "Kache Token?"
- },
- "history": {
- "message": "Istwa"
- },
- "howToDeposit": {
- "message": "Ki jan ou ta renmen depo Ether?"
- },
- "holdEther": {
- "message": "Li pèmèt ou kenbe ether & tokens, epi sèvi kòm on pon pou desantralize aplikasyon."
- },
- "import": {
- "message": "Pòte",
- "description": "Button to import an account from a selected file"
- },
- "importAccount": {
- "message": "Pòte Kont"
- },
- "importAccountMsg": {
- "message": " Kont pòte pa pral asosye avèk orijinal ou te kreye nan kont MetaMask seed fraz. Aprann plis sou kont enpòte "
- },
- "importAnAccount": {
- "message": "Pòte yon kont"
- },
- "importDen": {
- "message": "Pòte ki deja egziste DEN"
- },
- "imported": {
- "message": "Pòte",
- "description": "status showing that an account has been fully loaded into the keyring"
- },
- "importUsingSeed": {
- "message": "Pòte lè sèvi avèk seed fraz"
- },
- "infoHelp": {
- "message": "Enfo & Èd"
- },
- "initialTransactionConfirmed": {
- "message": "Premye tranzaksyon ou konfime sou rezo a. Klike sou OK pou tounen."
- },
- "insufficientFunds": {
- "message": "Lajan ensifizan."
- },
- "insufficientTokens": {
- "message": "Tokens pa valab."
- },
- "invalidAddress": {
- "message": "Adrès pa valab"
- },
- "invalidAddressRecipient": {
- "message": "Moun ki resevwa adrès la pa valab"
- },
- "invalidGasParams": {
- "message": "Gaz Paramèt la pa valab"
- },
- "invalidInput": {
- "message": "Sa ou rantre a pa valab"
- },
- "invalidRequest": {
- "message": "Demann pa valab"
- },
- "invalidRPC": {
- "message": "RPC URI pa valab"
- },
- "invalidSeedPhrase": {
- "message": "Seed fraz pa valab"
- },
- "jsonFail": {
- "message": "Yon bagay ale mal. Tanpri, asire w ke dosye JSON ou an byen fòmate."
- },
- "jsonFile": {
- "message": "JSON Dosye",
- "description": "format for importing an account"
- },
- "keepTrackTokens": {
- "message": "Gade tokens yo ou te achte ak kont MetaMask ou."
- },
- "kovan": {
- "message": "Kovan Tès Rezo"
- },
- "knowledgeDataBase": {
- "message": "Vizite baz nou an"
- },
- "max": {
- "message": "Maksimòm"
- },
- "learnMore": {
- "message": "Aprann plis"
- },
- "ledgerAccountRestriction": {
- "message": "Ou bezwen sèvi ak dènye kont ou anvan ou ka ajoute yon nouvo."
- },
- "lessThanMax": {
- "message": "dwe mwens pase oswa egal a $ 1.",
- "description": "helper for inputting hex as decimal input"
- },
- "likeToAddTokens": {
- "message": "Èske ou ta renmen ajoute sa nan tokens?"
- },
- "links": {
- "message": "Lyen"
- },
- "limit": {
- "message": "Limitasyon"
- },
- "loading": {
- "message": "Telechaje..."
- },
- "loadingTokens": {
- "message": "Telechaje Tokens..."
- },
- "localhost": {
- "message": "Localhost 8545"
- },
- "login": {
- "message": "Ouvri"
- },
- "logout": {
- "message": "Dekonekte"
- },
- "loose": {
- "message": "Pèdi"
- },
- "loweCaseWords": {
- "message": "seed mo sèlman gen karaktè miniskil"
- },
- "mainnet": {
- "message": "Main Ethereum Network"
- },
- "menu": {
- "message": "Opsyon"
- },
- "message": {
- "message": "Mesaje"
- },
- "metamaskDescription": {
- "message": "MetaMask sekirize idantite pou Ethereum."
- },
- "metamaskSeedWords": {
- "message": "MetaMask Seed Mo"
- },
- "min": {
- "message": "Minimòm"
- },
- "myAccounts": {
- "message": "Kont mwen"
- },
- "mustSelectOne": {
- "message": "Ou dwe chwazi omwen 1 token."
- },
- "needEtherInWallet": {
- "message": "Pou kominike avèk aplikasyon desantralize ou dwe itilize MetaMask, ou pral bezwen Ether nan Wallet ou."
- },
- "needImportFile": {
- "message": "Ou dwe chwazi yon dosye pou enpòte.",
- "description": "User is important an account and needs to add a file to continue"
- },
- "needImportPassword": {
- "message": "Ou dwe antre nan yon modpas pou dosye ou te chwazi a.",
- "description": "Password and file needed to import an account"
- },
- "negativeETH": {
- "message": "Pa ka voye kantite lajan negatif ETH."
- },
- "networks": {
- "message": "Rezo"
- },
- "nevermind": {
- "message": "Pa pwoblèm"
- },
- "newAccount": {
- "message": "Nouvo Kont"
- },
- "newAccountNumberName": {
- "message": "Kont $1",
- "description": "Default name of next account to be created on create account screen"
- },
- "newContract": {
- "message": "Nouvo Kontra"
- },
- "newPassword": {
- "message": "Nouvo modpas (minit 8)"
- },
- "newRecipient": {
- "message": "Nouvo Benefisyè"
- },
- "newRPC": {
- "message": "Nouvo RPC URL"
- },
- "next": {
- "message": "Aprè sa"
- },
- "noAddressForName": {
- "message": "Pa gen adrès ki etabli pou non sa a."
- },
- "noDeposits": {
- "message": "Pa gen depo ou te resevwa"
- },
- "noConversionRateAvailable": {
- "message": "Pa gen okenn Konvèsyon Disponib"
- },
- "noTransactionHistory": {
- "message": "Pa gen istwa tranzaksyon."
- },
- "noTransactions": {
- "message": "Pa gen tranzaksyon"
- },
- "notFound": {
- "message": "Pa jwenn"
- },
- "notStarted": {
- "message": "Pa kòmanse"
- },
- "noWebcamFoundTitle": {
- "message": "Pa jwenn webcam"
- },
- "noWebcamFound": {
- "message": "Nou pakay jwenn webcam òdinatè ou. Tanpri eseye ankò."
- },
- "oldUI": {
- "message": "Ansyen Itilizatè kouòdone"
- },
- "oldUIMessage": {
- "message": "Ou te retounen nan Ansyen Itilizatè kouòdone. Ou ka chanje tounen nan nouvo Ansyen Itilizatè nan opsyon a nan meni an tèt la."
- },
- "openInTab": {
- "message": "Louvri nan etikèt"
- },
- "or": {
- "message": "oubyen",
- "description": "choice between creating or importing a new account"
- },
- "origin": {
- "message": "Orijin"
- },
- "password": {
- "message": "Modpas"
- },
- "passwordCorrect": {
- "message": "Tanpri asire ke modpas ou kòrèk."
- },
- "passwordMismatch": {
- "message": "modpas sa pa menm",
- "description": "in password creation process, the two new password fields did not match"
- },
- "passwordShort": {
- "message": "modpas pa sifi",
- "description": "in password creation process, the password is not long enough to be secure"
- },
- "pastePrivateKey": {
- "message": "Kole fraz prive ou a la:",
- "description": "For importing an account from a private key"
- },
- "pasteSeed": {
- "message": "Kole seed fraz ou a la!"
- },
- "pending": {
- "message": "l ap mache"
- },
- "personalAddressDetected": {
- "message": "Adrès pèsonèl detekte. Antre adrès kontra token la."
- },
- "pleaseReviewTransaction": {
- "message": "Tanpri revize tranzaksyon ou."
- },
- "popularTokens": {
- "message": "Popilè Tokens"
- },
- "prev": {
- "message": "Avan"
- },
- "privacyMsg": {
- "message": "Règleman sou enfòmasyon prive"
- },
- "privateKey": {
- "message": "Prive kle",
- "description": "select this type of file to use to import an account"
- },
- "privateKeyWarning": {
- "message": "Atansyon: pa janm divilge kle sa. Nenpòt moun kapab avèk kle prive ou a vòlè sa ou gen ou sou kont ou a."
- },
- "privateNetwork": {
- "message": "Rezo Prive"
- },
- "qrCode": {
- "message": "Montre QR Kòd"
- },
- "queue": {
- "message": "Queue"
- },
- "readdToken": {
- "message": "Ou ka ajoute token sa aprè sa ankò ou prale nan \"Ajoute token\" nan opsyon meni kont ou an."
- },
- "readMore": {
- "message": "Li plis isit la."
- },
- "readMore2": {
- "message": "Li plis isit la."
- },
- "receive": {
- "message": "Resevwa"
- },
- "recipientAddress": {
- "message": "Adrès pou resevwa"
- },
- "refundAddress": {
- "message": "Adrès pou resevwa"
- },
- "rejected": {
- "message": "Rejte"
- },
- "reset": {
- "message": "Repwograme"
- },
- "resetAccount": {
- "message": "Repwograme Kont"
- },
- "resetAccountDescription": {
- "message": "Repwograme kont a netwaye tranzaksyon ou yo."
- },
- "restoreFromSeed": {
- "message": "Restore kont?"
- },
- "restoreVault": {
- "message": "Retabli kazye"
- },
- "restoreAccountWithSeed": {
- "message": "Retabli kont ou avèk yo Seed Fraz"
- },
- "required": {
- "message": "Egzije"
- },
- "retryWithMoreGas": {
- "message": "Reseye ak yon pri gaz pi wo isit la"
- },
- "walletSeed": {
- "message": "Wallet Seed"
- },
- "restore": {
- "message": "Retabli"
- },
- "revealSeedWords": {
- "message": "Revele Seed Mo Yo"
- },
- "revealSeedWordsTitle": {
- "message": "Seed Fraz"
- },
- "revealSeedWordsDescription": {
- "message": "Si ou pa janm chanje navigatè ou deplase òdinatè, ou pral bezwen fraz seed la pou ka gen aksè a kont ou. Sere yo on kote an sekirite e an sekrè."
- },
- "revealSeedWordsWarningTitle": {
- "message": "PA pataje fraz sa a avèk nenpòt moun!"
- },
- "revealSeedWordsWarning": {
- "message": "Yo ka itilize mo sa pou vòlè kont ou."
- },
- "revert": {
- "message": "Retounen"
- },
- "remove": {
- "message": "retire"
- },
- "removeAccount": {
- "message": "Retire kont"
- },
- "removeAccountDescription": {
- "message": "Kont sa a pral retire nan Wallet ou. Tanpri, asire ou ke ou gen orijinal fraz seed la oubyen kle prive pou rantre kont lan avan ou kontinye. Oubyen ou ka rantre kont ou ankò apati kont \"drop-down\" ou an."
- },
- "readyToConnect": {
- "message": "Pare pou konekte?"
- },
- "rinkeby": {
- "message": "Rinkeby Tès Rezo"
- },
- "ropsten": {
- "message": "Ropsten Tès Rezo"
- },
- "rpc": {
- "message": "Koutim RPC"
- },
- "currentRpc": {
- "message": "Kounya RPC"
- },
- "connectingToMainnet": {
- "message": "Konekte ak Main (Prensipal) Ethereum Rezo a"
- },
- "connectingToRopsten": {
- "message": "Konekte ak Ropsten Tès Rezo a"
- },
- "connectingToKovan": {
- "message": "Konekte nan Kovan Tès Rezo a"
- },
- "connectingToRinkeby": {
- "message": "Konekte nan Rinkeby Tès Rezo a"
- },
- "connectingToUnknown": {
- "message": "Konekte nan rezo enkoni"
- },
- "sampleAccountName": {
- "message": "Pa egzanp, Nouvo kont mwen an",
- "description": "Help user understand concept of adding a human-readable name to their account"
- },
- "save": {
- "message": "Sove"
- },
- "speedUp": {
- "message": "pi vit"
- },
- "speedUpTitle": {
- "message": "Monte vitès tranzaksyon"
- },
- "speedUpSubtitle": {
- "message": "Ogmante pri gaz ou pou eseye efase tranzaksyon ou pi vit"
- },
- "saveAsCsvFile": {
- "message": "Sove kòm dosye CSV"
- },
- "saveAsFile": {
- "message": "Sove kòm dosye",
- "description": "Account export process"
- },
- "saveSeedAsFile": {
- "message": "Sove pawòl seed kòm dosye"
- },
- "search": {
- "message": "Rechèch"
- },
- "searchResults": {
- "message": "Rezilta rechèch"
- },
- "secretPhrase": {
- "message": "Antre fraz sekrè douz mo ou a pou w restore kòf ou a."
- },
- "showHexData": {
- "message": "Montre Hex Data"
- },
- "showHexDataDescription": {
- "message": "Pran sa pouw ka montre chan entèfas hex data a"
- },
- "newPassword8Chars": {
- "message": "Nouvo modpas (pou pi pit 8)"
- },
- "seedPhraseReq": {
- "message": "Seed fraz yo se 12 long mo"
- },
- "select": {
- "message": "Chwazi"
- },
- "selectCurrency": {
- "message": "Chwazi Lajan"
- },
- "selectService": {
- "message": "Chwazi Sèvis"
- },
- "selectType": {
- "message": "Chwazi Kalite"
- },
- "send": {
- "message": "Voye"
- },
- "sendETH": {
- "message": "Voye ETH"
- },
- "sendTokens": {
- "message": "Voye Tokens"
- },
- "sentEther": {
- "message": "Voye ether"
- },
- "sentTokens": {
- "message": "tokens deja voye"
- },
- "separateEachWord": {
- "message": "Separe chak mo ak yon sèl espas"
- },
- "onlySendToEtherAddress": {
- "message": "Sèlman voye ETH nan yon adrès Ethereum."
- },
- "onlySendTokensToAccountAddress": {
- "message": "Sèlman voye $ 1 nan yon adrès kont Ethereum.",
- "description": "displays token symbol"
- },
- "orderOneHere": {
- "message": "Mete nan lòd on Trezor oswa Ledger epi kenbe lajan ou nan yon stòk frèt."
- },
- "outgoing": {
- "message": "Ap kite"
- },
- "searchTokens": {
- "message": "Rechèch Tokens"
- },
- "selectAnAddress": {
- "message": "Chwazi yon adrès"
- },
- "selectAnAccount": {
- "message": "Chwazi yon kont"
- },
- "selectAnAccountHelp": {
- "message": "Chwazi kont pou wè nan MetaMask"
- },
- "selectHdPath": {
- "message": "Chwazi chemen HD"
- },
- "selectPathHelp": {
- "message": "Si ou pa wè kont Ledger ou te genyen an anba a, eseye chanje chemen an \"Eritaj (MEW / MyCrypto)\""
- },
- "sendTokensAnywhere": {
- "message": "Voye Tokens pou nenpòt moun ki gen yon kont Ethereum"
- },
- "settings": {
- "message": "Paramèt"
- },
- "step1HardwareWallet": {
- "message": "1. Konekte Materyèl bous"
- },
- "step1HardwareWalletMsg": {
- "message": "Konekte materyèl bous ou dirèkteman nan òdinatè ou."
- },
- "step2HardwareWallet": {
- "message": "2. Chwazi yon kont"
- },
- "step2HardwareWalletMsg": {
- "message": "Chwazi kont ou vle wè a. Ou ka chwazi youn sèlman nan yon moman."
- },
- "step3HardwareWallet": {
- "message": "3. Kòmanse itilize dApps ak plis ankò!"
- },
- "step3HardwareWalletMsg": {
- "message": "Sèvi ak kont materyèl ou menm jan ou t ap fè pou kont Etherum. Ouvri sesyon an nan dApps, voye Eth, achte ak stòke ERC20 tokens ak e ki pake chanje tokens tankou CryptoKitties."
- },
- "info": {
- "message": "Enfòmasyon"
- },
- "scanInstructions": {
- "message": "Mete kòd QR la devan kamera ou"
- },
- "scanQrCode": {
- "message": "Enspeksyon QR Kòd"
- },
- "shapeshiftBuy": {
- "message": "Achte avèk Shapeshift"
- },
- "showPrivateKeys": {
- "message": "Montre Kle Prive"
- },
- "showQRCode": {
- "message": "Montre Kòd QR"
- },
- "sign": {
- "message": "Siyen"
- },
- "signatureRequest": {
- "message": "Siyati Mande"
- },
- "signed": {
- "message": "Te Siyen"
- },
- "signMessage": {
- "message": "Siyen mesaj"
- },
- "signNotice": {
- "message": "Lè w siyen mesaj sa a ka gen efè segondè ki \ndanjere. Sèlman \nsit mesaj ki soti nan sit ou konplètman fè konfyans ak tout kont ou. \n Metòd danjere sa yo pral retire nan yon vèsyon fiti. "
- },
- "sigRequest": {
- "message": "Demann Siyati"
- },
- "sigRequested": {
- "message": "Demann Siyati"
- },
- "spaceBetween": {
- "message": "ka gen sèlman yon espas ant mo yo"
- },
- "status": {
- "message": "Kondisyon"
- },
- "stateLogs": {
- "message": "State Logs"
- },
- "stateLogsDescription": {
- "message": "State logs gen adrès kont piblik ou yo epi tranzaksyon ou te voye yo."
- },
- "stateLogError": {
- "message": "Erè nan retwouve State Logs yo."
- },
- "submit": {
- "message": "Soumèt"
- },
- "submitted": {
- "message": "Te Soumèt"
- },
- "supportCenter": {
- "message": "Vizite Sant Sipò Nou"
- },
- "symbolBetweenZeroTen": {
- "message": "Senbòl yo dwe ant 0 ak 10 karaktè."
- },
- "takesTooLong": {
- "message": "Pran twò lontan?"
- },
- "terms": {
- "message": "Tèm pou itilize"
- },
- "testFaucet": {
- "message": "Tès Tiyo"
- },
- "to": {
- "message": "Pou"
- },
- "toETHviaShapeShift": {
- "message": "$1 pou ETH pa ShapeShift",
- "description": "system will fill in deposit type in start of message"
- },
- "token": {
- "message": "Token"
- },
- "tokenAddress": {
- "message": "Adrès Token"
- },
- "tokenAlreadyAdded": {
- "message": "Ou te deja ajoute token."
- },
- "tokenBalance": {
- "message": "Balans Token ou se:"
- },
- "tokenSelection": {
- "message": "Chache Tokens oswa chwazi nan lis Tokens popilè nou an."
- },
- "tokenSymbol": {
- "message": "Token Senbòl"
- },
- "tokenWarning1": {
- "message": "Kenbe tras token yo ou te achte ak kont MetaMask ou. Si ou te achte tokens pandan wap itilize yon kont diferan tokens sa yo pa pral parèt la."
- },
- "total": {
- "message": "Total"
- },
- "transactions": {
- "message": "tranzaksyon yo"
- },
- "transactionConfirmed": {
- "message": "Tranzaksyon ou te konfime pou $2."
- },
- "transactionCreated": {
- "message": "Tranzaksyon ou te kreye avèk on valè de $1 pou $2."
- },
- "transactionDropped": {
- "message": "Tranzaksyon ou te tonbe a $2."
- },
- "transactionSubmitted": {
- "message": "Tranzaksyon ou te soumèt a $2."
- },
- "transactionUpdated": {
- "message": "Tranzaksyon ou te aktyalize a $2."
- },
- "transactionUpdatedGas": {
- "message": "Tranzaksyon ou te aktyalize avèk on pri gaz de $1 a $2."
- },
- "transactionError": {
- "message": "Erè tranzaksyon. Eksepsyon jete nan kòd kontra."
- },
- "transactionMemo": {
- "message": "Memo tranzaksyon (opsyonèl)"
- },
- "transactionNumber": {
- "message": "Nimewo Tranzaksyon"
- },
- "transfer": {
- "message": "Transfè"
- },
- "transfers": {
- "message": "Transfè yo"
- },
- "trezorHardwareWallet": {
- "message": "TREZOR Materyèl Bous"
- },
- "troubleTokenBalances": {
- "message": "Nou te gen pwoblèm chaje balans token ou. Ou ka wè yo ",
- "description": "Followed by a link (here) to view token balances"
- },
- "tryAgain": {
- "message": "Eseye anko"
- },
- "twelveWords": {
- "message": "12 mo sa yo se sèl fason pou retabli kont MetaMask ou yo. \nKenbe yo yon kote ki an sekirite ak sekrè."
- },
- "typePassword": {
- "message": "Tape modpas ou"
- },
- "uiWelcome": {
- "message": "Byenveni nan New itilizatè koòdone (Beta)"
- },
- "uiWelcomeMessage": {
- "message": "Kounya w ap itilize nouvo MetaMask UI (itilizatè koòdone) a."
- },
- "unapproved": {
- "message": "Pa apwouve"
- },
- "unavailable": {
- "message": "Pa disponib"
- },
- "units": {
- "message": "inite yo"
- },
- "unknown": {
- "message": "Enkoni"
- },
- "unknownFunction": {
- "message": "Fonksyon enkoni"
- },
- "unknownNetwork": {
- "message": "Rezo Prive Enkoni"
- },
- "unknownNetworkId": {
- "message": "Rezo ID Enkoni"
- },
- "unknownQrCode": {
- "message": "Erè: Nou pa t kapab idantifye QR kòd sa"
- },
- "unknownCameraErrorTitle": {
- "message": "Ooops! Yon bagay te ale mal...."
- },
- "unknownCameraError": {
- "message": "Te gen yon erè pandan y ap eseye jwenn aksè nan kamera ou. Tanpri eseye ankò..."
- },
- "unlock": {
- "message": "Debloke"
- },
- "unlockMessage": {
- "message": "Entènèt desantralize a ap tann"
- },
- "uriErrorMsg": {
- "message": "URIs mande pou apwopriye prefiks HTTP / HTTPS a."
- },
- "usaOnly": {
- "message": "USA sèlman",
- "description": "Using this exchange is limited to people inside the USA"
- },
- "usedByClients": {
- "message": "Itilize pa yon varyete de kliyan diferan"
- },
- "useOldUI": {
- "message": "Itilizasyon ansyen UI (itilizatè koòdone)"
- },
- "validFileImport": {
- "message": "Ou dwe chwazi yon dosye ki valab pou enpòte."
- },
- "vaultCreated": {
- "message": "Kòf Kreye"
- },
- "viewAccount": {
- "message": "Wè Kont"
- },
- "viewOnEtherscan": {
- "message": "Wè sou Etherscan"
- },
- "visitWebSite": {
- "message": "Vizite sit entènèt nou an"
- },
- "warning": {
- "message": "Avètisman"
- },
- "welcomeBack": {
- "message": "Bon retou!"
- },
- "welcomeBeta": {
- "message": "Byenveni nan MetaMask Beta"
- },
- "whatsThis": {
- "message": "Kisa sa ye?"
- },
- "youNeedToAllowCameraAccess": {
- "message": "Ou bezwen bay kamera aksè pou sèvi ak fonksyon sa."
- },
- "yourSigRequested": {
- "message": "Yo mande siyati ou"
- },
- "youSign": {
- "message": "Ou ap siyen kounya"
- },
- "yourPrivateSeedPhrase": {
- "message": "Seed fraz prive ou a"
- }
+ "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"
+ },
+ "accessingYourCamera": {
+ "message": "Aksè a Kamera"
+ },
+ "account": {
+ "message": "Kont"
+ },
+ "accountDetails": {
+ "message": "Detay Kont"
+ },
+ "accountName": {
+ "message": "Non Kont"
+ },
+ "accountOptions": {
+ "message": "Opsyon kont"
+ },
+ "accountSelectionRequired": {
+ "message": "Ou bezwen chwazi yon kont!"
+ },
+ "activityLog": {
+ "message": "aktivite ki fèt"
+ },
+ "address": {
+ "message": "Adrès"
+ },
+ "addCustomToken": {
+ "message": "Ajoute token"
+ },
+ "addToken": {
+ "message": "Ajoute Token"
+ },
+ "addTokens": {
+ "message": "Ajoute Token"
+ },
+ "addSuggestedTokens": {
+ "message": "Ajoute Token Yo Sikjere W"
+ },
+ "addAcquiredTokens": {
+ "message": "Ajoute tokens yo ou te achte lè l sèvi avèk MetaMask"
+ },
+ "amount": {
+ "message": "Kantite lajan"
+ },
+ "amountPlusGas": {
+ "message": "Kantite lajan + Gaz"
+ },
+ "appDescription": {
+ "message": "Ekstansyon Navigatè Ethereum",
+ "description": "The description of the application"
+ },
+ "appName": {
+ "message": "MetaMask",
+ "description": "The name of the application"
+ },
+ "approve": {
+ "message": "Apwouve"
+ },
+ "approved": {
+ "message": "Apwouve"
+ },
+ "attemptingConnect": {
+ "message": "Eseye konekte nan blockchain."
+ },
+ "attemptToCancel": {
+ "message": "Eseye anile?"
+ },
+ "attemptToCancelDescription": {
+ "message": "Soumèt tantativ sa a pa garanti ke yo pral anile tranzaksyon ou anile. Si tantativ anile an gen siksè, ou pral chaje frè yo tranzaksyon pi wo a."
+ },
+ "attributions": {
+ "message": "Atribisyon"
+ },
+ "available": {
+ "message": "Disponib"
+ },
+ "back": {
+ "message": "Retounen"
+ },
+ "balance": {
+ "message": "Balans"
+ },
+ "balances": {
+ "message": "Balans Token"
+ },
+ "balanceIsInsufficientGas": {
+ "message": "Ensifizan balans pou total gaz aktyèl la"
+ },
+ "beta": {
+ "message": "BETA"
+ },
+ "betweenMinAndMax": {
+ "message": "dwe plis pase oswa egal a $ 1 mwens ke oswa egal a $ 2.",
+ "description": "helper for inputting hex as decimal input"
+ },
+ "blockiesIdenticon": {
+ "message": "Itilize Blockies Identicon"
+ },
+ "borrowDharma": {
+ "message": "Prete Avèk Dharma (Beta)"
+ },
+ "browserNotSupported": {
+ "message": "Navigatè ou a pa sipòte..."
+ },
+ "builtInCalifornia": {
+ "message": "MetaMask fèt e bati nan California."
+ },
+ "buy": {
+ "message": "Achte"
+ },
+ "buyCoinbase": {
+ "message": "Achte sou Coinbase"
+ },
+ "buyCoinbaseExplainer": {
+ "message": "Coinbase se fason ki pi popilè nan mond lan yo achte ak vann Bitcoin, Ethereum, ak Litecoin."
+ },
+ "buyCoinSwitch": {
+ "message": "Achte sou CoinSwitch"
+ },
+ "buyCoinSwitchExplainer": {
+ "message": "CoinSwitch se destinasyon nan yon sèl-Stop nan echanj plis pase 300 kriptoksèr nan pousantaj la pi byen."
+ },
+ "bytes": {
+ "message": "Bytes"
+ },
+ "ok": {
+ "message": "Oke"
+ },
+ "cancel": {
+ "message": "Anile"
+ },
+ "cancelAttempt": {
+ "message": "Teste Anile"
+ },
+ "cancellationGasFee": {
+ "message": "Anilasyon Gaz Chaj"
+ },
+ "cancelN": {
+ "message": "Anile tout $ 1 tranzaksyon"
+ },
+ "classicInterface": {
+ "message": "Sèvi ak fas klasik la"
+ },
+ "clickCopy": {
+ "message": "Klike sou kopi"
+ },
+ "clickToAdd": {
+ "message": "Klike sou $ 1 pou ajoute yo nan kont ou"
+ },
+ "close": {
+ "message": "Fèmen"
+ },
+ "chromeRequiredForHardwareWallets": {
+ "message": "Ou bezwen sèvi ak MetaMask sou Google Chrome yo nan lòd yo konekte sou Hardware Wallet."
+ },
+ "confirm": {
+ "message": "Konfime"
+ },
+ "confirmed": {
+ "message": "Konfime"
+ },
+ "confirmContract": {
+ "message": "Konfime Kontra"
+ },
+ "confirmPassword": {
+ "message": "Konfime Modpas"
+ },
+ "confirmTransaction": {
+ "message": "Konfime Tranzaksyon"
+ },
+ "connectHardwareWallet": {
+ "message": "Konekte Materyèl Wallet"
+ },
+ "connect": {
+ "message": "Konekte"
+ },
+ "connecting": {
+ "message": "Koneksyon..."
+ },
+ "connectingToKovan": {
+ "message": "Konekte nan Kovan Tès Rezo a"
+ },
+ "connectingToMainnet": {
+ "message": "Konekte ak Prensipal Ethereum Rezo a"
+ },
+ "connectingToRopsten": {
+ "message": "Konekte ak Ropsten Tès Rezo a"
+ },
+ "connectingToRinkeby": {
+ "message": "Konekte nan Rinkeby Tès Rezo a"
+ },
+ "connectingToUnknown": {
+ "message": "Konekte nan rezo enkoni"
+ },
+ "connectToLedger": {
+ "message": "Konekte ak Ledger"
+ },
+ "connectToTrezor": {
+ "message": "Konekte ak Trezor"
+ },
+ "continue": {
+ "message": "Kontinye"
+ },
+ "continueToCoinbase": {
+ "message": "Kontinye Coinbase"
+ },
+ "continueToCoinSwitch": {
+ "message": "Kontinye CoinSwitch"
+ },
+ "contractDeployment": {
+ "message": "Kontra Deplwaman"
+ },
+ "conversionProgress": {
+ "message": "Konvèsyon nan Pwogrè"
+ },
+ "copiedButton": {
+ "message": "Kopye"
+ },
+ "copiedClipboard": {
+ "message": "Kopi nan Clipboard"
+ },
+ "copiedExclamation": {
+ "message": "Kopye!"
+ },
+ "copiedSafe": {
+ "message": "Mwen te kopye li yon kote ki san danje"
+ },
+ "copy": {
+ "message": "Kopye"
+ },
+ "copyAddress": {
+ "message": "Kopi adrès clipboard"
+ },
+ "copyToClipboard": {
+ "message": "Kopi clipboard"
+ },
+ "copyButton": {
+ "message": " Kopi "
+ },
+ "copyPrivateKey": {
+ "message": "Sa a se kle prive ou (klike pou ou kopye)"
+ },
+ "create": {
+ "message": "Kreye"
+ },
+ "createAccount": {
+ "message": "Kreye Kont"
+ },
+ "createDen": {
+ "message": "Kreye"
+ },
+ "crypto": {
+ "message": "Crypto",
+ "description": "Exchange type (cryptocurrencies)"
+ },
+ "currentConversion": {
+ "message": "Konvèsyon aktyèl"
+ },
+ "currentLanguage": {
+ "message": "Lang Aktyèl"
+ },
+ "currentNetwork": {
+ "message": "Rezo aktyèl"
+ },
+ "currentRpc": {
+ "message": "Aktyèl RPC"
+ },
+ "customGas": {
+ "message": "Koutim Gaz"
+ },
+ "customToken": {
+ "message": "Koutim Token"
+ },
+ "customize": {
+ "message": "Koutim"
+ },
+ "customRPC": {
+ "message": "Koutim RPC"
+ },
+ "decimalsMustZerotoTen": {
+ "message": "Desimal yo dwe omwen 0, epi pa dwe plis pase 36."
+ },
+ "decimal": {
+ "message": "Presizyon desimal la"
+ },
+ "defaultNetwork": {
+ "message": "Dfo rezo a pou tranzaksyon Ether se Mainnet."
+ },
+ "denExplainer": {
+ "message": "DEN ou se depo modpas avèk chif ou nan MetaMask."
+ },
+ "deposit": {
+ "message": "Depo"
+ },
+ "depositBTC": {
+ "message": "Depoze BTC ou nan adrès ki anba a:"
+ },
+ "depositCoin": {
+ "message": "Depoze $1 ou nan adrès ki anba a",
+ "description": "Tells the user what coin they have selected to deposit with shapeshift"
+ },
+ "depositEth": {
+ "message": "Depo Eth"
+ },
+ "depositEther": {
+ "message": "Depo Ether"
+ },
+ "depositFiat": {
+ "message": "Depo ak Fiat"
+ },
+ "depositFromAccount": {
+ "message": "Depo nan yon lòt kont"
+ },
+ "depositShapeShift": {
+ "message": "Depo avèk ShapeShift"
+ },
+ "depositShapeShiftExplainer": {
+ "message": "Si ou posede lòt cryptocurrencies, ou ka chanje ak depo Ether dirèkteman nan Wallet MetaMask ou. Pa gen kont ki nesesè."
+ },
+ "details": {
+ "message": "Detay yo"
+ },
+ "directDeposit": {
+ "message": "Depo Dirèk"
+ },
+ "directDepositEther": {
+ "message": "Dirèkteman Depo Ether"
+ },
+ "directDepositEtherExplainer": {
+ "message": "Si ou deja gen kèk Ether, fason ki pi rapid yo ka resevwa Ether nan nouvo Wallet ou pa depo dirèk."
+ },
+ "done": {
+ "message": "Fini"
+ },
+ "downloadGoogleChrome": {
+ "message": "Telechaje Google Chrome"
+ },
+ "downloadStateLogs": {
+ "message": "Telechaje State Logs"
+ },
+ "dontHaveAHardwareWallet": {
+ "message": "Pa gen yon materyèl bous?"
+ },
+ "dropped": {
+ "message": "Tonbe"
+ },
+ "edit": {
+ "message": "Korije"
+ },
+ "editAccountName": {
+ "message": "Korije Non Kont"
+ },
+ "editingTransaction": {
+ "message": "Fè chanjman nan tranzaksyon ou"
+ },
+ "emailUs": {
+ "message": "Imèl nou!"
+ },
+ "encryptNewDen": {
+ "message": "Ankripte nouvo DEN ou"
+ },
+ "ensNameNotFound": {
+ "message": "Nou pa jwenn non ENS ou a"
+ },
+ "enterPassword": {
+ "message": "Mete modpas"
+ },
+ "enterPasswordConfirm": {
+ "message": "Antre nan modpas ou a konfime"
+ },
+ "enterPasswordContinue": {
+ "message": "Mete modpas pou kontinye"
+ },
+ "eth": {
+ "message": "ETH"
+ },
+ "etherscanView": {
+ "message": "Gade kont sou Etherscan"
+ },
+ "exchangeRate": {
+ "message": "Chanje to"
+ },
+ "expandView": {
+ "message": "Elaji Wè"
+ },
+ "exportPrivateKey": {
+ "message": "Voye Kòd Prive"
+ },
+ "exportPrivateKeyWarning": {
+ "message": "Voye kle prive ak pwòp risk ou."
+ },
+ "failed": {
+ "message": "Tonbe"
+ },
+ "fiat": {
+ "message": "FIAT",
+ "description": "Exchange type"
+ },
+ "fileImportFail": {
+ "message": "Enpòte dosye ki pa travay? Klike la a!",
+ "description": "Helps user import their account from a JSON file"
+ },
+ "followTwitter": {
+ "message": "Swiv nou sou Twitter"
+ },
+ "forgetDevice": {
+ "message": "Bliye aparèy sa a"
+ },
+ "from": {
+ "message": "Soti nan"
+ },
+ "fromToSame": {
+ "message": "Adrès orijinal le ak sa ou resevwa pake menm"
+ },
+ "fromShapeShift": {
+ "message": "Soti nan ShapeShift"
+ },
+ "functionType": {
+ "message": "Kalite Fonksyon"
+ },
+ "gas": {
+ "message": "Gaz",
+ "description": "Short indication of gas cost"
+ },
+ "gasFee": {
+ "message": "Frè gaz"
+ },
+ "gasLimit": {
+ "message": "Limit gaz"
+ },
+ "gasLimitCalculation": {
+ "message": "Nou kalkile gaz limit sijere a ki baze sou pousantaj siksè rezo a."
+ },
+ "gasLimitRequired": {
+ "message": "Limit gaz nesesè"
+ },
+ "gasLimitTooLow": {
+ "message": "Limit gaz dwe omwen 21000"
+ },
+ "gasUsed": {
+ "message": "Gaz yo Itilize"
+ },
+ "generatingSeed": {
+ "message": "Grenn jenerasyon..."
+ },
+ "gasPrice": {
+ "message": "Pri gaz (GWEI)"
+ },
+ "gasPriceCalculation": {
+ "message": "Nou kalkile pri yo gaz ki sijere ki baze sou pousantaj siksè rezo."
+ },
+ "gasPriceRequired": {
+ "message": "Pri Gaz la Egzije"
+ },
+ "generatingTransaction": {
+ "message": "Tranzaksyon kap fè"
+ },
+ "getEther": {
+ "message": "Jwenn Ether"
+ },
+ "getEtherFromFaucet": {
+ "message": "Jwenn Ether nan yon tiyo pou $1 la",
+ "description": "Displays network name for Ether faucet"
+ },
+ "getHelp": {
+ "message": "Jwenn èd."
+ },
+ "greaterThanMin": {
+ "message": "dwe pi gran pase oswa egal a $ 1.",
+ "description": "helper for inputting hex as decimal input"
+ },
+ "hardware": {
+ "message": "materyèl"
+ },
+ "hardwareWalletConnected": {
+ "message": "Materyèl Wallet konekte"
+ },
+ "hardwareWallets": {
+ "message": "Materyèl Wallet konekte"
+ },
+ "hardwareWalletsMsg": {
+ "message": "Chwazi yon Materyèl Wallet ou ta renmen itilize ak MetaMask"
+ },
+ "havingTroubleConnecting": {
+ "message": "Èske w gen pwoblèm pou konekte?"
+ },
+ "here": {
+ "message": "isit la",
+ "description": "as in -click here- for more information (goes with troubleTokenBalances)"
+ },
+ "hereList": {
+ "message": "Isit la nan yon lis !!!!"
+ },
+ "hexData": {
+ "message": "Hex Data"
+ },
+ "hide": {
+ "message": "Kache"
+ },
+ "hideToken": {
+ "message": "Kache Token"
+ },
+ "hideTokenPrompt": {
+ "message": "Kache Token?"
+ },
+ "history": {
+ "message": "Istwa"
+ },
+ "howToDeposit": {
+ "message": "Ki jan ou ta renmen depo Ether?"
+ },
+ "holdEther": {
+ "message": "Li pèmèt ou kenbe ether & tokens, epi sèvi kòm on pon pou desantralize aplikasyon."
+ },
+ "import": {
+ "message": "Pòte",
+ "description": "Button to import an account from a selected file"
+ },
+ "importAccount": {
+ "message": "Pòte Kont"
+ },
+ "importAccountMsg": {
+ "message": " Kont pòte pa pral asosye avèk orijinal ou te kreye nan kont MetaMask seed fraz. Aprann plis sou kont enpòte "
+ },
+ "importAnAccount": {
+ "message": "Pòte yon kont"
+ },
+ "importDen": {
+ "message": "Pòte ki deja egziste DEN"
+ },
+ "imported": {
+ "message": "Pòte",
+ "description": "status showing that an account has been fully loaded into the keyring"
+ },
+ "importUsingSeed": {
+ "message": "Pòte lè sèvi avèk seed fraz"
+ },
+ "info": {
+ "message": "Enfo"
+ },
+ "infoHelp": {
+ "message": "Enfo & Èd"
+ },
+ "initialTransactionConfirmed": {
+ "message": "Premye tranzaksyon ou konfime sou rezo a. Klike sou OK pou tounen."
+ },
+ "insufficientFunds": {
+ "message": "Lajan ensifizan."
+ },
+ "insufficientTokens": {
+ "message": "Tokens pa valab."
+ },
+ "invalidAddress": {
+ "message": "Adrès pa valab"
+ },
+ "invalidAddressRecipient": {
+ "message": "Moun ki resevwa adrès la pa valab"
+ },
+ "invalidGasParams": {
+ "message": "Gaz Paramèt la pa valab"
+ },
+ "invalidInput": {
+ "message": "Sa ou rantre a pa valab"
+ },
+ "invalidRequest": {
+ "message": "Demann pa valab"
+ },
+ "invalidRPC": {
+ "message": "RPC URI pa valab"
+ },
+ "invalidSeedPhrase": {
+ "message": "Seed fraz pa valab"
+ },
+ "jsonFail": {
+ "message": "Yon bagay ale mal. Tanpri, asire w ke dosye JSON ou an byen fòmate."
+ },
+ "jsonFile": {
+ "message": "JSON Dosye",
+ "description": "format for importing an account"
+ },
+ "keepTrackTokens": {
+ "message": "Gade tokens yo ou te achte ak kont MetaMask ou."
+ },
+ "kovan": {
+ "message": "Kovan Tès Rezo"
+ },
+ "knowledgeDataBase": {
+ "message": "Vizite baz nou an"
+ },
+ "max": {
+ "message": "Maksimòm"
+ },
+ "learnMore": {
+ "message": "Aprann plis"
+ },
+ "ledgerAccountRestriction": {
+ "message": "Ou bezwen sèvi ak dènye kont ou anvan ou ka ajoute yon nouvo."
+ },
+ "lessThanMax": {
+ "message": "dwe mwens pase oswa egal a $ 1.",
+ "description": "helper for inputting hex as decimal input"
+ },
+ "likeToAddTokens": {
+ "message": "Èske ou ta renmen ajoute sa nan tokens?"
+ },
+ "links": {
+ "message": "Lyen"
+ },
+ "limit": {
+ "message": "Limitasyon"
+ },
+ "loading": {
+ "message": "Telechaje..."
+ },
+ "loadingTokens": {
+ "message": "Telechaje Tokens..."
+ },
+ "localhost": {
+ "message": "Localhost 8545"
+ },
+ "login": {
+ "message": "Ouvri"
+ },
+ "logout": {
+ "message": "Dekonekte"
+ },
+ "loose": {
+ "message": "Pèdi"
+ },
+ "loweCaseWords": {
+ "message": "seed mo sèlman gen karaktè miniskil"
+ },
+ "mainnet": {
+ "message": "Prensipal Ethereum Rezo a"
+ },
+ "menu": {
+ "message": "Opsyon"
+ },
+ "message": {
+ "message": "Mesaje"
+ },
+ "metamaskDescription": {
+ "message": "MetaMask sekirize idantite pou Ethereum."
+ },
+ "metamaskSeedWords": {
+ "message": "MetaMask Seed Mo"
+ },
+ "metamaskVersion": {
+ "message": "MetaMask Vèsyon"
+ },
+ "min": {
+ "message": "Minimòm"
+ },
+ "missingYourTokens": {
+ "message": "Ou pa wè token ou a?"
+ },
+ "myAccounts": {
+ "message": "Kont mwen"
+ },
+ "mustSelectOne": {
+ "message": "Ou dwe chwazi omwen 1 token."
+ },
+ "needEtherInWallet": {
+ "message": "Pou kominike avèk aplikasyon desantralize ou dwe itilize MetaMask, ou pral bezwen Ether nan Wallet ou."
+ },
+ "needImportFile": {
+ "message": "Ou dwe chwazi yon dosye pou enpòte.",
+ "description": "User is important an account and needs to add a file to continue"
+ },
+ "needImportPassword": {
+ "message": "Ou dwe antre nan yon modpas pou dosye ou te chwazi a.",
+ "description": "Password and file needed to import an account"
+ },
+ "negativeETH": {
+ "message": "Pa ka voye kantite lajan negatif ETH."
+ },
+ "networks": {
+ "message": "Rezo"
+ },
+ "nevermind": {
+ "message": "Pa pwoblèm"
+ },
+ "newAccount": {
+ "message": "Nouvo Kont"
+ },
+ "newAccountNumberName": {
+ "message": "Kont $1",
+ "description": "Default name of next account to be created on create account screen"
+ },
+ "newContract": {
+ "message": "Nouvo Kontra"
+ },
+ "newPassword": {
+ "message": "Nouvo modpas (minit 8)"
+ },
+ "newPassword8Chars": {
+ "message": "Nouvo modpas (minit 8)"
+ },
+ "newRecipient": {
+ "message": "Nouvo Benefisyè"
+ },
+ "newRPC": {
+ "message": "Nouvo RPC URL"
+ },
+ "next": {
+ "message": "Aprè sa"
+ },
+ "noAddressForName": {
+ "message": "Pa gen adrès ki etabli pou non sa a."
+ },
+ "noDeposits": {
+ "message": "Pa gen depo ou te resevwa"
+ },
+ "noConversionRateAvailable": {
+ "message": "Pa gen okenn Konvèsyon Disponib"
+ },
+ "noTransactionHistory": {
+ "message": "Pa gen istwa tranzaksyon."
+ },
+ "noTransactions": {
+ "message": "Pa gen tranzaksyon"
+ },
+ "notFound": {
+ "message": "Pa jwenn"
+ },
+ "notStarted": {
+ "message": "Pa kòmanse"
+ },
+ "noWebcamFoundTitle": {
+ "message": "Pa jwenn webcam"
+ },
+ "noWebcamFound": {
+ "message": "Nou pakay jwenn webcam òdinatè ou. Tanpri eseye ankò."
+ },
+ "oldUI": {
+ "message": "Ansyen Itilizatè kouòdone"
+ },
+ "oldUIMessage": {
+ "message": "Ou te retounen nan Ansyen Itilizatè kouòdone. Ou ka chanje tounen nan nouvo Ansyen Itilizatè nan opsyon a nan meni an tèt la."
+ },
+ "onlySendToEtherAddress": {
+ "message": "Sèlman voye ETH nan yon adrès Ethereum."
+ },
+ "onlySendTokensToAccountAddress": {
+ "message": "Sèlman voye $ 1 nan yon adrès kont Ethereum.",
+ "description": "displays token symbol"
+ },
+ "openInTab": {
+ "message": "Louvri nan etikèt"
+ },
+ "or": {
+ "message": "oubyen",
+ "description": "choice between creating or importing a new account"
+ },
+ "orderOneHere": {
+ "message": "Mete nan lòd on Trezor oswa Ledger epi kenbe lajan ou nan yon stòk frèt."
+ },
+ "origin": {
+ "message": "Orijin"
+ },
+ "outgoing": {
+ "message": "Ap kite"
+ },
+ "parameters": {
+ "message": "Paramèt"
+ },
+ "password": {
+ "message": "Modpas"
+ },
+ "passwordCorrect": {
+ "message": "Tanpri asire ke modpas ou kòrèk."
+ },
+ "passwordsDontMatch": {
+ "message": "Modpas pa matche"
+ },
+ "passwordMismatch": {
+ "message": "modpas sa pa menm",
+ "description": "in password creation process, the two new password fields did not match"
+ },
+ "passwordNotLongEnough": {
+ "message": "Modpas pa lontan ase"
+ },
+ "passwordShort": {
+ "message": "modpas pa sifi",
+ "description": "in password creation process, the password is not long enough to be secure"
+ },
+ "pastePrivateKey": {
+ "message": "Kole fraz prive ou a la:",
+ "description": "For importing an account from a private key"
+ },
+ "pasteSeed": {
+ "message": "Kole seed fraz ou a la!"
+ },
+ "pending": {
+ "message": "l ap mache"
+ },
+ "personalAddressDetected": {
+ "message": "Adrès pèsonèl detekte. Antre adrès kontra token la."
+ },
+ "pleaseReviewTransaction": {
+ "message": "Tanpri revize tranzaksyon ou."
+ },
+ "popularTokens": {
+ "message": "Popilè Tokens"
+ },
+ "prev": {
+ "message": "Avan"
+ },
+ "primaryCurrencySetting": {
+ "message": "Lajan ou itilize pi plis la"
+ },
+ "primaryCurrencySettingDescription": {
+ "message": "Chwazi ETH pou bay priyorite montre valè nan ETH. Chwazi Fiat priyorite montre valè nan lajan ou chwazi a."
+ },
+ "privacyMsg": {
+ "message": "Règleman sou enfòmasyon prive"
+ },
+ "privateKey": {
+ "message": "Prive kle",
+ "description": "select this type of file to use to import an account"
+ },
+ "privateKeyWarning": {
+ "message": "Atansyon: pa janm divilge kle sa. Nenpòt moun kapab avèk kle prive ou a vòlè sa ou gen ou sou kont ou a."
+ },
+ "privateNetwork": {
+ "message": "Rezo Prive"
+ },
+ "qrCode": {
+ "message": "Montre QR Kòd"
+ },
+ "queue": {
+ "message": "Queue"
+ },
+ "readdToken": {
+ "message": "Ou ka ajoute token sa aprè sa ankò ou prale nan \"Ajoute token\" nan opsyon meni kont ou an."
+ },
+ "readMore": {
+ "message": "Li plis isit la."
+ },
+ "readMore2": {
+ "message": "Li plis isit la."
+ },
+ "receive": {
+ "message": "Resevwa"
+ },
+ "recipientAddress": {
+ "message": "Adrès pou resevwa"
+ },
+ "refundAddress": {
+ "message": "Adrès pou resevwa"
+ },
+ "reject": {
+ "message": "Rejte"
+ },
+ "rejectAll": {
+ "message": "Rejte Tout"
+ },
+ "rejectTxsN": {
+ "message": "Rejete $ 1 tranzaksyon"
+ },
+ "rejectTxsDescription": {
+ "message": "Ou se sou rejte $ 1 yon anpil nan tranzaksyon yo."
+ },
+ "rejected": {
+ "message": "Rejete"
+ },
+ "reset": {
+ "message": "Repwograme"
+ },
+ "resetAccount": {
+ "message": "Repwograme Kont"
+ },
+ "resetAccountDescription": {
+ "message": "Repwograme kont a netwaye tranzaksyon ou yo."
+ },
+ "restoreFromSeed": {
+ "message": "Restore kont?"
+ },
+ "restoreVault": {
+ "message": "Retabli kazye"
+ },
+ "restoreAccountWithSeed": {
+ "message": "Retabli kont ou avèk yo Seed Fraz"
+ },
+ "required": {
+ "message": "Egzije"
+ },
+ "retryWithMoreGas": {
+ "message": "Reseye ak yon pri gaz pi wo isit la"
+ },
+ "restore": {
+ "message": "Retabli"
+ },
+ "revealSeedWords": {
+ "message": "Revele Seed Mo Yo"
+ },
+ "revealSeedWordsTitle": {
+ "message": "Seed Fraz"
+ },
+ "revealSeedWordsDescription": {
+ "message": "Si ou pa janm chanje navigatè ou deplase òdinatè, ou pral bezwen fraz seed la pou ka gen aksè a kont ou. Sere yo on kote an sekirite e an sekrè."
+ },
+ "revealSeedWordsWarningTitle": {
+ "message": "PA pataje fraz sa a avèk nenpòt moun!"
+ },
+ "revealSeedWordsWarning": {
+ "message": "Yo ka itilize mo sa pou vòlè kont ou."
+ },
+ "revert": {
+ "message": "Retounen"
+ },
+ "remove": {
+ "message": "retire"
+ },
+ "removeAccount": {
+ "message": "Retire kont"
+ },
+ "removeAccountDescription": {
+ "message": "Kont sa a pral retire nan Wallet ou. Tanpri, asire ou ke ou gen orijinal fraz seed la oubyen kle prive pou rantre kont lan avan ou kontinye. Oubyen ou ka rantre kont ou ankò apati kont \"drop-down\" ou an."
+ },
+ "readyToConnect": {
+ "message": "Pare pou konekte?"
+ },
+ "rinkeby": {
+ "message": "Rinkeby Tès Rezo"
+ },
+ "ropsten": {
+ "message": "Ropsten Tès Rezo"
+ },
+ "rpc": {
+ "message": "Koutim RPC"
+ },
+ "sampleAccountName": {
+ "message": "Pa egzanp, Nouvo kont mwen an",
+ "description": "Help user understand concept of adding a human-readable name to their account"
+ },
+ "save": {
+ "message": "Sove"
+ },
+ "saveAsCsvFile": {
+ "message": "Sove kòm dosye CSV"
+ },
+ "saveAsFile": {
+ "message": "Sove kòm dosye",
+ "description": "Account export process"
+ },
+ "saveSeedAsFile": {
+ "message": "Sove pawòl seed kòm dosye"
+ },
+ "scanInstructions": {
+ "message": "Mete kòd QR la devan kamera ou"
+ },
+ "scanQrCode": {
+ "message": "Enspeksyon QR Kòd"
+ },
+ "search": {
+ "message": "Rechèch"
+ },
+ "searchResults": {
+ "message": "Rezilta rechèch"
+ },
+ "secretPhrase": {
+ "message": "Antre fraz sekrè douz mo ou a pou w restore kòf ou a."
+ },
+ "seedPhraseReq": {
+ "message": "Seed fraz yo se 12 long mo"
+ },
+ "select": {
+ "message": "Chwazi"
+ },
+ "selectCurrency": {
+ "message": "Chwazi Lajan"
+ },
+ "selectLocale": {
+ "message": "Chwazi Lokasyon"
+ },
+ "selectService": {
+ "message": "Chwazi Sèvis"
+ },
+ "selectType": {
+ "message": "Chwazi Kalite"
+ },
+ "send": {
+ "message": "Voye"
+ },
+ "sendETH": {
+ "message": "Voye ETH"
+ },
+ "sendTokens": {
+ "message": "Voye Tokens"
+ },
+ "sentEther": {
+ "message": "Voye ether"
+ },
+ "sentTokens": {
+ "message": "tokens deja voye"
+ },
+ "separateEachWord": {
+ "message": "Separe chak mo ak yon sèl espas"
+ },
+ "searchTokens": {
+ "message": "Rechèch Tokens"
+ },
+ "selectAnAddress": {
+ "message": "Chwazi yon adrès"
+ },
+ "selectAnAccount": {
+ "message": "Chwazi yon kont"
+ },
+ "selectAnAccountHelp": {
+ "message": "Chwazi kont pou wè nan MetaMask"
+ },
+ "selectHdPath": {
+ "message": "Chwazi chemen HD"
+ },
+ "selectPathHelp": {
+ "message": "Si ou pa wè kont Ledger ou te genyen an anba a, eseye chanje chemen an \"Eritaj (MEW / MyCrypto)\""
+ },
+ "sendTokensAnywhere": {
+ "message": "Voye Tokens pou nenpòt moun ki gen yon kont Ethereum"
+ },
+ "settings": {
+ "message": "Paramèt"
+ },
+ "shapeshiftBuy": {
+ "message": "Achte avèk Shapeshift"
+ },
+ "showPrivateKeys": {
+ "message": "Montre Kle Prive"
+ },
+ "showQRCode": {
+ "message": "Montre Kòd QR"
+ },
+ "showHexData": {
+ "message": "Montre Hex Data"
+ },
+ "showHexDataDescription": {
+ "message": "Pran sa pouw ka montre chan entèfas hex data a"
+ },
+ "sign": {
+ "message": "Siyen"
+ },
+ "signatureRequest": {
+ "message": "Siyati Mande"
+ },
+ "signed": {
+ "message": "Te Siyen"
+ },
+ "signMessage": {
+ "message": "Siyen mesaj"
+ },
+ "signNotice": {
+ "message": "Lè w siyen mesaj sa a ka gen efè segondè ki \ndanjere. Sèlman \nsit mesaj ki soti nan sit ou konplètman fè konfyans ak tout kont ou. \n Metòd danjere sa yo pral retire nan yon vèsyon fiti. "
+ },
+ "sigRequest": {
+ "message": "Demann Siyati"
+ },
+ "sigRequested": {
+ "message": "Demann Siyati"
+ },
+ "spaceBetween": {
+ "message": "ka gen sèlman yon espas ant mo yo"
+ },
+ "speedUp": {
+ "message": "pi vit"
+ },
+ "speedUpTitle": {
+ "message": "Monte vitès tranzaksyon"
+ },
+ "speedUpSubtitle": {
+ "message": "Ogmante pri gaz ou pou eseye efase tranzaksyon ou pi vit"
+ },
+ "status": {
+ "message": "Kondisyon"
+ },
+ "stateLogs": {
+ "message": "State Logs"
+ },
+ "stateLogsDescription": {
+ "message": "State logs gen adrès kont piblik ou yo epi tranzaksyon ou te voye yo."
+ },
+ "stateLogError": {
+ "message": "Erè nan retwouve State Logs yo."
+ },
+ "step1HardwareWallet": {
+ "message": "1. Konekte Materyèl bous"
+ },
+ "step1HardwareWalletMsg": {
+ "message": "Konekte materyèl bous ou dirèkteman nan òdinatè ou."
+ },
+ "step2HardwareWallet": {
+ "message": "2. Chwazi yon kont"
+ },
+ "step2HardwareWalletMsg": {
+ "message": "Chwazi kont ou vle wè a. Ou ka chwazi youn sèlman nan yon moman."
+ },
+ "step3HardwareWallet": {
+ "message": "3. Kòmanse itilize dApps ak plis ankò!"
+ },
+ "step3HardwareWalletMsg": {
+ "message": "Sèvi ak kont materyèl ou menm jan ou t ap fè pou kont Etherum. Ouvri sesyon an nan dApps, voye Eth, achte ak stòke ERC20 tokens ak e ki pake chanje tokens tankou CryptoKitties."
+ },
+ "submit": {
+ "message": "Soumèt"
+ },
+ "submitted": {
+ "message": "Te Soumèt"
+ },
+ "supportCenter": {
+ "message": "Vizite Sant Sipò Nou"
+ },
+ "symbolBetweenZeroTen": {
+ "message": "Senbòl yo dwe ant 0 ak 10 karaktè."
+ },
+ "takesTooLong": {
+ "message": "Pran twò lontan?"
+ },
+ "terms": {
+ "message": "Tèm pou itilize"
+ },
+ "testFaucet": {
+ "message": "Tès Tiyo"
+ },
+ "to": {
+ "message": "Pou"
+ },
+ "toETHviaShapeShift": {
+ "message": "$1 pou ETH pa ShapeShift",
+ "description": "system will fill in deposit type in start of message"
+ },
+ "token": {
+ "message": "Token"
+ },
+ "tokenAddress": {
+ "message": "Adrès Token"
+ },
+ "tokenAlreadyAdded": {
+ "message": "Ou te deja ajoute token."
+ },
+ "tokenBalance": {
+ "message": "Balans Token ou se:"
+ },
+ "tokenSelection": {
+ "message": "Chache Tokens oswa chwazi nan lis Tokens popilè nou an."
+ },
+ "tokenSymbol": {
+ "message": "Token Senbòl"
+ },
+ "tokenWarning1": {
+ "message": "Kenbe tras token yo ou te achte ak kont MetaMask ou. Si ou te achte tokens pandan wap itilize yon kont diferan tokens sa yo pa pral parèt la."
+ },
+ "total": {
+ "message": "Total"
+ },
+ "transaction": {
+ "message": "tranzaksyon yo"
+ },
+ "transactionConfirmed": {
+ "message": "Tranzaksyon ou te konfime pou $2."
+ },
+ "transactionCreated": {
+ "message": "Tranzaksyon ou te kreye avèk on valè de $1 pou $2."
+ },
+ "transactionWithNonce": {
+ "message": "Tranzaksyon $1"
+ },
+ "transactionDropped": {
+ "message": "Tranzaksyon ou te tonbe a $2."
+ },
+ "transactionSubmitted": {
+ "message": "Tranzaksyon ou te soumèt a $2."
+ },
+ "transactionUpdated": {
+ "message": "Tranzaksyon ou te aktyalize a $2."
+ },
+ "transactionUpdatedGas": {
+ "message": "Tranzaksyon ou te aktyalize avèk on pri gaz de $1 a $2."
+ },
+ "transactions": {
+ "message": "transactions"
+ },
+ "transactionError": {
+ "message": "Erè tranzaksyon. Eksepsyon jete nan kòd kontra."
+ },
+ "transactionMemo": {
+ "message": "Memo tranzaksyon (opsyonèl)"
+ },
+ "transactionNumber": {
+ "message": "Nimewo Tranzaksyon"
+ },
+ "transfer": {
+ "message": "Transfè"
+ },
+ "transferFrom": {
+ "message": "Transfer From"
+ },
+ "transfers": {
+ "message": "Transfè yo"
+ },
+ "trezorHardwareWallet": {
+ "message": "TREZOR Materyèl Bous"
+ },
+ "troubleTokenBalances": {
+ "message": "Nou te gen pwoblèm chaje balans token ou. Ou ka wè yo ",
+ "description": "Followed by a link (here) to view token balances"
+ },
+ "tryAgain": {
+ "message": "Eseye anko"
+ },
+ "twelveWords": {
+ "message": "12 mo sa yo se sèl fason pou retabli kont MetaMask ou yo. \nKenbe yo yon kote ki an sekirite ak sekrè."
+ },
+ "typePassword": {
+ "message": "Tape modpas ou"
+ },
+ "uiWelcome": {
+ "message": "Byenveni nan New itilizatè koòdone (Beta)"
+ },
+ "uiWelcomeMessage": {
+ "message": "Kounya w ap itilize nouvo MetaMask UI (itilizatè koòdone) a."
+ },
+ "unapproved": {
+ "message": "Pa apwouve"
+ },
+ "unavailable": {
+ "message": "Pa disponib"
+ },
+ "units": {
+ "message": "inite yo"
+ },
+ "unknown": {
+ "message": "Enkoni"
+ },
+ "unknownFunction": {
+ "message": "Fonksyon enkoni"
+ },
+ "unknownNetwork": {
+ "message": "Rezo Prive Enkoni"
+ },
+ "unknownNetworkId": {
+ "message": "Rezo ID Enkoni"
+ },
+ "unknownQrCode": {
+ "message": "Erè: Nou pa t kapab idantifye QR kòd sa"
+ },
+ "unknownCameraErrorTitle": {
+ "message": "Ooops! Yon bagay te ale mal...."
+ },
+ "unknownCameraError": {
+ "message": "Te gen yon erè pandan y ap eseye jwenn aksè nan kamera ou. Tanpri eseye ankò..."
+ },
+ "unlock": {
+ "message": "Debloke"
+ },
+ "unlockMessage": {
+ "message": "Entènèt desantralize a ap tann"
+ },
+ "updatedWithDate": {
+ "message": "Mete ajou $1"
+ },
+ "uriErrorMsg": {
+ "message": "URIs mande pou apwopriye prefiks HTTP / HTTPS a."
+ },
+ "usaOnly": {
+ "message": "USA sèlman",
+ "description": "Using this exchange is limited to people inside the USA"
+ },
+ "usedByClients": {
+ "message": "Itilize pa yon varyete de kliyan diferan"
+ },
+ "useOldUI": {
+ "message": "Itilizasyon ansyen UI (itilizatè koòdone)"
+ },
+ "validFileImport": {
+ "message": "Ou dwe chwazi yon dosye ki valab pou enpòte."
+ },
+ "vaultCreated": {
+ "message": "Kòf Kreye"
+ },
+ "viewAccount": {
+ "message": "Wè Kont"
+ },
+ "viewOnEtherscan": {
+ "message": "Wè sou Etherscan"
+ },
+ "visitWebSite": {
+ "message": "Vizite sit entènèt nou an"
+ },
+ "walletSeed": {
+ "message": "Bous Seed"
+ },
+ "warning": {
+ "message": "Avètisman"
+ },
+ "welcomeBack": {
+ "message": "Bon Retou!"
+ },
+ "welcomeBeta": {
+ "message": "Byenveni nan MetaMask Beta"
+ },
+ "whatsThis": {
+ "message": "Kisa sa ye?"
+ },
+ "yesLetsTry": {
+ "message": "Wi, ann eseye"
+ },
+ "youNeedToAllowCameraAccess": {
+ "message": "Ou bezwen bay kamera aksè pou sèvi ak fonksyon sa."
+ },
+ "yourSigRequested": {
+ "message": "Yo mande siyati ou"
+ },
+ "youSign": {
+ "message": "Ou ap siyen kounya"
+ },
+ "yourPrivateSeedPhrase": {
+ "message": "Seed fraz prive ou a"
+ }
}
diff --git a/app/_locales/index.json b/app/_locales/index.json
index 0598aa9ec..234215e39 100644
--- a/app/_locales/index.json
+++ b/app/_locales/index.json
@@ -1,23 +1,24 @@
[
- { "code": "cs", "name": "Czech" },
- { "code": "de", "name": "German" },
+ { "code": "cs", "name": "Čeština" },
+ { "code": "de", "name": "Deutsche" },
{ "code": "en", "name": "English" },
- { "code": "es", "name": "Spanish" },
- { "code": "fr", "name": "French" },
- { "code": "ht", "name": "Haitian Creole" },
- { "code": "hn", "name": "Hindi" },
- { "code": "it", "name": "Italian" },
- { "code": "ja", "name": "Japanese" },
- { "code": "ko", "name": "Korean" },
- { "code": "nl", "name": "Dutch" },
- { "code": "ph", "name": "Tagalog" },
- { "code": "pt", "name": "Portuguese" },
- { "code": "ru", "name": "Russian" },
- { "code": "sl", "name": "Slovenian" },
- { "code": "th", "name": "Thai" },
- { "code": "tml", "name": "Tamil" },
- { "code": "tr", "name": "Turkish" },
- { "code": "vi", "name": "Vietnamese" },
- { "code": "zh_CN", "name": "Chinese (Simplified)" },
- { "code": "zh_TW", "name": "Chinese (Traditional)" }
+ { "code": "es", "name": "Español" },
+ { "code": "fr", "name": "Français" },
+ { "code": "ht", "name": "Kreyòl ayisyen" },
+ { "code": "hn", "name": "हिन्दी" },
+ { "code": "it", "name": "Italiano" },
+ { "code": "ja", "name": "日本語" },
+ { "code": "ko", "name": "한국어" },
+ { "code": "nl", "name": "Nederlands" },
+ { "code": "ph", "name": "Pilipino" },
+ { "code": "pl", "name": "Polskie" },
+ { "code": "pt", "name": "Português" },
+ { "code": "ru", "name": "Русский" },
+ { "code": "sl", "name": "Slovenščina" },
+ { "code": "th", "name": "ไทย" },
+ { "code": "tml", "name": "தமிழ்" },
+ { "code": "tr", "name": "Türkçe" },
+ { "code": "vi", "name": "Tiếng Việt" },
+ { "code": "zh_CN", "name": "中文(简体)" },
+ { "code": "zh_TW", "name": "中文(繁體)" }
]
diff --git a/app/_locales/it/messages.json b/app/_locales/it/messages.json
index dafdb319c..285d75423 100644
--- a/app/_locales/it/messages.json
+++ b/app/_locales/it/messages.json
@@ -1,7 +1,52 @@
{
+ "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"
},
+ "accessingYourCamera": {
+ "message": "Accesso alla fotocamera..."
+ },
"account": {
"message": "Account"
},
@@ -11,6 +56,15 @@
"accountName": {
"message": "Nome Account"
},
+ "accountOptions": {
+ "message": "Account Options"
+ },
+ "accountSelectionRequired": {
+ "message": "Devi selezionare un account!"
+ },
+ "activityLog": {
+ "message": "log attività"
+ },
"address": {
"message": "Indirizzo"
},
@@ -23,6 +77,12 @@
"addTokens": {
"message": "Aggiungi più token"
},
+ "addSuggestedTokens": {
+ "message": "Aggiungi Token Suggeriti"
+ },
+ "addAcquiredTokens": {
+ "message": "Aggiungi i token che hai acquistato usando MetaMask"
+ },
"amount": {
"message": "Importo"
},
@@ -37,9 +97,21 @@
"message": "MetaMask",
"description": "Il nome dell'applicazione"
},
+ "approve": {
+ "message": "Approva"
+ },
+ "approved": {
+ "message": "Approvato"
+ },
"attemptingConnect": {
"message": "Tentativo di connessione alla blockchain."
},
+ "attemptToCancel": {
+ "message": "Tentativo di Annullamento?"
+ },
+ "attemptToCancelDescription": {
+ "message": "Tentare di annullare non garantisce che la transazione verrà annullata. Se annullata, è comunque richiesto pagare alla rete la commissione sulla transazione."
+ },
"attributions": {
"message": "Attribuzioni"
},
@@ -71,8 +143,11 @@
"borrowDharma": {
"message": "Prendi in presisito con Dharma (Beta)"
},
+ "browserNotSupported": {
+ "message": "Il tuo Browser non è supportato..."
+ },
"builtInCalifornia": {
- "message": "MetaMask è progettato e costruito in California."
+ "message": "MetaMask è progettato e realizzato in California."
},
"buy": {
"message": "Compra"
@@ -89,8 +164,23 @@
"buyCoinSwitchExplainer": {
"message": "CoinSwitch è la destinazione one-stop per lo scambio di oltre 300 criptovalute alla migliore tariffa."
},
+ "bytes": {
+ "message": "Bytes"
+ },
+ "ok": {
+ "message": "Ok"
+ },
"cancel": {
- "message": "Cancella"
+ "message": "Annulla"
+ },
+ "cancelAttempt": {
+ "message": "Tentativo di Annullamento"
+ },
+ "cancellationGasFee": {
+ "message": "Commissione di Annullamento in Gas"
+ },
+ "cancelN": {
+ "message": "Cancel all $1 transactions"
},
"classicInterface": {
"message": "Usa l'interfaccia classica"
@@ -98,9 +188,18 @@
"clickCopy": {
"message": "Clicca per Copiare"
},
+ "close": {
+ "message": "Chiudi"
+ },
+ "chromeRequiredForHardwareWallets": {
+ "message": "Devi usare MetaMask con Google Chrome per connettere il tuo Portafoglio Hardware"
+ },
"confirm": {
"message": "Conferma"
},
+ "confirmed": {
+ "message": "Confermata"
+ },
"confirmContract": {
"message": "Conferma Contratto"
},
@@ -110,6 +209,36 @@
"confirmTransaction": {
"message": "Conferma Transazione"
},
+ "connectHardwareWallet": {
+ "message": "Connetti Portafoglio Hardware"
+ },
+ "connect": {
+ "message": "Connetti"
+ },
+ "connecting": {
+ "message": "Connessione..."
+ },
+ "connectingToKovan": {
+ "message": "Connessione alla Rete di test Kovan"
+ },
+ "connectingToMainnet": {
+ "message": "Connessione alla Rete Ethereum Principale"
+ },
+ "connectingToRopsten": {
+ "message": "Connessione alla Rete di test Ropsten"
+ },
+ "connectingToRinkeby": {
+ "message": "Connessione alla Rete di test Rinkeby"
+ },
+ "connectingToUnknown": {
+ "message": "Connessione ad una Rete Sconosciuta"
+ },
+ "connectToLedger": {
+ "message": "Connettersi al Ledger"
+ },
+ "connectToTrezor": {
+ "message": "Connettersi al Trezor"
+ },
"continue": {
"message": "Continua"
},
@@ -140,6 +269,9 @@
"copy": {
"message": "Copia"
},
+ "copyAddress": {
+ "message": "Copia l'indirizzo"
+ },
"copyToClipboard": {
"message": "Copia negli appunti"
},
@@ -165,12 +297,21 @@
"currentConversion": {
"message": "Cambio Corrente"
},
+ "currentLanguage": {
+ "message": "Lingua Corrente"
+ },
"currentNetwork": {
"message": "Rete Corrente"
},
+ "currentRpc": {
+ "message": "RPC Corrente"
+ },
"customGas": {
"message": "Personalizza Gas"
},
+ "customToken": {
+ "message": "Token Personalizzato"
+ },
"customize": {
"message": "Personalizza"
},
@@ -232,33 +373,54 @@
"done": {
"message": "Finito"
},
+ "downloadGoogleChrome": {
+ "message": "Scarica Google Chrome"
+ },
"downloadStateLogs": {
"message": "Scarica i log di Stato"
},
+ "dontHaveAHardwareWallet": {
+ "message": "Non hai un portafoglio hardware?"
+ },
+ "dropped": {
+ "message": "Abbandonata"
+ },
"edit": {
"message": "Modifica"
},
"editAccountName": {
"message": "Modifica Nome Account"
},
+ "editingTransaction": {
+ "message": "Modifica la transazione"
+ },
"emailUs": {
"message": "Mandaci una mail!"
},
"encryptNewDen": {
"message": "Cripta il tuo nuovo DEN"
},
+ "ensNameNotFound": {
+ "message": "Nome ENS non trovato"
+ },
"enterPassword": {
"message": "Inserisci password"
},
"enterPasswordConfirm": {
"message": "Inserisci la tua password per confermare"
},
+ "enterPasswordContinue": {
+ "message": "Inserisci la tua password per continuare"
+ },
"etherscanView": {
"message": "Vedi account su Etherscan"
},
"exchangeRate": {
"message": "Tasso di cambio"
},
+ "expandView": {
+ "message": "Expand View"
+ },
"exportPrivateKey": {
"message": "Esporta Chiave Privata"
},
@@ -266,7 +428,7 @@
"message": "Esporta chiave privata a tuo rischio."
},
"failed": {
- "message": "Fallito"
+ "message": "Fallita"
},
"fiat": {
"message": "FIAT",
@@ -279,6 +441,9 @@
"followTwitter": {
"message": "Seguici su Twitter"
},
+ "forgetDevice": {
+ "message": "Dimentica questo dispositivo"
+ },
"from": {
"message": "Da"
},
@@ -288,6 +453,9 @@
"fromShapeShift": {
"message": "Da ShapeShift"
},
+ "functionType": {
+ "message": "Tipo della Funzione"
+ },
"gas": {
"message": "Gas",
"description": "Piccola indicazione del costo del gas"
@@ -319,6 +487,9 @@
"gasPriceRequired": {
"message": "Prezzo Gas Richiesto"
},
+ "generatingTransaction": {
+ "message": "Generando la transazione"
+ },
"getEther": {
"message": "Ottieni Ether"
},
@@ -326,10 +497,28 @@
"message": "Ottieni Get Ether da un faucet per $1",
"description": "Visualizza il nome della rete per il faucet Ether"
},
+ "getHelp": {
+ "message": "Aiuto."
+ },
"greaterThanMin": {
"message": "deve essere maggiore o uguale a $1.",
"description": "aiuto per inserire un input esadecimale come decimale"
},
+ "hardware": {
+ "message": "hardware"
+ },
+ "hardwareWalletConnected": {
+ "message": "Portafoglio hardware connesso"
+ },
+ "hardwareWallets": {
+ "message": "Connetti portafoglio hardware"
+ },
+ "hardwareWalletsMsg": {
+ "message": "Selezione un portafoglio hardware che vuoi utilizzare con MetaMask"
+ },
+ "havingTroubleConnecting": {
+ "message": "Problemi di connessione?"
+ },
"here": {
"message": "qui",
"description": "per intendere -clicca qui- per maggiori informazioni (va con troubleTokenBalances)"
@@ -337,6 +526,9 @@
"hereList": {
"message": "Questa è una lista!!!!"
},
+ "hexData": {
+ "message": "Dati Hex"
+ },
"hide": {
"message": "Nascondi"
},
@@ -346,6 +538,9 @@
"hideTokenPrompt": {
"message": "Nascondi Token?"
},
+ "history": {
+ "message": "Storico"
+ },
"howToDeposit": {
"message": "Come vuoi depositare Ether?"
},
@@ -372,9 +567,18 @@
"message": "Importato",
"description": "stato che conferma che un account è stato totalmente caricato nel portachiavi"
},
+ "importUsingSeed": {
+ "message": "Importa account con frase seed"
+ },
+ "info": {
+ "message": "Informazioni"
+ },
"infoHelp": {
"message": "Informazioni & Aiuto"
},
+ "initialTransactionConfirmed": {
+ "message": "La transazione iniziale è stata confermata dalla rete. Clicca OK per tornare indietro."
+ },
"insufficientFunds": {
"message": "Fondi non sufficienti."
},
@@ -399,6 +603,9 @@
"invalidRPC": {
"message": "URI RPC invalido"
},
+ "invalidSeedPhrase": {
+ "message": "Frase seed non valida"
+ },
"jsonFail": {
"message": "Qualcosa è andato storto. Assicurati che il file JSON sia formattato correttamente."
},
@@ -406,12 +613,24 @@
"message": "File JSON",
"description": "formato per importare un account"
},
+ "keepTrackTokens": {
+ "message": "Tieni traccia dei tokens che hai acquistato con il tuo account MetaMask."
+ },
"kovan": {
"message": "Rete di test Kovan"
},
"knowledgeDataBase": {
"message": "Visita la nostra Knowledge Base"
},
+ "max": {
+ "message": "Massimo"
+ },
+ "learnMore": {
+ "message": "Scopri di più"
+ },
+ "ledgerAccountRestriction": {
+ "message": "E' necessario utilizzare l'ultimo account prima di poterne aggiungere uno nuovo."
+ },
"lessThanMax": {
"message": "deve essere minore o uguale a $1.",
"description": "aiuto per inserire un input esadecimale come decimale"
@@ -419,6 +638,9 @@
"likeToAddTokens": {
"message": "Vorresti aggiungere questi token?"
},
+ "links": {
+ "message": "Collegamenti"
+ },
"limit": {
"message": "Limite"
},
@@ -446,17 +668,26 @@
"mainnet": {
"message": "Rete Ethereum Principale"
},
+ "menu": {
+ "message": "Menu"
+ },
"message": {
"message": "Messaggio"
},
"metamaskDescription": {
"message": "MetaMask è una cassaforte sicura per identità su Ethereum."
},
+ "metamaskSeedWords": {
+ "message": "Parole Seed di MetaMask"
+ },
+ "metamaskVersion": {
+ "message": "versione di MetaMask"
+ },
"min": {
"message": "Minimo"
},
"myAccounts": {
- "message": "Account Miei"
+ "message": "Miei Account"
},
"mustSelectOne": {
"message": "Devi selezionare almeno un token."
@@ -478,6 +709,9 @@
"networks": {
"message": "Reti"
},
+ "nevermind": {
+ "message": "Non importa"
+ },
"newAccount": {
"message": "Nuovo Account"
},
@@ -491,6 +725,9 @@
"newPassword": {
"message": "Nuova Password (minimo 8 caratteri)"
},
+ "newPassword8Chars": {
+ "message": "Nuova Password (minimo 8 caratteri)"
+ },
"newRecipient": {
"message": "Nuovo Destinatario"
},
@@ -498,7 +735,7 @@
"message": "Nuovo URL RPC"
},
"next": {
- "message": "Prossimo"
+ "message": "Avanti"
},
"noAddressForName": {
"message": "Nessun indirizzo è stato impostato per questo nome."
@@ -506,32 +743,75 @@
"noDeposits": {
"message": "Nessun deposito ricevuto"
},
+ "noConversionRateAvailable": {
+ "message": "Tasso di Conversione non Disponibile"
+ },
"noTransactionHistory": {
"message": "Nessuna cronologia delle transazioni."
},
"noTransactions": {
"message": "Nessuna Transazione"
},
+ "notFound": {
+ "message": "Non Trovata"
+ },
"notStarted": {
"message": "Non Iniziato"
},
+ "noWebcamFoundTitle": {
+ "message": "Webcam non trovata"
+ },
+ "noWebcamFound": {
+ "message": "La webcam del tuo computer non è stata trovata. Per favore riprovaci."
+ },
"oldUI": {
"message": "Vecchia interfaccia"
},
"oldUIMessage": {
"message": "Sei ritornato alla vecchia interfaccia. Puoi ritornare alla nuova interfaccia tramite l'opzione nel menu a discesa in alto a destra."
},
+ "onlySendToEtherAddress": {
+ "message": "Invia ETH solamente ad un account Ethereum."
+ },
+ "onlySendTokensToAccountAddress": {
+ "message": "Invia solamente $1 ad un account Ethereum.",
+ "description": "mostra il simbolo del token"
+ },
+ "openInTab": {
+ "message": "Apri in una scheda"
+ },
"or": {
"message": "o",
"description": "scelta tra creare o importare un nuovo account"
},
+ "orderOneHere": {
+ "message": "Compra un Trezor o un Ledger e tieni i tuoi soldi al sicuro"
+ },
+ "origin": {
+ "message": "Origine"
+ },
+ "outgoing": {
+ "message": "In Uscita"
+ },
+ "parameters": {
+ "message": "Parametri"
+ },
+ "password": {
+ "message": "Password"
+ },
"passwordCorrect": {
"message": "Assicurati che la password sia corretta."
},
+ "passwordsDontMatch": {
+ "message": "Le Password Non Corrispondonos"
+ },
"passwordMismatch": {
"message": "le password non corrispondono",
"description": "nella creazione della password, le due password all'interno dei campi non corrispondono"
},
+ "passwordNotLongEnough": {
+ "message": "Password non abbastanza lunga"
+ },
"passwordShort": {
"message": "password non sufficientemente lunga",
"description": "nella creazione della password, la password non è lunga abbastanza"
@@ -543,12 +823,21 @@
"pasteSeed": {
"message": "Incolla la tua frase seed qui!"
},
+ "pending": {
+ "message": "in corso"
+ },
"personalAddressDetected": {
"message": "Rilevato indirizzo personale. Inserisci l'indirizzo del contratto del token."
},
"pleaseReviewTransaction": {
"message": "Ricontrolla la tua transazione."
},
+ "popularTokens": {
+ "message": "Tokens Popolari"
+ },
+ "prev": {
+ "message": "Precedente"
+ },
"privacyMsg": {
"message": "Politica sulla Privacy"
},
@@ -565,6 +854,9 @@
"qrCode": {
"message": "Mostra Codice QR"
},
+ "queue": {
+ "message": "Coda"
+ },
"readdToken": {
"message": "Puoi aggiungere nuovamente questo token in futuro andando in “Aggiungi token” nel menu delle opzioni del tuo account."
},
@@ -583,36 +875,84 @@
"refundAddress": {
"message": "Indirizzo di Rimborso"
},
+ "rejectAll": {
+ "message": "Reject All"
+ },
+ "rejectTxsN": {
+ "message": "Reject $1 transactions"
+ },
+ "rejectTxsDescription": {
+ "message": "You are about to batch reject $1 transactions."
+ },
"rejected": {
"message": "Respinta"
},
+ "reset": {
+ "message": "Reset"
+ },
"resetAccount": {
"message": "Resetta Account"
},
+ "resetAccountDescription": {
+ "message": "Resettare il tuo account cancellerà lo storico delle transazioni."
+ },
"restoreFromSeed": {
"message": "Ripristina da una frase seed"
},
+ "restoreVault": {
+ "message": "Ripristina Cassaforte"
+ },
+ "restoreAccountWithSeed": {
+ "message": "Ripristina Account con la Frase Seed"
+ },
"required": {
"message": "Richiesto"
},
"retryWithMoreGas": {
"message": "Riprova con un prezzo del Gas maggiore qui"
},
+ "restore": {
+ "message": "Ripristina"
+ },
"revealSeedWords": {
"message": "Rivela Frase Seed"
},
+ "revealSeedWordsTitle": {
+ "message": "Frase Seed"
+ },
+ "revealSeedWordsDescription": {
+ "message": "Se cambierai browser o computer, ti servirà questa frase seed per accedere ai tuoi account. Salvala in un posto sicuro e segreto."
+ },
+ "revealSeedWordsWarningTitle": {
+ "message": "NON CONDIVIDERE questa frase con nessuno!"
+ },
"revealSeedWordsWarning": {
"message": "Non ripristinare la tua frase seed in pubblico!. Queste parole possono essere usate per rubare il tuo account."
},
"revert": {
"message": "Annulla"
},
+ "remove": {
+ "message": "rimuovi"
+ },
+ "removeAccount": {
+ "message": "Rimuovi account"
+ },
+ "removeAccountDescription": {
+ "message": "Questo account sarà rimosso dal tuo portafoglio. Per favore assicurati che hai la frase seed originale o la chiave privata per questo account importato prima di continuare. Puoi nuovamente importare o creare un account dal menù a tendina. "
+ },
+ "readyToConnect": {
+ "message": "Pronto a Connetterti?"
+ },
"rinkeby": {
"message": "Rete di test Rinkeby"
},
"ropsten": {
"message": "Rete di test Ropsten"
},
+ "rpc": {
+ "message": "RPC Personalizzata"
+ },
"sampleAccountName": {
"message": "Es: Il mio nuovo account",
"description": "Aiuta l'utente a capire il concetto di aggiungere un nome leggibile al loro account"
@@ -620,6 +960,9 @@
"save": {
"message": "Salva"
},
+ "saveAsCsvFile": {
+ "message": "Salva Come File CSV"
+ },
"saveAsFile": {
"message": "Salva come File",
"description": "Processo per esportare un account"
@@ -627,9 +970,18 @@
"saveSeedAsFile": {
"message": "Salva la Frase Seed come File"
},
+ "scanInstructions": {
+ "message": "Posizione il codice QR davanti alla fotocamera"
+ },
+ "scanQrCode": {
+ "message": "Scansiona Codice QR"
+ },
"search": {
"message": "Cerca"
},
+ "searchResults": {
+ "message": "Risultati Ricerca"
+ },
"secretPhrase": {
"message": "Inserisci la tua frase segreta di dodici parole per ripristinare la cassaforte."
},
@@ -642,6 +994,9 @@
"selectCurrency": {
"message": "Seleziona Moneta"
},
+ "selectLocale": {
+ "message": "Selezione Lingua"
+ },
"selectService": {
"message": "Seleziona Servizio"
},
@@ -657,6 +1012,33 @@
"sendTokens": {
"message": "Invia Tokens"
},
+ "sentEther": {
+ "message": "ether inviati"
+ },
+ "sentTokens": {
+ "message": "tokens inviati"
+ },
+ "separateEachWord": {
+ "message": "Separa ogni parola con un solo spazio"
+ },
+ "searchTokens": {
+ "message": "Cerca Tokens"
+ },
+ "selectAnAddress": {
+ "message": "Seleziona un Indirizzo"
+ },
+ "selectAnAccount": {
+ "message": "Seleziona un Account"
+ },
+ "selectAnAccountHelp": {
+ "message": "Selezione l'account da visualizzare in MetaMask"
+ },
+ "selectHdPath": {
+ "message": "Seleziona Percorso HD"
+ },
+ "selectPathHelp": {
+ "message": "Se non vedi il tuo account Ledger esistente di seguito, prova a cambiare il percorso in \"Legacy (MEW / MyCrypto)\""
+ },
"sendTokensAnywhere": {
"message": "Invia Tokens a chiunque abbia un account Ethereum"
},
@@ -672,9 +1054,21 @@
"showQRCode": {
"message": "Mostra Codie QR"
},
+ "showHexData": {
+ "message": "Mostra Dati Hex"
+ },
+ "showHexDataDescription": {
+ "message": "Seleziona per mostrare il campo dei dati hex nella schermata di invio"
+ },
"sign": {
"message": "Firma"
},
+ "signatureRequest": {
+ "message": "Firma Richiesta"
+ },
+ "signed": {
+ "message": "Firmata"
+ },
"signMessage": {
"message": "Firma Messaggio"
},
@@ -690,6 +1084,15 @@
"spaceBetween": {
"message": "ci può essere solo uno spazio tra le parole"
},
+ "speedUp": {
+ "message": "velocizza"
+ },
+ "speedUpTitle": {
+ "message": "Velocizza Transazione"
+ },
+ "speedUpSubtitle": {
+ "message": "Aumenta il prezzo del gas per tentare di sovrascrivere e velocizzare la transazione"
+ },
"status": {
"message": "Stato"
},
@@ -699,9 +1102,33 @@
"stateLogsDescription": {
"message": "I log di stato contengono i tuoi indirizzi pubblici e le transazioni effettuate."
},
+ "stateLogError": {
+ "message": "Errore nel recupero dei log di stato."
+ },
+ "step1HardwareWallet": {
+ "message": "1. Connetti Portafoglio Hardware"
+ },
+ "step1HardwareWalletMsg": {
+ "message": "Connetti il tuo portafoglio hardware al tuo computer."
+ },
+ "step2HardwareWallet": {
+ "message": "2. Seleziona un Account"
+ },
+ "step2HardwareWalletMsg": {
+ "message": "Selezione l'account che vuoi vedere. Puoi selezionarne solo uno alla volta."
+ },
+ "step3HardwareWallet": {
+ "message": "3. Inizia a usare dApps e molto altro ancora!"
+ },
+ "step3HardwareWalletMsg": {
+ "message": "Usa il tuo account hardware come utilizzeresti qualsiasi account Ethereum. Accedi alle dApps, invia Eth, compra e conserva token ERC20 e token non fungibili come CryptoKitties"
+ },
"submit": {
"message": "Invia"
},
+ "submitted": {
+ "message": "Inviata"
+ },
"supportCenter": {
"message": "Visita il nostro Centro di Supporto"
},
@@ -724,6 +1151,9 @@
"message": "$1 a ETH via ShapeShift",
"description": "il sistema riempirà il tipo di deposito all'inizio del messaggio"
},
+ "token": {
+ "message": "Token"
+ },
"tokenAddress": {
"message": "Indirizzo Token"
},
@@ -745,22 +1175,61 @@
"total": {
"message": "Totale"
},
+ "transaction": {
+ "message": "transazione"
+ },
+ "transactionConfirmed": {
+ "message": "Transazione confermata il $2."
+ },
+ "transactionCreated": {
+ "message": "Transazione di valore $1 creata il $2."
+ },
+ "transactionWithNonce": {
+ "message": "Transazione $1"
+ },
+ "transactionDropped": {
+ "message": "Transazione abbandonata il $2."
+ },
+ "transactionSubmitted": {
+ "message": "Transazione inviata il $2."
+ },
+ "transactionUpdated": {
+ "message": "Transazione aggiornata il $2."
+ },
+ "transactionUpdatedGas": {
+ "message": "Transazione aggiornata con un prezzo del gas di $1 il $2."
+ },
"transactions": {
"message": "transazioni"
},
+ "transactionError": {
+ "message": "Errore Transazione. Eccceziona generata nel codice del contratto."
+ },
"transactionMemo": {
"message": "Promemoria Transazione (opzionale)"
},
"transactionNumber": {
"message": "Numero Transazione"
},
+ "transfer": {
+ "message": "Trasferisci"
+ },
+ "transferFrom": {
+ "message": "Transfer From"
+ },
"transfers": {
"message": "Trasferimenti"
},
+ "trezorHardwareWallet": {
+ "message": "TREZOR Portafoglio Hardware"
+ },
"troubleTokenBalances": {
"message": "Abbiamo avuto un problema a caricare il bilancio dei tuoi token. Puoi vederlo ",
"description": "Seguito da un link (qui) per vedere il bilancio dei token"
},
+ "tryAgain": {
+ "message": "Prova di nuovo"
+ },
"twelveWords": {
"message": "Queste 12 parole sono l'unico modo per ripristinare i tuoi account MetaMask. \nSalvale in un posto sicuro e segreto."
},
@@ -773,18 +1242,45 @@
"uiWelcomeMessage": {
"message": "Stai utilizzanto la nuova interfaccia di MetaMask. Guarda in giro, prova nuove funzionalità come inviare token, e facci sapere se hai dei problemi."
},
+ "unapproved": {
+ "message": "Non approvata"
+ },
"unavailable": {
"message": "Non Disponibile"
},
+ "units": {
+ "message": "unità"
+ },
"unknown": {
"message": "Sconosciuto"
},
+ "unknownFunction": {
+ "message": "Funzione Sconosciuta"
+ },
"unknownNetwork": {
"message": "Rete Privata Sconosciuta"
},
"unknownNetworkId": {
"message": "ID rete sconosciuto"
},
+ "unknownQrCode": {
+ "message": "Errore: Non siamo riusciti a identificare il codice QR"
+ },
+ "unknownCameraErrorTitle": {
+ "message": "Ooops! Qualcosa è andato storto...."
+ },
+ "unknownCameraError": {
+ "message": "C'è stato un errore nel tentativo di accedere alla fotocamera. Per favore prova di nuovo..."
+ },
+ "unlock": {
+ "message": "Sblocca"
+ },
+ "unlockMessage": {
+ "message": "Il web decentralizzato ti attende"
+ },
+ "updatedWithDate": {
+ "message": "Aggiornata $1"
+ },
"uriErrorMsg": {
"message": "Gli URI richiedono un prefisso HTTP/HTTPS."
},
@@ -807,22 +1303,40 @@
"viewAccount": {
"message": "Vedi Account"
},
+ "viewOnEtherscan": {
+ "message": "Vedi su Etherscan"
+ },
"visitWebSite": {
"message": "Visita il nostro sito web"
},
+ "walletSeed": {
+ "message": "Seed del Portafoglio"
+ },
"warning": {
"message": "Attenzione"
},
+ "welcomeBack": {
+ "message": "Bentornato!"
+ },
"welcomeBeta": {
"message": "Benvenuto nella Beta di MetaMask"
},
"whatsThis": {
"message": "Cos'è questo?"
},
+ "yesLetsTry": {
+ "message": "Si, proviamo"
+ },
+ "youNeedToAllowCameraAccess": {
+ "message": "Devi consentire l'accesso alla fotocamera per usare questa funzionalità."
+ },
"yourSigRequested": {
"message": "E' richiesta la tua firma"
},
"youSign": {
"message": "Ti stai connettendo"
+ },
+ "yourPrivateSeedPhrase": {
+ "message": "La tua frase seed privata"
}
}
diff --git a/app/_locales/ja/messages.json b/app/_locales/ja/messages.json
index abac35b03..cd105b241 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 e2cf72296..c1d9d4733 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": "수락"
},
@@ -14,9 +56,15 @@
"accountName": {
"message": "계정 이름"
},
+ "accountOptions": {
+ "message": "계정 옵션"
+ },
"accountSelectionRequired": {
"message": "계정을 선택하셔야 합니다!"
},
+ "activityLog": {
+ "message": "활동 로그"
+ },
"address": {
"message": "주소"
},
@@ -29,6 +77,9 @@
"addTokens": {
"message": "토큰 추가"
},
+ "addSuggestedTokens": {
+ "message": "제안된 토큰 추가"
+ },
"addAcquiredTokens": {
"message": "메타마스크를 통해 획득한 토큰 추가"
},
@@ -55,6 +106,9 @@
"attemptingConnect": {
"message": "블록체인에 접속을 시도하는 중입니다."
},
+ "attemptToCancel": {
+ "message": "취소 하시겠습니까?"
+ },
"attributions": {
"message": "속성"
},
@@ -116,6 +170,15 @@
"cancel": {
"message": "취소"
},
+ "cancelAttempt": {
+ "message": "취소 시도"
+ },
+ "cancellationGasFee": {
+ "message": "취소 가스 수수료"
+ },
+ "cancelN": {
+ "message": "모든 $1 트랜잭션 취소"
+ },
"classicInterface": {
"message": "예전 인터페이스"
},
@@ -229,7 +292,10 @@
"description": "거래 유형 (암호화폐)"
},
"currentConversion": {
- "message": "선택된 단위"
+ "message": "현재 통화"
+ },
+ "currentLanguage": {
+ "message": "현재 언어"
},
"currentNetwork": {
"message": "현재 네트워크"
@@ -349,6 +415,9 @@
"exchangeRate": {
"message": "환율"
},
+ "expandView": {
+ "message": "큰 화면으로 보기"
+ },
"exportPrivateKey": {
"message": "개인키 내보내기"
},
@@ -466,6 +535,9 @@
"hideTokenPrompt": {
"message": "토큰 숨기기?"
},
+ "history": {
+ "message": "히스토리"
+ },
"howToDeposit": {
"message": "어떤 방법으로 이더를 입금하시겠습니까?"
},
@@ -495,6 +567,9 @@
"importUsingSeed": {
"message": "계정 시드 구문으로 가져오기"
},
+ "info": {
+ "message": "정보"
+ },
"infoHelp": {
"message": "정보 및 도움말"
},
@@ -548,7 +623,7 @@
"message": "최대"
},
"learnMore": {
- "message": "더 배우기."
+ "message": "더 알아보기."
},
"ledgerAccountRestriction": {
"message": "새 계정을 추가하려면 최소 마지막 계정을 사용해야 합니다."
@@ -599,6 +674,9 @@
"metamaskDescription": {
"message": "메타마스크는 이더리움을 위한 안전한 신분 저장소입니다."
},
+ "metamaskVersion": {
+ "message": "메타마스크 버전"
+ },
"metamaskSeedWords": {
"message": "메타마스크 시드 단어"
},
@@ -619,7 +697,7 @@
"description": "사용자는 계정을 가져오기 위해서 파일을 추가후 계속 진행해야 합니다"
},
"needImportPassword": {
- "message": "선택 된 파일에 대한 비밀번호를 입력해주세요.",
+ "message": "선택된 파일에 대한 비밀번호를 입력해주세요.",
"description": "계정을 가져오기 위해서 비밀번호와 파일이 필요합니다."
},
"negativeETH": {
@@ -736,6 +814,9 @@
"pasteSeed": {
"message": "시드 구문을 이곳에 붙여넣어 주세요!"
},
+ "pending": {
+ "message": "펜딩 중"
+ },
"personalAddressDetected": {
"message": "개인 주소가 탐지됨. 토큰 컨트랙트 주소를 입력하세요."
},
@@ -764,6 +845,9 @@
"qrCode": {
"message": "QR 코드 보기"
},
+ "queue": {
+ "message": "큐"
+ },
"readdToken": {
"message": "옵션 메뉴에서 “토큰 추가”를 눌러서 추후에 다시 이 토큰을 추가하실 수 있습니다."
},
@@ -782,6 +866,15 @@
"refundAddress": {
"message": "환불받을 주소"
},
+ "rejectAll": {
+ "message": "모두 거부"
+ },
+ "rejectTxsN": {
+ "message": "$1 트랜잭션 거부"
+ },
+ "rejectTxsDescription": {
+ "message": "$1 트랜잭션을 거부합니다."
+ },
"rejected": {
"message": "거부됨"
},
@@ -901,6 +994,9 @@
"selectCurrency": {
"message": "통화 선택"
},
+ "selectLocale": {
+ "message": "언어 선택"
+ },
"selectService": {
"message": "서비스 선택"
},
@@ -916,6 +1012,12 @@
"sendTokens": {
"message": "토큰 전송"
},
+ "sentEther": {
+ "message": "전송된 이더"
+ },
+ "sentTokens": {
+ "message": "전송된 토큰"
+ },
"separateEachWord": {
"message": "각 단어는 공백 한칸으로 분리합니다"
},
@@ -943,9 +1045,6 @@
"settings": {
"message": "설정"
},
- "info": {
- "message": "정보"
- },
"shapeshiftBuy": {
"message": "Shapeshift를 통해서 구매하기"
},
@@ -955,12 +1054,21 @@
"showQRCode": {
"message": "QR 코드 보기"
},
+ "showHexData": {
+ "message": "Hex 데이터 보기"
+ },
+ "showHexDataDescription": {
+ "message": "선택하면 전송화면의 hex 데이터 필드 값을 보여줍니다."
+ },
"sign": {
"message": "서명"
},
"signed": {
"message": "서명됨"
},
+ "signatureRequest": {
+ "message": "서명 요청"
+ },
"signMessage": {
"message": "메시지 서명"
},
@@ -1058,6 +1166,9 @@
"total": {
"message": "합계"
},
+ "transaction": {
+ "message": "트랜잭션"
+ },
"transactions": {
"message": "트랜잭션"
},
@@ -1104,6 +1215,9 @@
"unavailable": {
"message": "이용할 수 없음"
},
+ "units": {
+ "message": "단위"
+ },
"unknown": {
"message": "알 수 없음"
},
@@ -1174,11 +1288,14 @@
"whatsThis": {
"message": "이것은 무엇인가요?"
},
+ "yesLetsTry": {
+ "message": "네, 시도해보겠습니다."
+ },
"yourSigRequested": {
"message": "서명을 요청 중입니다."
},
"youSign": {
- "message": "서명 중입니다"
+ "message": "서명합니다"
},
"yourPrivateSeedPhrase": {
"message": "개인 시드 구문"
diff --git a/app/_locales/nl/messages.json b/app/_locales/nl/messages.json
index 77d899df7..595b93795 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"
},
@@ -444,7 +489,7 @@
"message": "back-up woorden hebben alleen kleine letters"
},
"mainnet": {
- "message": "belangrijkste Ethereum-netwerk"
+ "message": "Main Netwerk"
},
"message": {
"message": "Bericht"
diff --git a/app/_locales/ph/messages.json b/app/_locales/ph/messages.json
index 516b4eaaf..da3cf266d 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/pl/messages.json b/app/_locales/pl/messages.json
new file mode 100644
index 000000000..c6d797c34
--- /dev/null
+++ b/app/_locales/pl/messages.json
@@ -0,0 +1,1213 @@
+{
+ "accept": {
+ "message": "Akceptacja"
+ },
+ "accessingYourCamera": {
+ "message": "Uruchamianie kamery..."
+ },
+ "account": {
+ "message": "Konto"
+ },
+ "accountDetails": {
+ "message": "Szczegóły konta"
+ },
+ "accountName": {
+ "message": "Nazwa konta"
+ },
+ "accountSelectionRequired": {
+ "message": "Należy wybrać konto!"
+ },
+ "address": {
+ "message": "Adres"
+ },
+ "addCustomToken": {
+ "message": "Dodaj token"
+ },
+ "addToken": {
+ "message": "Dodaj token"
+ },
+ "addTokens": {
+ "message": "Dodaj tokeny"
+ },
+ "addSuggestedTokens": {
+ "message": "Dodaj sugerowane tokeny."
+ },
+ "addAcquiredTokens": {
+ "message": "Dodaj tokeny pozyskane przy pomocy MetaMask"
+ },
+ "amount": {
+ "message": "Ilość"
+ },
+ "amountPlusGas": {
+ "message": "Ilość + gaz"
+ },
+ "appDescription": {
+ "message": "Wtyczka przeglądarki do Ethereum",
+ "description": "Opis aplikacji"
+ },
+ "appName": {
+ "message": "MetaMask",
+ "description": "Nazwa aplikacji"
+ },
+ "approve": {
+ "message": "Zatwierdź"
+ },
+ "approved": {
+ "message": "Zatwierdzone"
+ },
+ "attemptingConnect": {
+ "message": "Próba połączenia z blockchainem."
+ },
+ "attributions": {
+ "message": "Atrybuty"
+ },
+ "available": {
+ "message": "Dostępne"
+ },
+ "back": {
+ "message": "Wstecz"
+ },
+ "balance": {
+ "message": "Ilość środków"
+ },
+ "balances": {
+ "message": "Ilość tokenów"
+ },
+ "balanceIsInsufficientGas": {
+ "message": "Niewystarczająca ilość środków na opłatę za gaz"
+ },
+ "beta": {
+ "message": "BETA"
+ },
+ "betweenMinAndMax": {
+ "message": "musi być większe lub równe $1 i mniejsze lub równe $2,",
+ "description": "pomoc przy wpisywaniu hex jako dane dziesiętne"
+ },
+ "blockiesIdenticon": {
+ "message": "Użyj Blockies Identicon"
+ },
+ "borrowDharma": {
+ "message": "Pożycz z Dharma (Beta)"
+ },
+ "browserNotSupported": {
+ "message": "Twoja przeglądarka nie jest obsługiwana..."
+ },
+ "builtInCalifornia": {
+ "message": "MetaMask został zaprojektowany i stworzony w Kaliforni."
+ },
+ "buy": {
+ "message": "Kup"
+ },
+ "buyCoinbase": {
+ "message": "Kup na Coinbase"
+ },
+ "buyCoinbaseExplainer": {
+ "message": "Coinbase to najpopularniejszy sposób na kupno i sprzedaż Bitcoin, Ethereum i Litecoin."
+ },
+ "bytes": {
+ "message": "Bajty"
+ },
+ "ok": {
+ "message": "Ok"
+ },
+ "cancel": {
+ "message": "Anuluj"
+ },
+ "classicInterface": {
+ "message": "Użyj klasycznego interfejsu"
+ },
+ "clickCopy": {
+ "message": "Kliknij żeby skopiować"
+ },
+ "close": {
+ "message": "Zamknij"
+ },
+ "chromeRequiredForHardwareWallets": {
+ "message": "Żeby połączyć się z portfelem sprzętowym, należy uruchomić MetaMask z przeglądarką Google Chrome."
+ },
+ "confirm": {
+ "message": "Potwierdź"
+ },
+ "confirmed": {
+ "message": "Potwierdzone"
+ },
+ "confirmContract": {
+ "message": "Zatwierdź kontrakt"
+ },
+ "confirmPassword": {
+ "message": "Potwierdź hasło"
+ },
+ "confirmTransaction": {
+ "message": "Potwierdź transakcję"
+ },
+ "connectHardwareWallet": {
+ "message": "Podłącz portfel sprzętowy"
+ },
+ "connect": {
+ "message": "Połącz"
+ },
+ "connecting": {
+ "message": "Łączenie..."
+ },
+ "connectToLedger": {
+ "message": "Połącz z Ledger"
+ },
+ "connectToTrezor": {
+ "message": "Połącz z Trezor"
+ },
+ "continue": {
+ "message": "Kontynuuj"
+ },
+ "continueToCoinbase": {
+ "message": "Przejdź do Coinbase"
+ },
+ "contractDeployment": {
+ "message": "Uruchomienie kontraktu"
+ },
+ "conversionProgress": {
+ "message": "Przeliczanie w toku"
+ },
+ "copiedButton": {
+ "message": "Skopiowane"
+ },
+ "copiedClipboard": {
+ "message": "Skopiowane do schowka"
+ },
+ "copiedExclamation": {
+ "message": "Skopiowane!"
+ },
+ "copiedSafe": {
+ "message": "Skopiowałem to w bezpieczne miejsce"
+ },
+ "copy": {
+ "message": "Skopiuj"
+ },
+ "copyContractAddress": {
+ "message": "Skopiuj adres kontaktowy"
+ },
+ "copyAddress": {
+ "message": "Skopiuj adres do schowka"
+ },
+ "copyToClipboard": {
+ "message": "Skopiuj do schowka"
+ },
+ "copyButton": {
+ "message": " Skopiuj "
+ },
+ "copyPrivateKey": {
+ "message": "To jest Twój prywatny klucz (kliknij żeby skopiować)"
+ },
+ "create": {
+ "message": "Utwórz"
+ },
+ "createAccount": {
+ "message": "Utwórz konto"
+ },
+ "createDen": {
+ "message": "Utwórz"
+ },
+ "crypto": {
+ "message": "Krypto",
+ "description": "Tym platformy wymiany (kryptowaluty)"
+ },
+ "currentConversion": {
+ "message": "Obecny kurs"
+ },
+ "currentNetwork": {
+ "message": "Bieżąca sieć"
+ },
+ "customGas": {
+ "message": "Ustaw gaz"
+ },
+ "customToken": {
+ "message": "Własny token"
+ },
+ "customize": {
+ "message": "Ustaw"
+ },
+ "customRPC": {
+ "message": "Własne RPC"
+ },
+ "decimalsMustZerotoTen": {
+ "message": "Liczb po przecinku musi być co najmniej 0 i nie więcej niż 36."
+ },
+ "decimal": {
+ "message": "Dokładność liczb po przecinku"
+ },
+ "defaultNetwork": {
+ "message": "Domyślna sieć dla Eteru to Main Net."
+ },
+ "denExplainer": {
+ "message": "Twój DEN to chroniony hasłem schowek w MetaMasku."
+ },
+ "deposit": {
+ "message": "Zdeponuj"
+ },
+ "depositBTC": {
+ "message": "Zdeponuj swoje BTC na poniższy adres:"
+ },
+ "depositCoin": {
+ "message": "Zdeponuj $1 na poniższy adres",
+ "description": "Pokazuje użytkownikowi jakie waluty wybrał do zdeponowania w ShapeShift"
+ },
+ "depositEth": {
+ "message": "Zdeponuj Eth"
+ },
+ "depositEther": {
+ "message": "Zdeponuj Eter"
+ },
+ "depositFiat": {
+ "message": "Zdeponuj w Fiat"
+ },
+ "depositFromAccount": {
+ "message": "Zdeponuj z innego konta"
+ },
+ "depositShapeShift": {
+ "message": "Zdeponuj przez ShapeShift"
+ },
+ "depositShapeShiftExplainer": {
+ "message": "Jeśli posiadasz inne kryptowaluty, możesz nimi handlować i deponować Eter bezpośrednio do swojego portfela MetaMask. Nie trzeba żadnego konta."
+ },
+ "details": {
+ "message": "Szczegóły"
+ },
+ "directDeposit": {
+ "message": "Bezpośredni depozyt"
+ },
+ "directDepositEther": {
+ "message": "Zdeponuj Eter bezpośrednio"
+ },
+ "directDepositEtherExplainer": {
+ "message": "Jeśli już masz Eter, najszybciej umieścisz go w swoim nowym portfelu przy pomocy bezpośredniego depozytu."
+ },
+ "done": {
+ "message": "Gotowe"
+ },
+ "downloadGoogleChrome": {
+ "message": "Ściągnij Google Chrome"
+ },
+ "downloadStateLogs": {
+ "message": "Załaduj logi stanów"
+ },
+ "dontHaveAHardwareWallet": {
+ "message": "Nie masz portfela sprzętowego?"
+ },
+ "dropped": {
+ "message": "Odrzucone"
+ },
+ "edit": {
+ "message": "Edytuj"
+ },
+ "editAccountName": {
+ "message": "Edytuj nazwę konta"
+ },
+ "editingTransaction": {
+ "message": "Dokonaj zmian w swojej transakcji"
+ },
+ "emailUs": {
+ "message": "Napisz do nas!"
+ },
+ "encryptNewDen": {
+ "message": "Zaszyfruj swój nowy DEN"
+ },
+ "ensNameNotFound": {
+ "message": "Nie znaleziono nazwy ENS"
+ },
+ "enterPassword": {
+ "message": "Wpisz hasło"
+ },
+ "enterPasswordConfirm": {
+ "message": "Wpisz hasło żeby potwierdzić"
+ },
+ "enterPasswordContinue": {
+ "message": "Podaj hasło żeby kontynuować"
+ },
+ "parameters": {
+ "message": "Parametry"
+ },
+ "passwordNotLongEnough": {
+ "message": "Hasło jest za krótkie"
+ },
+ "passwordsDontMatch": {
+ "message": "Hasła są niezgodne"
+ },
+ "etherscanView": {
+ "message": "Zobacz konto na Etherscan"
+ },
+ "exchangeRate": {
+ "message": "Kurs wymiany"
+ },
+ "exportPrivateKey": {
+ "message": "Eksportuj klucz prywatny"
+ },
+ "exportPrivateKeyWarning": {
+ "message": "Eksportujesz prywatne klucze na własne ryzyko."
+ },
+ "failed": {
+ "message": "Nie udało się"
+ },
+ "fiat": {
+ "message": "FIAT",
+ "description": "Rodzaj wymiany"
+ },
+ "fileImportFail": {
+ "message": "Importowanie pliku nie działa? Kliknij tutaj!",
+ "description": "Wspomaga użytkowników przy importowaniu ich konta z pliku JSON"
+ },
+ "followTwitter": {
+ "message": "Śledź nas na Twitterze"
+ },
+ "forgetDevice": {
+ "message": "Usuń to urządzenie."
+ },
+ "from": {
+ "message": "Z"
+ },
+ "fromToSame": {
+ "message": "Adresy Z i Do nie mogą być identyczne"
+ },
+ "fromShapeShift": {
+ "message": "Z ShapeShift"
+ },
+ "functionType": {
+ "message": "Typ funkcji"
+ },
+ "gas": {
+ "message": "Gaz",
+ "description": "Krótkie oznaczenie kosztu gazu"
+ },
+ "gasFee": {
+ "message": "Opłata za gaz"
+ },
+ "gasLimit": {
+ "message": "Limit gazu"
+ },
+ "gasLimitCalculation": {
+ "message": "Obliczamy sugerowany limit gazu na podstawie danych z transakcji w sieci."
+ },
+ "gasLimitRequired": {
+ "message": "Limit gazu jest wymagany"
+ },
+ "gasLimitTooLow": {
+ "message": "Limit gazu musi wynosić co najmniej 21000"
+ },
+ "generatingSeed": {
+ "message": "Generowanie seed..."
+ },
+ "gasPrice": {
+ "message": "Cena gazu (GWEI)"
+ },
+ "gasPriceCalculation": {
+ "message": "Obliczamy ceny gazu na podstawie danych z transakcji w sieci."
+ },
+ "gasPriceRequired": {
+ "message": "Wymagana cena gazu"
+ },
+ "generatingTransaction": {
+ "message": "Generowanie transakcji"
+ },
+ "getEther": {
+ "message": "Zdobądź Eter"
+ },
+ "getEtherFromFaucet": {
+ "message": "Zdobądź Eter ze źródła za $1",
+ "description": "Wyświetla nazwę sieci dla źródła Eteru"
+ },
+ "getHelp": {
+ "message": "Po pomoc."
+ },
+ "greaterThanMin": {
+ "message": "musi być większe lub równe $1.",
+ "description": "pomoc przy wpisywaniu hex jako dane dziesiętne"
+ },
+ "hardware": {
+ "message": "sprzęt"
+ },
+ "hardwareWalletConnected": {
+ "message": "Podłączono sprzętowy portfel"
+ },
+ "hardwareWallets": {
+ "message": "Podłącz sprzętowy portfel"
+ },
+ "hardwareWalletsMsg": {
+ "message": "Wybierz portfel sprzętowy, którego chcesz użyć z MetaMaskiem"
+ },
+ "havingTroubleConnecting": {
+ "message": "Problem z połączeniem?"
+ },
+ "here": {
+ "message": "tutaj",
+ "description": "jak w -kliknij tutaj- po więcej informacji (połączone z troubleTokenBalances)"
+ },
+ "hereList": {
+ "message": "Oto lista!!!"
+ },
+ "hexData": {
+ "message": "Dane Hex"
+ },
+ "hide": {
+ "message": "Schowaj"
+ },
+ "hideToken": {
+ "message": "Schowaj token"
+ },
+ "hideTokenPrompt": {
+ "message": "Schować token?"
+ },
+ "history": {
+ "message": "Historia"
+ },
+ "howToDeposit": {
+ "message": "Jak chcesz zdeponować Eter?"
+ },
+ "holdEther": {
+ "message": "Umożliwia przechowywanie eteru i tokenów oraz służy jako łącznik do zdecentralizowanych aplikacji."
+ },
+ "import": {
+ "message": "Importuj",
+ "description": "Przycisk do importowania konta z wybranego pliku."
+ },
+ "importAccount": {
+ "message": "Importuj konto"
+ },
+ "importAccountMsg": {
+ "message": " Importowane konta nie będą powiązane z Twoją pierwotną frazą seed MetaMask. Dowiedz się więcej o importowaniu kont "
+ },
+ "importAnAccount": {
+ "message": "Importuj konto"
+ },
+ "importDen": {
+ "message": "Importuj istniejące DEN"
+ },
+ "imported": {
+ "message": "Zaimportowane",
+ "description": "status pokazujący, że konto zostało w pełni załadowane na keyring"
+ },
+ "importUsingSeed": {
+ "message": "Importuj przy pomocy frazy seed konta"
+ },
+ "infoHelp": {
+ "message": "Info & pomoc"
+ },
+ "initialTransactionConfirmed": {
+ "message": "Twoja transakcja została potwierdzona w sieci. Kliknij OK żeby wrócić."
+ },
+ "insufficientFunds": {
+ "message": "Niewystarczające środki."
+ },
+ "insufficientTokens": {
+ "message": "Niewystarczająca liczba tokenów."
+ },
+ "invalidAddress": {
+ "message": "Nieprawidłowy adres"
+ },
+ "invalidAddressRecipient": {
+ "message": "Nieprawidłowy adres odbiorcy"
+ },
+ "invalidGasParams": {
+ "message": "Nieprawidłowe parametry gazu"
+ },
+ "invalidInput": {
+ "message": "Nieprawidłowe dane."
+ },
+ "invalidRequest": {
+ "message": "Nieprawidłowe zapytanie"
+ },
+ "invalidRPC": {
+ "message": "Nieprawidłowe RPC URI"
+ },
+ "invalidSeedPhrase": {
+ "message": "Nieprawidłowa fraza seed"
+ },
+ "jsonFail": {
+ "message": "Coś poszło nie tak. Upewnij się, że plik JSON jest prawidłowo sformatowany."
+ },
+ "jsonFile": {
+ "message": "Plik JSON",
+ "description": "formatuj do importowania konta"
+ },
+ "keepTrackTokens": {
+ "message": "Monitoruj stan tokenów kupionych przy pomocy konta MetaMask."
+ },
+ "kovan": {
+ "message": "Sieć testowa Kovan"
+ },
+ "knowledgeDataBase": {
+ "message": "Sprawdź naszą Bazę wiedzy."
+ },
+ "max": {
+ "message": "Maks."
+ },
+ "learnMore": {
+ "message": "Dowiedz się więcej"
+ },
+ "ledgerAccountRestriction": {
+ "message": "Musisz użyć swojego poprzedniego konta zanim dodasz kolejne."
+ },
+ "lessThanMax": {
+ "message": "musi być mniejsze lub równe $1.",
+ "description": "pomoc przy wpisywaniu hex jako dane dziesiętne"
+ },
+ "likeToAddTokens": {
+ "message": "Czy chcesz dodać te tokeny?"
+ },
+ "links": {
+ "message": "Łącza"
+ },
+ "limit": {
+ "message": "Limit"
+ },
+ "loading": {
+ "message": "Ładowanie..."
+ },
+ "loadingTokens": {
+ "message": "Ładowanie tokenów..."
+ },
+ "localhost": {
+ "message": "Serwer lokalny 8545"
+ },
+ "login": {
+ "message": "Zaloguj się"
+ },
+ "logout": {
+ "message": "Wyloguj się"
+ },
+ "loose": {
+ "message": "Porzuć"
+ },
+ "loweCaseWords": {
+ "message": "słowa seed mogą być pisane wyłącznie małymi literami"
+ },
+ "mainnet": {
+ "message": "Główna sieć Ethereum"
+ },
+ "menu": {
+ "message": "Menu"
+ },
+ "message": {
+ "message": "Wiadomość"
+ },
+ "metamaskDescription": {
+ "message": "MetaMask to bezpieczny portfel dla Ethereum."
+ },
+ "metamaskSeedWords": {
+ "message": "Słowa Seed MetaMask"
+ },
+ "min": {
+ "message": "Minimum"
+ },
+ "myAccounts": {
+ "message": "Moje konta"
+ },
+ "mustSelectOne": {
+ "message": "Należy wybrać co najmniej 1 token."
+ },
+ "needEtherInWallet": {
+ "message": "Żeby skorzystać ze zdecentraliowanych aplikacji (dApps) przy pomocy MetaMask, potrzebujesz Eteru w swoim portfelu."
+ },
+ "needImportFile": {
+ "message": "Musisz wybrać plik do zaimportowania.",
+ "description": "Użytkownik importuje konto i musi dodać plik, żeby kontynuować"
+ },
+ "needImportPassword": {
+ "message": "Musisz podać hasło dla wybranego pliku.",
+ "description": "Hasło i plik niezbędne do zaimportowania konta"
+ },
+ "negativeETH": {
+ "message": "Nie można wysłać ujemnych ilości ETH."
+ },
+ "networks": {
+ "message": "Sieci"
+ },
+ "nevermind": {
+ "message": "Nie ważne"
+ },
+ "newAccount": {
+ "message": "Nowe konto"
+ },
+ "newAccountNumberName": {
+ "message": "Konto $1",
+ "description": "Automatyczna nazwa kolejnego konta utworzonego w widoku Utwórz konto"
+ },
+ "newContract": {
+ "message": "Nowy kontrakt"
+ },
+ "newPassword": {
+ "message": "Nowe hasło (min. 8 znaków)"
+ },
+ "newRecipient": {
+ "message": "Nowy odbiorca"
+ },
+ "newRPC": {
+ "message": "Nowy RPC URL"
+ },
+ "next": {
+ "message": "Dalej"
+ },
+ "noAddressForName": {
+ "message": "Nie wybrano żadnego adresu dla tej nazwy."
+ },
+ "noDeposits": {
+ "message": "Brak otrzymanych depozytów"
+ },
+ "noConversionRateAvailable": {
+ "message": "Brak kursu waluty"
+ },
+ "noTransactionHistory": {
+ "message": "Brak historii transakcji."
+ },
+ "noTransactions": {
+ "message": "Nie ma transakcji"
+ },
+ "notFound": {
+ "message": "Nie znaleziono"
+ },
+ "notStarted": {
+ "message": "Nie rozpoczęto"
+ },
+ "noWebcamFoundTitle": {
+ "message": "Nie znaleziono kamery"
+ },
+ "noWebcamFound": {
+ "message": "Twoja kamera nie została znaleziona. Spróbuj ponownie."
+ },
+ "oldUI": {
+ "message": "Stary interfejs"
+ },
+ "oldUIMessage": {
+ "message": "Wróciłeś do starego interfejsu. Możesz włączyć nowy interfejs przez opcje w rozwijanym menu w prawym górnym rogu."
+ },
+ "openInTab": {
+ "message": "Otwórz w zakładce"
+ },
+ "or": {
+ "message": "lub",
+ "description": "wybór między tworzeniem i importowaniem nowego konta"
+ },
+ "origin": {
+ "message": "Pochodzenie"
+ },
+ "password": {
+ "message": "Hasło"
+ },
+ "passwordCorrect": {
+ "message": "Upewnij się, że Twoje hasło jest poprawne."
+ },
+ "passwordMismatch": {
+ "message": "hasła nie są takie same",
+ "description": "podczas tworzenia hasła, tekst w dwóch polach haseł nie był taki sam"
+ },
+ "passwordShort": {
+ "message": "hasło za krótkie",
+ "description": "podczas tworzenia hasła, hasło nie jest bezpieczne, ponieważ nie jest wystarczająco długie"
+ },
+ "pastePrivateKey": {
+ "message": "Tutaj wklej swój prywatny klucz:",
+ "description": "Do importowania konta z prywatnego klucza"
+ },
+ "pasteSeed": {
+ "message": "Tutaj wklej swoją frazę seed!"
+ },
+ "pending": {
+ "message": "oczekiwanie"
+ },
+ "personalAddressDetected": {
+ "message": "Wykryto osobisty adres. Wprowadź adres kontraktu tokenów."
+ },
+ "pleaseReviewTransaction": {
+ "message": "Proszę, sprawdź transakcję."
+ },
+ "popularTokens": {
+ "message": "Popularne tokeny"
+ },
+ "prev": {
+ "message": "Poprzednie"
+ },
+ "privacyMsg": {
+ "message": "Polityka prywatności"
+ },
+ "privateKey": {
+ "message": "Klucz prywatny",
+ "description": "wybierz ten typ pliku żeby importować konto"
+ },
+ "privateKeyWarning": {
+ "message": "Uwaga: Nie ujawniaj nikomu tego klucza. Ktokolwiek posiadający Twoje prywatne klucze może użyć środków znajdujących się na Twoim koncie."
+ },
+ "privateNetwork": {
+ "message": "Sieć prywatna"
+ },
+ "qrCode": {
+ "message": "Pokaż kod QR"
+ },
+ "queue": {
+ "message": "Kolejka"
+ },
+ "readdToken": {
+ "message": "Możesz później ponownie dodać ten token poprzez \"Dodaj token\" w opcjach menu swojego konta."
+ },
+ "readMore": {
+ "message": "Dowiedz się więcej tutaj."
+ },
+ "readMore2": {
+ "message": "Dowiedz się więcej."
+ },
+ "receive": {
+ "message": "Otrzymaj"
+ },
+ "recipientAddress": {
+ "message": "Adres odbiorcy"
+ },
+ "refundAddress": {
+ "message": "Twój adres na zwroty"
+ },
+ "rejected": {
+ "message": "Odrzucone"
+ },
+ "reset": {
+ "message": "Reset"
+ },
+ "resetAccount": {
+ "message": "Resetuj konto"
+ },
+ "resetAccountDescription": {
+ "message": "Zresetowanie konta wyczyści Twoją historię transakcji."
+ },
+ "restoreFromSeed": {
+ "message": "Przywrócić konto?"
+ },
+ "restoreVault": {
+ "message": "Przywróć schowek"
+ },
+ "restoreAccountWithSeed": {
+ "message": "Przywróć konto frazą seed"
+ },
+ "required": {
+ "message": "Wymagane"
+ },
+ "retryWithMoreGas": {
+ "message": "Spróbuj ponownie z większą ceną gazu"
+ },
+ "walletSeed": {
+ "message": "Seed portfela"
+ },
+ "restore": {
+ "message": "Przywróć"
+ },
+ "revealSeedWords": {
+ "message": "Pokaż słowa seed"
+ },
+ "revealSeedWordsTitle": {
+ "message": "Fraza seed"
+ },
+ "revealSeedWordsDescription": {
+ "message": "Jeśli kiedyś zmienisz przeglądarkę lub komputer, będziesz potrzebować tej frazy seed, żeby dostać się do swoich kont. Zapisz ją w bezpiecznym miejscu."
+ },
+ "revealSeedWordsWarningTitle": {
+ "message": "NIE pokazuj tej frazy nikomu!"
+ },
+ "revealSeedWordsWarning": {
+ "message": "Te słowa mogą być użyte żeby ukraść Twoje konta."
+ },
+ "revert": {
+ "message": "Wycofaj"
+ },
+ "remove": {
+ "message": "usuń"
+ },
+ "removeAccount": {
+ "message": "Usuń konto"
+ },
+ "removeAccountDescription": {
+ "message": "To konto będzie usunięte z Twojego portfela. Zanim przejdziesz dalej, upewnij się, że masz frazę seed i klucz prywatny do tego importowanego konta. Możesz później importować lub utworzyć nowe konta z rozwijanego menu kont. "
+ },
+ "readyToConnect": {
+ "message": "Gotowy na połączenie?"
+ },
+ "rinkeby": {
+ "message": "Sieć testowa Rinkeby"
+ },
+ "ropsten": {
+ "message": "Sieć testowa Ropsten"
+ },
+ "rpc": {
+ "message": "Indywidualne RPC"
+ },
+ "currentRpc": {
+ "message": "Obecne RPC"
+ },
+ "connectingToMainnet": {
+ "message": "Łączenie z główną siecią Ethereum"
+ },
+ "connectingToRopsten": {
+ "message": "Łączenie z siecią testową Ropsten"
+ },
+ "connectingToKovan": {
+ "message": "Łączenie z siecią testową Kovan"
+ },
+ "connectingToRinkeby": {
+ "message": "Łączenie z siecią testową Rinkeby"
+ },
+ "connectingToUnknown": {
+ "message": "Łączenie z nieznaną siecią"
+ },
+ "sampleAccountName": {
+ "message": "Np. Moje nowe konto",
+ "description": "Umożliwia użytkownikom zrozumieć ideę dodawania własnej nazwy to ich konta"
+ },
+ "save": {
+ "message": "Zapisz"
+ },
+ "speedUpTitle": {
+ "message": "Przyspiesz transakcję"
+ },
+ "speedUpSubtitle": {
+ "message": "Zwiększ cenę gazu żeby nadpisać i przyspieszyć transakcję"
+ },
+ "saveAsCsvFile": {
+ "message": "Zapisz jako plik CSV"
+ },
+ "saveAsFile": {
+ "message": "Zapisz jako",
+ "description": "Proces eksportu konta"
+ },
+ "saveSeedAsFile": {
+ "message": "Zapisz słowa seed jako plik"
+ },
+ "search": {
+ "message": "Szukaj"
+ },
+ "searchResults": {
+ "message": "Wyniki wyszukiwania"
+ },
+ "secretPhrase": {
+ "message": "Żeby otworzyć schowek, wpisz tutaj swoją frazę dwunastu słów."
+ },
+ "showHexData": {
+ "message": "Pokaż dane hex"
+ },
+ "showHexDataDescription": {
+ "message": "Wybierz to żeby pokazać pole danych hex na ekranie wysyłania"
+ },
+ "newPassword8Chars": {
+ "message": "Nowe hasło (min. 8 znaków)"
+ },
+ "seedPhraseReq": {
+ "message": "Frazy seed mają 12 słów"
+ },
+ "select": {
+ "message": "Wybierz"
+ },
+ "selectCurrency": {
+ "message": "Wybierz walutę"
+ },
+ "selectService": {
+ "message": "Wybierz usługę"
+ },
+ "selectType": {
+ "message": "Wybierz rodzaj"
+ },
+ "send": {
+ "message": "Wyślij"
+ },
+ "sendETH": {
+ "message": "Wyślij ETH"
+ },
+ "sendTokens": {
+ "message": "Wyślij tokeny"
+ },
+ "sentEther": {
+ "message": "wyślij eter"
+ },
+ "sentTokens": {
+ "message": "wysłane tokeny"
+ },
+ "separateEachWord": {
+ "message": "Oddziel słowa pojedynczą spacją"
+ },
+ "onlySendToEtherAddress": {
+ "message": "Na adres Ethereum wysyłaj tylko ETH."
+ },
+ "onlySendTokensToAccountAddress": {
+ "message": "Wyślij tylko $1 na adres konta Ethereum.",
+ "description": "wyświetla symbol tokena"
+ },
+ "orderOneHere": {
+ "message": "Zamów Trezor lub Ledger i trzymaj swoje środki w portfelu sprzętowym."
+ },
+ "outgoing": {
+ "message": "Wychodzące"
+ },
+ "searchTokens": {
+ "message": "Szukaj tokenów"
+ },
+ "selectAnAddress": {
+ "message": "Wybierz adres"
+ },
+ "selectAnAccount": {
+ "message": "Wybierz konto"
+ },
+ "selectAnAccountHelp": {
+ "message": "Wybierz konto do przeglądania w MetaMask"
+ },
+ "selectHdPath": {
+ "message": "Wybierz ścieżkę HD"
+ },
+ "selectPathHelp": {
+ "message": "Jeśli nie widzisz poniżej swoich kont Ledger, spróbuj przełączyć się na \"Legacy (MEW / MyCrypto)\""
+ },
+ "sendTokensAnywhere": {
+ "message": "Wyślij tokeny do kogoś z adresem Ethereum"
+ },
+ "settings": {
+ "message": "Ustawienia"
+ },
+ "step1HardwareWallet": {
+ "message": "1. Podłącz portfel sprzętowy"
+ },
+ "step1HardwareWalletMsg": {
+ "message": "Połącz swój portfel sprzętowy z komputerem."
+ },
+ "step2HardwareWallet": {
+ "message": "2. Wybierz konto"
+ },
+ "step2HardwareWalletMsg": {
+ "message": "Wybierz konto, które chcesz przeglądać. Możesz wybrać tylko jedno konto w danym momencie."
+ },
+ "step3HardwareWallet": {
+ "message": "3. Zacznij używać dystrybuowanych aplikacji (dApps) i wiele więcej!"
+ },
+ "step3HardwareWalletMsg": {
+ "message": "Używaj swojego konta sprzętowego tak, jak używasz jakiegokolwiek konta z Ethereum. Loguj się do dystrybuowanych aplikacji (dApps), wysyłaj Eth, kupuj i przechowaj tokeny ERC20 i niewymienne tokeny, jak np. CryptoKitties."
+ },
+ "info": {
+ "message": "Info"
+ },
+ "scanInstructions": {
+ "message": "Umieść kod QR na wprost kamery"
+ },
+ "scanQrCode": {
+ "message": "Skanuj kod QR"
+ },
+ "shapeshiftBuy": {
+ "message": "Kup w ShapeShift"
+ },
+ "showPrivateKeys": {
+ "message": "Pokaż prywatne klucze"
+ },
+ "showQRCode": {
+ "message": "Pokaż kod QR"
+ },
+ "sign": {
+ "message": "Podpisz"
+ },
+ "signatureRequest": {
+ "message": "Prośba o podpis"
+ },
+ "signed": {
+ "message": "Podpisane"
+ },
+ "signMessage": {
+ "message": "Podpisz wiadomość"
+ },
+ "signNotice": {
+ "message": "Podpisanie tej wiadomości może mieć \nniebezpieczne skutki uboczne. Podpisuj wiadomości \ntylko ze stron, którym chcesz udostępnić swoje konto.\nTa niebezpieczna metoda będzie usunięta w przyszłych wersjach. "
+ },
+ "sigRequest": {
+ "message": "Prośba o podpis"
+ },
+ "sigRequested": {
+ "message": "Podpis wymagany"
+ },
+ "spaceBetween": {
+ "message": "między słowami może być tylko pojedyncza spacja"
+ },
+ "status": {
+ "message": "Status"
+ },
+ "stateLogs": {
+ "message": "Logi stanów"
+ },
+ "stateLogsDescription": {
+ "message": "Logi stanów zawierają Twoje publiczne adresy kont i wykonanych transakcji."
+ },
+ "stateLogError": {
+ "message": "Błąd podczas pobierania logów stanów."
+ },
+ "submit": {
+ "message": "Wyślij"
+ },
+ "submitted": {
+ "message": "Wysłane"
+ },
+ "supportCenter": {
+ "message": "Odwiedź nasze Centrum Pomocy"
+ },
+ "symbolBetweenZeroTen": {
+ "message": "Symbol musi mieć od 0 do 10 znaków."
+ },
+ "takesTooLong": {
+ "message": "Trwa zbyt długo?"
+ },
+ "terms": {
+ "message": "Regulamin"
+ },
+ "testFaucet": {
+ "message": "Źródło testowego ETH"
+ },
+ "to": {
+ "message": "Do"
+ },
+ "toETHviaShapeShift": {
+ "message": "$1 na ETH przez ShapeShift",
+ "description": "system uzupełni typ depozytu na początku wiadomości"
+ },
+ "token": {
+ "message": "Token"
+ },
+ "tokenAddress": {
+ "message": "Adres tokena"
+ },
+ "tokenAlreadyAdded": {
+ "message": "Token jest już dodany."
+ },
+ "tokenBalance": {
+ "message": "Liczba Twoich tokenów:"
+ },
+ "tokenSelection": {
+ "message": "Szukaj tokenów lub wybierz z naszej listy popularnych tokenów."
+ },
+ "tokenSymbol": {
+ "message": "Symbol tokena"
+ },
+ "tokenWarning1": {
+ "message": "Monitoruj stan tokenów kupionych przy pomocy konta MetaMask. Jeśli masz tokeny kupione przy pomocy innych kont, nie pojawią się tutaj."
+ },
+ "total": {
+ "message": "Suma"
+ },
+ "transactions": {
+ "message": "transakcje"
+ },
+ "transactionError": {
+ "message": "Błąd transakcji. Wyjątek w kodzie kontraktu."
+ },
+ "transactionMemo": {
+ "message": "Memo transakcji (opcjonalnie)"
+ },
+ "transactionNumber": {
+ "message": "Numer transakcji"
+ },
+ "transfer": {
+ "message": "Przelew"
+ },
+ "transfers": {
+ "message": "Przelewy"
+ },
+ "trezorHardwareWallet": {
+ "message": "Sprzętowy portfel TREZOR"
+ },
+ "troubleTokenBalances": {
+ "message": "Wystąpił problem z załadowaniem informacji o Twoich tokenach. Można je zobaczyć ",
+ "description": "Z linkiem (tutaj) do informacji o stanie tokenów"
+ },
+ "tryAgain": {
+ "message": "Spróbuj ponownie"
+ },
+ "twelveWords": {
+ "message": "Tych 12 słów to jedyny sposób, żeby odzyskać konta w MetaMasku. Zapisz je w bezpiecznym miejscu."
+ },
+ "typePassword": {
+ "message": "Wpisz hasło"
+ },
+ "uiWelcome": {
+ "message": "Witamy w nowym interfejsie (Beta)"
+ },
+ "uiWelcomeMessage": {
+ "message": "Używasz teraz nowego interfejsu MetaMask."
+ },
+ "unapproved": {
+ "message": "Niezatwierdzone"
+ },
+ "unavailable": {
+ "message": "Niedostępne"
+ },
+ "unknown": {
+ "message": "Nieznane"
+ },
+ "unknownFunction": {
+ "message": "Nieznana funkcja"
+ },
+ "unknownNetwork": {
+ "message": "Nieznana sieć prywatna"
+ },
+ "unknownNetworkId": {
+ "message": "Nieznane sieciowe ID"
+ },
+ "unknownQrCode": {
+ "message": "Błąd: nie mogliśmy odczytać tego kodu QR"
+ },
+ "unknownCameraErrorTitle": {
+ "message": "Ups! Coś poszło nie tak..."
+ },
+ "unknownCameraError": {
+ "message": "Podczas łączenia się z kamerą wystąpił błąd. Spróbuj ponownie..."
+ },
+ "unlock": {
+ "message": "Odblokuj"
+ },
+ "unlockMessage": {
+ "message": "Zdecentralizowana sieć oczekuje"
+ },
+ "uriErrorMsg": {
+ "message": "URI wymaga prawidłowego prefiksu HTTP/HTTPS."
+ },
+ "usaOnly": {
+ "message": "Tylko USA",
+ "description": "Ta platforma wymiany jest dostępna tylko dla osób mieszkających w USA"
+ },
+ "usedByClients": {
+ "message": "Używany przez różnych klientów"
+ },
+ "useOldUI": {
+ "message": "Przełącz na stary interfejs"
+ },
+ "validFileImport": {
+ "message": "Należy wybrać prawidłowy plik do zaimportowania."
+ },
+ "vaultCreated": {
+ "message": "Schowek utworzony"
+ },
+ "viewAccount": {
+ "message": "Zobacz konto"
+ },
+ "viewOnEtherscan": {
+ "message": "Zobacz na Etherscan"
+ },
+ "visitWebSite": {
+ "message": "Odwiedź naszą stronę"
+ },
+ "warning": {
+ "message": "Uwaga"
+ },
+ "welcomeBack": {
+ "message": "Witaj z powrotem!"
+ },
+ "welcomeBeta": {
+ "message": "Witaj w MetaMask Beta"
+ },
+ "whatsThis": {
+ "message": "Co to jest?"
+ },
+ "youNeedToAllowCameraAccess": {
+ "message": "Żeby użyć tej opcji należy podłączyć kamerę"
+ },
+ "yourSigRequested": {
+ "message": "Twój podpis jest wymagany"
+ },
+ "youSign": {
+ "message": "Podpisujesz"
+ },
+ "yourPrivateSeedPhrase": {
+ "message": "Twoja prywatna fraza seed"
+ }
+} \ No newline at end of file
diff --git a/app/_locales/pt/messages.json b/app/_locales/pt/messages.json
index 92d4ae8c7..83fcba6e5 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 e95377c0c..9d4eb2cc2 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 94cda7b44..41abfa4de 100644
--- a/app/_locales/sl/messages.json
+++ b/app/_locales/sl/messages.json
@@ -1,87 +1,138 @@
{
+ "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": "Sprejmi"
+ "message": "Přijmout"
},
"account": {
- "message": "Račun"
+ "message": "Účet"
},
"accountDetails": {
- "message": "Podrobnosti računa"
+ "message": "Detaily účtu"
},
"accountName": {
- "message": "Ime računa"
+ "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"
+ "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"
},
+ "approved": {
+ "message": "Schváleno"
+ },
"attemptingConnect": {
- "message": "Povezovanje z verigo blokov ..."
+ "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": "Vaš znesek"
+ "message": "Zůstatek tokenu"
},
"balanceIsInsufficientGas": {
- "message": "Napačen znesek za skupno gas vrednost"
+ "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": "Uporabite Blockies Identicon"
+ "message": "Použít Blockies Identicon"
},
"borrowDharma": {
- "message": "Izposoja z Dharma (Beta)"
+ "message": "Pújčit si přes Dharma (Beta)"
},
"builtInCalifornia": {
- "message": "MetaMask je 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."
+ "message": "Coinbase je světově nejoblíbenější místo k nákupu a prodeji bitcoinu, etherea nebo litecoinu."
+ },
+ "ok": {
+ "message": "Ok"
},
"buyCoinSwitch": {
"message": "Kupi na CoinSwitch"
@@ -90,739 +141,826 @@
"message": "CoinSwitch je destinacija na enem mestu za izmenjavo več kot 300 kriptokotovitev po najboljši hitrosti."
},
"cancel": {
- "message": "Prekliči"
+ "message": "Zrušit"
},
"classicInterface": {
- "message": "Uporabi navaden način"
+ "message": "Použít klasické rozhraní"
},
"clickCopy": {
- "message": "Kliknite za kopiranje"
+ "message": "Kliknutím zkopírovat"
},
"confirm": {
- "message": "Potrdi"
+ "message": "Potvrdit"
+ },
+ "confirmed": {
+ "message": "Potvrzeno"
},
"confirmContract": {
- "message": "Potrdi pogodbo"
+ "message": "Potvrdit kontrakt"
},
"confirmPassword": {
- "message": "Potrdi geslo"
+ "message": "Potvrdit heslo"
},
"confirmTransaction": {
- "message": "Potrdi transakcijo"
+ "message": "Potvrdit transakci"
},
"continue": {
- "message": "Nadaljuj"
+ "message": "Pokračovat"
},
"continueToCoinbase": {
- "message": "Nadaljuj na Coinbase"
+ "message": "Přejít na Coinbase"
},
"continueToCoinSwitch": {
"message": "Nadaljuj na CoinSwitch"
},
"contractDeployment": {
- "message": "Ustvarjanje pogodbe"
+ "message": "Nasazení kontraktu"
},
"conversionProgress": {
- "message": "Poteka pretvorba"
+ "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"
+ "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 cena"
+ "message": "Aktuální převod"
},
"currentNetwork": {
- "message": "Trenutno omrežje"
+ "message": "Aktuální síť"
},
"customGas": {
- "message": "Prilagodi gas"
+ "message": "Nastavit palivo"
+ },
+ "customToken": {
+ "message": "Vlastní token"
},
"customize": {
- "message": "Prilagodi"
+ "message": "Nastavit"
},
"customRPC": {
- "message": "Poljuben RPC"
+ "message": "Vlastní RPC"
},
"decimalsMustZerotoTen": {
- "message": "Decimalk mora biti vsaj 0, in ne več kot 36."
+ "message": "Desetinných míst musí být od 0 do 36."
},
"decimal": {
- "message": "Decimalke natančnosti"
+ "message": "Počet desetinných míst přesnosti"
},
"defaultNetwork": {
- "message": "Privzeto omrežje za transakcije je Main Net."
+ "message": "Výchozí síť pro Etherové transakce je Main Net."
},
"denExplainer": {
- "message": "DEN je vaša šifrirana shramba v MetaMasku."
+ "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 $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 ethera"
+ "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 vpačate ether 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": "Direktno vplačilo"
+ "message": "Přímý vklad"
},
"directDepositEther": {
- "message": "Direktno vplačilo ehera"
+ "message": "Vložit Ether přímo"
},
"directDepositEtherExplainer": {
- "message": "Če že imate ether, ga lahko najhitreje dobite v MetaMask z direktnim vplačilom."
+ "message": "Pokud už vlastníte nějaký Ether, nejrychleji ho dostanete do peněženky přímým vkladem."
},
"done": {
- "message": "Končano"
+ "message": "Hotovo"
},
"downloadStateLogs": {
- "message": "Prenesi state dnevnike"
+ "message": "Stáhnout stavové protokoly"
+ },
+ "dropped": {
+ "message": "Zrušeno"
},
"edit": {
- "message": "Uredi"
+ "message": "Upravit"
},
"editAccountName": {
- "message": "Uredi ime računa"
+ "message": "Upravit název účtu"
},
"emailUs": {
- "message": "Pišite nam!"
+ "message": "Napište nám e-mail!"
},
"encryptNewDen": {
- "message": "Šifrirajte DEN"
+ "message": "Zašifrujte svůj nový DEN"
},
"enterPassword": {
- "message": "Vpišite geslo"
+ "message": "Zadejte heslo"
},
"enterPasswordConfirm": {
- "message": "Potrdite geslo"
+ "message": "Zadejte heslo k potvrzení"
+ },
+ "passwordNotLongEnough": {
+ "message": "Heslo není dost dlouhé"
+ },
+ "passwordsDontMatch": {
+ "message": "Hesla nejsou stejná"
},
"etherscanView": {
- "message": "Poglejte račun na Etherscan"
+ "message": "Prohlédněte si účet na Etherscan"
},
"exchangeRate": {
- "message": "Menjalni tečaj"
+ "message": "Směnný kurz"
},
"exportPrivateKey": {
- "message": "Izvozi zasebni ključ"
+ "message": "Exportovat privátní klíč"
},
"exportPrivateKeyWarning": {
- "message": "Izvažanje zasebnih ključev je na lastno odgovornost."
+ "message": "Exportujte privátní klíč na vlastní riziko."
},
"failed": {
- "message": "Ni uspelo"
+ "message": "Neúspěšné"
},
"fiat": {
"message": "FIAT",
"description": "Exchange type"
},
"fileImportFail": {
- "message": "Uvoz z datoteko ni uspel? 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"
+ "message": "Sledujte nás na Twitteru"
},
"from": {
"message": "Od"
},
"fromToSame": {
- "message": "From and To address cannot be the same"
+ "message": "Adresy odesílatele a příjemce nemohou být stejné"
},
"fromShapeShift": {
- "message": "Od ShapeShift"
+ "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 najmanj 21000"
+ "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"
+ "message": "Cena paliva je povinná"
},
"getEther": {
- "message": "Pridobite 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"
},
"greaterThanMin": {
- "message": "mora biti višji ali enak $1.",
+ "message": "musí být větší nebo roven $1.",
"description": "helper for inputting hex as decimal input"
},
"here": {
- "message": "tukaj",
+ "message": "zde",
"description": "as in -click here- for more information (goes with troubleTokenBalances)"
},
"hereList": {
- "message": "Tukaj je seznam!!!"
+ "message": "Tady je seznam!!!!"
},
"hide": {
- "message": "Skrij"
+ "message": "Skrýt"
},
"hideToken": {
- "message": "Skrij žeton"
+ "message": "Skrýt token"
},
"hideTokenPrompt": {
- "message": "Skrijem žeton?"
+ "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, da imate eter in žetone in služi kot most za decentralizirane aplikacije."
+ "message": "Dovoluje vám držet ether a tokeny a slouží jako most k decentralizovaným aplikacím."
},
"import": {
- "message": "Uvozi",
+ "message": "Import",
"description": "Button to import an account from a selected file"
},
"importAccount": {
- "message": "Uvozi račun"
+ "message": "Import účtu"
},
"importAccountMsg": {
- "message": " Uvoženi računi ne bodo povezani s prvotnim seedphaseom. 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": "Uvozi 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"
},
"infoHelp": {
- "message": "Info & Pomoč"
+ "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": "Nepravilen naslov"
+ "message": "Neplatná adresa"
},
"invalidAddressRecipient": {
- "message": "Prejemnikov naslov je neveljaven"
+ "message": "Adresa příjemce je neplatná"
},
"invalidGasParams": {
- "message": "Nepravilno nastavljen gas"
+ "message": "Neplatná parametry paliva"
},
"invalidInput": {
- "message": "Napačen vnos."
+ "message": "Neplatný vstup."
},
"invalidRequest": {
- "message": "Napačna zahteva"
+ "message": "Neplatný požadavek"
},
"invalidRPC": {
- "message": "Napačen RPC URI"
+ "message": "Neplatné RPC URI"
},
"jsonFail": {
- "message": "Nekaj je bilo narobe. Prepričajte se, da je JSON datoteka pravilno oblikovana."
+ "message": "Něco se pokazilo. Prosím, ujistěte se, že váš JSON soubor má správný formát."
},
"jsonFile": {
- "message": "JSON datoteka",
+ "message": "JSON soubor",
"description": "format for importing an account"
},
+ "keepTrackTokens": {
+ "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": "Zjistěte více."
},
"lessThanMax": {
- "message": "mora biti večji 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": "Odkazy"
},
"limit": {
- "message": "Omejitev"
+ "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 imajo lahko le male črke"
+ "message": "slova klíčové fráze mají pouze malá písmena"
},
"mainnet": {
- "message": "Glavno omrežje"
+ "message": "Main Ethereum Network"
},
"message": {
- "message": "Sporočilo"
+ "message": "Zpráva"
},
"metamaskDescription": {
- "message": "MetaMask je varen identitetni sklad za Ethereum."
+ "message": "MetaMask je bezpečný osobní trezor pro Ethereum."
},
"min": {
- "message": "Najmanj"
+ "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, ki uporabljajo MetaMask, 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": "Ni mogoče poslati negativne vsote ETH."
+ "message": "Nelze odeslat zápornou částku ETH."
},
"networks": {
- "message": "Omrežja"
+ "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. črk)"
+ "message": "Nové heslo (min 8 znaků)"
},
"newRecipient": {
- "message": "Nov prejemnik"
+ "message": "Nový příjemce"
},
"newRPC": {
- "message": "Nov RPC URL"
+ "message": "Nová RPC URL"
},
"next": {
- "message": "Naprej"
+ "message": "Další"
},
"noAddressForName": {
- "message": "Za to ime ni bil nastavljen noben naslov."
+ "message": "Pro toto jméno nebyla nastavena žádná adresa."
},
"noDeposits": {
- "message": "Ni prejetih vplačil"
+ "message": "Žádný vklad"
},
"noTransactionHistory": {
- "message": "Ni zgodovine transakcij."
+ "message": "Žádná historie transakcí."
},
"noTransactions": {
- "message": "Ni transakcij"
+ "message": "Žádné transakce"
},
"notStarted": {
- "message": "Ni se začelo"
+ "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."
+ "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"
},
"passwordCorrect": {
- "message": "Prepričajte se, da je geslo pravilno."
+ "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"
},
"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 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 phrase!"
+ "message": "Svou klíčovou frázi vložte zde!"
},
"personalAddressDetected": {
- "message": "Osebni naslov je zaznan. Vnesite naslov žetona."
+ "message": "Detekována osobní adresa. Zadejte adresu kontraktu tokenu."
},
"pleaseReviewTransaction": {
- "message": "Preglejte transakcijo."
+ "message": "Zkontrolujte si transakci."
+ },
+ "popularTokens": {
+ "message": "Oblíbené tokeny"
},
"privacyMsg": {
- "message": "Politika zasebnosti"
+ "message": "Zásady ochrany osobních údajů"
},
"privateKey": {
- "message": "Zasebni ključ",
+ "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. Vsakdo s svojimi zasebnimi ključi lahko ukrade vse 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"
+ "message": "Ukázat QR kód"
},
"readdToken": {
- "message": "Ta žeton lahko dodate tudi v prihodnosti, tako da odprete možnost »Dodaj žeton« v meniju z računi."
+ "message": "Tento token můžete v budoucnu přidat zpět s „Přidat token“ v nastavení účtu."
},
"readMore": {
- "message": "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": "Prejmite"
+ "message": "Obrdžet"
},
"recipientAddress": {
- "message": "Prejemnikov naslov"
+ "message": "Adresa příjemce"
},
"refundAddress": {
- "message": "Vaš naslov za vračilo"
+ "message": "Adresa pro vrácení peněz"
},
"rejected": {
- "message": "Zavrnjeno"
+ "message": "Odmítnuto"
},
"resetAccount": {
- "message": "Ponastavi račun"
+ "message": "Resetovat účet"
},
"restoreFromSeed": {
- "message": "Obnovi iz seed phrase"
+ "message": "Obnovit z seed fráze"
+ },
+ "restoreVault": {
+ "message": "Obnovit trezor"
},
"required": {
- "message": "Zahtevano"
+ "message": "Povinné"
},
"retryWithMoreGas": {
- "message": "Poskusi z višjim gas price"
+ "message": "Opakujte s vyšší cenou paliva"
+ },
+ "walletSeed": {
+ "message": "Klíčová fráze peněženky"
},
"revealSeedWords": {
- "message": "Prikaži seed words"
+ "message": "Zobrazit slova klíčové fráze"
},
"revealSeedWordsWarning": {
- "message": "Ne obnovite seed words na javnem mestu! Te besede se lahko uporabijo za krajo vseh vaših računov."
+ "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": "Povrni"
+ "message": "Zvrátit"
},
"rinkeby": {
- "message": "Testno omrežje Rinkeby"
+ "message": "Rinkeby Test Network"
},
"ropsten": {
- "message": "Testno omrežje Ropsten"
+ "message": "Ropsten Test Network"
+ },
+ "currentRpc": {
+ "message": "Současné RPC"
+ },
+ "connectingToMainnet": {
+ "message": "Připojuji se k Main Ethereum Network"
+ },
+ "connectingToRopsten": {
+ "message": "Připojuji se k Ropsten Test Network"
+ },
+ "connectingToKovan": {
+ "message": "Připojuji se k Kovan Test Network"
+ },
+ "connectingToRinkeby": {
+ "message": "Připojuji se k Rinkeby Test Network"
+ },
+ "connectingToUnknown": {
+ "message": "Připojuji se k neznámé síti"
},
"sampleAccountName": {
- "message": "npr. Moj nov 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"
+ },
+ "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"
+ "message": "Uložit slova klíčové fráze do souboru"
},
"search": {
- "message": "Iskanje"
+ "message": "Hledat"
},
"secretPhrase": {
- "message": "Tukaj vnesite svoje seed words, da obnovite svoje račune."
+ "message": "Zadejte svých 12 slov tajné fráze k obnovení trezoru."
+ },
+ "newPassword8Chars": {
+ "message": "Nové heslo (min 8 znaků)"
},
"seedPhraseReq": {
- "message": "seed phrases so dolgi 12 besed"
+ "message": "klíčové fráze mají 12 slov"
},
"select": {
- "message": "Izberi"
+ "message": "Vybrat"
},
"selectCurrency": {
- "message": "Izberi valuto"
+ "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"
+ "message": "Odeslat tokeny"
+ },
+ "onlySendToEtherAddress": {
+ "message": "Posílejte jen ETH na Ethereum adresu."
+ },
+ "searchTokens": {
+ "message": "Hledat tokeny"
},
"sendTokensAnywhere": {
- "message": "Pošljite žetone vsem, ki imajo Ethereum račun"
+ "message": "Posílejte tokeny komukoli s Ethereum účtem"
},
"settings": {
- "message": "Nastavitve"
+ "message": "Nastavení"
+ },
+ "info": {
+ "message": "Informace"
},
"shapeshiftBuy": {
- "message": "Kupite z Shapeshift"
+ "message": "Nakoupit na ShapeShift"
},
"showPrivateKeys": {
- "message": "Prikaži zasebne ključe"
+ "message": "Zobrazit privátní klíče"
},
"showQRCode": {
- "message": "Prikaži QR kodo"
+ "message": "Zobrazit QR kód"
},
"sign": {
- "message": "Podpiši"
+ "message": "Podepsat"
+ },
+ "signed": {
+ "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 je zahtevan"
+ "message": "Požádáno o podpis"
},
"spaceBetween": {
- "message": "med besedami je lahko samo presledek"
+ "message": "mezi slovy může být pouze mezera"
},
"status": {
- "message": "Status"
+ "message": "Stav"
},
"stateLogs": {
- "message": "State dnevniki"
+ "message": "Stavové protokoly"
},
"stateLogsDescription": {
- "message": "State dnevniki vsebujejo naslove vašega računa in poslane transakcije.."
+ "message": "Stavové protokoly obsahují vaše veřejné adresy účtů a odeslané transakce."
+ },
+ "stateLogError": {
+ "message": "Chyba během získávání stavových protokolů."
},
"submit": {
- "message": "Potrdi"
+ "message": "Odeslat"
+ },
+ "submitted": {
+ "message": "Odesláno"
},
"supportCenter": {
- "message": "Obiščite našo podporo"
+ "message": "Navštivte naše centrum podpory"
},
"symbolBetweenZeroTen": {
- "message": "Simbol mora biti dolg od 0 do 10 znakov."
+ "message": "Symbol musí být mezi 0 a 10 znaky."
},
"takesTooLong": {
- "message": "Traja 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"
},
"tokenAddress": {
- "message": "Naslov žetona"
+ "message": "Adresa tokenu"
},
"tokenAlreadyAdded": {
- "message": "Žeton je že bil dodan."
+ "message": "Token byl už přidán."
},
"tokenBalance": {
- "message": "Vaš znesek žetona:"
+ "message": "Váš zůstatek tokenu je:"
},
"tokenSelection": {
- "message": "Poiščite žetone ali jih izberite z našega seznama priljubljenih žetonov."
+ "message": "Vyhledejte token nebo je vyberte z našeho seznamu oblíbených tokenů."
},
"tokenSymbol": {
- "message": "Simbol žetona"
+ "message": "Symbol tokenu"
},
"tokenWarning1": {
- "message": "Spremljajte žetone, ki ste jih kupili s svojim MetaMask računom. Če ste kupili žetone z drugačnim računom, ti žetoni 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"
+ "message": "Celkem"
},
"transactions": {
- "message": "transakcije"
+ "message": "transakce"
+ },
+ "transactionError": {
+ "message": "Chyba transakce. Vyhozena výjimka v kódu kontraktu."
},
"transactionMemo": {
- "message": "Opis transakcije (ni zahtevano)"
+ "message": "Poznámka transakce (nepovinné)"
},
"transactionNumber": {
- "message": "Številka transakcije"
+ "message": "Číslo transakce"
},
"transfers": {
- "message": "Prenosi"
+ "message": "Převody"
},
"troubleTokenBalances": {
- "message": "Imeli smo težave pri nalaganju vaših žetonov. Ogledate si jih lahko ",
+ "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"
},
"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": "Vpišite vaše geslo"
+ "message": "Zadejte své heslo"
},
"uiWelcome": {
- "message": "Dobrodošli v nov UI (Beta)"
+ "message": "Vítejte v novém rozhraní (Beta)"
},
"uiWelcomeMessage": {
- "message": "Zdaj uporabljate novi MetaMask uporabniški vmesnik. Razglejte se, preizkusite nove funkcije, kot so pošiljanje žetonov, in nas obvestite, če imate kakšne težave."
+ "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": "Neschváleno"
},
"unavailable": {
- "message": "Ni na voljo"
+ "message": "Nedostupné"
},
"unknown": {
- "message": "Neznano"
+ "message": "Neznámé"
},
"unknownNetwork": {
- "message": "Neznano zasebno omrežje"
+ "message": "Neznámá soukromá síť"
},
"unknownNetworkId": {
- "message": "Neznan ID omrežja"
+ "message": "Neznámé ID sítě"
},
"uriErrorMsg": {
- "message": "URI-ji 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": "Uporablja jih več različnih odjemalcev"
+ "message": "Používána různými klienty"
},
"useOldUI": {
- "message": "Uporabi star uporabniški vmesnik"
+ "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"
+ "message": "Zobrazit účet"
},
"visitWebSite": {
- "message": "Obiščite našo spletno stran"
+ "message": "Navštivte naši stránku"
},
"warning": {
- "message": "Opozorilo"
+ "message": "Varování"
},
"welcomeBeta": {
- "message": "Dobrodošli v MetaMask Beta"
+ "message": "Vítejte v MetaMask Beta"
},
"whatsThis": {
- "message": "Kaj je to?"
+ "message": "Co to je?"
},
"yourSigRequested": {
- "message": "Vaš podpis je bil zahtevan"
+ "message": "Je vyžadován váš podpis"
},
"youSign": {
- "message": "Podpisani ste"
+ "message": "Podepisujete"
}
-}
+} \ No newline at end of file
diff --git a/app/_locales/th/messages.json b/app/_locales/th/messages.json
index 3bd0c7009..a7af72ee7 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 9de7dc768..1a7f76588 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 7f0374f95..1e51d84c4 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 e496114ee..857f78597 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 5c1397816..5425d60da 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 b29b37c4e..9424b6ded 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/home.html b/app/home.html
index 4fad0f993..051133cf8 100644
--- a/app/home.html
+++ b/app/home.html
@@ -7,6 +7,7 @@
</head>
<body>
<div id="app-content"></div>
+ <script src="./libs.js" type="text/javascript" charset="utf-8"></script>
<script src="./ui.js" type="text/javascript" charset="utf-8"></script>
</body>
</html>
diff --git a/app/images/eth.svg b/app/images/eth.svg
new file mode 100644
index 000000000..6375b790f
--- /dev/null
+++ b/app/images/eth.svg
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 22.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 40 40" style="enable-background:new 0 0 40 40;" xml:space="preserve">
+<style type="text/css">
+ .st0{fill:#38393A;}
+</style>
+<title>deposit-eth</title>
+<desc>Created with Sketch.</desc>
+<g id="deposit-eth" transform="translate(0.000000, 14.000000)">
+ <path id="Shape" class="st0" d="M19.9,16L7.5,8.7L19.9,26L32.3,8.7L19.9,16L19.9,16z M20.1-14L7.7,6.4l12.4,7.3l12.4-7.2L20.1-14z"
+ />
+</g>
+</svg>
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/loading.html b/app/loading.html
index aef5d9607..71403a5ac 100644
--- a/app/loading.html
+++ b/app/loading.html
@@ -1,5 +1,9 @@
-<html>
+<!DOCTYPE html>
+<html lang="en">
<head>
+ <meta charset="UTF-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>MetaMask Loading</title>
<style>
#div-logo {
@@ -31,5 +35,11 @@
<div id="div-logo">
<img id="logo" src="./images/loginglogo.svg">
</div>
+ <script type="text/javascript">
+ // redirect to 404 after one minute
+ setTimeout(() => {
+ location.href = './404.html'
+ }, 60000)
+ </script>
</body>
</html>
diff --git a/app/manifest.json b/app/manifest.json
index cd34a586d..2dd8429af 100644
--- a/app/manifest.json
+++ b/app/manifest.json
@@ -1,7 +1,7 @@
{
"name": "__MSG_appName__",
"short_name": "__MSG_appName__",
- "version": "4.14.0",
+ "version": "5.0.2",
"manifest_version": 2,
"author": "https://metamask.io",
"description": "__MSG_appDescription__",
@@ -77,4 +77,4 @@
"*"
]
}
-}
+} \ No newline at end of file
diff --git a/app/notification.html b/app/notification.html
index 457ba7137..042ffa6b8 100644
--- a/app/notification.html
+++ b/app/notification.html
@@ -11,6 +11,7 @@
</head>
<body class="notification" style="height:600px;">
<div id="app-content"></div>
+ <script src="./libs.js" type="text/javascript" charset="utf-8"></script>
<script src="./ui.js" type="text/javascript" charset="utf-8"></script>
</body>
</html>
diff --git a/app/popup.html b/app/popup.html
index 3acfd8c55..1ba0fda94 100644
--- a/app/popup.html
+++ b/app/popup.html
@@ -7,6 +7,7 @@
</head>
<body style="width:357px; height:600px;">
<div id="app-content"></div>
+ <script src="./libs.js" type="text/javascript" charset="utf-8"></script>
<script src="./ui.js" type="text/javascript" charset="utf-8"></script>
</body>
</html>
diff --git a/app/scripts/background.js b/app/scripts/background.js
index 0343e134c..078e84928 100644
--- a/app/scripts/background.js
+++ b/app/scripts/background.js
@@ -2,6 +2,9 @@
* @file The entry point for the web extension singleton process.
*/
+// this needs to run before anything else
+require('./lib/setupFetchDebugging')()
+
const urlUtil = require('url')
const endOfStream = require('end-of-stream')
const pump = require('pump')
@@ -20,13 +23,13 @@ const createStreamSink = require('./lib/createStreamSink')
const NotificationManager = require('./lib/notification-manager.js')
const MetamaskController = require('./metamask-controller')
const rawFirstTimeState = require('./first-time-state')
-const setupRaven = require('./lib/setupRaven')
+const setupSentry = require('./lib/setupSentry')
const reportFailedTxToSentry = require('./lib/reportFailedTxToSentry')
const setupMetamaskMeshMetrics = require('./lib/setupMetamaskMeshMetrics')
const EdgeEncryptor = require('./edge-encryptor')
const getFirstPreferredLangCode = require('./lib/get-first-preferred-lang-code')
const getObjStructure = require('./lib/getObjStructure')
-const ipfsContent = require('./lib/ipfsContent.js')
+const setupEnsIpfsResolver = require('./lib/ens-ipfs/setup')
const {
ENVIRONMENT_TYPE_POPUP,
@@ -47,7 +50,7 @@ global.METAMASK_NOTIFIER = notificationManager
// setup sentry error reporting
const release = platform.getVersion()
-const raven = setupRaven({ release })
+const sentry = setupSentry({ release })
// browser check if it is Edge - https://stackoverflow.com/questions/9847580/how-to-detect-safari-chrome-ie-firefox-and-opera-browser
// Internet Explorer 6-11
@@ -55,7 +58,6 @@ const isIE = !!document.documentMode
// Edge 20+
const isEdge = !isIE && !!window.StyleMedia
-let ipfsHandle
let popupIsOpen = false
let notificationIsOpen = false
const openMetamaskTabsIDs = {}
@@ -161,7 +163,6 @@ async function initialize () {
const initLangCode = await getFirstPreferredLangCode()
await setupController(initState, initLangCode)
log.debug('MetaMask initialization complete.')
- ipfsHandle = ipfsContent(initState.NetworkController.provider)
}
//
@@ -194,14 +195,14 @@ async function loadStateFromPersistence () {
// we were able to recover (though it might be old)
versionedData = diskStoreState
const vaultStructure = getObjStructure(versionedData)
- raven.captureMessage('MetaMask - Empty vault found - recovered from diskStore', {
+ sentry.captureMessage('MetaMask - Empty vault found - recovered from diskStore', {
// "extra" key is required by Sentry
extra: { vaultStructure },
})
} else {
// unable to recover, clear state
versionedData = migrator.generateInitialState(firstTimeState)
- raven.captureMessage('MetaMask - Empty vault found - unable to recover')
+ sentry.captureMessage('MetaMask - Empty vault found - unable to recover')
}
}
@@ -209,7 +210,7 @@ async function loadStateFromPersistence () {
migrator.on('error', (err) => {
// get vault structure without secrets
const vaultStructure = getObjStructure(versionedData)
- raven.captureException(err, {
+ sentry.captureException(err, {
// "extra" key is required by Sentry
extra: { vaultStructure },
})
@@ -255,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
@@ -266,17 +268,15 @@ function setupController (initState, initLangCode) {
})
global.metamaskController = controller
- controller.networkController.on('networkDidChange', () => {
- ipfsHandle && ipfsHandle.remove()
- ipfsHandle = ipfsContent(controller.networkController.providerStore.getState())
- })
+ const provider = controller.provider
+ setupEnsIpfsResolver({ provider })
// report failed transactions to Sentry
controller.txController.on(`tx:status-update`, (txId, status) => {
if (status !== 'failed') return
const txMeta = controller.txController.txStateManager.getTx(txId)
try {
- reportFailedTxToSentry({ raven, txMeta })
+ reportFailedTxToSentry({ sentry, txMeta })
} catch (e) {
console.error(e)
}
@@ -448,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 d870741d6..ee38ee3ab 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,73 @@ 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, selectedAddress }) => {
+ switch (action) {
+ case 'approve-provider-request':
+ isEnabled = true
+ window.postMessage({ type: 'ethereumprovider', selectedAddress }, '*')
+ break
+ case 'approve-legacy-provider-request':
+ isEnabled = true
+ window.postMessage({ type: 'ethereumproviderlegacy', selectedAddress }, '*')
+ 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
@@ -135,17 +219,22 @@ function doctypeCheck () {
}
/**
- * Checks the current document extension
+ * Returns whether or not the extension (suffix) of the current document is prohibited
*
- * @returns {boolean} {@code true} if the current extension is not prohibited
+ * This checks {@code window.location.pathname} against a set of file extensions
+ * that should not have web3 injected into them. This check is indifferent of query parameters
+ * in the location.
+ *
+ * @returns {boolean} whether or not the extension of the current document is prohibited
*/
function suffixCheck () {
- var prohibitedTypes = ['xml', 'pdf']
- var currentUrl = window.location.href
- var currentRegex
+ const prohibitedTypes = [
+ /\.xml$/,
+ /\.pdf$/,
+ ]
+ const currentUrl = window.location.pathname
for (let i = 0; i < prohibitedTypes.length; i++) {
- currentRegex = new RegExp(`\\.${prohibitedTypes[i]}$`)
- if (currentRegex.test(currentUrl)) {
+ if (prohibitedTypes[i].test(currentUrl)) {
return false
}
}
@@ -205,3 +294,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/blacklist.js b/app/scripts/controllers/blacklist.js
index 89c7cc888..e55b09d03 100644
--- a/app/scripts/controllers/blacklist.js
+++ b/app/scripts/controllers/blacklist.js
@@ -83,8 +83,25 @@ class BlacklistController {
*
*/
async updatePhishingList () {
- const response = await fetch('https://api.infura.io/v2/blacklist')
- const phishing = await response.json()
+ // make request
+ let response
+ try {
+ response = await fetch('https://api.infura.io/v2/blacklist')
+ } catch (err) {
+ log.error(new Error(`BlacklistController - failed to fetch blacklist:\n${err.stack}`))
+ return
+ }
+ // parse response
+ let rawResponse
+ let phishing
+ try {
+ const rawResponse = await response.text()
+ phishing = JSON.parse(rawResponse)
+ } catch (err) {
+ log.error(new Error(`BlacklistController - failed to parse blacklist:\n${rawResponse}`))
+ return
+ }
+ // update current blacklist
this.store.updateState({ phishing })
this._setupPhishingDetector(phishing)
return phishing
@@ -97,9 +114,9 @@ class BlacklistController {
*/
scheduleUpdates () {
if (this._phishingUpdateIntervalRef) return
- this.updatePhishingList().catch(log.warn)
+ this.updatePhishingList()
this._phishingUpdateIntervalRef = setInterval(() => {
- this.updatePhishingList().catch(log.warn)
+ this.updatePhishingList()
}, POLLING_INTERVAL)
}
diff --git a/app/scripts/controllers/currency.js b/app/scripts/controllers/currency.js
index d5bc5fe2b..fce65fd9c 100644
--- a/app/scripts/controllers/currency.js
+++ b/app/scripts/controllers/currency.js
@@ -21,6 +21,7 @@ class CurrencyController {
* since midnight of January 1, 1970
* @property {number} conversionInterval The id of the interval created by the scheduleConversionInterval method.
* Used to clear an existing interval on subsequent calls of that method.
+ * @property {string} nativeCurrency The ticker/symbol of the native chain currency
*
*/
constructor (opts = {}) {
@@ -28,6 +29,7 @@ class CurrencyController {
currentCurrency: 'usd',
conversionRate: 0,
conversionDate: 'N/A',
+ nativeCurrency: 'ETH',
}, opts.initState)
this.store = new ObservableStore(initState)
}
@@ -37,6 +39,29 @@ class CurrencyController {
//
/**
+ * A getter for the nativeCurrency property
+ *
+ * @returns {string} A 2-4 character shorthand that describes the specific currency
+ *
+ */
+ getNativeCurrency () {
+ return this.store.getState().nativeCurrency
+ }
+
+ /**
+ * A setter for the nativeCurrency property
+ *
+ * @param {string} nativeCurrency The new currency to set as the nativeCurrency in the store
+ *
+ */
+ setNativeCurrency (nativeCurrency) {
+ this.store.updateState({
+ nativeCurrency,
+ ticker: nativeCurrency,
+ })
+ }
+
+ /**
* A getter for the currentCurrency property
*
* @returns {string} A 2-4 character shorthand that describes a specific currency, currently selected by the user
@@ -104,17 +129,60 @@ class CurrencyController {
*
*/
async updateConversionRate () {
- let currentCurrency
+ let currentCurrency, nativeCurrency
try {
currentCurrency = this.getCurrentCurrency()
- const response = await fetch(`https://api.infura.io/v1/ticker/eth${currentCurrency.toLowerCase()}`)
- const parsedResponse = await response.json()
- this.setConversionRate(Number(parsedResponse.bid))
- this.setConversionDate(Number(parsedResponse.timestamp))
+ nativeCurrency = this.getNativeCurrency()
+ // select api
+ let apiUrl
+ if (nativeCurrency === 'ETH') {
+ // ETH
+ apiUrl = `https://api.infura.io/v1/ticker/eth${currentCurrency.toLowerCase()}`
+ } else {
+ // ETC
+ apiUrl = `https://min-api.cryptocompare.com/data/price?fsym=${nativeCurrency.toUpperCase()}&tsyms=${currentCurrency.toUpperCase()}`
+ }
+ // attempt request
+ let response
+ try {
+ response = await fetch(apiUrl)
+ } catch (err) {
+ log.error(new Error(`CurrencyController - Failed to request currency from Infura:\n${err.stack}`))
+ return
+ }
+ // parse response
+ let rawResponse
+ let parsedResponse
+ try {
+ rawResponse = await response.text()
+ parsedResponse = JSON.parse(rawResponse)
+ } catch (err) {
+ log.error(new Error(`CurrencyController - Failed to parse response "${rawResponse}"`))
+ return
+ }
+ // set conversion rate
+ if (nativeCurrency === 'ETH') {
+ // ETH
+ this.setConversionRate(Number(parsedResponse.bid))
+ this.setConversionDate(Number(parsedResponse.timestamp))
+ } else {
+ // ETC
+ if (parsedResponse[currentCurrency.toUpperCase()]) {
+ this.setConversionRate(Number(parsedResponse[currentCurrency.toUpperCase()]))
+ this.setConversionDate(parseInt((new Date()).getTime() / 1000))
+ } else {
+ this.setConversionRate(0)
+ this.setConversionDate('N/A')
+ }
+ }
} catch (err) {
- log.warn(`MetaMask - Failed to query currency conversion:`, currentCurrency, err)
+ // reset current conversion rate
+ log.warn(`MetaMask - Failed to query currency conversion:`, nativeCurrency, currentCurrency, err)
this.setConversionRate(0)
this.setConversionDate('N/A')
+ // throw error
+ log.error(new Error(`CurrencyController - Failed to query rate for currency "${currentCurrency}":\n${err.stack}`))
+ return
}
}
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/createMetamaskMiddleware.js b/app/scripts/controllers/network/createMetamaskMiddleware.js
index 9e6a45888..319c5bf3e 100644
--- a/app/scripts/controllers/network/createMetamaskMiddleware.js
+++ b/app/scripts/controllers/network/createMetamaskMiddleware.js
@@ -11,6 +11,7 @@ function createMetamaskMiddleware ({
processTransaction,
processEthSignMessage,
processTypedMessage,
+ processTypedMessageV3,
processPersonalMessage,
getPendingNonce,
}) {
@@ -25,6 +26,7 @@ function createMetamaskMiddleware ({
processTransaction,
processEthSignMessage,
processTypedMessage,
+ processTypedMessageV3,
processPersonalMessage,
}),
createPendingNonceMiddleware({ getPendingNonce }),
diff --git a/app/scripts/controllers/network/network.js b/app/scripts/controllers/network/network.js
index c1667d9a6..b459b8013 100644
--- a/app/scripts/controllers/network/network.js
+++ b/app/scripts/controllers/network/network.js
@@ -11,6 +11,8 @@ const createInfuraClient = require('./createInfuraClient')
const createJsonRpcClient = require('./createJsonRpcClient')
const createLocalhostClient = require('./createLocalhostClient')
const { createSwappableProxy, createEventEmitterProxy } = require('swappable-obj-proxy')
+const extend = require('extend')
+const networks = { networkList: {} }
const {
ROPSTEN,
@@ -29,6 +31,10 @@ const defaultProviderConfig = {
type: testMode ? RINKEBY : MAINNET,
}
+const defaultNetworkConfig = {
+ ticker: 'ETH',
+}
+
module.exports = class NetworkController extends EventEmitter {
constructor (opts = {}) {
@@ -39,7 +45,8 @@ module.exports = class NetworkController extends EventEmitter {
// create stores
this.providerStore = new ObservableStore(providerConfig)
this.networkStore = new ObservableStore('loading')
- this.store = new ComposedStore({ provider: this.providerStore, network: this.networkStore })
+ this.networkConfig = new ObservableStore(defaultNetworkConfig)
+ this.store = new ComposedStore({ provider: this.providerStore, network: this.networkStore, settings: this.networkConfig })
this.on('networkDidChange', this.lookupNetwork)
// provider and block tracker
this._provider = null
@@ -51,8 +58,8 @@ module.exports = class NetworkController extends EventEmitter {
initializeProvider (providerParams) {
this._baseProviderParams = providerParams
- const { type, rpcTarget } = this.providerStore.getState()
- this._configureProvider({ type, rpcTarget })
+ const { type, rpcTarget, chainId, ticker, nickname } = this.providerStore.getState()
+ this._configureProvider({ type, rpcTarget, chainId, ticker, nickname })
this.lookupNetwork()
}
@@ -72,7 +79,20 @@ module.exports = class NetworkController extends EventEmitter {
return this.networkStore.getState()
}
- setNetworkState (network) {
+ getNetworkConfig () {
+ return this.networkConfig.getState()
+ }
+
+ setNetworkState (network, type) {
+ if (network === 'loading') {
+ return this.networkStore.putState(network)
+ }
+
+ // type must be defined
+ if (!type) {
+ return
+ }
+ network = networks.networkList[type] && networks.networkList[type].chainId ? networks.networkList[type].chainId : network
return this.networkStore.putState(network)
}
@@ -85,18 +105,22 @@ module.exports = class NetworkController extends EventEmitter {
if (!this._provider) {
return log.warn('NetworkController - lookupNetwork aborted due to missing provider')
}
+ var { type } = this.providerStore.getState()
const ethQuery = new EthQuery(this._provider)
ethQuery.sendAsync({ method: 'net_version' }, (err, network) => {
if (err) return this.setNetworkState('loading')
log.info('web3.getNetwork returned ' + network)
- this.setNetworkState(network)
+ this.setNetworkState(network, type)
})
}
- setRpcTarget (rpcTarget) {
+ setRpcTarget (rpcTarget, chainId, ticker = 'ETH', nickname = '') {
const providerConfig = {
type: 'rpc',
rpcTarget,
+ chainId,
+ ticker,
+ nickname,
}
this.providerConfig = providerConfig
}
@@ -132,7 +156,7 @@ module.exports = class NetworkController extends EventEmitter {
}
_configureProvider (opts) {
- const { type, rpcTarget } = opts
+ const { type, rpcTarget, chainId, ticker, nickname } = opts
// infura type-based endpoints
const isInfura = INFURA_PROVIDER_TYPES.includes(type)
if (isInfura) {
@@ -142,7 +166,7 @@ module.exports = class NetworkController extends EventEmitter {
this._configureLocalhostProvider()
// url-based rpc endpoints
} else if (type === 'rpc') {
- this._configureStandardProvider({ rpcUrl: rpcTarget })
+ this._configureStandardProvider({ rpcUrl: rpcTarget, chainId, ticker, nickname })
} else {
throw new Error(`NetworkController - _configureProvider - unknown type "${type}"`)
}
@@ -152,6 +176,11 @@ module.exports = class NetworkController extends EventEmitter {
log.info('NetworkController - configureInfuraProvider', type)
const networkClient = createInfuraClient({ network: type })
this._setNetworkClient(networkClient)
+ // setup networkConfig
+ var settings = {
+ ticker: 'ETH',
+ }
+ this.networkConfig.putState(settings)
}
_configureLocalhostProvider () {
@@ -160,9 +189,22 @@ module.exports = class NetworkController extends EventEmitter {
this._setNetworkClient(networkClient)
}
- _configureStandardProvider ({ rpcUrl }) {
+ _configureStandardProvider ({ rpcUrl, chainId, ticker, nickname }) {
log.info('NetworkController - configureStandardProvider', rpcUrl)
const networkClient = createJsonRpcClient({ rpcUrl })
+ // hack to add a 'rpc' network with chainId
+ networks.networkList['rpc'] = {
+ chainId: chainId,
+ rpcUrl,
+ ticker: ticker || 'ETH',
+ nickname,
+ }
+ // setup networkConfig
+ var settings = {
+ network: chainId,
+ }
+ settings = extend(settings, networks.networkList['rpc'])
+ this.networkConfig.putState(settings)
this._setNetworkClient(networkClient)
}
diff --git a/app/scripts/controllers/preferences.js b/app/scripts/controllers/preferences.js
index fd6a4866d..ffb593b09 100644
--- a/app/scripts/controllers/preferences.js
+++ b/app/scripts/controllers/preferences.js
@@ -25,7 +25,7 @@ class PreferencesController {
*/
constructor (opts = {}) {
const initState = extend({
- frequentRpcList: [],
+ frequentRpcListDetail: [],
currentAccountTab: 'history',
accountTokens: {},
assetImages: {},
@@ -38,12 +38,15 @@ class PreferencesController {
lostIdentities: {},
seedWords: null,
forgottenPassword: false,
+ preferences: {
+ useNativeCurrencyAsPrimaryCurrency: true,
+ },
}, opts.initState)
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
@@ -101,7 +104,7 @@ class PreferencesController {
* @param {Function} - end
*/
async requestWatchAsset (req, res, next, end) {
- if (req.method === 'metamask_watchAsset') {
+ if (req.method === 'metamask_watchAsset' || req.method === 'wallet_watchAsset') {
const { type, options } = req.params
switch (type) {
case 'ERC20':
@@ -372,22 +375,6 @@ class PreferencesController {
}
/**
- * Gets an updated rpc list from this.addToFrequentRpcList() and sets the `frequentRpcList` to this update list.
- *
- * @param {string} _url The the new rpc url to add to the updated list
- * @param {bool} remove Remove selected url
- * @returns {Promise<void>} Promise resolves with undefined
- *
- */
- updateFrequentRpcList (_url, remove = false) {
- return this.addToFrequentRpcList(_url, remove)
- .then((rpcList) => {
- this.store.updateState({ frequentRpcList: rpcList })
- return Promise.resolve()
- })
- }
-
- /**
* Setter for the `currentAccountTab` property
*
* @param {string} currentAccountTab Specifies the new tab to be marked as current
@@ -402,35 +389,53 @@ class PreferencesController {
}
/**
- * Returns an updated rpcList based on the passed url and the current list.
- * The returned list will have a max length of 3. If the _url currently exists it the list, it will be moved to the
- * end of the list. The current list is modified and returned as a promise.
+ * Adds custom RPC url to state.
*
- * @param {string} _url The rpc url to add to the frequentRpcList.
- * @param {bool} remove Remove selected url
- * @returns {Promise<array>} The updated frequentRpcList.
+ * @param {string} url The RPC url to add to frequentRpcList.
+ * @param {number} chainId Optional chainId of the selected network.
+ * @param {string} ticker Optional ticker symbol of the selected network.
+ * @param {string} nickname Optional nickname of the selected network.
+ * @returns {Promise<array>} Promise resolving to updated frequentRpcList.
*
*/
- addToFrequentRpcList (_url, remove = false) {
- const rpcList = this.getFrequentRpcList()
- const index = rpcList.findIndex((element) => { return element === _url })
+ addToFrequentRpcList (url, chainId, ticker = 'ETH', nickname = '') {
+ const rpcList = this.getFrequentRpcListDetail()
+ const index = rpcList.findIndex((element) => { return element.rpcUrl === url })
if (index !== -1) {
rpcList.splice(index, 1)
}
- if (!remove && _url !== 'http://localhost:8545') {
- rpcList.push(_url)
+ if (url !== 'http://localhost:8545') {
+ rpcList.push({ rpcUrl: url, chainId, ticker, nickname })
+ }
+ this.store.updateState({ frequentRpcListDetail: rpcList })
+ return Promise.resolve(rpcList)
+ }
+
+ /**
+ * Removes custom RPC url from state.
+ *
+ * @param {string} url The RPC url to remove from frequentRpcList.
+ * @returns {Promise<array>} Promise resolving to updated frequentRpcList.
+ *
+ */
+ removeFromFrequentRpcList (url) {
+ const rpcList = this.getFrequentRpcListDetail()
+ const index = rpcList.findIndex((element) => { return element.rpcUrl === url })
+ if (index !== -1) {
+ rpcList.splice(index, 1)
}
+ this.store.updateState({ frequentRpcListDetail: rpcList })
return Promise.resolve(rpcList)
}
/**
- * Getter for the `frequentRpcList` property.
+ * Getter for the `frequentRpcListDetail` property.
*
- * @returns {array<string>} An array of one or two rpc urls.
+ * @returns {array<array>} An array of rpc urls.
*
*/
- getFrequentRpcList () {
- return this.store.getState().frequentRpcList
+ getFrequentRpcListDetail () {
+ return this.store.getState().frequentRpcListDetail
}
/**
@@ -463,6 +468,33 @@ class PreferencesController {
getFeatureFlags () {
return this.store.getState().featureFlags
}
+
+ /**
+ * Updates the `preferences` property, which is an object. These are user-controlled features
+ * found in the settings page.
+ * @param {string} preference The preference to enable or disable.
+ * @param {boolean} value Indicates whether or not the preference should be enabled or disabled.
+ * @returns {Promise<object>} Promises a new object; the updated preferences object.
+ */
+ setPreference (preference, value) {
+ const currentPreferences = this.getPreferences()
+ const updatedPreferences = {
+ ...currentPreferences,
+ [preference]: value,
+ }
+
+ this.store.updateState({ preferences: updatedPreferences })
+ return Promise.resolve(updatedPreferences)
+ }
+
+ /**
+ * A getter for the `preferences` property
+ * @returns {object} A key-boolean map of user-selected preferences.
+ */
+ getPreferences () {
+ return this.store.getState().preferences
+ }
+
//
// PRIVATE METHODS
//
@@ -535,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
})
@@ -551,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..21d7fd22e
--- /dev/null
+++ b/app/scripts/controllers/provider-approval.js
@@ -0,0 +1,158 @@
+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-legacy-provider-request',
+ selectedAddress: this.publicConfigStore.getState().selectedAddress,
+ }, { 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',
+ selectedAddress: this.publicConfigStore.getState().selectedAddress,
+ }, { 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/controllers/transactions/index.js b/app/scripts/controllers/transactions/index.js
index a57c85f50..9f2290924 100644
--- a/app/scripts/controllers/transactions/index.js
+++ b/app/scripts/controllers/transactions/index.js
@@ -366,7 +366,40 @@ class TransactionController extends EventEmitter {
this.txStateManager.setTxStatusSubmitted(txId)
}
- confirmTransaction (txId) {
+ /**
+ * Sets the status of the transaction to confirmed and sets the status of nonce duplicates as
+ * dropped if the txParams have data it will fetch the txReceipt
+ * @param {number} txId - The tx's ID
+ * @returns {Promise<void>}
+ */
+ async confirmTransaction (txId) {
+ // get the txReceipt before marking the transaction confirmed
+ // to ensure the receipt is gotten before the ui revives the tx
+ const txMeta = this.txStateManager.getTx(txId)
+
+ if (!txMeta) {
+ return
+ }
+
+ try {
+ const txReceipt = await this.query.getTransactionReceipt(txMeta.hash)
+
+ // It seems that sometimes the numerical values being returned from
+ // this.query.getTransactionReceipt are BN instances and not strings.
+ const gasUsed = typeof txReceipt.gasUsed !== 'string'
+ ? txReceipt.gasUsed.toString(16)
+ : txReceipt.gasUsed
+
+ txMeta.txReceipt = {
+ ...txReceipt,
+ gasUsed,
+ }
+
+ this.txStateManager.updateTx(txMeta, 'transactions#confirmTransaction - add txReceipt')
+ } catch (err) {
+ log.error(err)
+ }
+
this.txStateManager.setTxStatusConfirmed(txId)
this._markNonceDuplicatesDropped(txId)
}
diff --git a/app/scripts/controllers/transactions/tx-gas-utils.js b/app/scripts/controllers/transactions/tx-gas-utils.js
index 3dd45507f..def67c2c3 100644
--- a/app/scripts/controllers/transactions/tx-gas-utils.js
+++ b/app/scripts/controllers/transactions/tx-gas-utils.js
@@ -7,6 +7,8 @@ const {
const { addHexPrefix } = require('ethereumjs-util')
const SIMPLE_GAS_COST = '0x5208' // Hex for 21000, cost of a simple send.
+import { TRANSACTION_NO_CONTRACT_ERROR_KEY } from '../../../../ui/app/constants/error-keys'
+
/**
tx-gas-utils are gas utility methods for Transaction manager
its passed ethquery
@@ -32,6 +34,7 @@ class TxGasUtil {
} catch (err) {
txMeta.simulationFails = {
reason: err.message,
+ errorKey: err.errorKey,
}
return txMeta
}
@@ -56,24 +59,38 @@ class TxGasUtil {
return txParams.gas
}
- // if recipient has no code, gas is 21k max:
const recipient = txParams.to
const hasRecipient = Boolean(recipient)
- let code
- if (recipient) code = await this.query.getCode(recipient)
- if (hasRecipient && (!code || code === '0x')) {
- txParams.gas = SIMPLE_GAS_COST
- txMeta.simpleSend = true // Prevents buffer addition
- return SIMPLE_GAS_COST
+ // see if we can set the gas based on the recipient
+ if (hasRecipient) {
+ const code = await this.query.getCode(recipient)
+ // For an address with no code, geth will return '0x', and ganache-core v2.2.1 will return '0x0'
+ const codeIsEmpty = !code || code === '0x' || code === '0x0'
+
+ if (codeIsEmpty) {
+ // if there's data in the params, but there's no contract code, it's not a valid transaction
+ if (txParams.data) {
+ const err = new Error('TxGasUtil - Trying to call a function on a non-contract address')
+ // set error key so ui can display localized error message
+ err.errorKey = TRANSACTION_NO_CONTRACT_ERROR_KEY
+ throw err
+ }
+
+ // This is a standard ether simple send, gas requirement is exactly 21k
+ txParams.gas = SIMPLE_GAS_COST
+ // prevents buffer addition
+ txMeta.simpleSend = true
+ return SIMPLE_GAS_COST
+ }
}
- // if not, fall back to block gasLimit
+ // fallback to block gasLimit
const blockGasLimitBN = hexToBn(blockGasLimitHex)
const saferGasLimitBN = BnMultiplyByFraction(blockGasLimitBN, 19, 20)
txParams.gas = bnToHex(saferGasLimitBN)
- // run tx
+ // estimate tx gas requirements
return await this.query.estimateGas(txParams)
}
diff --git a/app/scripts/controllers/transactions/tx-state-manager.js b/app/scripts/controllers/transactions/tx-state-manager.js
index daa6cc388..58c48e34e 100644
--- a/app/scripts/controllers/transactions/tx-state-manager.js
+++ b/app/scripts/controllers/transactions/tx-state-manager.js
@@ -400,6 +400,11 @@ class TransactionStateManager extends EventEmitter {
*/
_setTxStatus (txId, status) {
const txMeta = this.getTx(txId)
+
+ if (!txMeta) {
+ return
+ }
+
txMeta.status = status
setTimeout(() => {
try {
diff --git a/app/scripts/inpage.js b/app/scripts/inpage.js
index 431702d63..83392761e 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 }) {
+ if (!data || data.type !== messageType) { return }
+ remove && window.removeEventListener('message', handler)
+ handler.apply(window, arguments)
+ })
+}
//
// setup plugin communication
@@ -28,23 +50,98 @@ var metamaskStream = new LocalMessageDuplexStream({
// compose the inpage provider
var inpageProvider = new MetamaskInpageProvider(metamaskStream)
-// Augment the provider with its enable method
-inpageProvider.enable = function (options = {}) {
+// set a high max listener count to avoid unnecesary warnings
+inpageProvider.setMaxListeners(100)
+
+// set up a listener for when MetaMask is locked
+onMessage('metamasksetlocked', () => { isEnabled = false })
+
+// set up a listener for privacy mode responses
+onMessage('ethereumproviderlegacy', ({ data: { selectedAddress } }) => {
+ isEnabled = true
+ inpageProvider.publicConfigStore.updateState({ selectedAddress })
+}, true)
+
+// 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, selectedAddress } }) => {
+ if (typeof error !== 'undefined') {
+ reject(error)
+ } else {
+ window.removeEventListener('message', providerHandle)
+ inpageProvider.publicConfigStore.updateState({ selectedAddress })
+
+ // wait for the background to update with an account
+ inpageProvider.sendAsync({ method: 'eth_accounts', params: [] }, (error, response) => {
+ if (error) {
+ reject(error)
+ } else {
+ isEnabled = true
+ resolve(response.result)
+ }
+ })
+ }
}
+ 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, {
@@ -55,6 +152,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/lib/contracts/registrar.js b/app/scripts/lib/ens-ipfs/contracts/registrar.js
index 99ca24458..99ca24458 100644
--- a/app/scripts/lib/contracts/registrar.js
+++ b/app/scripts/lib/ens-ipfs/contracts/registrar.js
diff --git a/app/scripts/lib/contracts/resolver.js b/app/scripts/lib/ens-ipfs/contracts/resolver.js
index 1bf3f90ce..1bf3f90ce 100644
--- a/app/scripts/lib/contracts/resolver.js
+++ b/app/scripts/lib/ens-ipfs/contracts/resolver.js
diff --git a/app/scripts/lib/ens-ipfs/resolver.js b/app/scripts/lib/ens-ipfs/resolver.js
new file mode 100644
index 000000000..fe2dc1134
--- /dev/null
+++ b/app/scripts/lib/ens-ipfs/resolver.js
@@ -0,0 +1,54 @@
+const namehash = require('eth-ens-namehash')
+const multihash = require('multihashes')
+const Eth = require('ethjs-query')
+const EthContract = require('ethjs-contract')
+const registrarAbi = require('./contracts/registrar')
+const resolverAbi = require('./contracts/resolver')
+
+module.exports = resolveEnsToIpfsContentId
+
+
+async function resolveEnsToIpfsContentId ({ provider, name }) {
+ const eth = new Eth(provider)
+ const hash = namehash.hash(name)
+ const contract = new EthContract(eth)
+ // lookup registrar
+ const chainId = Number.parseInt(await eth.net_version(), 10)
+ const registrarAddress = getRegistrarForChainId(chainId)
+ if (!registrarAddress) {
+ throw new Error(`EnsIpfsResolver - no known ens-ipfs registrar for chainId "${chainId}"`)
+ }
+ const Registrar = contract(registrarAbi).at(registrarAddress)
+ // lookup resolver
+ const resolverLookupResult = await Registrar.resolver(hash)
+ const resolverAddress = resolverLookupResult[0]
+ if (hexValueIsEmpty(resolverAddress)) {
+ throw new Error(`EnsIpfsResolver - no resolver found for name "${name}"`)
+ }
+ const Resolver = contract(resolverAbi).at(resolverAddress)
+ // lookup content id
+ const contentLookupResult = await Resolver.content(hash)
+ const contentHash = contentLookupResult[0]
+ if (hexValueIsEmpty(contentHash)) {
+ throw new Error(`EnsIpfsResolver - no content ID found for name "${name}"`)
+ }
+ const nonPrefixedHex = contentHash.slice(2)
+ const buffer = multihash.fromHexString(nonPrefixedHex)
+ const contentId = multihash.toB58String(multihash.encode(buffer, 'sha2-256'))
+ return contentId
+}
+
+function hexValueIsEmpty(value) {
+ return [undefined, null, '0x', '0x0', '0x0000000000000000000000000000000000000000000000000000000000000000'].includes(value)
+}
+
+function getRegistrarForChainId (chainId) {
+ switch (chainId) {
+ // mainnet
+ case 1:
+ return '0x314159265dd8dbb310642f98f50c066173c1259b'
+ // ropsten
+ case 3:
+ return '0x112234455c3a32fd11230c42e7bccd4a84e02010'
+ }
+}
diff --git a/app/scripts/lib/ens-ipfs/setup.js b/app/scripts/lib/ens-ipfs/setup.js
new file mode 100644
index 000000000..45eb1ce14
--- /dev/null
+++ b/app/scripts/lib/ens-ipfs/setup.js
@@ -0,0 +1,63 @@
+const urlUtil = require('url')
+const extension = require('extensionizer')
+const resolveEnsToIpfsContentId = require('./resolver.js')
+
+const supportedTopLevelDomains = ['eth']
+
+module.exports = setupEnsIpfsResolver
+
+function setupEnsIpfsResolver({ provider }) {
+
+ // install listener
+ const urlPatterns = supportedTopLevelDomains.map(tld => `*://*.${tld}/*`)
+ extension.webRequest.onErrorOccurred.addListener(webRequestDidFail, { urls: urlPatterns })
+
+ // return api object
+ return {
+ // uninstall listener
+ remove () {
+ extension.webRequest.onErrorOccurred.removeListener(webRequestDidFail)
+ },
+ }
+
+ async function webRequestDidFail (details) {
+ const { tabId, url } = details
+ // ignore requests that are not associated with tabs
+ if (tabId === -1) return
+ // parse ens name
+ const urlData = urlUtil.parse(url)
+ const { hostname: name, path, search } = urlData
+ const domainParts = name.split('.')
+ const topLevelDomain = domainParts[domainParts.length - 1]
+ // if unsupported TLD, abort
+ if (!supportedTopLevelDomains.includes(topLevelDomain)) return
+ // otherwise attempt resolve
+ attemptResolve({ tabId, name, path, search })
+ }
+
+ async function attemptResolve({ tabId, name, path, search }) {
+ extension.tabs.update(tabId, { url: `loading.html` })
+ try {
+ const ipfsContentId = await resolveEnsToIpfsContentId({ provider, name })
+ let url = `https://gateway.ipfs.io/ipfs/${ipfsContentId}${path}${search || ''}`
+ try {
+ // check if ipfs gateway has result
+ const response = await fetch(url, { method: 'HEAD' })
+ // if failure, redirect to 404 page
+ if (response.status !== 200) {
+ extension.tabs.update(tabId, { url: '404.html' })
+ return
+ }
+ // otherwise redirect to the correct page
+ extension.tabs.update(tabId, { url })
+ } catch (err) {
+ console.warn(err)
+ // if HEAD fetch failed, redirect so user can see relevant error page
+ extension.tabs.update(tabId, { url })
+ }
+ } catch (err) {
+ console.warn(err)
+ extension.tabs.update(tabId, { url: `error.html?name=${name}` })
+ }
+ }
+}
diff --git a/app/scripts/lib/ipfsContent.js b/app/scripts/lib/ipfsContent.js
deleted file mode 100644
index 8b08453c4..000000000
--- a/app/scripts/lib/ipfsContent.js
+++ /dev/null
@@ -1,46 +0,0 @@
-const extension = require('extensionizer')
-const resolver = require('./resolver.js')
-
-module.exports = function (provider) {
- function ipfsContent (details) {
- const name = details.url.substring(7, details.url.length - 1)
- let clearTime = null
- if (/^.+\.eth$/.test(name) === false) return
-
- extension.tabs.query({active: true}, tab => {
- extension.tabs.update(tab.id, { url: 'loading.html' })
-
- clearTime = setTimeout(() => {
- return extension.tabs.update(tab.id, { url: '404.html' })
- }, 60000)
-
- resolver.resolve(name, provider).then(ipfsHash => {
- clearTimeout(clearTime)
- let url = 'https://ipfs.infura.io/ipfs/' + ipfsHash
- return fetch(url, { method: 'HEAD' }).then(response => response.status).then(statusCode => {
- if (statusCode !== 200) return extension.tabs.update(tab.id, { url: '404.html' })
- extension.tabs.update(tab.id, { url: url })
- })
- .catch(err => {
- url = 'https://ipfs.infura.io/ipfs/' + ipfsHash
- extension.tabs.update(tab.id, {url: url})
- return err
- })
- })
- .catch(err => {
- clearTimeout(clearTime)
- const url = err === 'unsupport' ? 'unsupport' : 'error'
- extension.tabs.update(tab.id, {url: `${url}.html?name=${name}`})
- })
- })
- return { cancel: true }
- }
-
- extension.webRequest.onErrorOccurred.addListener(ipfsContent, {urls: ['*://*.eth/'], types: ['main_frame']})
-
- return {
- remove () {
- extension.webRequest.onErrorOccurred.removeListener(ipfsContent)
- },
- }
-}
diff --git a/app/scripts/lib/reportFailedTxToSentry.js b/app/scripts/lib/reportFailedTxToSentry.js
index df5661e59..de4d57145 100644
--- a/app/scripts/lib/reportFailedTxToSentry.js
+++ b/app/scripts/lib/reportFailedTxToSentry.js
@@ -7,10 +7,10 @@ module.exports = reportFailedTxToSentry
// for sending to sentry
//
-function reportFailedTxToSentry ({ raven, txMeta }) {
+function reportFailedTxToSentry ({ sentry, txMeta }) {
const errorMessage = 'Transaction Failed: ' + extractEthjsErrorMessage(txMeta.err.message)
- raven.captureMessage(errorMessage, {
+ sentry.captureMessage(errorMessage, {
// "extra" key is required by Sentry
- extra: txMeta,
+ extra: { txMeta },
})
}
diff --git a/app/scripts/lib/resolver.js b/app/scripts/lib/resolver.js
deleted file mode 100644
index ff0fed161..000000000
--- a/app/scripts/lib/resolver.js
+++ /dev/null
@@ -1,71 +0,0 @@
-const namehash = require('eth-ens-namehash')
-const multihash = require('multihashes')
-const HttpProvider = require('ethjs-provider-http')
-const Eth = require('ethjs-query')
-const EthContract = require('ethjs-contract')
-const registrarAbi = require('./contracts/registrar')
-const resolverAbi = require('./contracts/resolver')
-
-function ens (name, provider) {
- const eth = new Eth(new HttpProvider(getProvider(provider.type)))
- const hash = namehash.hash(name)
- const contract = new EthContract(eth)
- const Registrar = contract(registrarAbi).at(getRegistrar(provider.type))
- return new Promise((resolve, reject) => {
- if (provider.type === 'mainnet' || provider.type === 'ropsten') {
- Registrar.resolver(hash).then((address) => {
- if (address === '0x0000000000000000000000000000000000000000') {
- reject(null)
- } else {
- const Resolver = contract(resolverAbi).at(address['0'])
- return Resolver.content(hash)
- }
- }).then((contentHash) => {
- if (contentHash['0'] === '0x0000000000000000000000000000000000000000000000000000000000000000') reject(null)
- if (contentHash.ret !== '0x') {
- const hex = contentHash['0'].substring(2)
- const buf = multihash.fromHexString(hex)
- resolve(multihash.toB58String(multihash.encode(buf, 'sha2-256')))
- } else {
- reject(null)
- }
- })
- } else {
- return reject('unsupport')
- }
- })
-}
-
-function getProvider (type) {
- switch (type) {
- case 'mainnet':
- return 'https://mainnet.infura.io/'
- case 'ropsten':
- return 'https://ropsten.infura.io/'
- default:
- return 'http://localhost:8545/'
- }
-}
-
-function getRegistrar (type) {
- switch (type) {
- case 'mainnet':
- return '0x314159265dd8dbb310642f98f50c066173c1259b'
- case 'ropsten':
- return '0x112234455c3a32fd11230c42e7bccd4a84e02010'
- default:
- return '0x0000000000000000000000000000000000000000'
- }
-}
-
-module.exports.resolve = function (name, provider) {
- const path = name.split('.')
- const topLevelDomain = path[path.length - 1]
- if (topLevelDomain === 'eth' || topLevelDomain === 'test') {
- return ens(name, provider)
- } else {
- return new Promise((resolve, reject) => {
- reject(null)
- })
- }
-}
diff --git a/app/scripts/lib/setupFetchDebugging.js b/app/scripts/lib/setupFetchDebugging.js
new file mode 100644
index 000000000..c1ef22d21
--- /dev/null
+++ b/app/scripts/lib/setupFetchDebugging.js
@@ -0,0 +1,36 @@
+module.exports = setupFetchDebugging
+
+//
+// This is a utility to help resolve cases where `window.fetch` throws a
+// `TypeError: Failed to Fetch` without any stack or context for the request
+// https://github.com/getsentry/sentry-javascript/pull/1293
+//
+
+function setupFetchDebugging() {
+ if (!global.fetch) return
+ const originalFetch = global.fetch
+
+ global.fetch = wrappedFetch
+
+ async function wrappedFetch(...args) {
+ const initialStack = getCurrentStack()
+ try {
+ return await originalFetch.call(window, ...args)
+ } catch (err) {
+ if (!err.stack) {
+ console.warn('FetchDebugger - fetch encountered an Error without a stack', err)
+ console.warn('FetchDebugger - overriding stack to point of original call')
+ err.stack = initialStack
+ }
+ throw err
+ }
+ }
+}
+
+function getCurrentStack() {
+ try {
+ throw new Error('Fake error for generating stack trace')
+ } catch (err) {
+ return err.stack
+ }
+}
diff --git a/app/scripts/lib/setupRaven.js b/app/scripts/lib/setupSentry.js
index e6e511640..69042bc19 100644
--- a/app/scripts/lib/setupRaven.js
+++ b/app/scripts/lib/setupSentry.js
@@ -1,58 +1,55 @@
-const Raven = require('raven-js')
+const Sentry = require('@sentry/browser')
const METAMASK_DEBUG = process.env.METAMASK_DEBUG
const extractEthjsErrorMessage = require('./extractEthjsErrorMessage')
-const PROD = 'https://3567c198f8a8412082d32655da2961d0@sentry.io/273505'
-const DEV = 'https://f59f3dd640d2429d9d0e2445a87ea8e1@sentry.io/273496'
+const SENTRY_DSN_PROD = 'https://3567c198f8a8412082d32655da2961d0@sentry.io/273505'
+const SENTRY_DSN_DEV = 'https://f59f3dd640d2429d9d0e2445a87ea8e1@sentry.io/273496'
-module.exports = setupRaven
+module.exports = setupSentry
-// Setup raven / sentry remote error reporting
-function setupRaven (opts) {
- const { release } = opts
- let ravenTarget
+// Setup sentry remote error reporting
+function setupSentry (opts) {
+ const { release, getState } = opts
+ let sentryTarget
// detect brave
const isBrave = Boolean(window.chrome.ipcRenderer)
if (METAMASK_DEBUG) {
- console.log('Setting up Sentry Remote Error Reporting: DEV')
- ravenTarget = DEV
+ console.log('Setting up Sentry Remote Error Reporting: SENTRY_DSN_DEV')
+ sentryTarget = SENTRY_DSN_DEV
} else {
- console.log('Setting up Sentry Remote Error Reporting: PROD')
- ravenTarget = PROD
+ console.log('Setting up Sentry Remote Error Reporting: SENTRY_DSN_PROD')
+ sentryTarget = SENTRY_DSN_PROD
}
- const client = Raven.config(ravenTarget, {
+ Sentry.init({
+ dsn: sentryTarget,
+ debug: METAMASK_DEBUG,
release,
- transport: function (opts) {
- opts.data.extra.isBrave = isBrave
- const report = opts.data
+ beforeSend: (report) => rewriteReport(report),
+ })
- try {
- // handle error-like non-error exceptions
- rewriteErrorLikeExceptions(report)
- // simplify certain complex error messages (e.g. Ethjs)
- simplifyErrorMessages(report)
- // modify report urls
- rewriteReportUrls(report)
- } catch (err) {
- console.warn(err)
- }
- // make request normally
- client._makeRequest(opts)
- },
+ Sentry.configureScope(scope => {
+ scope.setExtra('isBrave', isBrave)
})
- client.install()
- return Raven
-}
+ function rewriteReport(report) {
+ try {
+ // simplify certain complex error messages (e.g. Ethjs)
+ simplifyErrorMessages(report)
+ // modify report urls
+ rewriteReportUrls(report)
+ // append app state
+ if (getState) {
+ const appState = getState()
+ report.extra.appState = appState
+ }
+ } catch (err) {
+ console.warn(err)
+ }
+ return report
+ }
-function rewriteErrorLikeExceptions (report) {
- // handle errors that lost their error-ness in serialization (e.g. dnode)
- rewriteErrorMessages(report, (errorMessage) => {
- if (!errorMessage.includes('Non-Error exception captured with keys:')) return errorMessage
- if (!(report.extra && report.extra.__serialized__ && report.extra.__serialized__.message)) return errorMessage
- return `Non-Error Exception: ${report.extra.__serialized__.message}`
- })
+ return Sentry
}
function simplifyErrorMessages (report) {
diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js
index 493877345..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,
})
@@ -129,6 +130,7 @@ module.exports = class MetamaskController extends EventEmitter {
provider: this.provider,
blockTracker: this.blockTracker,
})
+
// start and stop polling for balances based on activeControllerConnections
this.on('controllerConnectionChanged', (activeControllerConnections) => {
if (activeControllerConnections > 0) {
@@ -138,6 +140,11 @@ module.exports = class MetamaskController extends EventEmitter {
}
})
+ // ensure accountTracker updates balances after network change
+ this.networkController.on('networkDidChange', () => {
+ this.accountTracker._updateAccounts()
+ })
+
// key mgmt
const additionalKeyrings = [TrezorKeyring, LedgerBridgeKeyring]
this.keyringController = new KeyringController({
@@ -191,6 +198,8 @@ module.exports = class MetamaskController extends EventEmitter {
})
this.networkController.on('networkDidChange', () => {
this.balancesController.updateAllBalances()
+ var currentCurrency = this.currencyController.getCurrentCurrency()
+ this.setCurrentCurrency(currentCurrency, function() {})
})
this.balancesController.updateAllBalances()
@@ -211,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,
@@ -240,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))
}
@@ -255,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
@@ -269,6 +292,8 @@ module.exports = class MetamaskController extends EventEmitter {
processTransaction: this.newUnapprovedTransaction.bind(this),
// msg signing
processEthSignMessage: this.newUnsignedMessage.bind(this),
+ processTypedMessage: this.newUnsignedTypedMessage.bind(this),
+ processTypedMessageV3: this.newUnsignedTypedMessage.bind(this),
processPersonalMessage: this.newUnsignedPersonalMessage.bind(this),
getPendingNonce: this.getPendingNonce.bind(this),
}
@@ -339,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
@@ -387,6 +413,7 @@ module.exports = class MetamaskController extends EventEmitter {
setCurrentAccountTab: nodeify(preferencesController.setCurrentAccountTab, preferencesController),
setAccountLabel: nodeify(preferencesController.setAccountLabel, preferencesController),
setFeatureFlag: nodeify(preferencesController.setFeatureFlag, preferencesController),
+ setPreference: nodeify(preferencesController.setPreference, preferencesController),
// BlacklistController
whitelistPhishingDomain: this.whitelistPhishingDomain.bind(this),
@@ -395,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),
@@ -426,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),
}
}
@@ -971,8 +1002,8 @@ module.exports = class MetamaskController extends EventEmitter {
* @param {Object} msgParams - The params passed to eth_signTypedData.
* @param {Function} cb - The callback function, called with the signature.
*/
- newUnsignedTypedMessage (msgParams, req) {
- const promise = this.typedMessageManager.addUnapprovedMessageAsync(msgParams, req)
+ newUnsignedTypedMessage (msgParams, req, version) {
+ const promise = this.typedMessageManager.addUnapprovedMessageAsync(msgParams, req, version)
this.sendUpdate()
this.opts.showUnconfirmedMessage()
return promise
@@ -1266,10 +1297,6 @@ module.exports = class MetamaskController extends EventEmitter {
engine.push(subscriptionManager.middleware)
// watch asset
engine.push(this.preferencesController.requestWatchAsset.bind(this.preferencesController))
- // sign typed data middleware
- engine.push(this.createTypedDataMiddleware('eth_signTypedData', 'V1').bind(this))
- engine.push(this.createTypedDataMiddleware('eth_signTypedData_v1', 'V1').bind(this))
- engine.push(this.createTypedDataMiddleware('eth_signTypedData_v3', 'V3', true).bind(this))
// forward to metamask primary provider
engine.push(createProviderMiddleware({ provider }))
@@ -1405,10 +1432,13 @@ module.exports = class MetamaskController extends EventEmitter {
* @param {Function} cb - A callback function returning currency info.
*/
setCurrentCurrency (currencyCode, cb) {
+ const { ticker } = this.networkController.getNetworkConfig()
try {
+ this.currencyController.setNativeCurrency(ticker)
this.currencyController.setCurrentCurrency(currencyCode)
this.currencyController.updateConversionRate()
const data = {
+ nativeCurrency: ticker || 'ETH',
conversionRate: this.currencyController.getConversionRate(),
currentCurrency: this.currencyController.getCurrentCurrency(),
conversionDate: this.currencyController.getConversionDate(),
@@ -1447,11 +1477,14 @@ module.exports = class MetamaskController extends EventEmitter {
/**
* A method for selecting a custom URL for an ethereum RPC provider.
* @param {string} rpcTarget - A URL for a valid Ethereum RPC API.
+ * @param {number} chainId - The chainId of the selected network.
+ * @param {string} ticker - The ticker symbol of the selected network.
+ * @param {string} nickname - Optional nickname of the selected network.
* @returns {Promise<String>} - The RPC Target URL confirmed.
*/
- async setCustomRpc (rpcTarget) {
- this.networkController.setRpcTarget(rpcTarget)
- await this.preferencesController.updateFrequentRpcList(rpcTarget)
+ async setCustomRpc (rpcTarget, chainId, ticker = 'ETH', nickname = '') {
+ this.networkController.setRpcTarget(rpcTarget, chainId, ticker, nickname)
+ await this.preferencesController.addToFrequentRpcList(rpcTarget, chainId, ticker, nickname)
return rpcTarget
}
@@ -1460,7 +1493,7 @@ module.exports = class MetamaskController extends EventEmitter {
* @param {string} rpcTarget - A RPC URL to delete.
*/
async delCustomRpc (rpcTarget) {
- await this.preferencesController.updateFrequentRpcList(rpcTarget, true)
+ await this.preferencesController.removeFromFrequentRpcList(rpcTarget)
}
/**
@@ -1535,27 +1568,6 @@ module.exports = class MetamaskController extends EventEmitter {
* @param {Function} - next
* @param {Function} - end
*/
- createTypedDataMiddleware (methodName, version, reverse) {
- return async (req, res, next, end) => {
- const { method, params } = req
- if (method === methodName) {
- const promise = this.typedMessageManager.addUnapprovedMessageAsync({
- data: reverse ? params[1] : params[0],
- from: reverse ? params[0] : params[1],
- }, req, version)
- this.sendUpdate()
- this.opts.showUnconfirmedMessage()
- try {
- res.result = await promise
- end()
- } catch (error) {
- end(error)
- }
- } else {
- next()
- }
- }
- }
/**
* Adds a domain to the {@link BlacklistController} whitelist
@@ -1564,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()
diff --git a/app/scripts/ui.js b/app/scripts/ui.js
index 98a036338..c4f6615db 100644
--- a/app/scripts/ui.js
+++ b/app/scripts/ui.js
@@ -9,7 +9,7 @@ const extension = require('extensionizer')
const ExtensionPlatform = require('./platforms/extension')
const NotificationManager = require('./lib/notification-manager')
const notificationManager = new NotificationManager()
-const setupRaven = require('./lib/setupRaven')
+const setupSentry = require('./lib/setupSentry')
const log = require('loglevel')
start().catch(log.error)
@@ -21,7 +21,17 @@ async function start () {
// setup sentry error reporting
const release = global.platform.getVersion()
- setupRaven({ release })
+ setupSentry({ release, getState })
+ // provide app state to append to error logs
+ function getState() {
+ // get app state
+ const state = window.getCleanAppState()
+ // remove unnecessary data
+ delete state.localeMessages
+ delete state.metamask.recentBlocks
+ // return state to be added to request
+ return state
+ }
// inject css
// const css = MetaMaskUiCss()