aboutsummaryrefslogtreecommitdiffstats
path: root/app
diff options
context:
space:
mode:
Diffstat (limited to 'app')
-rw-r--r--app/_locales/cs/messages.json45
-rw-r--r--app/_locales/de/messages.json45
-rw-r--r--app/_locales/en/messages.json73
-rw-r--r--app/_locales/es/messages.json45
-rw-r--r--app/_locales/fr/messages.json39
-rw-r--r--app/_locales/hn/messages.json45
-rw-r--r--app/_locales/ht/messages.json2584
-rw-r--r--app/_locales/it/messages.json45
-rw-r--r--app/_locales/ja/messages.json45
-rw-r--r--app/_locales/ko/messages.json45
-rw-r--r--app/_locales/nl/messages.json47
-rw-r--r--app/_locales/ph/messages.json45
-rw-r--r--app/_locales/pt/messages.json45
-rw-r--r--app/_locales/ru/messages.json45
-rw-r--r--app/_locales/sl/messages.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/images/mm-secure.svg7
-rw-r--r--app/images/provider-approval-check.svg20
-rw-r--r--app/loading.html12
-rw-r--r--app/manifest.json2
-rw-r--r--app/scripts/background.js27
-rw-r--r--app/scripts/contentscript.js128
-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.js39
-rw-r--r--app/scripts/controllers/provider-approval.js152
-rw-r--r--app/scripts/controllers/token-rates.js11
-rw-r--r--app/scripts/controllers/transactions/tx-gas-utils.js35
-rw-r--r--app/scripts/inpage.js151
-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.js10
-rw-r--r--app/scripts/lib/setupSentry.js (renamed from app/scripts/lib/setupRaven.js)75
-rw-r--r--app/scripts/metamask-controller.js83
-rw-r--r--app/scripts/platforms/extension.js12
-rw-r--r--app/scripts/ui.js14
49 files changed, 3537 insertions, 1798 deletions
diff --git a/app/_locales/cs/messages.json b/app/_locales/cs/messages.json
index ae2413ad9..fde553c9e 100644
--- a/app/_locales/cs/messages.json
+++ b/app/_locales/cs/messages.json
@@ -1,4 +1,49 @@
{
+ "privacyMode": {
+ "message": "Režim súkromia"
+ },
+ "privacyModeDescription": {
+ "message": "Webové stránky musia požiadať o prístup k zobrazeniu informácií o vašom účte."
+ },
+ "exposeAccounts": {
+ "message": "Vystavte účty"
+ },
+ "exposeDescription": {
+ "message": "Vystavte účty na aktuální webové stránky. Užitečné pro starší dappy."
+ },
+ "confirmExpose": {
+ "message": "Opravdu chcete své účty vystavit na stávajícím webu?"
+ },
+ "confirmClear": {
+ "message": "Naozaj chcete vymazať schválené webové stránky?"
+ },
+ "clearApprovalDataSuccess": {
+ "message": "Schválené údaje webových stránek byly úspěšně zrušeny."
+ },
+ "approvalData": {
+ "message": "Údaje o schválení"
+ },
+ "approvalDataDescription": {
+ "message": "Vymažte schválené údaje webových stránek, aby všechny weby znovu požádaly o schválení."
+ },
+ "clearApprovalData": {
+ "message": "Jasné údaje o schválení"
+ },
+ "approve": {
+ "message": "Schválit"
+ },
+ "reject": {
+ "message": "Odmítnout"
+ },
+ "providerAPIRequest": {
+ "message": "Požadavek API Ethereum"
+ },
+ "reviewProviderRequest": {
+ "message": "Přečtěte si prosím tuto žádost API Ethereum."
+ },
+ "providerRequestInfo": {
+ "message": "Níže uvedená doména se pokouší požádat o přístup k API Ethereum, aby mohla komunikovat s blokádou Ethereum. Před schválením přístupu Ethereum vždy zkontrolujte, zda jste na správném místě."
+ },
"accept": {
"message": "Přijmout"
},
diff --git a/app/_locales/de/messages.json b/app/_locales/de/messages.json
index 9e1eb9eac..9404a9824 100644
--- a/app/_locales/de/messages.json
+++ b/app/_locales/de/messages.json
@@ -1,4 +1,49 @@
{
+ "privacyMode": {
+ "message": "Datenschutzmodus"
+ },
+ "privacyModeDescription": {
+ "message": "Websites müssen Zugriff anfordern, um Ihre Kontoinformationen anzuzeigen."
+ },
+ "exposeAccounts": {
+ "message": "Expose Konten"
+ },
+ "exposeDescription": {
+ "message": "Expose Konten auf der aktuellen Website. Nützlich für ältere Dapps."
+ },
+ "confirmExpose": {
+ "message": "Möchten Sie Ihre Konten wirklich der aktuellen Website zugänglich machen?"
+ },
+ "confirmClear": {
+ "message": "Möchten Sie die genehmigten Websites wirklich löschen?"
+ },
+ "clearApprovalDataSuccess": {
+ "message": "Genehmigte Website-Daten wurden erfolgreich gelöscht."
+ },
+ "approvalData": {
+ "message": "Genehmigungsdaten"
+ },
+ "approvalDataDescription": {
+ "message": "Löschen Sie die genehmigten Website-Daten, damit alle Websites erneut eine Genehmigung anfordern müssen."
+ },
+ "clearApprovalData": {
+ "message": "Genehmigungsdaten löschen"
+ },
+ "approve": {
+ "message": "Genehmigen"
+ },
+ "reject": {
+ "message": "Ablehnen"
+ },
+ "providerAPIRequest": {
+ "message": "Web3-API-Anfrage"
+ },
+ "reviewProviderRequest": {
+ "message": "Bitte lesen Sie diese Ethereum-API-Anfrage."
+ },
+ "providerRequestInfo": {
+ "message": "Die unten aufgeführte Domäne versucht, Zugriff auf die Ethereum-API anzufordern, damit sie mit der Ethereum-Blockchain interagieren kann. Überprüfen Sie immer, dass Sie sich auf der richtigen Website befinden, bevor Sie den Web3-Zugriff genehmigen."
+ },
"accept": {
"message": "Annehmen"
},
diff --git a/app/_locales/en/messages.json b/app/_locales/en/messages.json
index bf5854a31..95c9efeeb 100644
--- a/app/_locales/en/messages.json
+++ b/app/_locales/en/messages.json
@@ -1,4 +1,43 @@
{
+ "privacyMode": {
+ "message": "Privacy Mode"
+ },
+ "privacyModeDescription": {
+ "message": "Websites must request access to view your account information."
+ },
+ "exposeAccounts": {
+ "message": "Expose Accounts"
+ },
+ "exposeDescription": {
+ "message": "Expose accounts to the current website. Useful for legacy dapps."
+ },
+ "confirmExpose": {
+ "message": "Are you sure you want to expose your accounts to the current website?"
+ },
+ "confirmClear": {
+ "message": "Are you sure you want to clear approved websites?"
+ },
+ "clearApprovalDataSuccess": {
+ "message": "Approved website data cleared successfully."
+ },
+ "approvalData": {
+ "message": "Privacy Data"
+ },
+ "approvalDataDescription": {
+ "message": "Clear privacy data so all websites must request access to view account information again."
+ },
+ "clearApprovalData": {
+ "message": "Clear Privacy Data"
+ },
+ "reject": {
+ "message": "Reject"
+ },
+ "providerRequest": {
+ "message": "$1 would like to connect to your account"
+ },
+ "providerRequestInfo": {
+ "message": "This site is requesting access to view your current account address. Always make sure you trust the sites you interact with."
+ },
"accept": {
"message": "Accept"
},
@@ -170,6 +209,9 @@
"connect": {
"message": "Connect"
},
+ "connectRequest": {
+ "message": "Connect Request"
+ },
"connecting": {
"message": "Connecting..."
},
@@ -692,9 +734,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"
},
@@ -803,7 +863,7 @@
"message": "Primary Currency"
},
"primaryCurrencySettingDescription": {
- "message": "Select ETH to prioritize displaying values in ETH. Select Fiat to prioritize displaying values in your selected currency."
+ "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"
@@ -842,9 +902,6 @@
"refundAddress": {
"message": "Your Refund Address"
},
- "reject": {
- "message": "Reject"
- },
"rejectAll": {
"message": "Reject All"
},
@@ -1169,12 +1226,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)"
},
diff --git a/app/_locales/es/messages.json b/app/_locales/es/messages.json
index be2a29ab5..55276e1ec 100644
--- a/app/_locales/es/messages.json
+++ b/app/_locales/es/messages.json
@@ -1,4 +1,49 @@
{
+ "privacyMode": {
+ "message": "Modo privado"
+ },
+ "privacyModeDescription": {
+ "message": "Los sitios web deben solicitar acceso para ver la información de su cuenta."
+ },
+ "exposeAccounts": {
+ "message": "Exponer cuentas"
+ },
+ "exposeDescription": {
+ "message": "Exponer cuentas al sitio web actual. Útil para dapps heredados."
+ },
+ "confirmExpose": {
+ "message": "¿Seguro que quieres exponer tus cuentas al sitio web actual?"
+ },
+ "confirmClear": {
+ "message": "¿Seguro que quieres borrar los sitios web aprobados?"
+ },
+ "clearApprovalDataSuccess": {
+ "message": "Los datos aprobados del sitio web se borraron con éxito."
+ },
+ "approvalData": {
+ "message": "Datos de aprobación"
+ },
+ "approvalDataDescription": {
+ "message": "Borre los datos del sitio web aprobado para que todos los sitios deban volver a solicitar la aprobación."
+ },
+ "clearApprovalData": {
+ "message": "Borrar datos de aprobación"
+ },
+ "approve": {
+ "message": "Aprobar"
+ },
+ "reject": {
+ "message": "Rechazar"
+ },
+ "providerAPIRequest": {
+ "message": "Solicitud de API Web3"
+ },
+ "reviewProviderRequest": {
+ "message": "Por favor, revise esta solicitud API Ethereum."
+ },
+ "providerRequestInfo": {
+ "message": "El dominio que se muestra a continuación intenta solicitar acceso a la API Ethereum para que pueda interactuar con la cadena de bloques de Ethereum. Siempre verifique que esté en el sitio correcto antes de aprobar el acceso Ethereum."
+ },
"accept": {
"message": "Aceptar"
},
diff --git a/app/_locales/fr/messages.json b/app/_locales/fr/messages.json
index d418cd9aa..17306d0f2 100644
--- a/app/_locales/fr/messages.json
+++ b/app/_locales/fr/messages.json
@@ -1,4 +1,43 @@
{
+ "privacyMode": {
+ "message": "Les sites Web doivent demander un accès pour afficher les informations de votre compte."
+ },
+ "privacyModeDescription": {
+ "message": "Les sites Web doivent demander un accès pour afficher les informations de votre compte."
+ },
+ "exposeAccounts": {
+ "message": "Exposer les comptes"
+ },
+ "exposeDescription": {
+ "message": "Exposer des comptes sur le site Web actuel. Utile pour les dapps hérités."
+ },
+ "confirmExpose": {
+ "message": "Êtes-vous sûr de vouloir exposer vos comptes au site Web actuel?"
+ },
+ "confirmClear": {
+ "message": "Êtes-vous sûr de vouloir supprimer les sites Web approuvés?"
+ },
+ "clearApprovalDataSuccess": {
+ "message": "Les données de site Web approuvées ont été supprimées."
+ },
+ "approvalData": {
+ "message": "Données d'approbation"
+ },
+ "approvalDataDescription": {
+ "message": "Effacer les données de site Web approuvées afin que tous les sites doivent à nouveau demander l'approbation."
+ },
+ "clearApprovalData": {
+ "message": "Effacer les données d'approbation"
+ },
+ "providerAPIRequest": {
+ "message": "Demande d'API Web3"
+ },
+ "reviewProviderRequest": {
+ "message": "Veuillez consulter cette demande d'API Ethereum."
+ },
+ "providerRequestInfo": {
+ "message": "Le domaine répertorié ci-dessous tente de demander l'accès à l'API Ethereum pour pouvoir interagir avec la chaîne de blocs Ethereum. Vérifiez toujours que vous êtes sur le bon site avant d'autoriser l'accès à Ethereum."
+ },
"accept": {
"message": "Accepter"
},
diff --git a/app/_locales/hn/messages.json b/app/_locales/hn/messages.json
index b869560e5..8e2281418 100644
--- a/app/_locales/hn/messages.json
+++ b/app/_locales/hn/messages.json
@@ -1,4 +1,49 @@
{
+ "privacyMode": {
+ "message": "गोपनीयता मोड"
+ },
+ "privacyModeDescription": {
+ "message": "वेबसाइटों को आपकी खाता जानकारी देखने के लिए पहुंच का अनुरोध करना होगा।"
+ },
+ "exposeAccounts": {
+ "message": "खातों का पर्दाफाश करें"
+ },
+ "exposeDescription": {
+ "message": "मौजूदा वेबसाइट पर खातों का पर्दाफाश करें। विरासत डैप्स के लिए उपयोगी।"
+ },
+ "confirmExpose": {
+ "message": "क्या आप वाकई अपने खातों को वर्तमान वेबसाइट पर बेनकाब करना चाहते हैं?"
+ },
+ "confirmClear": {
+ "message": "क्या आप वाकई अनुमोदित वेबसाइटों को साफ़ करना चाहते हैं?"
+ },
+ "clearApprovalDataSuccess": {
+ "message": "स्वीकृत वेबसाइट डेटा सफलतापूर्वक मंजूरी दे दी।"
+ },
+ "approvalData": {
+ "message": "स्वीकृति डेटा"
+ },
+ "approvalDataDescription": {
+ "message": "अनुमोदित वेबसाइट डेटा साफ़ करें ताकि सभी साइटों को फिर से अनुमोदन का अनुरोध करना होगा।"
+ },
+ "clearApprovalData": {
+ "message": "अनुमोदन डेटा साफ़ करें"
+ },
+ "approve": {
+ "message": "मंजूर"
+ },
+ "reject": {
+ "message": "अस्वीकार"
+ },
+ "providerAPIRequest": {
+ "message": "वेब 3 एपीआई अनुरोध"
+ },
+ "reviewProviderRequest": {
+ "message": "कृपया इस वेब 3 एपीआई अनुरोध की समीक्षा करें।"
+ },
+ "providerRequestInfo": {
+ "message": "नीचे सूचीबद्ध डोमेन वेब 3 एपीआई तक पहुंच का अनुरोध करने का प्रयास कर रहा है ताकि यह एथेरियम ब्लॉकचेन से बातचीत कर सके। वेब 3 एक्सेस को मंजूरी देने से पहले हमेशा सही जांच करें कि आप सही साइट पर हैं।"
+ },
"accept": {
"message": "स्वीकार करें"
},
diff --git a/app/_locales/ht/messages.json b/app/_locales/ht/messages.json
index 50a0ec2bb..ff44af903 100644
--- a/app/_locales/ht/messages.json
+++ b/app/_locales/ht/messages.json
@@ -1,1237 +1,1351 @@
{
- "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."
- },
- "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"
- },
- "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."
+ },
+ "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"
+ },
+ "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/it/messages.json b/app/_locales/it/messages.json
index 06e3dc855..e97c28e42 100644
--- a/app/_locales/it/messages.json
+++ b/app/_locales/it/messages.json
@@ -1,4 +1,46 @@
{
+ "privacyMode": {
+ "message": "Modalità di privacy"
+ },
+ "privacyModeDescription": {
+ "message": "I siti Web devono richiedere l'accesso per visualizzare le informazioni del tuo account."
+ },
+ "exposeAccounts": {
+ "message": "Expose Accounts"
+ },
+ "exposeDescription": {
+ "message": "Esporre gli account al sito Web corrente. Utile per dapps legacy."
+ },
+ "confirmExpose": {
+ "message": "Sei sicuro di voler esporre i tuoi account al sito web corrente?"
+ },
+ "confirmClear": {
+ "message": "Sei sicuro di voler cancellare i siti Web approvati?"
+ },
+ "clearApprovalDataSuccess": {
+ "message": "Dati del sito Web approvati cancellati correttamente."
+ },
+ "approvalData": {
+ "message": "Dati di approvazione"
+ },
+ "approvalDataDescription": {
+ "message": "Cancella i dati del sito web approvati, quindi tutti i siti devono richiedere nuovamente l'approvazione."
+ },
+ "clearApprovalData": {
+ "message": "Cancella i dati di approvazione"
+ },
+ "reject": {
+ "message": "Rifiutare"
+ },
+ "providerAPIRequest": {
+ "message": "Richiesta API Web3"
+ },
+ "reviewProviderRequest": {
+ "message": "Si prega di rivedere questa richiesta API Ethereum."
+ },
+ "providerRequestInfo": {
+ "message": "Il dominio elencato di seguito sta tentando di richiedere l'accesso all'API Ethereum in modo che possa interagire con la blockchain di Ethereum. Controlla sempre di essere sul sito corretto prima di approvare l'accesso a Ethereum."
+ },
"accept": {
"message": "Accetta"
},
@@ -824,9 +866,6 @@
"refundAddress": {
"message": "Indirizzo di Rimborso"
},
- "reject": {
- "message": "Reject"
- },
"rejectAll": {
"message": "Reject All"
},
diff --git a/app/_locales/ja/messages.json b/app/_locales/ja/messages.json
index 7b25f386a..8ae363030 100644
--- a/app/_locales/ja/messages.json
+++ b/app/_locales/ja/messages.json
@@ -1,4 +1,49 @@
{
+ "privacyMode": {
+ "message": "プライバシーモード"
+ },
+ "privacyModeDescription": {
+ "message": "ウェブサイトはあなたのアカウント情報を閲覧するためのアクセスを要求する必要があります。"
+ },
+ "exposeAccounts": {
+ "message": "アカウントを公開する"
+ },
+ "exposeDescription": {
+ "message": "アカウントを現在のウェブサイトに公開する。従来のdappsに役立ちます。"
+ },
+ "confirmExpose": {
+ "message": "現在のウェブサイトにアカウントを公開してもよろしいですか?"
+ },
+ "confirmClear": {
+ "message": "承認されたウェブサイトをクリアしてもよろしいですか?"
+ },
+ "clearApprovalDataSuccess": {
+ "message": "承認されたウェブサイトデータが正常に消去されました。"
+ },
+ "approvalData": {
+ "message": "承認データ"
+ },
+ "approvalDataDescription": {
+ "message": "承認されたウェブサイトのデータをクリアすると、すべてのサイトで承認を再度要求する必要があります"
+ },
+ "clearApprovalData": {
+ "message": "承認データのクリア"
+ },
+ "approve": {
+ "message": "承認する"
+ },
+ "reject": {
+ "message": "拒否"
+ },
+ "providerAPIRequest": {
+ "message": "Web3 APIリクエスト"
+ },
+ "reviewProviderRequest": {
+ "message": "このEthereum APIリクエストを確認してください。"
+ },
+ "providerRequestInfo": {
+ "message": "下記のドメインは、Ethereumブロックチェーンとやり取りできるようにEthereum APIへのアクセスをリクエストしようとしています。 Web3アクセスを承認する前に、正しいサイトにいることを常に確認してください。"
+ },
"accept": {
"message": "承認"
},
diff --git a/app/_locales/ko/messages.json b/app/_locales/ko/messages.json
index c8d470188..af1c32615 100644
--- a/app/_locales/ko/messages.json
+++ b/app/_locales/ko/messages.json
@@ -1,4 +1,46 @@
{
+ "privacyMode": {
+ "message": "개인 정보 보호 모드"
+ },
+ "privacyModeDescription": {
+ "message": "웹 사이트는 계정 정보를 볼 수있는 액세스 권한을 요청해야합니다."
+ },
+ "exposeAccounts": {
+ "message": "계정 노출"
+ },
+ "exposeDescription": {
+ "message": "계정을 현재 웹 사이트에 노출하십시오. 기존 dapps에 유용합니다."
+ },
+ "confirmExpose": {
+ "message": "계정을 현재 웹 사이트에 공개 하시겠습니까?"
+ },
+ "confirmClear": {
+ "message": "승인 된 웹 사이트를 삭제 하시겠습니까?"
+ },
+ "clearApprovalDataSuccess": {
+ "message": "승인 된 웹 사이트 데이터가 성공적으로 삭제되었습니다."
+ },
+ "approvalData": {
+ "message": "승인 데이터"
+ },
+ "approvalDataDescription": {
+ "message": "승인 된 웹 사이트 데이터를 삭제하여 모든 사이트에서 승인을 다시 요청해야합니다."
+ },
+ "clearApprovalData": {
+ "message": "승인 데이터 삭제"
+ },
+ "reject": {
+ "message": "받지 않다"
+ },
+ "providerAPIRequest": {
+ "message": "Web3 API 요청"
+ },
+ "reviewProviderRequest": {
+ "message": "이 Ethereum API 요청을 검토하십시오."
+ },
+ "providerRequestInfo": {
+ "message": "아래 나열된 도메인은 Web3 API에 대한 액세스를 요청하여 Ethereum 블록 체인과 상호 작용할 수 있습니다. Ethereum 액세스를 승인하기 전에 항상 올바른 사이트에 있는지 다시 확인하십시오."
+ },
"accept": {
"message": "수락"
},
@@ -815,9 +857,6 @@
"refundAddress": {
"message": "환불받을 주소"
},
- "reject": {
- "message": "거부"
- },
"rejectAll": {
"message": "모두 거부"
},
diff --git a/app/_locales/nl/messages.json b/app/_locales/nl/messages.json
index e6d09c123..5d9f1f3ab 100644
--- a/app/_locales/nl/messages.json
+++ b/app/_locales/nl/messages.json
@@ -1,4 +1,49 @@
{
+ "privacyMode": {
+ "message": "Privacy-modus"
+ },
+ "privacyModeDescription": {
+ "message": "Websites moeten toegang vragen om uw accountgegevens te bekijken."
+ },
+ "exposeAccounts": {
+ "message": "Expose Accounts"
+ },
+ "exposeDescription": {
+ "message": "Stel accounts vrij op de huidige website. Handig voor legacy dapps."
+ },
+ "confirmExpose": {
+ "message": "Weet u zeker dat u uw accounts wilt weergeven aan de huidige website?"
+ },
+ "confirmClear": {
+ "message": "Weet je zeker dat je goedgekeurde websites wilt wissen?"
+ },
+ "clearApprovalDataSuccess": {
+ "message": "Goedgekeurde websitegegevens zijn met succes gewist."
+ },
+ "approvalData": {
+ "message": "Goedkeuringsgegevens"
+ },
+ "approvalDataDescription": {
+ "message": "Goedgekeurde websitegegevens wissen zodat alle sites opnieuw goedkeuring moeten aanvragen."
+ },
+ "clearApprovalData": {
+ "message": "Gegevens over goedkeuring wissen"
+ },
+ "approve": {
+ "message": "Goedkeuren"
+ },
+ "reject": {
+ "message": "Afwijzen"
+ },
+ "providerAPIRequest": {
+ "message": "Web3 API-aanvraag"
+ },
+ "reviewProviderRequest": {
+ "message": "Bekijk deze Ethereum API-aanvraag."
+ },
+ "providerRequestInfo": {
+ "message": "Het onderstaande domein probeert toegang tot de Ethereum API te vragen zodat deze kan communiceren met de Ethereum-blockchain. Controleer altijd eerst of u op de juiste site bent voordat u Ethereum-toegang goedkeurt."
+ },
"accept": {
"message": "Aanvaarden"
},
@@ -435,7 +480,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 9a243447a..cef686868 100644
--- a/app/_locales/ph/messages.json
+++ b/app/_locales/ph/messages.json
@@ -1,4 +1,49 @@
{
+ "privacyMode": {
+ "message": "Mode ng Privacy"
+ },
+ "privacyModeDescription": {
+ "message": "Dapat humiling ng access ang mga website upang tingnan ang impormasyon ng iyong account."
+ },
+ "exposeAccounts": {
+ "message": "Ilantad ang Mga Account"
+ },
+ "exposeDescription": {
+ "message": "Ilantad ang mga account sa kasalukuyang website. Kapaki-pakinabang para sa mga dapps ng legacy."
+ },
+ "confirmExpose": {
+ "message": "Sigurado ka bang gusto mong ilantad ang iyong mga account sa kasalukuyang website?"
+ },
+ "confirmClear": {
+ "message": "Sigurado ka bang gusto mong i-clear ang mga naaprubahang website?"
+ },
+ "clearApprovalDataSuccess": {
+ "message": "Matagumpay na na-clear ang data ng aprubadong website."
+ },
+ "approvalData": {
+ "message": "Data ng Pag-apruba"
+ },
+ "approvalDataDescription": {
+ "message": "I-clear ang naaprubahang data ng website upang ang lahat ng site ay dapat humiling muli ng pag-apruba"
+ },
+ "clearApprovalData": {
+ "message": "Tanggalin ang data ng pag-apruba"
+ },
+ "approve": {
+ "message": "Aprubahan"
+ },
+ "reject": {
+ "message": "Tanggihan"
+ },
+ "providerAPIRequest": {
+ "message": "Kahilingan sa Web3 API"
+ },
+ "reviewProviderRequest": {
+ "message": "Mangyaring suriin ang kahilingan sa Ethereum API na ito."
+ },
+ "providerRequestInfo": {
+ "message": "Ang domain na nakalista sa ibaba ay sinusubukang humiling ng access sa Ethereum API upang maaari itong makipag-ugnayan sa Ethereum blockchain. Laging i-double check na ikaw ay nasa tamang site bago aprubahan ang Ethereum access."
+ },
"accept": {
"message": "Tanggapin"
},
diff --git a/app/_locales/pt/messages.json b/app/_locales/pt/messages.json
index 287ae0400..8e07aaef5 100644
--- a/app/_locales/pt/messages.json
+++ b/app/_locales/pt/messages.json
@@ -1,4 +1,49 @@
{
+ "privacyMode": {
+ "message": "Modo de privacidade"
+ },
+ "privacyModeDescription": {
+ "message": "Os sites devem solicitar acesso para visualizar as informações da sua conta."
+ },
+ "exposeAccounts": {
+ "message": "Expor contas"
+ },
+ "exposeDescription": {
+ "message": "Exponha contas ao site atual. Útil para dapps herdados."
+ },
+ "confirmExpose": {
+ "message": "Tem certeza de que deseja expor suas contas ao site atual?"
+ },
+ "confirmClear": {
+ "message": "Tem certeza de que deseja limpar sites aprovados?"
+ },
+ "clearApprovalDataSuccess": {
+ "message": "Dados aprovados do website foram limpos com sucesso."
+ },
+ "approvalData": {
+ "message": "Dados de aprovação"
+ },
+ "approvalDataDescription": {
+ "message": "Limpe os dados aprovados do website para que todos os sites solicitem aprovação novamente."
+ },
+ "clearApprovalData": {
+ "message": "Limpar dados de aprovação"
+ },
+ "approve": {
+ "message": "Aprovar"
+ },
+ "reject": {
+ "message": "Rejeitar"
+ },
+ "providerAPIRequest": {
+ "message": "Solicitação de API do Web3"
+ },
+ "reviewProviderRequest": {
+ "message": "Por favor, revise esta solicitação da API da Ethereum."
+ },
+ "providerRequestInfo": {
+ "message": "O domínio listado abaixo está tentando solicitar acesso à API Ethereum para que ele possa interagir com o blockchain Ethereum. Sempre verifique se você está no site correto antes de aprovar o acesso à Ethereum."
+ },
"accept": {
"message": "Aceitar"
},
diff --git a/app/_locales/ru/messages.json b/app/_locales/ru/messages.json
index 45bb09683..917b2b615 100644
--- a/app/_locales/ru/messages.json
+++ b/app/_locales/ru/messages.json
@@ -1,4 +1,49 @@
{
+ "privacyMode": {
+ "message": "Режим конфиденциальности"
+ },
+ "privacyModeDescription": {
+ "message": "Веб-сайты должны запрашивать доступ для просмотра информации об учетной записи."
+ },
+ "exposeAccounts": {
+ "message": "Открыть счета"
+ },
+ "exposeDescription": {
+ "message": "Выводить счета на текущий веб-сайт. Полезно для старых dapps."
+ },
+ "confirmExpose": {
+ "message": "Вы уверены, что хотите открыть свои аккаунты на текущем веб-сайте?"
+ },
+ "confirmClear": {
+ "message": "Вы уверены, что хотите очистить утвержденные веб-сайты?Tem certeza de que deseja limpar sites aprovados?"
+ },
+ "clearApprovalDataSuccess": {
+ "message": "Утвержденные данные веб-сайта успешно удалены."
+ },
+ "approvalData": {
+ "message": "Данные об утверждении"
+ },
+ "approvalDataDescription": {
+ "message": "Очистите утвержденные данные веб-сайта, чтобы все сайты снова запросили подтверждение."
+ },
+ "clearApprovalData": {
+ "message": "Четкие данные об утверждении"
+ },
+ "approve": {
+ "message": "Одобрить"
+ },
+ "reject": {
+ "message": "Отклонить"
+ },
+ "providerAPIRequest": {
+ "message": "Запрос API Web3"
+ },
+ "reviewProviderRequest": {
+ "message": "Просмотрите этот запрос API Ethereum."
+ },
+ "providerRequestInfo": {
+ "message": "Домен, указанный ниже, пытается запросить доступ к API-интерфейсу Ethereum, чтобы он мог взаимодействовать с блокчейном Ethereum. Всегда проверяйте, что вы находитесь на правильном сайте, прежде чем одобрять доступ к веб-сайту."
+ },
"accept": {
"message": "Принять"
},
diff --git a/app/_locales/sl/messages.json b/app/_locales/sl/messages.json
index a4b04d34b..b9c4ff8e0 100644
--- a/app/_locales/sl/messages.json
+++ b/app/_locales/sl/messages.json
@@ -1,819 +1,957 @@
{
+ "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"
},
"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"
},
"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 a9f2f1022..7fabe4eac 100644
--- a/app/_locales/th/messages.json
+++ b/app/_locales/th/messages.json
@@ -1,4 +1,49 @@
{
+ "privacyMode": {
+ "message": "โหมดความเป็นส่วนตัว"
+ },
+ "privacyModeDescription": {
+ "message": "เว็บไซต์ต้องขอเข้าถึงเพื่อดูข้อมูลบัญชีของคุณ"
+ },
+ "exposeAccounts": {
+ "message": "เปิดเผยบัญชี"
+ },
+ "exposeDescription": {
+ "message": "เปิดเผยบัญชีไปยังเว็บไซต์ปัจจุบัน มีประโยชน์สำหรับ dapps แบบเดิม"
+ },
+ "confirmExpose": {
+ "message": "คุณแน่ใจหรือไม่ว่าต้องการเปิดเผยบัญชีของคุณไปยังเว็บไซต์ปัจจุบัน"
+ },
+ "confirmClear": {
+ "message": "คุณแน่ใจหรือไม่ว่าต้องการล้างเว็บไซต์ที่ผ่านการอนุมัติ"
+ },
+ "clearApprovalDataSuccess": {
+ "message": "อนุมัติข้อมูลเว็บไซต์ที่ได้รับอนุมัติแล้ว"
+ },
+ "approvalData": {
+ "message": "ข้อมูลการอนุมัติ"
+ },
+ "approvalDataDescription": {
+ "message": "ล้างข้อมูลเว็บไซต์ที่ได้รับการอนุมัติเพื่อให้ทุกไซต์ต้องขออนุมัติอีกครั้ง"
+ },
+ "clearApprovalData": {
+ "message": "ล้างข้อมูลการอนุมัติ"
+ },
+ "approve": {
+ "message": "อนุมัติ"
+ },
+ "reject": {
+ "message": "ปฏิเสธ"
+ },
+ "providerAPIRequest": {
+ "message": "คำขอ Web3 API"
+ },
+ "reviewProviderRequest": {
+ "message": "โปรดอ่านคำขอ Ethereum API นี้"
+ },
+ "providerRequestInfo": {
+ "message": "โดเมนที่แสดงด้านล่างกำลังพยายามขอเข้าถึง API ของ Ethereum เพื่อให้สามารถโต้ตอบกับบล็อค Ethereum ได้ ตรวจสอบว่าคุณอยู่ในไซต์ที่ถูกต้องก่อนที่จะอนุมัติการเข้าถึง Ethereum เสมอ"
+ },
"accept": {
"message": "ยอมรับ"
},
diff --git a/app/_locales/tml/messages.json b/app/_locales/tml/messages.json
index 8dc242c10..0643ce205 100644
--- a/app/_locales/tml/messages.json
+++ b/app/_locales/tml/messages.json
@@ -1,4 +1,49 @@
{
+ "privacyMode": {
+ "message": "தனியுரிமை முறை"
+ },
+ "privacyModeDescription": {
+ "message": "உங்கள் கணக்குத் தகவலை பார்வையிட வலைத்தளங்கள் அணுகலைக் கோர வேண்டும்."
+ },
+ "exposeAccounts": {
+ "message": "கணக்குகளை அம்பலப்படுத்துங்கள்"
+ },
+ "exposeDescription": {
+ "message": "தற்போதைய இணையதளத்திற்கு கணக்குகளை அம்பலப்படுத்துங்கள். மரபணு டாப்ஸ் பயன்படுத்த."
+ },
+ "confirmExpose": {
+ "message": "நிச்சயமாக உங்கள் கணக்குகளை தற்போதைய இணையத்தளத்தில் அம்பலப்படுத்த விரும்புகிறீர்களா?"
+ },
+ "confirmClear": {
+ "message": "அங்கீகரிக்கப்பட்ட வலைத்தளங்களை நிச்சயமாக நீக்க விரும்புகிறீர்களா?"
+ },
+ "clearApprovalDataSuccess": {
+ "message": "அங்கீகரிக்கப்பட்ட வலைத்தள தரவு வெற்றிகரமாக அழிக்கப்பட்டது."
+ },
+ "approvalData": {
+ "message": "ஒப்புதல் தரவு"
+ },
+ "approvalDataDescription": {
+ "message": "அங்கீகரிக்கப்பட்ட வலைத்தள தரவை அழிக்கவும், அனைத்து தளங்களும் ஒப்புதல் மீண்டும் கோர வேண்டும்."
+ },
+ "clearApprovalData": {
+ "message": "ஒப்புதல் தரவை அழி"
+ },
+ "approve": {
+ "message": "ஒப்புதல்"
+ },
+ "reject": {
+ "message": "நிராகரி"
+ },
+ "providerAPIRequest": {
+ "message": "Web3 API கோரிக்கை"
+ },
+ "reviewProviderRequest": {
+ "message": "இந்த வலை 3 API கோரிக்கையை மதிப்பாய்வு செய்யவும்."
+ },
+ "providerRequestInfo": {
+ "message": "கீழே பட்டியலிடப்பட்டுள்ள டொமைன் Web3 ஏபிஐ அணுகலைக் கோருவதற்கு முயற்சிக்கிறது, எனவே இது Ethereum blockchain உடன் தொடர்பு கொள்ள முடியும். Web3 அணுகுமுறையை அங்கீகரிப்பதற்கு முன் சரியான தளத்தில் இருப்பதை எப்போதும் இருமுறை சரிபார்க்கவும்."
+ },
"accept": {
"message": "ஏற்கவும்"
},
diff --git a/app/_locales/tr/messages.json b/app/_locales/tr/messages.json
index 0dac139dd..1bb149eaa 100644
--- a/app/_locales/tr/messages.json
+++ b/app/_locales/tr/messages.json
@@ -1,4 +1,49 @@
{
+ "privacyMode": {
+ "message": "Gizlilik modu"
+ },
+ "privacyModeDescription": {
+ "message": "Web siteleri, hesap bilgilerinizi görmek için erişim istemek zorundadır."
+ },
+ "exposeAccounts": {
+ "message": "Hesapları Açığa Çıkar"
+ },
+ "exposeDescription": {
+ "message": "Hesapları mevcut web sitesine gösterin. Eski dapps için kullanışlıdır."
+ },
+ "confirmExpose": {
+ "message": "Hesaplarınızı mevcut web sitesine taşımak istediğinizden emin misiniz?"
+ },
+ "confirmClear": {
+ "message": "Onaylanmış web sitelerini silmek istediğinizden emin misiniz?"
+ },
+ "clearApprovalDataSuccess": {
+ "message": "Onaylanan web sitesi verileri başarıyla temizlendi."
+ },
+ "approvalData": {
+ "message": "Onay Verileri"
+ },
+ "approvalDataDescription": {
+ "message": "Onaylanan web sitesi verilerini temizle, tüm sitelerin tekrar onay isteğinde bulunması gerekir."
+ },
+ "clearApprovalData": {
+ "message": "Onay verilerini temizle"
+ },
+ "approve": {
+ "message": "Onaylamak"
+ },
+ "reject": {
+ "message": "Reddetmek"
+ },
+ "providerAPIRequest": {
+ "message": "Web3 API İsteği"
+ },
+ "reviewProviderRequest": {
+ "message": "Lütfen bu Ethereum API isteğini inceleyin."
+ },
+ "providerRequestInfo": {
+ "message": "Aşağıda listelenen etki alanı, Ethereum API'sine erişim talep etmeye çalışmaktadır, böylece Ethereum blockchain ile etkileşime girebilir. Web3 erişimini onaylamadan önce her zaman doğru sitede olduğunuzu kontrol edin."
+ },
"accept": {
"message": "Kabul et"
},
diff --git a/app/_locales/vi/messages.json b/app/_locales/vi/messages.json
index 782dfd119..f0837ba98 100644
--- a/app/_locales/vi/messages.json
+++ b/app/_locales/vi/messages.json
@@ -1,4 +1,49 @@
{
+ "privacyMode": {
+ "message": "Chế độ riêng tư"
+ },
+ "privacyModeDescription": {
+ "message": "Trang web phải yêu cầu quyền truy cập để xem thông tin tài khoản của bạn."
+ },
+ "exposeAccounts": {
+ "message": "Hiển thị tài khoản"
+ },
+ "exposeDescription": {
+ "message": "Hiển thị tài khoản cho trang web hiện tại. Hữu ích cho các ứng dụng cũ."
+ },
+ "confirmExpose": {
+ "message": "Bạn có chắc chắn muốn hiển thị tài khoản của mình cho trang web hiện tại không?"
+ },
+ "confirmClear": {
+ "message": "Bạn có chắc chắn muốn xóa các trang web được phê duyệt không?"
+ },
+ "clearApprovalDataSuccess": {
+ "message": "Đã xóa thành công dữ liệu trang web được phê duyệt."
+ },
+ "approvalData": {
+ "message": "Dữ liệu phê duyệt"
+ },
+ "approvalDataDescription": {
+ "message": "Xóa dữ liệu trang web được phê duyệt để tất cả các trang web phải yêu cầu phê duyệt lại."
+ },
+ "clearApprovalData": {
+ "message": "Xóa dữ liệu phê duyệt"
+ },
+ "approve": {
+ "message": "Phê duyệt"
+ },
+ "reject": {
+ "message": "Từ chối"
+ },
+ "providerAPIRequest": {
+ "message": "Yêu cầu API Web3"
+ },
+ "reviewProviderRequest": {
+ "message": "Vui lòng xem lại yêu cầu API Ethereum này."
+ },
+ "providerRequestInfo": {
+ "message": "Miền được liệt kê bên dưới đang cố gắng yêu cầu quyền truy cập vào API Ethereum để nó có thể tương tác với chuỗi khối Ethereum. Luôn kiểm tra kỹ xem bạn có đang ở đúng trang web trước khi phê duyệt quyền truy cập Ethereum hay không."
+ },
"accept": {
"message": "Chấp nhận"
},
diff --git a/app/_locales/zh_CN/messages.json b/app/_locales/zh_CN/messages.json
index 90ac2a55b..911ddf476 100644
--- a/app/_locales/zh_CN/messages.json
+++ b/app/_locales/zh_CN/messages.json
@@ -1,4 +1,49 @@
{
+ "privacyMode": {
+ "message": "隐私模式"
+ },
+ "privacyModeDescription": {
+ "message": "网站必须请求访问权限才能查看您的帐户信息。"
+ },
+ "exposeAccounts": {
+ "message": "公开账户"
+ },
+ "exposeDescription": {
+ "message": "将帐户公开给当前网站。对传统dapps很有用。"
+ },
+ "confirmExpose": {
+ "message": "您确定要将帐户公开到当前网站吗?"
+ },
+ "confirmClear": {
+ "message": "您确定要清除已批准的网站吗?"
+ },
+ "clearApprovalDataSuccess": {
+ "message": "已批准的网站数据已成功清除。"
+ },
+ "approvalData": {
+ "message": "审批数据"
+ },
+ "approvalDataDescription": {
+ "message": "清除已批准的网站数据,以便所有网站都必须再次申请"
+ },
+ "clearApprovalData": {
+ "message": "清除批准数据"
+ },
+ "approve": {
+ "message": "批准"
+ },
+ "reject": {
+ "message": "拒绝"
+ },
+ "providerAPIRequest": {
+ "message": "Web3 API请求"
+ },
+ "reviewProviderRequest": {
+ "message": "请查看此Ethereum API请求。"
+ },
+ "providerRequestInfo": {
+ "message": "下面列出的域正在尝试请求访问Ethereum API,以便它可以与以太坊区块链进行交互。在批准Ethereum访问之前,请务必仔细检查您是否在正确的站点上。"
+ },
"accept": {
"message": "接受"
},
diff --git a/app/_locales/zh_TW/messages.json b/app/_locales/zh_TW/messages.json
index f71ce311f..3b048fd91 100644
--- a/app/_locales/zh_TW/messages.json
+++ b/app/_locales/zh_TW/messages.json
@@ -1,4 +1,49 @@
{
+ "privacyMode": {
+ "message": "隱私模式"
+ },
+ "privacyModeDescription": {
+ "message": "網站必須請求訪問權限才能查看您的帳戶信息。"
+ },
+ "exposeAccounts": {
+ "message": "公開賬戶"
+ },
+ "exposeDescription": {
+ "message": "將帳戶公開給當前網站。對傳統dapps很有用。"
+ },
+ "confirmExpose": {
+ "message": "您確定要將帳戶公開到當前網站嗎?"
+ },
+ "confirmClear": {
+ "message": "您確定要清除已批准的網站嗎?"
+ },
+ "clearApprovalDataSuccess": {
+ "message": "已批准的網站數據已成功清除。"
+ },
+ "approvalData": {
+ "message": "審批數據"
+ },
+ "approvalDataDescription": {
+ "message": "清除已批准的網站數據,以便所有網站都必須再次申請"
+ },
+ "clearApprovalData": {
+ "message": "清除批准數據"
+ },
+ "approve": {
+ "message": "批准"
+ },
+ "reject": {
+ "message": "拒絕"
+ },
+ "providerAPIRequest": {
+ "message": "Web3 API請求"
+ },
+ "reviewProviderRequest": {
+ "message": "請查看此Ethereum API請求。"
+ },
+ "providerRequestInfo": {
+ "message": "下面列出的域正在嘗試請求訪問Ethereum API,以便它可以與以太坊區塊鏈進行交互。在批准Ethereum訪問之前,請務必仔細檢查您是否在正確的站點上。"
+ },
"accept": {
"message": "接受"
},
diff --git a/app/images/mm-secure.svg b/app/images/mm-secure.svg
new file mode 100644
index 000000000..1345b75b2
--- /dev/null
+++ b/app/images/mm-secure.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg width="78" height="22" viewBox="0 0 78 22" fill="none" xmlns="http://www.w3.org/2000/svg">
+ <path d="M29.5488 2.89062L31.375 8.04688L33.1914 2.89062H35.1152V10H33.6455V8.05664L33.792 4.70215L31.873 10H30.8672L28.9531 4.70703L29.0996 8.05664V10H27.6348V2.89062H29.5488ZM38.7334 10.0977C37.9587 10.0977 37.3271 9.86003 36.8389 9.38477C36.3538 8.90951 36.1113 8.27637 36.1113 7.48535V7.34863C36.1113 6.81803 36.2139 6.3444 36.4189 5.92773C36.624 5.50781 36.9137 5.18555 37.2881 4.96094C37.6657 4.73307 38.0954 4.61914 38.5771 4.61914C39.2998 4.61914 39.8678 4.84701 40.2812 5.30273C40.6979 5.75846 40.9062 6.40462 40.9062 7.24121V7.81738H37.542C37.5876 8.16243 37.7243 8.43913 37.9521 8.64746C38.1833 8.85579 38.4746 8.95996 38.8262 8.95996C39.3698 8.95996 39.7946 8.76302 40.1006 8.36914L40.7939 9.14551C40.5824 9.44499 40.2959 9.67936 39.9346 9.84863C39.5732 10.0146 39.1729 10.0977 38.7334 10.0977ZM38.5723 5.76172C38.2923 5.76172 38.0645 5.85612 37.8887 6.04492C37.7161 6.23372 37.6055 6.50391 37.5566 6.85547H39.5195V6.74316C39.513 6.43066 39.4284 6.18978 39.2656 6.02051C39.1029 5.84798 38.8717 5.76172 38.5723 5.76172ZM43.4014 3.41797V4.7168H44.3047V5.75195H43.4014V8.38867C43.4014 8.58398 43.4388 8.72396 43.5137 8.80859C43.5885 8.89323 43.7318 8.93555 43.9434 8.93555C44.0996 8.93555 44.238 8.92415 44.3584 8.90137V9.9707C44.0817 10.0553 43.7969 10.0977 43.5039 10.0977C42.5143 10.0977 42.0098 9.59798 41.9902 8.59863V5.75195H41.2188V4.7168H41.9902V3.41797H43.4014ZM48.1523 10C48.0872 9.87305 48.04 9.71517 48.0107 9.52637C47.6689 9.90723 47.2246 10.0977 46.6777 10.0977C46.1602 10.0977 45.7305 9.94792 45.3887 9.64844C45.0501 9.34896 44.8809 8.97135 44.8809 8.51562C44.8809 7.95573 45.0876 7.52604 45.501 7.22656C45.9176 6.92708 46.5182 6.77572 47.3027 6.77246H47.9521V6.46973C47.9521 6.22559 47.8887 6.03027 47.7617 5.88379C47.638 5.7373 47.4411 5.66406 47.1709 5.66406C46.9333 5.66406 46.7461 5.72103 46.6094 5.83496C46.4759 5.94889 46.4092 6.10514 46.4092 6.30371H44.998C44.998 5.99772 45.0924 5.71452 45.2812 5.4541C45.4701 5.19368 45.737 4.99023 46.082 4.84375C46.4271 4.69401 46.8145 4.61914 47.2441 4.61914C47.8952 4.61914 48.4111 4.78353 48.792 5.1123C49.1761 5.43783 49.3682 5.89681 49.3682 6.48926V8.7793C49.3714 9.2806 49.4414 9.65983 49.5781 9.91699V10H48.1523ZM46.9854 9.01855C47.1937 9.01855 47.3857 8.97298 47.5615 8.88184C47.7373 8.78743 47.8675 8.66211 47.9521 8.50586V7.59766H47.4248C46.7184 7.59766 46.3424 7.8418 46.2969 8.33008L46.292 8.41309C46.292 8.58887 46.3538 8.73372 46.4775 8.84766C46.6012 8.96159 46.7705 9.01855 46.9854 9.01855ZM52.459 2.89062L54.2852 8.04688L56.1016 2.89062H58.0254V10H56.5557V8.05664L56.7021 4.70215L54.7832 10H53.7773L51.8633 4.70703L52.0098 8.05664V10H50.5449V2.89062H52.459ZM62.2734 10C62.2083 9.87305 62.1611 9.71517 62.1318 9.52637C61.79 9.90723 61.3457 10.0977 60.7988 10.0977C60.2812 10.0977 59.8516 9.94792 59.5098 9.64844C59.1712 9.34896 59.002 8.97135 59.002 8.51562C59.002 7.95573 59.2087 7.52604 59.6221 7.22656C60.0387 6.92708 60.6393 6.77572 61.4238 6.77246H62.0732V6.46973C62.0732 6.22559 62.0098 6.03027 61.8828 5.88379C61.7591 5.7373 61.5622 5.66406 61.292 5.66406C61.0544 5.66406 60.8672 5.72103 60.7305 5.83496C60.597 5.94889 60.5303 6.10514 60.5303 6.30371H59.1191C59.1191 5.99772 59.2135 5.71452 59.4023 5.4541C59.5911 5.19368 59.8581 4.99023 60.2031 4.84375C60.5482 4.69401 60.9355 4.61914 61.3652 4.61914C62.0163 4.61914 62.5322 4.78353 62.9131 5.1123C63.2972 5.43783 63.4893 5.89681 63.4893 6.48926V8.7793C63.4925 9.2806 63.5625 9.65983 63.6992 9.91699V10H62.2734ZM61.1064 9.01855C61.3148 9.01855 61.5068 8.97298 61.6826 8.88184C61.8584 8.78743 61.9886 8.66211 62.0732 8.50586V7.59766H61.5459C60.8395 7.59766 60.4635 7.8418 60.418 8.33008L60.4131 8.41309C60.4131 8.58887 60.4749 8.73372 60.5986 8.84766C60.7223 8.96159 60.8916 9.01855 61.1064 9.01855ZM67.4346 8.54004C67.4346 8.36751 67.3483 8.23242 67.1758 8.13477C67.0065 8.03385 66.7331 7.94434 66.3555 7.86621C65.099 7.60254 64.4707 7.06868 64.4707 6.26465C64.4707 5.7959 64.6644 5.40527 65.0518 5.09277C65.4424 4.77702 65.9518 4.61914 66.5801 4.61914C67.2507 4.61914 67.7861 4.77702 68.1865 5.09277C68.5902 5.40853 68.792 5.81868 68.792 6.32324H67.3809C67.3809 6.12142 67.3158 5.9554 67.1855 5.8252C67.0553 5.69173 66.8519 5.625 66.5752 5.625C66.3376 5.625 66.1536 5.67871 66.0234 5.78613C65.8932 5.89355 65.8281 6.03027 65.8281 6.19629C65.8281 6.35254 65.9014 6.47949 66.0479 6.57715C66.1976 6.67155 66.4482 6.75456 66.7998 6.82617C67.1514 6.89453 67.4476 6.97266 67.6885 7.06055C68.4339 7.33398 68.8066 7.80762 68.8066 8.48145C68.8066 8.96322 68.5999 9.35384 68.1865 9.65332C67.7731 9.94954 67.2393 10.0977 66.585 10.0977C66.1423 10.0977 65.7484 10.0195 65.4033 9.86328C65.0615 9.70378 64.793 9.4873 64.5977 9.21387C64.4023 8.93717 64.3047 8.63932 64.3047 8.32031H65.6426C65.6556 8.57096 65.7484 8.76302 65.9209 8.89648C66.0934 9.02995 66.3245 9.09668 66.6143 9.09668C66.8844 9.09668 67.0879 9.04622 67.2246 8.94531C67.3646 8.84115 67.4346 8.70605 67.4346 8.54004ZM71.6387 7.88086L71.1309 8.38867V10H69.7197V2.5H71.1309V6.65527L71.4043 6.30371L72.7568 4.7168H74.4512L72.542 6.91895L74.6172 10H72.9961L71.6387 7.88086ZM31.3213 18.1348C31.3213 17.8581 31.2236 17.6465 31.0283 17.5C30.833 17.3503 30.4814 17.194 29.9736 17.0312C29.4658 16.8652 29.0638 16.7025 28.7676 16.543C27.9603 16.1068 27.5566 15.5192 27.5566 14.7803C27.5566 14.3962 27.6641 14.0544 27.8789 13.7549C28.097 13.4521 28.4079 13.2161 28.8115 13.0469C29.2184 12.8776 29.6742 12.793 30.1787 12.793C30.6865 12.793 31.139 12.8857 31.5361 13.0713C31.9333 13.2536 32.2409 13.5124 32.459 13.8477C32.6803 14.1829 32.791 14.5638 32.791 14.9902H31.3262C31.3262 14.6647 31.2236 14.4124 31.0186 14.2334C30.8135 14.0511 30.5254 13.96 30.1543 13.96C29.7962 13.96 29.5179 14.0365 29.3193 14.1895C29.1208 14.3392 29.0215 14.5378 29.0215 14.7852C29.0215 15.0163 29.137 15.21 29.3682 15.3662C29.6025 15.5225 29.946 15.6689 30.3984 15.8057C31.2318 16.0563 31.8389 16.3672 32.2197 16.7383C32.6006 17.1094 32.791 17.5716 32.791 18.125C32.791 18.7402 32.5583 19.2236 32.0928 19.5752C31.6273 19.9235 31.0007 20.0977 30.2129 20.0977C29.666 20.0977 29.168 19.9984 28.7188 19.7998C28.2695 19.598 27.9261 19.3229 27.6885 18.9746C27.4541 18.6263 27.3369 18.2227 27.3369 17.7637H28.8066C28.8066 18.5482 29.2754 18.9404 30.2129 18.9404C30.5612 18.9404 30.833 18.8704 31.0283 18.7305C31.2236 18.5872 31.3213 18.3887 31.3213 18.1348ZM36.126 20.0977C35.3512 20.0977 34.7197 19.86 34.2314 19.3848C33.7464 18.9095 33.5039 18.2764 33.5039 17.4854V17.3486C33.5039 16.818 33.6064 16.3444 33.8115 15.9277C34.0166 15.5078 34.3063 15.1855 34.6807 14.9609C35.0583 14.7331 35.488 14.6191 35.9697 14.6191C36.6924 14.6191 37.2604 14.847 37.6738 15.3027C38.0905 15.7585 38.2988 16.4046 38.2988 17.2412V17.8174H34.9346C34.9801 18.1624 35.1169 18.4391 35.3447 18.6475C35.5758 18.8558 35.8672 18.96 36.2188 18.96C36.7624 18.96 37.1872 18.763 37.4932 18.3691L38.1865 19.1455C37.9749 19.445 37.6885 19.6794 37.3271 19.8486C36.9658 20.0146 36.5654 20.0977 36.126 20.0977ZM35.9648 15.7617C35.6849 15.7617 35.457 15.8561 35.2812 16.0449C35.1087 16.2337 34.998 16.5039 34.9492 16.8555H36.9121V16.7432C36.9056 16.4307 36.821 16.1898 36.6582 16.0205C36.4954 15.848 36.2643 15.7617 35.9648 15.7617ZM41.3018 18.96C41.5622 18.96 41.7738 18.8883 41.9365 18.7451C42.0993 18.6019 42.1839 18.4115 42.1904 18.1738H43.5137C43.5104 18.5319 43.4128 18.8607 43.2207 19.1602C43.0286 19.4564 42.765 19.6875 42.4297 19.8535C42.0977 20.0163 41.7298 20.0977 41.3262 20.0977C40.571 20.0977 39.9753 19.8584 39.5391 19.3799C39.1029 18.8981 38.8848 18.234 38.8848 17.3877V17.2949C38.8848 16.4811 39.1012 15.8317 39.5342 15.3467C39.9671 14.8617 40.5612 14.6191 41.3164 14.6191C41.9772 14.6191 42.5062 14.8079 42.9033 15.1855C43.3037 15.5599 43.5072 16.0596 43.5137 16.6846H42.1904C42.1839 16.4111 42.0993 16.1898 41.9365 16.0205C41.7738 15.848 41.5589 15.7617 41.292 15.7617C40.9632 15.7617 40.7142 15.8822 40.5449 16.123C40.3789 16.3607 40.2959 16.748 40.2959 17.2852V17.4316C40.2959 17.9753 40.3789 18.3659 40.5449 18.6035C40.7109 18.8411 40.9632 18.96 41.3018 18.96ZM47.4834 19.4629C47.1351 19.8861 46.6533 20.0977 46.0381 20.0977C45.4717 20.0977 45.0387 19.9349 44.7393 19.6094C44.443 19.2839 44.2917 18.807 44.2852 18.1787V14.7168H45.6963V18.1299C45.6963 18.68 45.9469 18.9551 46.4482 18.9551C46.9268 18.9551 47.2555 18.7891 47.4346 18.457V14.7168H48.8506V20H47.5225L47.4834 19.4629ZM52.8838 16.04C52.6917 16.014 52.5225 16.001 52.376 16.001C51.8421 16.001 51.4922 16.1816 51.3262 16.543V20H49.915V14.7168H51.248L51.2871 15.3467C51.5703 14.8617 51.9626 14.6191 52.4639 14.6191C52.6201 14.6191 52.7666 14.6403 52.9033 14.6826L52.8838 16.04ZM55.9014 20.0977C55.1266 20.0977 54.4951 19.86 54.0068 19.3848C53.5218 18.9095 53.2793 18.2764 53.2793 17.4854V17.3486C53.2793 16.818 53.3818 16.3444 53.5869 15.9277C53.792 15.5078 54.0817 15.1855 54.4561 14.9609C54.8337 14.7331 55.2633 14.6191 55.7451 14.6191C56.4678 14.6191 57.0358 14.847 57.4492 15.3027C57.8659 15.7585 58.0742 16.4046 58.0742 17.2412V17.8174H54.71C54.7555 18.1624 54.8923 18.4391 55.1201 18.6475C55.3512 18.8558 55.6426 18.96 55.9941 18.96C56.5378 18.96 56.9626 18.763 57.2686 18.3691L57.9619 19.1455C57.7503 19.445 57.4639 19.6794 57.1025 19.8486C56.7412 20.0146 56.3408 20.0977 55.9014 20.0977ZM55.7402 15.7617C55.4603 15.7617 55.2324 15.8561 55.0566 16.0449C54.8841 16.2337 54.7734 16.5039 54.7246 16.8555H56.6875V16.7432C56.681 16.4307 56.5964 16.1898 56.4336 16.0205C56.2708 15.848 56.0397 15.7617 55.7402 15.7617Z" fill="#A2A4AC"/>
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M0 2.65498L0 8.69867C0 14.9252 4.19995 20.1981 10 22C15.7999 20.1981 20 14.9252 20 8.69867L20 2.65498L10 0L0 2.65498Z" fill="#A2A4AC"/>
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M8.47027 11.6L7.38462 12.093L8.92308 12.5429L8.47027 11.6ZM11.2204 11.6L10.7692 12.5429L12.3077 12.093L11.2204 11.6ZM10.4442 13.8H9.24372L9.0357 13.9633L8.92308 15.0571L9.02705 14.9484H10.6609L10.7692 15.0571L10.6522 13.9633L10.4442 13.8ZM15.6234 9.86253L15.388 9.69497L15.7646 9.35535L15.4774 9.13192L15.8541 8.84816L15.6046 8.66202L16 6.76348L15.4068 5L11.5888 6.40985L8.41115 6.40985L4.59313 5L4 6.76348L4.40012 8.66202L4.1459 8.84816L4.52253 9.13192L4.23536 9.35535L4.612 9.69497L4.37656 9.86253L4.91795 10.4907L4.09886 13.0127L4.85682 15.5859L7.52607 14.86L8.04391 15.2788L9.09844 16H10.9015L11.9561 15.2788L12.4739 14.86L15.1432 15.5859L15.9058 13.0127L15.082 10.4907L15.6234 9.86253Z" fill="white"/>
+</svg>
diff --git a/app/images/provider-approval-check.svg b/app/images/provider-approval-check.svg
new file mode 100644
index 000000000..c3df71f59
--- /dev/null
+++ b/app/images/provider-approval-check.svg
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g filter="url(#filter0_d)">
+<path d="M34.5 19C34.5 27.0081 28.0081 33.5 20 33.5C11.9919 33.5 5.5 27.0081 5.5 19C5.5 10.9919 11.9919 4.5 20 4.5C28.0081 4.5 34.5 10.9919 34.5 19Z" fill="#61BA00" stroke="#61BA00"/>
+<path d="M13.2998 19.7195L16.813 23.3195L26.1998 14.0195" stroke="white" stroke-width="2"/>
+</g>
+<defs>
+<filter id="filter0_d" x="0" y="0" width="40" height="40" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+<feFlood flood-opacity="0" result="BackgroundImageFix"/>
+<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"/>
+<feOffset dy="1"/>
+<feGaussianBlur stdDeviation="2.5"/>
+<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.25 0"/>
+<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow"/>
+<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow" result="shape"/>
+</filter>
+</defs>
+</svg>
+
diff --git a/app/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 be1b08c07..a72d474b1 100644
--- a/app/manifest.json
+++ b/app/manifest.json
@@ -1,7 +1,7 @@
{
"name": "__MSG_appName__",
"short_name": "__MSG_appName__",
- "version": "4.16.0",
+ "version": "5.0.0",
"manifest_version": 2,
"author": "https://metamask.io",
"description": "__MSG_appDescription__",
diff --git a/app/scripts/background.js b/app/scripts/background.js
index d20ffe6e3..2dcb79bef 100644
--- a/app/scripts/background.js
+++ b/app/scripts/background.js
@@ -23,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,
@@ -50,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
@@ -58,7 +58,6 @@ const isIE = !!document.documentMode
// Edge 20+
const isEdge = !isIE && !!window.StyleMedia
-let ipfsHandle
let popupIsOpen = false
let notificationIsOpen = false
const openMetamaskTabsIDs = {}
@@ -164,7 +163,6 @@ async function initialize () {
const initLangCode = await getFirstPreferredLangCode()
await setupController(initState, initLangCode)
log.debug('MetaMask initialization complete.')
- ipfsHandle = ipfsContent(initState.NetworkController.provider)
}
//
@@ -197,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')
}
}
@@ -212,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 },
})
@@ -258,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
@@ -269,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)
}
@@ -459,7 +456,7 @@ function triggerUi () {
* Opens the browser popup for user confirmation of watchAsset
* then it waits until user interact with the UI
*/
-function showWatchAssetUi () {
+function openPopup () {
triggerUi()
return new Promise(
(resolve) => {
diff --git a/app/scripts/contentscript.js b/app/scripts/contentscript.js
index 33523eb46..1a10cdb34 100644
--- a/app/scripts/contentscript.js
+++ b/app/scripts/contentscript.js
@@ -7,10 +7,12 @@ const PongStream = require('ping-pong-stream/pong')
const ObjectMultiplex = require('obj-multiplex')
const extension = require('extensionizer')
const PortStream = require('extension-port-stream')
+const TransformStream = require('stream').Transform
const inpageContent = fs.readFileSync(path.join(__dirname, '..', '..', 'dist', 'chrome', 'inpage.js')).toString()
const inpageSuffix = '//# sourceURL=' + extension.extension.getURL('inpage.js') + '\n'
const inpageBundle = inpageContent + inpageSuffix
+let isEnabled = false
// Eventually this streaming injection could be replaced with:
// https://developer.mozilla.org/en-US/docs/Mozilla/Tech/XPCOM/Language_Bindings/Components.utils.exportFunction
@@ -20,24 +22,27 @@ const inpageBundle = inpageContent + inpageSuffix
// MetaMask will be much faster loading and performant on Firefox.
if (shouldInjectWeb3()) {
- setupInjection()
+ injectScript(inpageBundle)
setupStreams()
+ listenForProviderRequest()
+ checkPrivacyMode()
}
/**
- * Creates a script tag that injects inpage.js
+ * Injects a script tag into the current document
+ *
+ * @param {string} content - Code to be executed in the current document
*/
-function setupInjection () {
+function injectScript (content) {
try {
- // inject in-page script
- var scriptTag = document.createElement('script')
- scriptTag.textContent = inpageBundle
- scriptTag.onload = function () { this.parentNode.removeChild(this) }
- var container = document.head || document.documentElement
- // append as first child
+ const container = document.head || document.documentElement
+ const scriptTag = document.createElement('script')
+ scriptTag.setAttribute('async', false)
+ scriptTag.textContent = content
container.insertBefore(scriptTag, container.children[0])
+ container.removeChild(scriptTag)
} catch (e) {
- console.error('Metamask injection failed.', e)
+ console.error('MetaMask script injection failed', e)
}
}
@@ -54,10 +59,22 @@ function setupStreams () {
const pluginPort = extension.runtime.connect({ name: 'contentscript' })
const pluginStream = new PortStream(pluginPort)
+ // Filter out selectedAddress until this origin is enabled
+ const approvalTransform = new TransformStream({
+ objectMode: true,
+ transform: (data, _, done) => {
+ if (typeof data === 'object' && data.name && data.name === 'publicConfig' && !isEnabled) {
+ data.data.selectedAddress = undefined
+ }
+ done(null, { ...data })
+ },
+ })
+
// forward communication plugin->inpage
pump(
pageStream,
pluginStream,
+ approvalTransform,
pageStream,
(err) => logStreamDisconnectWarning('MetaMask Contentscript Forwarding', err)
)
@@ -97,6 +114,69 @@ function setupStreams () {
mux.ignoreStream('publicConfig')
}
+/**
+ * Establishes listeners for requests to fully-enable the provider from the dapp context
+ * and for full-provider approvals and rejections from the background script context. Dapps
+ * should not post messages directly and should instead call provider.enable(), which
+ * handles posting these messages internally.
+ */
+function listenForProviderRequest () {
+ window.addEventListener('message', ({ source, data }) => {
+ if (source !== window || !data || !data.type) { return }
+ switch (data.type) {
+ case 'ETHEREUM_ENABLE_PROVIDER':
+ extension.runtime.sendMessage({
+ action: 'init-provider-request',
+ force: data.force,
+ origin: source.location.hostname,
+ siteImage: getSiteIcon(source),
+ siteTitle: getSiteName(source),
+ })
+ break
+ case 'ETHEREUM_IS_APPROVED':
+ extension.runtime.sendMessage({
+ action: 'init-is-approved',
+ origin: source.location.hostname,
+ })
+ break
+ case 'METAMASK_IS_UNLOCKED':
+ extension.runtime.sendMessage({
+ action: 'init-is-unlocked',
+ })
+ break
+ }
+ })
+
+ extension.runtime.onMessage.addListener(({ action = '', isApproved, caching, isUnlocked }) => {
+ switch (action) {
+ case 'approve-provider-request':
+ isEnabled = true
+ injectScript(`window.dispatchEvent(new CustomEvent('ethereumprovider', { detail: {}}))`)
+ break
+ case 'reject-provider-request':
+ injectScript(`window.dispatchEvent(new CustomEvent('ethereumprovider', { detail: { error: 'User rejected provider access' }}))`)
+ break
+ case 'answer-is-approved':
+ injectScript(`window.dispatchEvent(new CustomEvent('ethereumisapproved', { detail: { isApproved: ${isApproved}, caching: ${caching}}}))`)
+ break
+ case 'answer-is-unlocked':
+ injectScript(`window.dispatchEvent(new CustomEvent('metamaskisunlocked', { detail: { isUnlocked: ${isUnlocked}}}))`)
+ break
+ case 'metamask-set-locked':
+ isEnabled = false
+ injectScript(`window.dispatchEvent(new CustomEvent('metamasksetlocked', { detail: {}}))`)
+ break
+ }
+ })
+}
+
+/**
+ * Checks if MetaMask is currently operating in "privacy mode", meaning
+ * dapps must call ethereum.enable in order to access user accounts
+ */
+function checkPrivacyMode () {
+ extension.runtime.sendMessage({ action: 'init-privacy-request' })
+}
/**
* Error handler for page to plugin stream disconnections
@@ -210,3 +290,31 @@ function redirectToPhishingWarning () {
href: window.location.href,
})}`
}
+
+function getSiteName (window) {
+ const document = window.document
+ const siteName = document.querySelector('head > meta[property="og:site_name"]')
+ if (siteName) {
+ return siteName.content
+ }
+
+ return document.title
+}
+
+function getSiteIcon (window) {
+ const document = window.document
+
+ // Use the site's favicon if it exists
+ const shortcutIcon = document.querySelector('head > link[rel="shortcut icon"]')
+ if (shortcutIcon) {
+ return shortcutIcon.href
+ }
+
+ // Search through available icons in no particular order
+ const icon = Array.from(document.querySelectorAll('head > link[rel="icon"]')).find((icon) => Boolean(icon.href))
+ if (icon) {
+ return icon.href
+ }
+
+ return null
+}
diff --git a/app/scripts/controllers/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 20b13398c..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: {},
@@ -39,14 +39,14 @@ class PreferencesController {
seedWords: null,
forgottenPassword: false,
preferences: {
- useETHAsPrimaryCurrency: true,
+ 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
@@ -392,19 +392,22 @@ class PreferencesController {
* Adds custom RPC url to state.
*
* @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) {
- 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 (url !== 'http://localhost:8545') {
- rpcList.push(url)
+ rpcList.push({ rpcUrl: url, chainId, ticker, nickname })
}
- this.store.updateState({ frequentRpcList: rpcList })
+ this.store.updateState({ frequentRpcListDetail: rpcList })
return Promise.resolve(rpcList)
}
@@ -416,23 +419,23 @@ class PreferencesController {
*
*/
removeFromFrequentRpcList (url) {
- const rpcList = this.getFrequentRpcList()
- const index = rpcList.findIndex((element) => { return element === url })
+ const rpcList = this.getFrequentRpcListDetail()
+ const index = rpcList.findIndex((element) => { return element.rpcUrl === url })
if (index !== -1) {
rpcList.splice(index, 1)
}
- this.store.updateState({ frequentRpcList: rpcList })
+ 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
}
/**
@@ -564,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
})
@@ -580,8 +583,8 @@ class PreferencesController {
*/
_validateERC20AssetParams (opts) {
const { rawAddress, symbol, decimals } = opts
- if (!rawAddress || !symbol || !decimals) throw new Error(`Cannot suggest token without address, symbol, and decimals`)
- if (!(symbol.length < 6)) throw new Error(`Invalid symbol ${symbol} more than five characters`)
+ if (!rawAddress || !symbol || typeof decimals === 'undefined') throw new Error(`Cannot suggest token without address, symbol, and decimals`)
+ if (!(symbol.length < 7)) throw new Error(`Invalid symbol ${symbol} more than six characters`)
const numDecimals = parseInt(decimals, 10)
if (isNaN(numDecimals) || numDecimals > 36 || numDecimals < 0) {
throw new Error(`Invalid decimals ${decimals} must be at least 0, and not over 36`)
diff --git a/app/scripts/controllers/provider-approval.js b/app/scripts/controllers/provider-approval.js
new file mode 100644
index 000000000..d3b7f6dff
--- /dev/null
+++ b/app/scripts/controllers/provider-approval.js
@@ -0,0 +1,152 @@
+const ObservableStore = require('obs-store')
+
+/**
+ * A controller that services user-approved requests for a full Ethereum provider API
+ */
+class ProviderApprovalController {
+ /**
+ * Determines if caching is enabled
+ */
+ caching = true
+
+ /**
+ * Creates a ProviderApprovalController
+ *
+ * @param {Object} [config] - Options to configure controller
+ */
+ constructor ({ closePopup, keyringController, openPopup, platform, preferencesController, publicConfigStore } = {}) {
+ this.approvedOrigins = {}
+ this.closePopup = closePopup
+ this.keyringController = keyringController
+ this.openPopup = openPopup
+ this.platform = platform
+ this.preferencesController = preferencesController
+ this.publicConfigStore = publicConfigStore
+ this.store = new ObservableStore()
+
+ if (platform && platform.addMessageListener) {
+ platform.addMessageListener(({ action = '', force, origin, siteTitle, siteImage }) => {
+ switch (action) {
+ case 'init-provider-request':
+ this._handleProviderRequest(origin, siteTitle, siteImage, force)
+ break
+ case 'init-is-approved':
+ this._handleIsApproved(origin)
+ break
+ case 'init-is-unlocked':
+ this._handleIsUnlocked()
+ break
+ case 'init-privacy-request':
+ this._handlePrivacyRequest()
+ break
+ }
+ })
+ }
+ }
+
+ /**
+ * Called when a tab requests access to a full Ethereum provider API
+ *
+ * @param {string} origin - Origin of the window requesting full provider access
+ * @param {string} siteTitle - The title of the document requesting full provider access
+ * @param {string} siteImage - The icon of the window requesting full provider access
+ */
+ _handleProviderRequest (origin, siteTitle, siteImage, force) {
+ this.store.updateState({ providerRequests: [{ origin, siteTitle, siteImage }] })
+ const isUnlocked = this.keyringController.memStore.getState().isUnlocked
+ if (!force && this.approvedOrigins[origin] && this.caching && isUnlocked) {
+ this.approveProviderRequest(origin)
+ return
+ }
+ this.openPopup && this.openPopup()
+ }
+
+ /**
+ * Called by a tab to determine if an origin has been approved in the past
+ *
+ * @param {string} origin - Origin of the window
+ */
+ _handleIsApproved (origin) {
+ this.platform && this.platform.sendMessage({
+ action: 'answer-is-approved',
+ isApproved: this.approvedOrigins[origin] && this.caching,
+ caching: this.caching,
+ }, { active: true })
+ }
+
+ /**
+ * Called by a tab to determine if MetaMask is currently locked or unlocked
+ */
+ _handleIsUnlocked () {
+ const isUnlocked = this.keyringController.memStore.getState().isUnlocked
+ this.platform && this.platform.sendMessage({ action: 'answer-is-unlocked', isUnlocked }, { active: true })
+ }
+
+ /**
+ * Called to check privacy mode; if privacy mode is off, this will automatically enable the provider (legacy behavior)
+ */
+ _handlePrivacyRequest () {
+ const privacyMode = this.preferencesController.getFeatureFlags().privacyMode
+ if (!privacyMode) {
+ this.platform && this.platform.sendMessage({ action: 'approve-provider-request' }, { active: true })
+ this.publicConfigStore.emit('update', this.publicConfigStore.getState())
+ }
+ }
+
+ /**
+ * Called when a user approves access to a full Ethereum provider API
+ *
+ * @param {string} origin - Origin of the target window to approve provider access
+ */
+ approveProviderRequest (origin) {
+ this.closePopup && this.closePopup()
+ const requests = this.store.getState().providerRequests || []
+ this.platform && this.platform.sendMessage({ action: 'approve-provider-request' }, { active: true })
+ this.publicConfigStore.emit('update', this.publicConfigStore.getState())
+ const providerRequests = requests.filter(request => request.origin !== origin)
+ this.store.updateState({ providerRequests })
+ this.approvedOrigins[origin] = true
+ }
+
+ /**
+ * Called when a tab rejects access to a full Ethereum provider API
+ *
+ * @param {string} origin - Origin of the target window to reject provider access
+ */
+ rejectProviderRequest (origin) {
+ this.closePopup && this.closePopup()
+ const requests = this.store.getState().providerRequests || []
+ this.platform && this.platform.sendMessage({ action: 'reject-provider-request' }, { active: true })
+ const providerRequests = requests.filter(request => request.origin !== origin)
+ this.store.updateState({ providerRequests })
+ delete this.approvedOrigins[origin]
+ }
+
+ /**
+ * Clears any cached approvals for user-approved origins
+ */
+ clearApprovedOrigins () {
+ this.approvedOrigins = {}
+ }
+
+ /**
+ * Determines if a given origin should have accounts exposed
+ *
+ * @param {string} origin - Domain origin to check for approval status
+ * @returns {boolean} - True if the origin has been approved
+ */
+ shouldExposeAccounts (origin) {
+ const privacyMode = this.preferencesController.getFeatureFlags().privacyMode
+ return !privacyMode || this.approvedOrigins[origin]
+ }
+
+ /**
+ * Tells all tabs that MetaMask is now locked. This is primarily used to set
+ * internal flags in the contentscript and inpage script.
+ */
+ setLocked () {
+ this.platform.sendMessage({ action: 'metamask-set-locked' })
+ }
+}
+
+module.exports = ProviderApprovalController
diff --git a/app/scripts/controllers/token-rates.js b/app/scripts/controllers/token-rates.js
index 87d716aa6..b6f084841 100644
--- a/app/scripts/controllers/token-rates.js
+++ b/app/scripts/controllers/token-rates.js
@@ -1,5 +1,5 @@
const ObservableStore = require('obs-store')
-const { warn } = require('loglevel')
+const log = require('loglevel')
// By default, poll every 3 minutes
const DEFAULT_INTERVAL = 180 * 1000
@@ -26,8 +26,11 @@ class TokenRatesController {
async updateExchangeRates () {
if (!this.isActive) { return }
const contractExchangeRates = {}
- for (const i in this._tokens) {
- const address = this._tokens[i].address
+ // copy array to ensure its not modified during iteration
+ const tokens = this._tokens.slice()
+ for (const token of tokens) {
+ if (!token) return log.error(`TokenRatesController - invalid tokens state:\n${JSON.stringify(tokens, null, 2)}`)
+ const address = token.address
contractExchangeRates[address] = await this.fetchExchangeRate(address)
}
this.store.putState({ contractExchangeRates })
@@ -44,7 +47,7 @@ class TokenRatesController {
const json = await response.json()
return json && json.length ? json[0].averagePrice : 0
} catch (error) {
- warn(`MetaMask - TokenRatesController exchange rate fetch failed for ${address}.`, error)
+ log.warn(`MetaMask - TokenRatesController exchange rate fetch failed for ${address}.`, error)
return 0
}
}
diff --git a/app/scripts/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/inpage.js b/app/scripts/inpage.js
index b885a7e05..327e25042 100644
--- a/app/scripts/inpage.js
+++ b/app/scripts/inpage.js
@@ -6,14 +6,21 @@ 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.')
//
// setup plugin communication
@@ -27,26 +34,125 @@ var metamaskStream = new LocalMessageDuplexStream({
// compose the inpage provider
var inpageProvider = new MetamaskInpageProvider(metamaskStream)
+
// set a high max listener count to avoid unnecesary warnings
inpageProvider.setMaxListeners(100)
-// Augment the provider with its enable method
-inpageProvider.enable = function (options = {}) {
+// set up a listener for when MetaMask is locked
+window.addEventListener('metamasksetlocked', () => {
+ isEnabled = false
+})
+
+// augment the provider with its enable method
+inpageProvider.enable = function ({ force } = {}) {
return new Promise((resolve, reject) => {
- if (options.mockRejection) {
- reject('User rejected account access')
- } else {
- inpageProvider.sendAsync({ method: 'eth_accounts', params: [] }, (error, response) => {
- if (error) {
- reject(error)
- } else {
- resolve(response.result)
- }
- })
+ window.removeEventListener('ethereumprovider', providerHandle)
+ providerHandle = ({ detail }) => {
+ if (typeof detail.error !== 'undefined') {
+ reject(detail.error)
+ } else {
+ // wait for the publicConfig store to populate with an account
+ const publicConfig = new Promise((resolve) => {
+ const { selectedAddress } = inpageProvider.publicConfigStore.getState()
+ inpageProvider._metamask.isUnlocked().then(unlocked => {
+ if (!unlocked || selectedAddress) {
+ resolve()
+ } else {
+ inpageProvider.publicConfigStore.on('update', ({ selectedAddress }) => {
+ selectedAddress && resolve()
+ })
+ }
+ })
+ })
+
+ // wait for the background to update with an account
+ const ethAccounts = new Promise((resolveAccounts, rejectAccounts) => {
+ inpageProvider.sendAsync({ method: 'eth_accounts', params: [] }, (error, response) => {
+ if (error) {
+ rejectAccounts(error)
+ } else {
+ resolveAccounts(response.result)
+ }
+ })
+ })
+
+ Promise.all([ethAccounts, publicConfig])
+ .then(([selectedAddress]) => {
+ isEnabled = true
+ resolve(selectedAddress)
+ })
+ .catch(reject)
+ }
}
+ window.addEventListener('ethereumprovider', providerHandle)
+ 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, reject) => {
+ window.removeEventListener('ethereumisapproved', isApprovedHandle)
+ isApprovedHandle = ({ detail }) => {
+ if (typeof detail.error !== 'undefined') {
+ reject(detail.error)
+ } else {
+ if (detail.caching) {
+ resolve(!!detail.isApproved)
+ } else {
+ resolve(false)
+ }
+ }
+ }
+ window.addEventListener('ethereumisapproved', isApprovedHandle)
+ 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, reject) => {
+ window.removeEventListener('metamaskisunlocked', isUnlockedHandle)
+ isUnlockedHandle = ({ detail }) => {
+ if (typeof detail.error !== 'undefined') {
+ reject(detail.error)
+ } else {
+ resolve(!!detail.isUnlocked)
+ }
+ }
+ window.addEventListener('metamaskisunlocked', isUnlockedHandle)
+ window.postMessage({ type: 'METAMASK_IS_UNLOCKED' }, '*')
+ })
+ },
+}, {
+ get: function(obj, prop) {
+ !warned && console.warn('Heads up! ethereum._metamask exposes methods that have ' +
+ 'not been standardized yet. This means that these methods may not be implemented ' +
+ 'in other dapp browsers and may be removed from MetaMask in the future.')
+ warned = true
+ return obj[prop]
+ },
+})
+
// Work around for web3@1.0 deleting the bound `sendAsync` but not the unbound
// `sendAsync` method on the prototype, causing `this` reference issues with drizzle
const proxiedInpageProvider = new Proxy(inpageProvider, {
@@ -57,6 +163,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
index dd87b65a6..c1ef22d21 100644
--- a/app/scripts/lib/setupFetchDebugging.js
+++ b/app/scripts/lib/setupFetchDebugging.js
@@ -2,7 +2,7 @@ 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
+// `TypeError: Failed to Fetch` without any stack or context for the request
// https://github.com/getsentry/sentry-javascript/pull/1293
//
@@ -17,9 +17,11 @@ function setupFetchDebugging() {
try {
return await originalFetch.call(window, ...args)
} catch (err) {
- console.warn('FetchDebugger - fetch encountered an Error', err)
- console.warn('FetchDebugger - overriding stack to point of original call')
- err.stack = initialStack
+ 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
}
}
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 7913662d4..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,
})
@@ -138,12 +139,12 @@ module.exports = class MetamaskController extends EventEmitter {
this.accountTracker.stop()
}
})
-
+
// ensure accountTracker updates balances after network change
this.networkController.on('networkDidChange', () => {
this.accountTracker._updateAccounts()
})
-
+
// key mgmt
const additionalKeyrings = [TrezorKeyring, LedgerBridgeKeyring]
this.keyringController = new KeyringController({
@@ -197,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()
@@ -217,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,
@@ -246,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))
}
@@ -261,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
@@ -275,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),
}
@@ -345,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
@@ -402,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),
@@ -433,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),
}
}
@@ -978,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
@@ -1273,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 }))
@@ -1412,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(),
@@ -1454,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.addToFrequentRpcList(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
}
@@ -1542,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
@@ -1571,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()