aboutsummaryrefslogtreecommitdiffstats
path: root/app
diff options
context:
space:
mode:
Diffstat (limited to 'app')
-rw-r--r--app/_locales/cs/messages.json8
-rw-r--r--app/_locales/de/messages.json8
-rw-r--r--app/_locales/en/messages.json394
-rw-r--r--app/_locales/es/messages.json593
-rw-r--r--app/_locales/fr/messages.json18
-rw-r--r--app/_locales/hn/messages.json10
-rw-r--r--app/_locales/ht/messages.json8
-rw-r--r--app/_locales/index.json3
-rw-r--r--app/_locales/it/messages.json323
-rw-r--r--app/_locales/ja/messages.json2
-rw-r--r--app/_locales/ko/messages.json385
-rw-r--r--app/_locales/nl/messages.json8
-rw-r--r--app/_locales/pl/messages.json19
-rw-r--r--app/_locales/pt/messages.json8
-rw-r--r--app/_locales/ru/messages.json8
-rw-r--r--app/_locales/sk/messages.json957
-rw-r--r--app/_locales/sl/messages.json1250
-rw-r--r--app/_locales/th/messages.json6
-rw-r--r--app/_locales/tml/messages.json6
-rw-r--r--app/_locales/tr/messages.json8
-rw-r--r--app/_locales/zh_CN/messages.json6
-rw-r--r--app/_locales/zh_TW/messages.json843
-rw-r--r--app/fonts/index.css405
-rw-r--r--app/images/caret-left-black.svg18
-rw-r--r--app/images/double-arrow.svg13
-rw-r--r--app/images/download-alt.svg5
-rwxr-xr-xapp/images/icons/cancelled.svg3
-rw-r--r--app/images/icons/confirm.svg3
-rw-r--r--app/images/icons/down-arrow.svg4
-rw-r--r--app/images/icons/error.svg4
-rwxr-xr-xapp/images/icons/new.svg3
-rwxr-xr-xapp/images/icons/retry.svg7
-rwxr-xr-xapp/images/icons/submitted.svg3
-rw-r--r--app/images/icons/swap.svg1
-rw-r--r--app/images/logo/metamask-logo-horizontal-beta.svg115
-rw-r--r--app/images/logo/metamask-logo-horizontal.svg62
-rw-r--r--app/images/metrics-chart.svg8
-rw-r--r--app/images/single-arrow.svg10
-rw-r--r--app/images/sleuth.svg1
-rw-r--r--app/images/thin-plus.svg4
-rw-r--r--app/images/wyre.svg9
-rw-r--r--app/manifest.json10
-rw-r--r--app/phishing.html118
-rw-r--r--app/scripts/background.js35
-rw-r--r--app/scripts/contentscript.js22
-rw-r--r--app/scripts/controllers/address-book.js98
-rw-r--r--app/scripts/controllers/cached-balances.js83
-rw-r--r--app/scripts/controllers/detect-tokens.js20
-rw-r--r--app/scripts/controllers/network/contract-addresses.js11
-rw-r--r--app/scripts/controllers/network/createBlockTracker.js19
-rw-r--r--app/scripts/controllers/network/createInfuraClient.js10
-rw-r--r--app/scripts/controllers/network/createJsonRpcClient.js6
-rw-r--r--app/scripts/controllers/network/createLocalhostClient.js6
-rw-r--r--app/scripts/controllers/network/network.js25
-rw-r--r--app/scripts/controllers/preferences.js126
-rw-r--r--app/scripts/controllers/provider-approval.js74
-rw-r--r--app/scripts/controllers/recent-blocks.js31
-rw-r--r--app/scripts/controllers/token-rates.js40
-rw-r--r--app/scripts/controllers/transactions/enums.js2
-rw-r--r--app/scripts/controllers/transactions/index.js59
-rw-r--r--app/scripts/controllers/transactions/pending-tx-tracker.js8
-rw-r--r--app/scripts/controllers/transactions/tx-gas-utils.js11
-rw-r--r--app/scripts/controllers/transactions/tx-state-manager.js27
-rw-r--r--app/scripts/createStandardProvider.js92
-rw-r--r--app/scripts/inpage.js49
-rw-r--r--app/scripts/lib/ComposableObservableStore.js4
-rw-r--r--app/scripts/lib/account-tracker.js61
-rw-r--r--app/scripts/lib/auto-reload.js4
-rw-r--r--app/scripts/lib/buy-eth-url.js4
-rw-r--r--app/scripts/lib/ens-ipfs/resolver.js2
-rw-r--r--app/scripts/lib/ens-ipfs/setup.js6
-rw-r--r--app/scripts/lib/get-first-preferred-lang-code.js15
-rw-r--r--app/scripts/lib/notification-manager.js14
-rw-r--r--app/scripts/lib/setupFetchDebugging.js8
-rw-r--r--app/scripts/lib/setupSentry.js2
-rw-r--r--app/scripts/metamask-controller.js214
-rw-r--r--app/scripts/migrations/029.js27
-rw-r--r--app/scripts/migrations/030.js49
-rw-r--r--app/scripts/migrations/031.js31
-rw-r--r--app/scripts/migrations/032.js29
-rw-r--r--app/scripts/migrations/fail-tx.js41
-rw-r--r--app/scripts/migrations/index.js3
-rw-r--r--app/scripts/notice-controller.js6
-rw-r--r--app/scripts/phishing-detect.js24
-rw-r--r--app/scripts/platforms/extension.js21
-rw-r--r--app/scripts/popup-core.js12
-rw-r--r--app/scripts/ui.js38
-rw-r--r--app/trezor-usb-permissions.html33
-rw-r--r--app/vendor/trezor/content-script.js21
-rw-r--r--app/vendor/trezor/usb-permissions.js50
90 files changed, 6126 insertions, 1124 deletions
diff --git a/app/_locales/cs/messages.json b/app/_locales/cs/messages.json
index 40679a01d..a28c4cb4a 100644
--- a/app/_locales/cs/messages.json
+++ b/app/_locales/cs/messages.json
@@ -837,8 +837,8 @@
"supportCenter": {
"message": "Navštivte naše centrum podpory"
},
- "symbolBetweenZeroTen": {
- "message": "Symbol musí být mezi 0 a 10 znaky."
+ "symbolBetweenZeroTwelve": {
+ "message": "Symbol musí být mezi 0 a 12 znaky."
},
"takesTooLong": {
"message": "Trvá to dlouho?"
@@ -951,8 +951,8 @@
"warning": {
"message": "Varování"
},
- "welcomeBeta": {
- "message": "Vítejte v MetaMask Beta"
+ "welcome": {
+ "message": "Vítejte v MetaMask"
},
"whatsThis": {
"message": "Co to je?"
diff --git a/app/_locales/de/messages.json b/app/_locales/de/messages.json
index f4a69c106..b76f87772 100644
--- a/app/_locales/de/messages.json
+++ b/app/_locales/de/messages.json
@@ -816,8 +816,8 @@
"supportCenter": {
"message": "Gehe zu unserem Support Center"
},
- "symbolBetweenZeroTen": {
- "message": "Das Symbol muss zwischen 0 und 10 Zeichen haben."
+ "symbolBetweenZeroTwelve": {
+ "message": "Das Symbol muss zwischen 0 und 12 Zeichen haben."
},
"takesTooLong": {
"message": "Dauert es zu lang?"
@@ -927,8 +927,8 @@
"warning": {
"message": "Warnung"
},
- "welcomeBeta": {
- "message": "Willkommen zu MetaMask Beta"
+ "welcome": {
+ "message": "Willkommen zu MetaMask"
},
"whatsThis": {
"message": "Was ist das?"
diff --git a/app/_locales/en/messages.json b/app/_locales/en/messages.json
index 48b247187..72695c120 100644
--- a/app/_locales/en/messages.json
+++ b/app/_locales/en/messages.json
@@ -11,12 +11,18 @@
"exposeDescription": {
"message": "Expose accounts to the current website. Useful for legacy dapps."
},
+ "chartOnlyAvailableEth": {
+ "message": "Chart only available on Ethereum networks."
+ },
"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?"
},
+ "contractInteraction": {
+ "message": "Contract Interaction"
+ },
"clearApprovalDataSuccess": {
"message": "Approved website data cleared successfully."
},
@@ -38,9 +44,15 @@
"providerRequestInfo": {
"message": "This site is requesting access to view your current account address. Always make sure you trust the sites you interact with."
},
+ "aboutUs": {
+ "message": "About Us"
+ },
"accept": {
"message": "Accept"
},
+ "acceleratingATransaction": {
+ "message": "* Accelerating a transaction by using a higher gas price increases its chances of getting processed by the network faster, but it is not always guaranteed."
+ },
"accessingYourCamera": {
"message": "Accessing your camera..."
},
@@ -65,6 +77,15 @@
"address": {
"message": "Address"
},
+ "advanced": {
+ "message": "Advanced"
+ },
+ "advancedSettingsDescription": {
+ "message": "Access developer features, download State Logs, Reset Account, setup testnets and custom RPC."
+ },
+ "advancedOptions": {
+ "message": "Advanced Options"
+ },
"addCustomToken": {
"message": "Add custom token"
},
@@ -80,14 +101,26 @@
"addAcquiredTokens": {
"message": "Add the tokens you've acquired using MetaMask"
},
+ "agreeTermsOfService": {
+ "message": "I agree to the Terms of Service"
+ },
+ "allDone": {
+ "message": "All Done"
+ },
+ "alreadyHaveSeedPhrase": {
+ "message": "No, I already have a seed phrase"
+ },
"amount": {
"message": "Amount"
},
"amountPlusGas": {
"message": "Amount + Gas"
},
+ "amountPlusTxFee": {
+ "message": "Amount + TX Fee"
+ },
"appDescription": {
- "message": "Ethereum Browser Extension",
+ "message": "An Ethereum Wallet in your Browser",
"description": "The description of the application"
},
"appName": {
@@ -115,18 +148,27 @@
"available": {
"message": "Available"
},
+ "average": {
+ "message": "Average"
+ },
"back": {
"message": "Back"
},
"balance": {
"message": "Balance"
},
+ "balanceOutdated": {
+ "message": "Balance may be outdated"
+ },
"balances": {
"message": "Token balance(s)"
},
"balanceIsInsufficientGas": {
"message": "Insufficient balance for current gas total"
},
+ "basic": {
+ "message": "Basic"
+ },
"beta": {
"message": "BETA"
},
@@ -155,6 +197,12 @@
"buyCoinbaseExplainer": {
"message": "Coinbase is the world’s most popular way to buy and sell Bitcoin, Ethereum, and Litecoin."
},
+ "buyWithWyre": {
+ "message": "Buy ETH with Wyre"
+ },
+ "buyWithWyreDescription": {
+ "message": "Wyre lets you use a credit card to deposit ETH right in to your MetaMask account."
+ },
"buyCoinSwitch": {
"message": "Buy on CoinSwitch"
},
@@ -176,6 +224,9 @@
"cancellationGasFee": {
"message": "Cancellation Gas Fee"
},
+ "cancelled": {
+ "message": "Cancelled"
+ },
"cancelN": {
"message": "Cancel all $1 transactions"
},
@@ -188,15 +239,24 @@
"clickToAdd": {
"message": "Click on $1 to add them to your account"
},
+ "clickToRevealSeed": {
+ "message": "Click here to reveal secret words"
+ },
"close": {
"message": "Close"
},
"chromeRequiredForHardwareWallets": {
"message": "You need to use MetaMask on Google Chrome in order to connect to your Hardware Wallet."
},
+ "company": {
+ "message": "Company"
+ },
"confirm": {
"message": "Confirm"
},
+ "confirmationTime": {
+ "message": "Confirmation time (sec)"
+ },
"confirmed": {
"message": "Confirmed"
},
@@ -206,9 +266,15 @@
"confirmPassword": {
"message": "Confirm Password"
},
+ "confirmSecretBackupPhrase": {
+ "message": "Confirm your Secret Backup Phrase"
+ },
"confirmTransaction": {
"message": "Confirm Transaction"
},
+ "congratulations": {
+ "message": "Congratulations"
+ },
"connectHardwareWallet": {
"message": "Connect Hardware Wallet"
},
@@ -221,6 +287,9 @@
"connecting": {
"message": "Connecting..."
},
+ "connectingTo": {
+ "message": "Connecting to $1"
+ },
"connectingToKovan": {
"message": "Connecting to Kovan Test Network"
},
@@ -248,6 +317,9 @@
"continueToCoinbase": {
"message": "Continue to Coinbase"
},
+ "continueToWyre": {
+ "message": "Continue to Wyre"
+ },
"continueToCoinSwitch": {
"message": "Continue to CoinSwitch"
},
@@ -275,6 +347,12 @@
"copyAddress": {
"message": "Copy address to clipboard"
},
+ "copyTransactionId": {
+ "message": "Copy Transaction ID"
+ },
+ "copiedTransactionId": {
+ "message": "Copied Transaction ID"
+ },
"copyToClipboard": {
"message": "Copy to clipboard"
},
@@ -290,15 +368,21 @@
"createAccount": {
"message": "Create Account"
},
+ "createAWallet": {
+ "message": "Create a Wallet"
+ },
"createDen": {
"message": "Create"
},
+ "createPassword": {
+ "message": "Create Password"
+ },
"crypto": {
"message": "Crypto",
"description": "Exchange type (cryptocurrencies)"
},
- "currentConversion": {
- "message": "Current Conversion"
+ "currencyConversion": {
+ "message": "Currency Conversion"
},
"currentLanguage": {
"message": "Current Language"
@@ -312,6 +396,9 @@
"customGas": {
"message": "Customize Gas"
},
+ "customGasSubTitle": {
+ "message": "Increasing fee may decrease processing times, but it is not guaranteed."
+ },
"customToken": {
"message": "Custom Token"
},
@@ -379,6 +466,9 @@
"downloadGoogleChrome": {
"message": "Download Google Chrome"
},
+ "downloadSecretBackup": {
+ "message": "Download this Secret Backup Phrase and keep it stored safely on an external encrypted hard drive or storage medium."
+ },
"downloadStateLogs": {
"message": "Download State Logs"
},
@@ -403,6 +493,30 @@
"encryptNewDen": {
"message": "Encrypt your new DEN"
},
+ "endOfFlowMessage1": {
+ "message": "You passed the test - keep your seedphrase safe, it's your responsibility!"
+ },
+ "endOfFlowMessage2": {
+ "message": "Tips on storing it safely"
+ },
+ "endOfFlowMessage3": {
+ "message": "Save a backup in multiple places."
+ },
+ "endOfFlowMessage4": {
+ "message": "Never share the phrase with anyone."
+ },
+ "endOfFlowMessage5": {
+ "message": "Be careful of phishing! MetaMask will never spontaneously ask for your seed phrase."
+ },
+ "endOfFlowMessage6": {
+ "message": "If you need to back your up seed phrase again, you can find it in Settings -> Security."
+ },
+ "endOfFlowMessage7": {
+ "message": "If you ever have questions or see something fishy, email support@metamask.io."
+ },
+ "endOfFlowMessage8": {
+ "message": "MetaMask cannot recover your seedphrase. Learn more."
+ },
"ensNameNotFound": {
"message": "ENS name not found"
},
@@ -421,6 +535,9 @@
"etherscanView": {
"message": "View account on Etherscan"
},
+ "estimatedProcessingTimes": {
+ "message": "Estimated Processing Times"
+ },
"exchangeRate": {
"message": "Exchange Rate"
},
@@ -436,6 +553,18 @@
"failed": {
"message": "Failed"
},
+ "fast": {
+ "message": "Fast"
+ },
+ "faster": {
+ "message": "Faster"
+ },
+ "fastest": {
+ "message": "Fastest"
+ },
+ "feeChartTitle": {
+ "message": "Live Transaction Fee Predictions"
+ },
"fiat": {
"message": "Fiat",
"description": "Exchange type"
@@ -475,6 +604,9 @@
"gasLimitCalculation": {
"message": "We calculate the suggested gas limit based on network success rates."
},
+ "gasLimitInfoModalContent": {
+ "message": "Gas limit is the maximum amount of units of gas you are willing to spend."
+ },
"gasLimitRequired": {
"message": "Gas Limit Required"
},
@@ -490,12 +622,27 @@
"gasPrice": {
"message": "Gas Price (GWEI)"
},
+ "gasPriceExtremelyLow": {
+ "message": "Gas Price Extremely Low"
+ },
+ "gasPriceInfoModalContent": {
+ "message": "Gas price specifies the amount of Ether you are willing to pay for each unit of gas."
+ },
+ "gasPriceNoDenom": {
+ "message": "Gas Price"
+ },
"gasPriceCalculation": {
"message": "We calculate the suggested gas prices based on network success rates."
},
"gasPriceRequired": {
"message": "Gas Price Required"
},
+ "general": {
+ "message": "General"
+ },
+ "generalSettingsDescription": {
+ "message": "Currency conversion, primary currency, language, blockies identicon"
+ },
"generatingTransaction": {
"message": "Generating transaction"
},
@@ -509,10 +656,16 @@
"getHelp": {
"message": "Get Help."
},
+ "getStarted": {
+ "message": "Get Started"
+ },
"greaterThanMin": {
"message": "must be greater than or equal to $1.",
"description": "helper for inputting hex as decimal input"
},
+ "happyToSeeYou": {
+ "message": "We’re happy to see you."
+ },
"hardware": {
"message": "hardware"
},
@@ -566,12 +719,21 @@
"importAccountMsg": {
"message": " Imported accounts will not be associated with your originally created MetaMask account seedphrase. Learn more about imported accounts "
},
+ "importAccountSeedPhrase": {
+ "message": "Import an Account with Seed Phrase"
+ },
"importAnAccount": {
"message": "Import an account"
},
"importDen": {
"message": "Import Existing DEN"
},
+ "importWallet": {
+ "message": "Import Wallet"
+ },
+ "importYourExisting": {
+ "message": "Import your existing wallet using a 12 word seed phrase"
+ },
"imported": {
"message": "Imported",
"description": "status showing that an account has been fully loaded into the keyring"
@@ -579,6 +741,9 @@
"importUsingSeed": {
"message": "Import using account seed phrase"
},
+ "importWithSeedPhrase": {
+ "message": "Import with seed phrase"
+ },
"info": {
"message": "Info"
},
@@ -588,6 +753,9 @@
"initialTransactionConfirmed": {
"message": "Your initial transaction was confirmed by the network. Click OK to go back."
},
+ "insufficientBalance": {
+ "message": "Insufficient balance."
+ },
"insufficientFunds": {
"message": "Insufficient funds."
},
@@ -600,6 +768,12 @@
"invalidAddressRecipient": {
"message": "Recipient address is invalid"
},
+ "knownAddressRecipient": {
+ "message": "Known contract address."
+ },
+ "invalidAddressRecipientNotEthNetwork": {
+ "message": "Not ETH network, set to lowercase"
+ },
"invalidGasParams": {
"message": "Invalid Gas Parameters"
},
@@ -640,10 +814,16 @@
"ledgerAccountRestriction": {
"message": "You need to make use your last account before you can add a new one."
},
+ "legal": {
+ "message": "Legal"
+ },
"lessThanMax": {
"message": "must be less than or equal to $1.",
"description": "helper for inputting hex as decimal input"
},
+ "letsGoSetUp": {
+ "message": "Yes, let’s get set up!"
+ },
"likeToAddTokens": {
"message": "Would you like to add these tokens?"
},
@@ -653,6 +833,9 @@
"limit": {
"message": "Limit"
},
+ "liveGasPricePredictions": {
+ "message": "Live Gas Price Predictions"
+ },
"loading": {
"message": "Loading..."
},
@@ -677,6 +860,9 @@
"mainnet": {
"message": "Main Ethereum Network"
},
+ "memorizePhrase": {
+ "message": "Memorize this phrase."
+ },
"menu": {
"message": "Menu"
},
@@ -684,7 +870,7 @@
"message": "Message"
},
"metamaskDescription": {
- "message": "MetaMask is a secure identity vault for Ethereum."
+ "message": "Connecting you to Ethereum and the Decentralized Web."
},
"metamaskSeedWords": {
"message": "MetaMask Seed Words"
@@ -698,6 +884,15 @@
"missingYourTokens": {
"message": "Don't see your tokens?"
},
+ "minutesShorthand": {
+ "message": "Min"
+ },
+ "mobileSyncTitle": {
+ "message": "Sync accounts with mobile"
+ },
+ "mobileSyncText": {
+ "message": "Please enter your password to confirm it's you!"
+ },
"myAccounts": {
"message": "My Accounts"
},
@@ -746,6 +941,21 @@
"newNetwork": {
"message": "New Network"
},
+ "newToMetaMask": {
+ "message": "New to MetaMask?"
+ },
+ "noAlreadyHaveSeed": {
+ "message": "No, I already have a seed phrase"
+ },
+ "protectYourKeys": {
+ "message": "Protect Your Keys!"
+ },
+ "protectYourKeysMessage1": {
+ "message": "Be careful with your seed phrase — there have been reports of websites that attempt to imitate MetaMask. MetaMask will never ask for your seed phrase!"
+ },
+ "protectYourKeysMessage2": {
+ "message": "Keep your phrase safe. If you see something fishy, or you’re uncertain about a website, email support@metamask.io"
+ },
"rpcURL": {
"message": "New RPC URL"
},
@@ -764,6 +974,12 @@
"optionalNickname": {
"message": "Nickname (optional)"
},
+ "newTotal": {
+ "message": "New Total"
+ },
+ "newTransactionFee": {
+ "message": "New Transaction Fee"
+ },
"next": {
"message": "Next"
},
@@ -782,6 +998,9 @@
"noTransactions": {
"message": "You have no transactions"
},
+ "notEnoughGas": {
+ "message": "Not Enough Gas"
+ },
"notFound": {
"message": "Not Found"
},
@@ -794,6 +1013,9 @@
"noWebcamFound": {
"message": "Your computer's webcam was not found. Please try again."
},
+ "ofTextNofM": {
+ "message": "of"
+ },
"oldUI": {
"message": "Old UI"
},
@@ -826,6 +1048,15 @@
"parameters": {
"message": "Parameters"
},
+ "originalTotal": {
+ "message": "Original Total"
+ },
+ "participateInMetaMetrics": {
+ "message": "Participate in MetaMetrics"
+ },
+ "participateInMetaMetricsDescription": {
+ "message": "Participate in MetaMetrics to help us make MetaMask better"
+ },
"password": {
"message": "Password"
},
@@ -941,6 +1172,9 @@
"restoreAccountWithSeed": {
"message": "Restore your Account with Seed Phrase"
},
+ "requestsAwaitingAcknowledgement": {
+ "message": "requests waiting to be acknowledged"
+ },
"required": {
"message": "Required"
},
@@ -996,6 +1230,12 @@
"save": {
"message": "Save"
},
+ "slow": {
+ "message": "Slow"
+ },
+ "slower": {
+ "message": "Slower"
+ },
"saveAsCsvFile": {
"message": "Save as CSV File"
},
@@ -1018,9 +1258,30 @@
"searchResults": {
"message": "Search Results"
},
+ "secretBackupPhrase": {
+ "message": "Secret Backup Phrase"
+ },
+ "secretBackupPhraseDescription": {
+ "message": "Your secret backup phrase makes it easy to back up and restore your account."
+ },
+ "secretBackupPhraseWarning": {
+ "message": "WARNING: Never disclose your backup phrase. Anyone with this phrase can take your Ether forever."
+ },
"secretPhrase": {
"message": "Enter your secret twelve word phrase here to restore your vault."
},
+ "securityAndPrivacy": {
+ "message": "Security & Privacy"
+ },
+ "securitySettingsDescription": {
+ "message": "Privacy settings and wallet seed phrase"
+ },
+ "secondsShorthand": {
+ "message": "Sec"
+ },
+ "seedPhrasePlaceholder": {
+ "message": "Separate each word with a single space"
+ },
"seedPhraseReq": {
"message": "Seed phrases are 12 words long"
},
@@ -1030,6 +1291,9 @@
"selectCurrency": {
"message": "Select Currency"
},
+ "selectEachPhrase": {
+ "message": "Please select each phrase in order to make sure it is correct."
+ },
"selectLocale": {
"message": "Select Locale"
},
@@ -1042,6 +1306,9 @@
"send": {
"message": "Send"
},
+ "sendAmount": {
+ "message": "Send Amount"
+ },
"sendETH": {
"message": "Send ETH"
},
@@ -1069,6 +1336,9 @@
"selectAnAccountHelp": {
"message": "Select the account to view in MetaMask"
},
+ "selectAHigherGasFee": {
+ "message": "Select a higher gas fee to accelerate the processing of your transaction.*"
+ },
"selectHdPath": {
"message": "Select HD Path"
},
@@ -1084,6 +1354,18 @@
"shapeshiftBuy": {
"message": "Buy with Shapeshift"
},
+ "showAdvancedGasInline": {
+ "message": "Advanced gas controls"
+ },
+ "showAdvancedGasInlineDescription": {
+ "message": "Select this to show gas price and limit controls directly on the send and confirm screens."
+ },
+ "showFiatConversionInTestnets": {
+ "message": "Show Conversion on Testnets"
+ },
+ "showFiatConversionInTestnetsDescription": {
+ "message": "Select this to show fiat conversion on Testnets"
+ },
"showPrivateKeys": {
"message": "Show Private Keys"
},
@@ -1117,6 +1399,9 @@
"sigRequested": {
"message": "Signature Requested"
},
+ "somethingWentWrong": {
+ "message": "Oops! Something went wrong."
+ },
"spaceBetween": {
"message": "there can only be a space between words"
},
@@ -1129,6 +1414,15 @@
"speedUpSubtitle": {
"message": "Increase your gas price to attempt to overwrite and speed up your transaction"
},
+ "speedUpCancellation": {
+ "message": "Speed up this cancellation"
+ },
+ "speedUpTransaction": {
+ "message": "Speed up this transaction"
+ },
+ "switchNetworks": {
+ "message": "Switch Networks"
+ },
"status": {
"message": "Status"
},
@@ -1159,6 +1453,9 @@
"step3HardwareWalletMsg": {
"message": "Use your hardware account like you would with any Ethereum account. Log in to dApps, send Eth, buy and store ERC20 tokens and Non-Fungible tokens like CryptoKitties."
},
+ "storePhrase": {
+ "message": "Store this phrase in a password manager like 1Password."
+ },
"submit": {
"message": "Submit"
},
@@ -1168,8 +1465,29 @@
"supportCenter": {
"message": "Visit our Support Center"
},
- "symbolBetweenZeroTen": {
- "message": "Symbol must be between 0 and 10 characters."
+ "symbolBetweenZeroTwelve": {
+ "message": "Symbol must be between 0 and 12 characters."
+ },
+ "syncWithMobile": {
+ "message": "Sync with mobile"
+ },
+ "syncWithMobileTitle": {
+ "message": "Sync with mobile"
+ },
+ "syncWithMobileDesc": {
+ "message": "You can sync your accounts and information with your mobile device. Open the MetaMask mobile app, go to \"Settings\" and tap on \"Sync from Browser Extension\""
+ },
+ "syncWithMobileDescNewUsers": {
+ "message": "If you just open the MetaMask Mobile app for the first time, just follow the steps in your phone."
+ },
+ "syncWithMobileScanThisCode": {
+ "message": "Scan this code with your MetaMask mobile app"
+ },
+ "syncWithMobileBeCareful": {
+ "message": "Make sure nobody else is looking at your screen when you scan this code"
+ },
+ "syncWithMobileComplete": {
+ "message": "Your data has been synced succesfully. Enjoy the MetaMask mobile app!"
},
"takesTooLong": {
"message": "Taking too long?"
@@ -1180,6 +1498,12 @@
"testFaucet": {
"message": "Test Faucet"
},
+ "thisWillCreate": {
+ "message": "This will create a new wallet and seed phrase"
+ },
+ "tips": {
+ "message": "Tips"
+ },
"to": {
"message": "To"
},
@@ -1199,6 +1523,9 @@
"tokenBalance": {
"message": "Your Token Balance is:"
},
+ "tokenContractAddress": {
+ "message": "Token Contract Address"
+ },
"tokenSelection": {
"message": "Search for tokens or select from our list of popular tokens."
},
@@ -1215,29 +1542,38 @@
"message": "transaction"
},
"transactionConfirmed": {
- "message": "Transaction confirmed on $2."
+ "message": "Transaction confirmed at $2."
},
"transactionCreated": {
- "message": "Transaction created with a value of $1 on $2."
+ "message": "Transaction created with a value of $1 at $2."
},
"transactionWithNonce": {
"message": "Transaction $1"
},
"transactionDropped": {
- "message": "Transaction dropped on $2."
+ "message": "Transaction dropped at $2."
},
"transactionSubmitted": {
- "message": "Transaction submitted on $2."
+ "message": "Transaction submitted with gas fee of $1 at $2."
+ },
+ "transactionResubmitted": {
+ "message": "Transaction resubmitted with gas fee increased to $1 at $2"
},
"transactionUpdated": {
- "message": "Transaction updated on $2."
+ "message": "Transaction updated at $2."
},
"transactionUpdatedGas": {
- "message": "Transaction updated with a gas price of $1 on $2."
+ "message": "Transaction updated with a gas fee of $1 at $2."
},
"transactionErrored": {
"message": "Transaction encountered an error."
},
+ "transactionCancelAttempted": {
+ "message": "Transaction cancel attempted with gas fee of $1 at $2"
+ },
+ "transactionCancelSuccess": {
+ "message": "Transaction successfully cancelled at $2"
+ },
"transactions": {
"message": "transactions"
},
@@ -1247,12 +1583,18 @@
"transactionErrorNoContract": {
"message": "Trying to call a function on a non-contract address."
},
+ "transactionFee": {
+ "message": "Transaction Fee"
+ },
"transactionMemo": {
"message": "Transaction memo (optional)"
},
"transactionNumber": {
"message": "Transaction Number"
},
+ "transactionTime": {
+ "message": "Transaction Time"
+ },
"transfer": {
"message": "Transfer"
},
@@ -1278,6 +1620,9 @@
"typePassword": {
"message": "Type your MetaMask password"
},
+ "uiMigrationAnnouncement": {
+ "message": "Welcome to the new MetaMask UI. If you have feedback about the UI or feature requests, please reach out to our support team or on GitHub."
+ },
"uiWelcome": {
"message": "Welcome to the New UI (Beta)"
},
@@ -1296,9 +1641,6 @@
"unknown": {
"message": "Unknown"
},
- "unknownFunction": {
- "message": "Unknown Function"
- },
"unknownNetwork": {
"message": "Unknown Private Network"
},
@@ -1360,12 +1702,15 @@
"welcomeBack": {
"message": "Welcome Back!"
},
- "welcomeBeta": {
- "message": "Welcome to MetaMask Beta"
+ "welcome": {
+ "message": "Welcome to MetaMask"
},
"whatsThis": {
"message": "What's this?"
},
+ "writePhrase": {
+ "message": "Write this phrase on a piece of paper and store in a secure location. If you want even more security, write it down on multiple pieces of paper and store each in 2 - 3 different locations."
+ },
"yesLetsTry": {
"message": "Yes, let's try"
},
@@ -1380,5 +1725,20 @@
},
"yourPrivateSeedPhrase": {
"message": "Your private seed phrase"
+ },
+ "yourUniqueAccountImage": {
+ "message": "Your unique account image"
+ },
+ "yourUniqueAccountImageDescription1": {
+ "message": "This image was programmatically generated for you by your new account number."
+ },
+ "yourUniqueAccountImageDescription2": {
+ "message": "You’ll see this image everytime you need to confirm a transaction."
+ },
+ "yourUniqueAccountImageDescription3": {
+ "message": "MetaMask will never ask for your seed phrase!"
+ },
+ "zeroGasPriceOnSpeedUpError": {
+ "message":"Zero gas price on speed up"
}
}
diff --git a/app/_locales/es/messages.json b/app/_locales/es/messages.json
index b8ad6f268..3bdbfa852 100644
--- a/app/_locales/es/messages.json
+++ b/app/_locales/es/messages.json
@@ -24,7 +24,7 @@
"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."
+ "message": "Borrar la información privada de modo que todos los sitios deban volver a requerir acceso para acceder a los datos de la cuenta."
},
"clearApprovalData": {
"message": "Borrar datos de aprobación"
@@ -42,7 +42,7 @@
"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."
+ "message": "El dominio que se muestra a continuación intenta solicitar acceso a la API Ethereum para que pueda interactuar con la blockchain de Ethereum. Siempre verifique que esté en el sitio correcto antes de aprobar el acceso Ethereum."
},
"accept": {
"message": "Aceptar"
@@ -111,7 +111,7 @@
},
"betweenMinAndMax": {
"message": "Debe ser mayor o igual a $1 y menor o igual a $2",
- "description": "helper para ingresar hex como un ingreso decimal"
+ "description": "Helper para ingresar hex como un ingreso decimal"
},
"blockiesIdenticon": {
"message": "Usar Blockies Identicon (Iconos)"
@@ -462,6 +462,9 @@
"invalidAddressRecipient": {
"message": "Dirección del destinatario invalida"
},
+ "invalidAddressRecipientNotEthNetwork": {
+ "message": "No es una red ETH, convertirlo a minúscula"
+ },
"invalidGasParams": {
"message": "Parametros de gas inválidos"
},
@@ -692,7 +695,7 @@
"message": "Restaurar desde semilla"
},
"restoreVault": {
- "message": "Restaurar Bóveda"
+ "message": "Restaurar bóveda"
},
"retryWithMoreGas": {
"message": "Vuelva a intentar con un precio de gas más alto aquí"
@@ -813,8 +816,8 @@
"supportCenter": {
"message": "Visita nuestro centro de atención"
},
- "symbolBetweenZeroTen": {
- "message": "Símbolo debe ser entre 0 y 10 caracteres"
+ "symbolBetweenZeroTwelve": {
+ "message": "Símbolo debe ser entre 0 y 12 caracteres"
},
"takesTooLong": {
"message": "¿Está tardando demasiado?"
@@ -927,8 +930,8 @@
"warning": {
"message": "Advertencia"
},
- "welcomeBeta": {
- "message": "Bienvenido a MetaMask Beta"
+ "welcome": {
+ "message": "Bienvenido a MetaMask"
},
"whatsThis": {
"message": "¿Qué es esto?"
@@ -938,5 +941,579 @@
},
"yourSigRequested": {
"message": "Tu firma ya fue solicitada"
+ },
+ "contractInteraction": {
+ "message": "Interacción con contrato"
+ },
+ "providerRequest": {
+ "message": "$1 quisiera conectar con tu cuenta"
+ },
+ "acceleratingATransaction": {
+ "message": "* Agilizar a una transacción al usar un precio de gas más alto aumenta las probabilidades que que la red lo procese más rápidamente, pero eso no siempre está garantizado."
+ },
+ "accessingYourCamera": {
+ "message": "Accediendo a tu cámara..."
+ },
+ "accountOptions": {
+ "message": "Opciones de la cuenta"
+ },
+ "accountSelectionRequired": {
+ "message": "¡Necesitas elegir una cuenta!"
+ },
+ "activityLog": {
+ "message": "registro de actividades"
+ },
+ "advancedOptions": {
+ "message": "Opciones Avanzadas"
+ },
+ "addSuggestedTokens": {
+ "message": "Agregar tokens propuestos"
+ },
+ "addAcquiredTokens": {
+ "message": "Agregar los tokens que has adquirido usando MetaMask"
+ },
+ "advanced": {
+ "message": "Avanzado"
+ },
+ "amountPlusTxFee": {
+ "message": "Cantidad + Comisión por transacción"
+ },
+ "attemptToCancel": {
+ "message": "¿Intentar cancelar?"
+ },
+ "attemptToCancelDescription": {
+ "message": "El intentar cancelar la transacción no garantiza la cancelación de la misma. Si el intento de cancelación tiene éxito, se le cobrará la comisión de transacción indicada arriba."
+ },
+ "average": {
+ "message": "Promedio"
+ },
+ "basic": {
+ "message": "Básico"
+ },
+ "browserNotSupported": {
+ "message": "Tu navegador no está admitido..."
+ },
+ "bytes": {
+ "message": "Bytes"
+ },
+ "cancelAttempt": {
+ "message": "Intentar cancelar"
+ },
+ "cancellationGasFee": {
+ "message": "Comisión de Gas por cancelación"
+ },
+ "cancelled": {
+ "message": "Cancelado"
+ },
+ "cancelN": {
+ "message": "Cancelar a todas transacciones de $1"
+ },
+ "clickToAdd": {
+ "message": "Hazle clic en $1 para agregarles a su cuenta"
+ },
+ "close": {
+ "message": "Cerrar"
+ },
+ "chromeRequiredForHardwareWallets": {
+ "message": "Hay que usar MetaMask en Google Chrome para poder conectarse con tu Monedero Físico."
+ },
+ "confirmationTime": {
+ "message": "Tiempo de confirmación (seg)"
+ },
+ "connectHardwareWallet": {
+ "message": "Conectar Monedero Físico"
+ },
+ "connect": {
+ "message": "Conectar"
+ },
+ "connectRequest": {
+ "message": "Petición para conectar"
+ },
+ "connecting": {
+ "message": "Conectándose..."
+ },
+ "connectingTo": {
+ "message": "Conectánodse a $1"
+ },
+ "connectToLedger": {
+ "message": "Conectarse al Ledger"
+ },
+ "connectToTrezor": {
+ "message": "Conectarse al Trezor"
+ },
+ "copyAddress": {
+ "message": "Copiar la dirección al portapapeles"
+ },
+ "currentLanguage": {
+ "message": "Idioma Actual"
+ },
+ "customGasSubTitle": {
+ "message": "Aumentar la comisión puede hacer que el tiempo de procesamiento se disminuya, pero no lo garantiza."
+ },
+ "customToken": {
+ "message": "Token Personalizado"
+ },
+ "downloadGoogleChrome": {
+ "message": "Descargar Google Chrome"
+ },
+ "dontHaveAHardwareWallet": {
+ "message": "¿No tienes un monedero físico?"
+ },
+ "ensNameNotFound": {
+ "message": "No se encontró el nombre ENS"
+ },
+ "enterPasswordContinue": {
+ "message": "Introducir contraseña para seguir"
+ },
+ "eth": {
+ "message": "ETH"
+ },
+ "estimatedProcessingTimes": {
+ "message": "Tiempo Previsto de procesamiento"
+ },
+ "expandView": {
+ "message": "Ampliar Vista"
+ },
+ "fast": {
+ "message": "Rápido"
+ },
+ "faster": {
+ "message": "Más Rápido"
+ },
+ "fastest": {
+ "message": "Lo Mas Rápido"
+ },
+ "feeChartTitle": {
+ "message": "Previsiones en vivo de las comisiones por transacciones"
+ },
+ "forgetDevice": {
+ "message": "Olvidar a este dispositivo"
+ },
+ "functionType": {
+ "message": "Tipo de función"
+ },
+ "gasUsed": {
+ "message": "Gas usado"
+ },
+ "gasPriceExtremelyLow": {
+ "message": "Precio de Gas excesivamente bajo"
+ },
+ "gasPriceNoDenom": {
+ "message": "Precio de Gas"
+ },
+ "generatingTransaction": {
+ "message": "Generando la transacción"
+ },
+ "getHelp": {
+ "message": "Pedir ayuda."
+ },
+ "hardware": {
+ "message": "hardware"
+ },
+ "hardwareWalletConnected": {
+ "message": "Se ha conectado el monedero físico"
+ },
+ "hardwareWallets": {
+ "message": "Conectarle un monedero físico"
+ },
+ "hardwareWalletsMsg": {
+ "message": "Seleccionar un monedero físico que quieres usar con MetaMask"
+ },
+ "havingTroubleConnecting": {
+ "message": "¿Tienes problemas para hacer la conexión?"
+ },
+ "hexData": {
+ "message": "Datos de formato Hex"
+ },
+ "history": {
+ "message": "Historial"
+ },
+ "importUsingSeed": {
+ "message": "Importar usando la frase semilla de la cuenta"
+ },
+ "initialTransactionConfirmed": {
+ "message": "La red confirmó tu transacción inicial. Hazle clic en OK para volver."
+ },
+ "insufficientBalance": {
+ "message": "Saldo insuficiente."
+ },
+ "invalidSeedPhrase": {
+ "message": "Frase semilla no válida."
+ },
+ "keepTrackTokens": {
+ "message": "Estar al tanto con los tokens que has comprado a través de tu cuenta de MetaMask."
+ },
+ "learnMore": {
+ "message": "Más información"
+ },
+ "ledgerAccountRestriction": {
+ "message": "Hay que hacer uso de tu última cuenta antes de agregarle una nueva."
+ },
+ "liveGasPricePredictions": {
+ "message": "Previsiones en vivo del precio de Gas"
+ },
+ "menu": {
+ "message": "Menú"
+ },
+ "metamaskSeedWords": {
+ "message": "Palabras semilla de MetaMask"
+ },
+ "metamaskVersion": {
+ "message": "Versión de MetaMask"
+ },
+ "missingYourTokens": {
+ "message": "¿No ves tus tokens?"
+ },
+ "minutesShorthand": {
+ "message": "Min"
+ },
+ "nevermind": {
+ "message": "Olvídatelo"
+ },
+ "newNetwork": {
+ "message": "Red Nueva"
+ },
+ "rpcURL": {
+ "message": "Nuevo URL de RPC"
+ },
+ "showAdvancedOptions": {
+ "message": "Mostrar opciones avanzadas"
+ },
+ "hideAdvancedOptions": {
+ "message": "Ocultar opciones avanzadas"
+ },
+ "optionalChainId": {
+ "message": "ChainID (opcional)"
+ },
+ "optionalSymbol": {
+ "message": "Símbolo (opcional)"
+ },
+ "optionalNickname": {
+ "message": "Apodo (opcional)"
+ },
+ "newTotal": {
+ "message": "Nuevo total"
+ },
+ "newTransactionFee": {
+ "message": "Nueva Comisión por transacción"
+ },
+ "noConversionRateAvailable": {
+ "message": "No hay tasa de conversión"
+ },
+ "notFound": {
+ "message": "No se encontró"
+ },
+ "noWebcamFoundTitle": {
+ "message": "No se encontró a la webcam"
+ },
+ "noWebcamFound": {
+ "message": "No se encontró a la webcam de tu ordenador. Favor de volver a intentar."
+ },
+ "ofTextNofM": {
+ "message": "de"
+ },
+ "onlySendTokensToAccountAddress": {
+ "message": "Mandar solamente $1 a la dirección de una cuenta de Ethereum.",
+ "description": "muestra el símbolo del token"
+ },
+ "openInTab": {
+ "message": "Abrir en una pestaña"
+ },
+ "orderOneHere": {
+ "message": "Comprate un Trezor o Ledger y guarda tus fondos en almacenamiento frío"
+ },
+ "origin": {
+ "message": "Orígen"
+ },
+ "outgoing": {
+ "message": "De salida"
+ },
+ "parameters": {
+ "message": "Parámetros"
+ },
+ "originalTotal": {
+ "message": "Total Original"
+ },
+ "password": {
+ "message": "Contraseña"
+ },
+ "pending": {
+ "message": "pendiente"
+ },
+ "popularTokens": {
+ "message": "Tokens Corrientes"
+ },
+ "prev": {
+ "message": "Prev"
+ },
+ "primaryCurrencySetting": {
+ "message": "Moneda principal"
+ },
+ "primaryCurrencySettingDescription": {
+ "message": "Seleccionar nativa para prioritizar el que se muestren los valores en la moneda nativa de la cadena (p.ej. ETH). Seleccionar Fíat para prioritzar el que se muestren los valores en la moneda fíat seleccionada."
+ },
+ "queue": {
+ "message": "Cola"
+ },
+ "rejectAll": {
+ "message": "Rechazar todas"
+ },
+ "rejectTxsN": {
+ "message": "Rechazar transacciones de $1"
+ },
+ "rejectTxsDescription": {
+ "message": "Está al punto de rechazar transacciones de $1 en lote."
+ },
+ "reset": {
+ "message": "Reiniciar"
+ },
+ "resetAccountDescription": {
+ "message": "Reiniciar tu cuenta borrará tu historial de transacciones."
+ },
+ "restoreAccountWithSeed": {
+ "message": "Restaurar tu Cuenta con Frase Semilla"
+ },
+ "requestsAwaitingAcknowledgement": {
+ "message": "peticiones pendientes de reconocimiento"
+ },
+ "restore": {
+ "message": "Restaurar"
+ },
+ "revealSeedWordsTitle": {
+ "message": "Frase semilla"
+ },
+ "revealSeedWordsDescription": {
+ "message": "Si en algún momento cambias de navegador o de ordenador, necesitarás esta frase semilla para acceder a tus cuentas. Guárdatela en un lugar seguro y secreto."
+ },
+ "revealSeedWordsWarningTitle": {
+ "message": "NO compartas esta frase con nadie!"
+ },
+ "remove": {
+ "message": "borrar"
+ },
+ "removeAccount": {
+ "message": "Borrar cuenta"
+ },
+ "removeAccountDescription": {
+ "message": "Se borrará esta cuenta de tu monedero. Por favor, asegúrate de tener la frase semilla o clave personal original para esta cuenta importada antes de seguir adelante. Podrás importar o crear cuentas de nuevo del menu desplegable de cuentas."
+ },
+ "readyToConnect": {
+ "message": "¿Listo/a para conectar?"
+ },
+ "rpc": {
+ "message": "RPC Personalizado"
+ },
+ "slow": {
+ "message": "Lento"
+ },
+ "slower": {
+ "message": "Más lento"
+ },
+ "saveAsCsvFile": {
+ "message": "Guardar como archivo CSV"
+ },
+ "scanInstructions": {
+ "message": "Coloque el código QR delante de tu cámara"
+ },
+ "scanQrCode": {
+ "message": "Escanear código QR"
+ },
+ "searchResults": {
+ "message": "Resultados de la Búsqueda"
+ },
+ "secondsShorthand": {
+ "message": "Seg"
+ },
+ "selectLocale": {
+ "message": "Seleccionar local"
+ },
+ "sendAmount": {
+ "message": "Mandar cantidad"
+ },
+ "sentEther": {
+ "message": "se mandó ether"
+ },
+ "sentTokens": {
+ "message": "se mandaron tokens"
+ },
+ "separateEachWord": {
+ "message": "Separar a cada palabra con un sólo espacio"
+ },
+ "searchTokens": {
+ "message": "Buscar Tokens"
+ },
+ "selectAnAddress": {
+ "message": "Seleccionar una Dirección"
+ },
+ "selectAnAccount": {
+ "message": "Seleccionar una Cuenta"
+ },
+ "selectAnAccountHelp": {
+ "message": "Seleccionar la cuenta que quiere ver en MetaMask"
+ },
+ "selectAHigherGasFee": {
+ "message": "Seleccione una comisión de gas más elevada para agilizar el procesamiento de tu transacción.*"
+ },
+ "selectHdPath": {
+ "message": "Seleccionar la ruta HD (jerárquica determinista)"
+ },
+ "selectPathHelp": {
+ "message": "Si no ves tus cuentas actuales de Ledger abajo, prueba cambiando la ruta a \"Legacy (MEW / MyCrypto)\""
+ },
+ "showHexData": {
+ "message": "Mostrar Datos en formato Hex"
+ },
+ "showHexDataDescription": {
+ "message": "Seleccionar esto para mostrar el campo de los datos en formato hex en la pantalla de mandar"
+ },
+ "signatureRequest": {
+ "message": "Petición de Firma"
+ },
+ "somethingWentWrong": {
+ "message": "¡Ups! Algo funcionó mal."
+ },
+ "speedUp": {
+ "message": "Agilizar"
+ },
+ "speedUpTitle": {
+ "message": "Agilizar la Transacción"
+ },
+ "speedUpSubtitle": {
+ "message": "Aumenta el precio de gas para intentar sobrescribir y así agilizar a la transacción"
+ },
+ "speedUpCancellation": {
+ "message": "Agilizar esta cancelación"
+ },
+ "speedUpTransaction": {
+ "message": "Agilizar esta transacción"
+ },
+ "switchNetworks": {
+ "message": "Cambiar de Red"
+ },
+ "step1HardwareWallet": {
+ "message": "1. Conectar monedero físico."
+ },
+ "step1HardwareWalletMsg": {
+ "message": "Conéctate el monedero físico directamente al ordenador."
+ },
+ "step2HardwareWallet": {
+ "message": "2. Seleccionar una cuenta"
+ },
+ "step2HardwareWalletMsg": {
+ "message": "Seleccione la cuenta que quieres ver. Sólo se puede eligir una a la vez."
+ },
+ "step3HardwareWallet": {
+ "message": "3. Empezar a usar dApps y más!"
+ },
+ "step3HardwareWalletMsg": {
+ "message": "Usa tu cuenta física igual que harías con cualquier cuenta de Ethereum. Regístrate con dApps, manda Eth, compra y almacena tokens de ERC20 y otros tokens no-fungibles, como CryptoKitties."
+ },
+ "token": {
+ "message": "Token"
+ },
+ "transaction": {
+ "message": "transacción"
+ },
+ "transactionConfirmed": {
+ "message": "Se confirmó la transacción a $2."
+ },
+ "transactionCreated": {
+ "message": "Se creó una transacción con un valor de $1, a $2."
+ },
+ "transactionWithNonce": {
+ "message": "Transacción $1"
+ },
+ "transactionDropped": {
+ "message": "Transacción se cayó en $2."
+ },
+ "transactionSubmitted": {
+ "message": "Se propuso la transacción con una comisión de gas de $1, en $2."
+ },
+ "transactionResubmitted": {
+ "message": "Se volvió a proponer la transacción, aumentando la comisión de gas a $1, en $2"
+ },
+ "transactionUpdated": {
+ "message": "Se actualizó la transacción en $2."
+ },
+ "transactionUpdatedGas": {
+ "message": "Se actualizó la transacción, con una comisión de gas de $1 en $2."
+ },
+ "transactionErrored": {
+ "message": "La transacción tuvo un error."
+ },
+ "transactionCancelAttempted": {
+ "message": "Se intentó cancelar la transacción con una comisión de gas de $1, en $2"
+ },
+ "transactionCancelSuccess": {
+ "message": "La transacción se canceló con éxito en $2"
+ },
+ "transactionError": {
+ "message": "Error en transacción. Se produjo una excepción en el código del contrato."
+ },
+ "transactionErrorNoContract": {
+ "message": "Intentando llamar una función en una dirección que no es del contrato."
+ },
+ "transactionFee": {
+ "message": "Comisión de la transacción"
+ },
+ "transactionTime": {
+ "message": "Tiempo de Transacción"
+ },
+ "transfer": {
+ "message": "Traspasar"
+ },
+ "transferFrom": {
+ "message": "Traspasar de"
+ },
+ "trezorHardwareWallet": {
+ "message": "Monedero físico TREZOR"
+ },
+ "tryAgain": {
+ "message": "Vuelve a intentar"
+ },
+ "units": {
+ "message": "unidades"
+ },
+ "unknownQrCode": {
+ "message": "Error: No pudimos identificar ese código QR"
+ },
+ "unknownCameraErrorTitle": {
+ "message": "Uuups! Algo se estropeó..."
+ },
+ "unknownCameraError": {
+ "message": "Hubo un error al intentar acceder a la cámara. Por favor, vuelve a intentar..."
+ },
+ "unlock": {
+ "message": "Desbloquear"
+ },
+ "unlockMessage": {
+ "message": "Te espera toda la red descentralizada"
+ },
+ "updatedWithDate": {
+ "message": "Actualizado $1"
+ },
+ "viewOnEtherscan": {
+ "message": "Ver en Etherscan"
+ },
+ "welcomeBack": {
+ "message": "¡Bienvenido de nuevo!"
+ },
+ "yesLetsTry": {
+ "message": "Sí, probemos"
+ },
+ "youNeedToAllowCameraAccess": {
+ "message": "Tienes que permitir acceso a la cámara para usar esta función."
+ },
+ "yourPrivateSeedPhrase": {
+ "message": "Tu frase semilla privada"
+ },
+ "zeroGasPriceOnSpeedUpError": {
+ "message":"No hubo precio de gas al agilizar"
+ },
+ "currencyConversion": {
+ "message": "Cambio de Monedas"
+ },
+ "editingTransaction": {
+ "message": "Hacer cambios a tu transacción"
}
}
diff --git a/app/_locales/fr/messages.json b/app/_locales/fr/messages.json
index 32b0a3109..d2ba10009 100644
--- a/app/_locales/fr/messages.json
+++ b/app/_locales/fr/messages.json
@@ -210,22 +210,22 @@
"message": "Connecter"
},
"connecting": {
- "message": "Connection..."
+ "message": "Connexion..."
},
"connectingToKovan": {
- "message": "Connection au réseau de test Kovan"
+ "message": "Connexion au réseau de test Kovan"
},
"connectingToMainnet": {
- "message": "Connection au réseau principal Ethereum"
+ "message": "Connexion au réseau principal Ethereum"
},
"connectingToRopsten": {
- "message": "Connection au réseau de test Ropsten"
+ "message": "Connexion au réseau de test Ropsten"
},
"connectingToRinkeby": {
- "message": "Connection au réseau de test Rinkeby"
+ "message": "Connexion au réseau de test Rinkeby"
},
"connectingToUnknown": {
- "message": "Connection à un réseau inconnu"
+ "message": "Connexion à un réseau inconnu"
},
"connectToLedger": {
"message": "Connecter un Ledger"
@@ -1129,8 +1129,8 @@
"supportCenter": {
"message": "Visitez notre centre d'aide"
},
- "symbolBetweenZeroTen": {
- "message": "Le symbol doit avoir entre 0 et 10 caractères."
+ "symbolBetweenZeroTwelve": {
+ "message": "Le symbol doit avoir entre 0 et 12 caractères."
},
"takesTooLong": {
"message": "Cela prend trop de temps ?"
@@ -1312,7 +1312,7 @@
"welcomeBack": {
"message": "Bienvenue à nouveau !"
},
- "welcomeBeta": {
+ "welcome": {
"message": "Bienvenue dans la Beta de MetaMask"
},
"whatsThis": {
diff --git a/app/_locales/hn/messages.json b/app/_locales/hn/messages.json
index 5e8b65374..6c27ee1bc 100644
--- a/app/_locales/hn/messages.json
+++ b/app/_locales/hn/messages.json
@@ -227,7 +227,7 @@
},
"decimal": {
"message": "दशमलव परिशुद्धता"
- },
+ },
"defaultNetwork": {
"message": "ईथर लेनदेन के लिए डिफ़ॉल्ट नेटवर्क मुख्य नेट है।"
},
@@ -750,8 +750,8 @@
"supportCenter": {
"message": "हमारे सहायता केंद्र पर जाएं"
},
- "symbolBetweenZeroTen": {
- "message": "प्रतीक 0 और 10 अक्षरों के बीच होना चाहिए"
+ "symbolBetweenZeroTwelve": {
+ "message": "प्रतीक 0 और 12 अक्षरों के बीच होना चाहिए"
},
"takesTooLong": {
"message": "बहुत समय ले रहा है?"
@@ -854,11 +854,11 @@
},
"visitWebSite": {
"message": "हमारी वेब साइट पर जाएं"
- },
+ },
"warning": {
"message": "चेतावनी"
},
- "welcomeBeta": {
+ "welcome": {
"message": "मेटामास्क बीटा में आपका स्वागत है"
},
"whatsThis": {
diff --git a/app/_locales/ht/messages.json b/app/_locales/ht/messages.json
index 5688e725e..4a4c92f3a 100644
--- a/app/_locales/ht/messages.json
+++ b/app/_locales/ht/messages.json
@@ -1150,8 +1150,8 @@
"supportCenter": {
"message": "Vizite Sant Sipò Nou"
},
- "symbolBetweenZeroTen": {
- "message": "Senbòl yo dwe ant 0 ak 10 karaktè."
+ "symbolBetweenZeroTwelve": {
+ "message": "Senbòl yo dwe ant 0 ak 12 karaktè."
},
"takesTooLong": {
"message": "Pran twò lontan?"
@@ -1336,8 +1336,8 @@
"welcomeBack": {
"message": "Bon Retou!"
},
- "welcomeBeta": {
- "message": "Byenveni nan MetaMask Beta"
+ "welcome": {
+ "message": "Byenveni nan MetaMask"
},
"whatsThis": {
"message": "Kisa sa ye?"
diff --git a/app/_locales/index.json b/app/_locales/index.json
index 234215e39..30fb87faf 100644
--- a/app/_locales/index.json
+++ b/app/_locales/index.json
@@ -14,10 +14,11 @@
{ "code": "pl", "name": "Polskie" },
{ "code": "pt", "name": "Português" },
{ "code": "ru", "name": "Русский" },
+ { "code": "sk", "name": "Slovenčina" },
{ "code": "sl", "name": "Slovenščina" },
{ "code": "th", "name": "ไทย" },
{ "code": "tml", "name": "தமிழ்" },
- { "code": "tr", "name": "Türkçe" },
+ { "code": "tr", "name": "Türkçe" },
{ "code": "vi", "name": "Tiếng Việt" },
{ "code": "zh_CN", "name": "中文(简体)" },
{ "code": "zh_TW", "name": "中文(繁體)" }
diff --git a/app/_locales/it/messages.json b/app/_locales/it/messages.json
index 285d75423..9e0f1f06d 100644
--- a/app/_locales/it/messages.json
+++ b/app/_locales/it/messages.json
@@ -1,12 +1,12 @@
{
"privacyMode": {
- "message": "Modalità di privacy"
+ "message": "Modalità privacy"
},
"privacyModeDescription": {
"message": "I siti Web devono richiedere l'accesso per visualizzare le informazioni del tuo account."
},
"exposeAccounts": {
- "message": "Expose Accounts"
+ "message": "Esponi Accounts"
},
"exposeDescription": {
"message": "Esporre gli account al sito Web corrente. Utile per dapps legacy."
@@ -17,6 +17,9 @@
"confirmClear": {
"message": "Sei sicuro di voler cancellare i siti Web approvati?"
},
+ "contractInteraction": {
+ "message": "Interazione Contratto"
+ },
"clearApprovalDataSuccess": {
"message": "Dati del sito Web approvati cancellati correttamente."
},
@@ -30,13 +33,10 @@
"message": "Cancella i dati di approvazione"
},
"reject": {
- "message": "Rifiutare"
- },
- "providerAPIRequest": {
- "message": "Richiesta API Web3"
+ "message": "Annulla"
},
- "reviewProviderRequest": {
- "message": "Si prega di rivedere questa richiesta API Ethereum."
+ "providerRequest": {
+ "message": "$1 vorrebbe connettersi al tuo account"
},
"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."
@@ -44,6 +44,9 @@
"accept": {
"message": "Accetta"
},
+ "acceleratingATransaction": {
+ "message": "* Accelerare una transazione usando un prezzo del gas maggiore aumenta la probabilità che la rete la elabori più velocemente, ma non è garantito."
+ },
"accessingYourCamera": {
"message": "Accesso alla fotocamera..."
},
@@ -57,7 +60,7 @@
"message": "Nome Account"
},
"accountOptions": {
- "message": "Account Options"
+ "message": "Opzioni Account"
},
"accountSelectionRequired": {
"message": "Devi selezionare un account!"
@@ -68,6 +71,9 @@
"address": {
"message": "Indirizzo"
},
+ "advancedOptions": {
+ "message": "Opzioni Avanzate"
+ },
"addCustomToken": {
"message": "Aggiungi un token personalizzato"
},
@@ -75,7 +81,7 @@
"message": "Aggiungi Token"
},
"addTokens": {
- "message": "Aggiungi più token"
+ "message": "Aggiungi token"
},
"addSuggestedTokens": {
"message": "Aggiungi Token Suggeriti"
@@ -83,12 +89,18 @@
"addAcquiredTokens": {
"message": "Aggiungi i token che hai acquistato usando MetaMask"
},
+ "advanced": {
+ "message": "Avanzato"
+ },
"amount": {
"message": "Importo"
},
"amountPlusGas": {
"message": "Importo + Gas"
},
+ "amountPlusTxFee": {
+ "message": "Importo + Costo TX"
+ },
"appDescription": {
"message": "Ethereum Browser Extension",
"description": "La descrizione dell'applicazione"
@@ -118,18 +130,27 @@
"available": {
"message": "Disponibile"
},
+ "average": {
+ "message": "Media"
+ },
"back": {
"message": "Indietro"
},
"balance": {
"message": "Bilancio:"
},
+ "balanceOutdated": {
+ "message": "Il bilancio può essere non aggiornato"
+ },
"balances": {
"message": "I tuoi bilanci"
},
"balanceIsInsufficientGas": {
"message": "Bilancio insufficiente per il gas totale corrente"
},
+ "basic": {
+ "message": "Base"
+ },
"beta": {
"message": "BETA"
},
@@ -177,10 +198,13 @@
"message": "Tentativo di Annullamento"
},
"cancellationGasFee": {
- "message": "Commissione di Annullamento in Gas"
+ "message": "Costo di Annullamento in Gas"
+ },
+ "cancelled": {
+ "message": "Cancellata"
},
"cancelN": {
- "message": "Cancel all $1 transactions"
+ "message": "Annulla tutte le transazioni relative a $1"
},
"classicInterface": {
"message": "Usa l'interfaccia classica"
@@ -188,6 +212,12 @@
"clickCopy": {
"message": "Clicca per Copiare"
},
+ "clickToAdd": {
+ "message": "Clicca su $1 per aggiungerli al tuo account"
+ },
+ "clickToRevealSeed": {
+ "message": "Clicca qui per rivelare la tua frase segreta"
+ },
"close": {
"message": "Chiudi"
},
@@ -197,6 +227,9 @@
"confirm": {
"message": "Conferma"
},
+ "confirmationTime": {
+ "message": "Tempo di conferma (sec)"
+ },
"confirmed": {
"message": "Confermata"
},
@@ -206,6 +239,9 @@
"confirmPassword": {
"message": "Conferma Password"
},
+ "confirmSecretBackupPhrase": {
+ "message": "Conferma la tua Frase di Backup Segreta"
+ },
"confirmTransaction": {
"message": "Conferma Transazione"
},
@@ -215,9 +251,15 @@
"connect": {
"message": "Connetti"
},
+ "connectRequest": {
+ "message": "Richiesta Connessione"
+ },
"connecting": {
"message": "Connessione..."
},
+ "connectingTo": {
+ "message": "Connessione in corso a $1"
+ },
"connectingToKovan": {
"message": "Connessione alla Rete di test Kovan"
},
@@ -290,12 +332,15 @@
"createDen": {
"message": "Crea"
},
+ "createPassword": {
+ "message": "Crea Password"
+ },
"crypto": {
"message": "Crypto",
"description": "Tipo di exchange (cryptomonete)"
},
- "currentConversion": {
- "message": "Cambio Corrente"
+ "currencyConversion": {
+ "message": "Conversione Moneta"
},
"currentLanguage": {
"message": "Lingua Corrente"
@@ -309,6 +354,9 @@
"customGas": {
"message": "Personalizza Gas"
},
+ "customGasSubTitle": {
+ "message": "Incrementare il costo potrebbe diminuire il tempo di elaborazione, ma non è garantito."
+ },
"customToken": {
"message": "Token Personalizzato"
},
@@ -376,6 +424,9 @@
"downloadGoogleChrome": {
"message": "Scarica Google Chrome"
},
+ "downloadSecretBackup": {
+ "message": "Scarica questa Frase di Backup Segreta e tienila al sicuro in un hard disk o supporto di memorizzazione esterno criptato."
+ },
"downloadStateLogs": {
"message": "Scarica i log di Stato"
},
@@ -412,14 +463,20 @@
"enterPasswordContinue": {
"message": "Inserisci la tua password per continuare"
},
+ "eth": {
+ "message": "ETH"
+ },
"etherscanView": {
"message": "Vedi account su Etherscan"
},
+ "estimatedProcessingTimes": {
+ "message": "Tempi di Elaborazione Stimati"
+ },
"exchangeRate": {
"message": "Tasso di cambio"
},
"expandView": {
- "message": "Expand View"
+ "message": "Espandi Vista"
},
"exportPrivateKey": {
"message": "Esporta Chiave Privata"
@@ -430,6 +487,18 @@
"failed": {
"message": "Fallita"
},
+ "fast": {
+ "message": "Veloce"
+ },
+ "faster": {
+ "message": "Più veloce"
+ },
+ "fastest": {
+ "message": "Velocissima"
+ },
+ "feeChartTitle": {
+ "message": "Previsioni sulle Commissioni per le Transazioni dal Vivo"
+ },
"fiat": {
"message": "FIAT",
"description": "Tipo di scambio"
@@ -469,20 +538,35 @@
"gasLimitCalculation": {
"message": "Calcoliamo il gas limite suggerito in base al successo delle transazioni in rete."
},
+ "gasLimitInfoModalContent": {
+ "message": "Il gas limite è il massimo importo di unità di gas che sei disposto a spendere."
+ },
"gasLimitRequired": {
"message": "Gas Limite Richiesto"
},
"gasLimitTooLow": {
"message": "Il Gas Limite deve essere almeno 21000"
},
+ "gasUsed": {
+ "message": "Gas Utilizzato"
+ },
"generatingSeed": {
"message": "Generando la frase seed..."
},
"gasPrice": {
"message": "Prezzo del Gas (GWEI)"
},
+ "gasPriceExtremelyLow": {
+ "message": "Prezzo del gas estremamente basso"
+ },
+ "gasPriceInfoModalContent": {
+ "message": "Il prezzo del gas specifica il totale di Ether che sei disposto a pagare per ogni unità di gas."
+ },
+ "gasPriceNoDenom": {
+ "message": "Prezzo del Gas"
+ },
"gasPriceCalculation": {
- "message": "Calcoliamo il gas limite suggerito in base al successo delle transazioni in rete."
+ "message": "Calcoliamo il prezzo del gas suggerito in base al successo delle transazioni in rete."
},
"gasPriceRequired": {
"message": "Prezzo Gas Richiesto"
@@ -545,7 +629,7 @@
"message": "Come vuoi depositare Ether?"
},
"holdEther": {
- "message": "Ti permette di tenere ether & token, e serve da ponte per le applicazioni decentralizzate."
+ "message": "Ti permette di custodire ether & token, e serve da ponte per le applicazioni decentralizzate."
},
"import": {
"message": "Importa",
@@ -555,7 +639,10 @@
"message": "Importa Account"
},
"importAccountMsg": {
- "message": " Gli account importati non saranno associati alla frase seed originariamente creata con MetaMask. Impara di più sugli account importati "
+ "message": " Gli account importati non saranno associati alla frase seed originariamente creata con MetaMask. Scopri di più sugli account importati "
+ },
+ "importAccountSeedPhrase": {
+ "message": "Importa un Account con una Frase Seed"
},
"importAnAccount": {
"message": "Importa un account"
@@ -570,6 +657,9 @@
"importUsingSeed": {
"message": "Importa account con frase seed"
},
+ "importWithSeedPhrase": {
+ "message": "Importa con una frase seed"
+ },
"info": {
"message": "Informazioni"
},
@@ -579,11 +669,14 @@
"initialTransactionConfirmed": {
"message": "La transazione iniziale è stata confermata dalla rete. Clicca OK per tornare indietro."
},
+ "insufficientBalance": {
+ "message": "Bilancio insufficiente."
+ },
"insufficientFunds": {
- "message": "Fondi non sufficienti."
+ "message": "Fondi insufficienti."
},
"insufficientTokens": {
- "message": "Token non sufficienti."
+ "message": "Token insufficienti."
},
"invalidAddress": {
"message": "Indirizzo non valido"
@@ -591,6 +684,9 @@
"invalidAddressRecipient": {
"message": "Indirizzo destinatario invalido"
},
+ "knownAddressRecipient": {
+ "message": "Indirizzo del contratto conosciuto."
+ },
"invalidGasParams": {
"message": "Parametri del Gas non validi"
},
@@ -644,6 +740,9 @@
"limit": {
"message": "Limite"
},
+ "liveGasPricePredictions": {
+ "message": "Previsioni sui Prezzi del Gas dal Vivo"
+ },
"loading": {
"message": "Caricamento..."
},
@@ -654,7 +753,7 @@
"message": "Localhost 8545"
},
"login": {
- "message": "Connetti"
+ "message": "Accedi"
},
"logout": {
"message": "Disconnetti"
@@ -668,6 +767,9 @@
"mainnet": {
"message": "Rete Ethereum Principale"
},
+ "memorizePhrase": {
+ "message": "Memorizza questa frase."
+ },
"menu": {
"message": "Menu"
},
@@ -686,6 +788,12 @@
"min": {
"message": "Minimo"
},
+ "missingYourTokens": {
+ "message": "Non vedi i tuoi token?"
+ },
+ "minutesShorthand": {
+ "message": "Min"
+ },
"myAccounts": {
"message": "Miei Account"
},
@@ -731,9 +839,33 @@
"newRecipient": {
"message": "Nuovo Destinatario"
},
- "newRPC": {
+ "newNetwork": {
+ "message": "Nuova Rete"
+ },
+ "rpcURL": {
"message": "Nuovo URL RPC"
},
+ "showAdvancedOptions": {
+ "message": "Mostra Opzioni Avanzate"
+ },
+ "hideAdvancedOptions": {
+ "message": "Nascondi Opzioni Avanzate"
+ },
+ "optionalChainId": {
+ "message": "ChainID (opzionale)"
+ },
+ "optionalSymbol": {
+ "message": "Simbolo (opzionale)"
+ },
+ "optionalNickname": {
+ "message": "Nickname (opzionale)"
+ },
+ "newTotal": {
+ "message": "Nuovo Totale"
+ },
+ "newTransactionFee": {
+ "message": "Costo in gas per la Transazione"
+ },
"next": {
"message": "Avanti"
},
@@ -764,6 +896,9 @@
"noWebcamFound": {
"message": "La webcam del tuo computer non è stata trovata. Per favore riprovaci."
},
+ "ofTextNofM": {
+ "message": "di"
+ },
"oldUI": {
"message": "Vecchia interfaccia"
},
@@ -796,6 +931,9 @@
"parameters": {
"message": "Parametri"
},
+ "originalTotal": {
+ "message": "Totale Precedente"
+ },
"password": {
"message": "Password"
},
@@ -803,7 +941,7 @@
"message": "Assicurati che la password sia corretta."
},
"passwordsDontMatch": {
- "message": "Le Password Non Corrispondonos"
+ "message": "Le Password Non Corrispondono"
},
"passwordMismatch": {
"message": "le password non corrispondono",
@@ -838,6 +976,12 @@
"prev": {
"message": "Precedente"
},
+ "primaryCurrencySetting": {
+ "message": "Moneta Primaria"
+ },
+ "primaryCurrencySettingDescription": {
+ "message": "Seleziona ETH per privilegiare la visualizzazione dei valori nella moneta nativa della blockhain. Seleziona Fiat per privilegiare la visualizzazione dei valori nella moneta selezionata."
+ },
"privacyMsg": {
"message": "Politica sulla Privacy"
},
@@ -876,25 +1020,25 @@
"message": "Indirizzo di Rimborso"
},
"rejectAll": {
- "message": "Reject All"
+ "message": "Respingi Tutto"
},
"rejectTxsN": {
- "message": "Reject $1 transactions"
+ "message": "Respingi $1 transazioni"
},
"rejectTxsDescription": {
- "message": "You are about to batch reject $1 transactions."
+ "message": "Stai per respingere in serie $1 transazioni."
},
"rejected": {
"message": "Respinta"
},
"reset": {
- "message": "Reset"
+ "message": "Ripristina"
},
"resetAccount": {
- "message": "Resetta Account"
+ "message": "Ripristina Account"
},
"resetAccountDescription": {
- "message": "Resettare il tuo account cancellerà lo storico delle transazioni."
+ "message": "Ripristinare il tuo account cancellerà lo storico delle transazioni."
},
"restoreFromSeed": {
"message": "Ripristina da una frase seed"
@@ -905,6 +1049,9 @@
"restoreAccountWithSeed": {
"message": "Ripristina Account con la Frase Seed"
},
+ "requestsAwaitingAcknowledgement": {
+ "message": "richiedi che l'attesa sia recepita"
+ },
"required": {
"message": "Richiesto"
},
@@ -930,7 +1077,7 @@
"message": "Non ripristinare la tua frase seed in pubblico!. Queste parole possono essere usate per rubare il tuo account."
},
"revert": {
- "message": "Annulla"
+ "message": "Ripristina"
},
"remove": {
"message": "rimuovi"
@@ -960,6 +1107,12 @@
"save": {
"message": "Salva"
},
+ "slow": {
+ "message": "Lenta"
+ },
+ "slower": {
+ "message": "Più lenta"
+ },
"saveAsCsvFile": {
"message": "Salva Come File CSV"
},
@@ -982,9 +1135,24 @@
"searchResults": {
"message": "Risultati Ricerca"
},
+ "secretBackupPhrase": {
+ "message": "Frase di Backup Segreta"
+ },
+ "secretBackupPhraseDescription": {
+ "message": "La tua frase di backup segreta rende facile fare il backup e ripristinare il tuo account."
+ },
+ "secretBackupPhraseWarning": {
+ "message": "ATTENZIONE: Non dire mai a nessuno questa frase di backup. Chiunque con questa frase può rubare i tuoi Ether per sempre."
+ },
"secretPhrase": {
"message": "Inserisci la tua frase segreta di dodici parole per ripristinare la cassaforte."
},
+ "secondsShorthand": {
+ "message": "Sec"
+ },
+ "seedPhrasePlaceholder": {
+ "message": "Separa ogni parola con un singolo spazio"
+ },
"seedPhraseReq": {
"message": "le frasi seed sono lunghe 12 parole"
},
@@ -994,6 +1162,9 @@
"selectCurrency": {
"message": "Seleziona Moneta"
},
+ "selectEachPhrase": {
+ "message": "Per favore seleziona ogni frase in ordine per assicurarti che sia corretta."
+ },
"selectLocale": {
"message": "Selezione Lingua"
},
@@ -1006,6 +1177,9 @@
"send": {
"message": "Invia"
},
+ "sendAmount": {
+ "message": "Invia Importo"
+ },
"sendETH": {
"message": "Invia ETH"
},
@@ -1033,6 +1207,9 @@
"selectAnAccountHelp": {
"message": "Selezione l'account da visualizzare in MetaMask"
},
+ "selectAHigherGasFee": {
+ "message": "Seleziona un costo in gas maggiore per accelerare l'elaborazione della transazione.*"
+ },
"selectHdPath": {
"message": "Seleziona Percorso HD"
},
@@ -1048,6 +1225,12 @@
"shapeshiftBuy": {
"message": "Compra con Shapeshift"
},
+ "showAdvancedGasInline": {
+ "message": "Controlli gas avanzati"
+ },
+ "showAdvancedGasInlineDescription": {
+ "message": "Seleziona qui per visualizzare i controlli su prezzo e limite del gas nelle schermate di invio e conferma."
+ },
"showPrivateKeys": {
"message": "Mostra Chiave Privata"
},
@@ -1081,6 +1264,9 @@
"sigRequested": {
"message": "Richiesta Firma"
},
+ "somethingWentWrong": {
+ "message": "Oops! Qualcosa è andato storto."
+ },
"spaceBetween": {
"message": "ci può essere solo uno spazio tra le parole"
},
@@ -1093,6 +1279,15 @@
"speedUpSubtitle": {
"message": "Aumenta il prezzo del gas per tentare di sovrascrivere e velocizzare la transazione"
},
+ "speedUpCancellation": {
+ "message": "Accelera questo annullamento"
+ },
+ "speedUpTransaction": {
+ "message": "Accelera questa transazione"
+ },
+ "switchNetworks": {
+ "message": "Cambia Reti"
+ },
"status": {
"message": "Stato"
},
@@ -1123,6 +1318,9 @@
"step3HardwareWalletMsg": {
"message": "Usa il tuo account hardware come utilizzeresti qualsiasi account Ethereum. Accedi alle dApps, invia Eth, compra e conserva token ERC20 e token non fungibili come CryptoKitties"
},
+ "storePhrase": {
+ "message": "Conserva questa frase in un gestore di password come 1Password."
+ },
"submit": {
"message": "Invia"
},
@@ -1132,8 +1330,8 @@
"supportCenter": {
"message": "Visita il nostro Centro di Supporto"
},
- "symbolBetweenZeroTen": {
- "message": "Il simbolo deve essere lungo tra 0 e 10 caratteri."
+ "symbolBetweenZeroTwelve": {
+ "message": "Il simbolo deve essere lungo tra 0 e 12 caratteri."
},
"takesTooLong": {
"message": "Ci sta mettendo troppo?"
@@ -1144,6 +1342,9 @@
"testFaucet": {
"message": "Prova Faucet"
},
+ "tips": {
+ "message": "Suggerimenti"
+ },
"to": {
"message": "A"
},
@@ -1179,25 +1380,37 @@
"message": "transazione"
},
"transactionConfirmed": {
- "message": "Transazione confermata il $2."
+ "message": "Transazione confermata alle $2."
},
"transactionCreated": {
- "message": "Transazione di valore $1 creata il $2."
+ "message": "Transazione di valore $1 creata alle $2."
},
"transactionWithNonce": {
"message": "Transazione $1"
},
"transactionDropped": {
- "message": "Transazione abbandonata il $2."
+ "message": "Transazione abbandonata alle $2."
},
"transactionSubmitted": {
- "message": "Transazione inviata il $2."
+ "message": "Transazione inviata alle $2."
+ },
+ "transactionResubmitted": {
+ "message": "Transazione reinviata con costo in gas aumentato a $1 alle $2"
},
"transactionUpdated": {
- "message": "Transazione aggiornata il $2."
+ "message": "Transazione aggiornata alle $2."
},
"transactionUpdatedGas": {
- "message": "Transazione aggiornata con un prezzo del gas di $1 il $2."
+ "message": "Transazione aggiornata con un prezzo del gas di $1 alle $2."
+ },
+ "transactionErrored": {
+ "message": "La transazione ha riscontrato un errore."
+ },
+ "transactionCancelAttempted": {
+ "message": "Provato l'annullamento della transazione con costo in gas di $1 alle $2"
+ },
+ "transactionCancelSuccess": {
+ "message": "Transazione cancellata alle $2"
},
"transactions": {
"message": "transazioni"
@@ -1205,17 +1418,26 @@
"transactionError": {
"message": "Errore Transazione. Eccceziona generata nel codice del contratto."
},
+ "transactionErrorNoContract": {
+ "message": "Stai provando a chiamare una funzione ad un indirizzo che non è un contratto."
+ },
+ "transactionFee": {
+ "message": "Costo Transazione"
+ },
"transactionMemo": {
"message": "Promemoria Transazione (opzionale)"
},
"transactionNumber": {
"message": "Numero Transazione"
},
+ "transactionTime": {
+ "message": "Tempo Conferma Transazione"
+ },
"transfer": {
"message": "Trasferisci"
},
"transferFrom": {
- "message": "Transfer From"
+ "message": "Trasferisci Da"
},
"transfers": {
"message": "Trasferimenti"
@@ -1236,6 +1458,9 @@
"typePassword": {
"message": "Inserisci Password"
},
+ "uiMigrationAnnouncement": {
+ "message": "Benvenuto alla nuova interfaccia di MetaMask. Se hai un feedback a proposito dell'interfaccia o richieste di funzionalità, per favore contatta il nostro team di supporto su GitHub."
+ },
"uiWelcome": {
"message": "Benvenuto alla nuova interfaccia (Beta)"
},
@@ -1254,9 +1479,6 @@
"unknown": {
"message": "Sconosciuto"
},
- "unknownFunction": {
- "message": "Funzione Sconosciuta"
- },
"unknownNetwork": {
"message": "Rete Privata Sconosciuta"
},
@@ -1318,12 +1540,15 @@
"welcomeBack": {
"message": "Bentornato!"
},
- "welcomeBeta": {
+ "welcome": {
"message": "Benvenuto nella Beta di MetaMask"
},
"whatsThis": {
"message": "Cos'è questo?"
},
+ "writePhrase": {
+ "message": "Scrivi questa frase su un foglio di carta e conservala in un posto sicuro. Se vuoi ancora più sicurezza, scrivila su più fogli e conserva ognuno in 2 o 3 posti diversi. "
+ },
"yesLetsTry": {
"message": "Si, proviamo"
},
@@ -1338,5 +1563,17 @@
},
"yourPrivateSeedPhrase": {
"message": "La tua frase seed privata"
+ },
+ "yourUniqueAccountImage": {
+ "message": "L'immagine esclusiva del tuo account"
+ },
+ "yourUniqueAccountImageDescription1": {
+ "message": "Questa immagine è stata generata automaticamente per te dal tuo nuovo indirizzo."
+ },
+ "yourUniqueAccountImageDescription2": {
+ "message": "Vedrai questa immagine ogni volta che dovrai confermare una transazione."
+ },
+ "zeroGasPriceOnSpeedUpError": {
+ "message": "Prezzo del gas maggiore di zero"
}
}
diff --git a/app/_locales/ja/messages.json b/app/_locales/ja/messages.json
index cd105b241..fcac67894 100644
--- a/app/_locales/ja/messages.json
+++ b/app/_locales/ja/messages.json
@@ -802,7 +802,7 @@
"welcomeBack": {
"message": "おかえりなさい!"
},
- "welcomeBeta": {
+ "welcome": {
"message": "MetaMask ベータ版へようこそ!"
},
"whatsThis": {
diff --git a/app/_locales/ko/messages.json b/app/_locales/ko/messages.json
index c1d9d4733..bf11640e2 100644
--- a/app/_locales/ko/messages.json
+++ b/app/_locales/ko/messages.json
@@ -30,13 +30,16 @@
"message": "승인 데이터 삭제"
},
"reject": {
- "message": "받지 않다"
+ "message": "거부"
},
"providerAPIRequest": {
"message": "Web3 API 요청"
},
"reviewProviderRequest": {
- "message": "이 Ethereum API 요청을 검토하십시오."
+ "message": "이 Ethereum API 요청을 검토하세요."
+ },
+ "providerRequest": {
+ "message": "$1이 당신의 계정에 연결하길 원합니다."
},
"providerRequestInfo": {
"message": "아래 나열된 도메인은 Web3 API에 대한 액세스를 요청하여 Ethereum 블록 체인과 상호 작용할 수 있습니다. Ethereum 액세스를 승인하기 전에 항상 올바른 사이트에 있는지 다시 확인하십시오."
@@ -44,6 +47,9 @@
"accept": {
"message": "수락"
},
+ "acceleratingATransaction": {
+ "message": "* 더 높은 가스 요금을 사용하여 트랜잭션을 가속화하면 네트워크에 의해 더 빨리 처리될 가능성이 증가하지만 항상 빠른 처리가 보장되는 것은 아닙니다."
+ },
"accessingYourCamera": {
"message": "카메라에 접근 중..."
},
@@ -68,6 +74,9 @@
"address": {
"message": "주소"
},
+ "advancedOptions": {
+ "message": "고급 옵션"
+ },
"addCustomToken": {
"message": "사용자 정의 토큰 추가"
},
@@ -83,12 +92,21 @@
"addAcquiredTokens": {
"message": "메타마스크를 통해 획득한 토큰 추가"
},
+ "advanced": {
+ "message": "고급"
+ },
+ "allDone": {
+ "message": "모두 완료"
+ },
"amount": {
"message": "수량"
},
"amountPlusGas": {
"message": "수량 + 가스"
},
+ "amountPlusTxFee": {
+ "message": "Amount + TX Fee"
+ },
"appDescription": {
"message": "이더리움 브라우저 확장 프로그램",
"description": "애플리케이션 설명"
@@ -109,12 +127,18 @@
"attemptToCancel": {
"message": "취소 하시겠습니까?"
},
+ "attemptToCancelDescription": {
+ "message": "이 취소 시도가 기존 트랜잭션의 취소를 보장하지 않습니다. 취소 시도가 성공하면 위 거래 수수료가 부과됩니다."
+ },
"attributions": {
"message": "속성"
},
"available": {
"message": "사용 가능"
},
+ "average": {
+ "message": "평균"
+ },
"back": {
"message": "돌아가기"
},
@@ -127,6 +151,9 @@
"balanceIsInsufficientGas": {
"message": "현재 가스 총합에 대해 잔액이 부족합니다"
},
+ "basic": {
+ "message": "Basic"
+ },
"beta": {
"message": "BETA"
},
@@ -176,6 +203,9 @@
"cancellationGasFee": {
"message": "취소 가스 수수료"
},
+ "cancelled": {
+ "message": "취소됨"
+ },
"cancelN": {
"message": "모든 $1 트랜잭션 취소"
},
@@ -185,6 +215,12 @@
"clickCopy": {
"message": "클릭하여 복사"
},
+ "clickToAdd": {
+ "message": "계정에 토큰을 추가하기 위해 $1를 클릭하세요."
+ },
+ "clickToRevealSeed": {
+ "message": "비밀 단어를 보기 위해 여기를 클릭하세요."
+ },
"close": {
"message": "닫기"
},
@@ -194,6 +230,9 @@
"confirm": {
"message": "승인"
},
+ "confirmationTime": {
+ "message": "처리 시간 (초)"
+ },
"confirmed": {
"message": "승인됨"
},
@@ -203,27 +242,39 @@
"confirmPassword": {
"message": "비밀번호 확인"
},
+ "confirmSecretBackupPhrase": {
+ "message": "비밀 백업 구문 확인"
+ },
"confirmTransaction": {
"message": "트랜잭션 승인"
},
+ "congratulations": {
+ "message": "축하합니다."
+ },
"connectHardwareWallet": {
"message": "하드웨어 지갑 연결"
},
"connect": {
"message": "연결"
},
+ "connectRequest": {
+ "message": "연결 요청"
+ },
"connecting": {
"message": "연결 중..."
},
+ "connectingTo": {
+ "message": "$1에 연결"
+ },
+ "connectingToKovan": {
+ "message": "Kovan 테스트넷 접속 중"
+ },
"connectingToMainnet": {
"message": "이더리움 메인넷 접속 중"
},
"connectingToRopsten": {
"message": "Ropsten 테스트넷 접속 중"
},
- "connectingToKovan": {
- "message": "Kovan 테스트넷 접속 중"
- },
"connectingToRinkeby": {
"message": "Rinkeby 테스트넷 접속 중"
},
@@ -272,6 +323,12 @@
"copyToClipboard": {
"message": "클립보드로 복사"
},
+ "copyTransactionId": {
+ "message": "트랜잭션 아이디 복사"
+ },
+ "copiedTransactionId": {
+ "message": "트랜잭션 아이디 복사됨"
+ },
"copyButton": {
"message": " 복사 "
},
@@ -284,9 +341,15 @@
"createAccount": {
"message": "계정 생성"
},
+ "createAWallet": {
+ "message": "지갑 생성하기"
+ },
"createDen": {
"message": "생성"
},
+ "createPassword": {
+ "message": "비밀번호 생성"
+ },
"crypto": {
"message": "암호화폐",
"description": "거래 유형 (암호화폐)"
@@ -294,6 +357,9 @@
"currentConversion": {
"message": "현재 통화"
},
+ "currencyConversion": {
+ "message": "통화 변환"
+ },
"currentLanguage": {
"message": "현재 언어"
},
@@ -306,6 +372,9 @@
"customGas": {
"message": "가스 설정"
},
+ "customGasSubTitle": {
+ "message": "수수료를 높히면 처리 시간이 단축될 수 있지만, 그것이 보장되진 않습니다."
+ },
"customToken": {
"message": "사용자 정의 토큰"
},
@@ -319,7 +388,7 @@
"message": "소수점은 0 이상이고 36 이하여야 합니다."
},
"decimal": {
- "message": "소수점 정확도"
+ "message": "소수 자릿수"
},
"defaultNetwork": {
"message": "이더리움 트랜잭션의 기본 네트워크는 메인넷입니다."
@@ -373,6 +442,9 @@
"downloadGoogleChrome": {
"message": "구글 크롬 다운로드"
},
+ "downloadSecretBackup": {
+ "message": "이 비밀 백업 구문을 다운로드하여 암호화된 외장 하드 드라이브나 저장 매체에 안전하게 보관하세요."
+ },
"downloadStateLogs": {
"message": "상태 로그 다운로드"
},
@@ -397,6 +469,30 @@
"encryptNewDen": {
"message": "새로운 DEN을 암호화"
},
+ "endOfFlowMessage1": {
+ "message": "인증을 통과했습니다 - 시드 구문을 안전하게 보관하세요. 그것은 당신의 의무입니다."
+ },
+ "endOfFlowMessage2": {
+ "message": "안전하게 시드 구문을 보관하는 팁"
+ },
+ "endOfFlowMessage3": {
+ "message": "여러 군데에 시드 구문을 백업하세요."
+ },
+ "endOfFlowMessage4": {
+ "message": "누구와도 시드 구문을 공유하지마세요."
+ },
+ "endOfFlowMessage5": {
+ "message": "피싱에 주의하세요! 메타마스크는 절대 갑작스럽게 당신의 시드 구문을 묻지 않습니다."
+ },
+ "endOfFlowMessage6": {
+ "message": "만약 시드 구문을 다시 백업해야한다면, 설정 -> 보안에서 확인할 수 있습니다. "
+ },
+ "endOfFlowMessage7": {
+ "message": "만약 질문이 있거나 피싱을 목격했다면 support@metamask.io으로 메일을 보내주세요."
+ },
+ "endOfFlowMessage8": {
+ "message": "메타마스크는 당신의 시드 구문을 복원해줄 수 없습니다. 더 알아보기."
+ },
"ensNameNotFound": {
"message": "ENS 이름을 찾을 수 없습니다"
},
@@ -409,9 +505,15 @@
"enterPasswordContinue": {
"message": "계속하기 위해 비밀번호 입력"
},
+ "eth": {
+ "message": "ETH"
+ },
"etherscanView": {
"message": "이더스캔에서 계정보기"
},
+ "estimatedProcessingTimes": {
+ "message": "예상 처리 시간"
+ },
"exchangeRate": {
"message": "환율"
},
@@ -427,6 +529,12 @@
"failed": {
"message": "실패"
},
+ "fast": {
+ "message": "빠름"
+ },
+ "faster": {
+ "message": "빨라짐"
+ },
"fiat": {
"message": "FIAT",
"description": "거래 형식"
@@ -466,18 +574,33 @@
"gasLimitCalculation": {
"message": "네트워크 성공률을 기반으로 적합한 가스 한도를 계산합니다."
},
+ "gasLimitInfoModalContent": {
+ "message": "가스 한도는 당신이 기꺼이 소비할 수 있는 가스의 최대 수량입니다."
+ },
"gasLimitRequired": {
"message": "가스 한도가 필요합니다."
},
"gasLimitTooLow": {
"message": "가스 한도는 최소 21000 이상이어야 합니다."
},
+ "gasUsed": {
+ "message": "사용된 가스"
+ },
"generatingSeed": {
"message": "시드 생성 중..."
},
"gasPrice": {
"message": "가스 가격 (GWEI)"
},
+ "gasPriceExtremelyLow": {
+ "message": "가스 가격 매우 낮음"
+ },
+ "gasPriceInfoModalContent": {
+ "message": "가스 가격은 가스 1당 지불할 gwei 단위의 이더 수량을 명시합니다."
+ },
+ "gasPriceNoDenom": {
+ "message": "가스 가격"
+ },
"gasPriceCalculation": {
"message": "네트워크 성공률을 기반으로 적합한 가스 가격을 계산합니다."
},
@@ -497,10 +620,16 @@
"getHelp": {
"message": "도움말"
},
+ "getStarted": {
+ "message": "시작하기"
+ },
"greaterThanMin": {
"message": "$1 이상이어야 합니다.",
"description": "10진수 입력으로 hex값 입력을 도와줍니다"
},
+ "happyToSeeYou": {
+ "message": "We’re happy to see you."
+ },
"hardware": {
"message": "하드웨어"
},
@@ -554,12 +683,21 @@
"importAccountMsg": {
"message": " 가져온 계정은 메타마스크에서 원래 생성된 계정의 시드구문과 연관성이 없습니다. 가져온 계정에 대해 더 배우기 "
},
+ "importAccountSeedPhrase": {
+ "message": "시드 구문으로 계정 가져오기"
+ },
"importAnAccount": {
"message": "계정 가져오기"
},
"importDen": {
"message": "기존의 DEN 가져오기"
},
+ "importWallet": {
+ "message": "지갑 가져오기"
+ },
+ "importYourExisting": {
+ "message": "12개 단어로 구성된 시드 구문으로 이미 만들어진 지갑을 가져오기"
+ },
"imported": {
"message": "가져온 계정",
"description": "이 상태는 해당 계정이 keyring으로 완전히 로드된 상태임을 표시합니다"
@@ -567,6 +705,9 @@
"importUsingSeed": {
"message": "계정 시드 구문으로 가져오기"
},
+ "importWithSeedPhrase": {
+ "message": "시드 구문 가져오기"
+ },
"info": {
"message": "정보"
},
@@ -576,6 +717,9 @@
"initialTransactionConfirmed": {
"message": "초기 트랜잭션이 네트워크를 통해 확정되었습니다. 확인을 누르면 이전으로 돌아갑니다."
},
+ "insufficientBalance": {
+ "message": "잔액 부족."
+ },
"insufficientFunds": {
"message": "충분하지 않은 자금."
},
@@ -632,6 +776,9 @@
"message": "$1 이하여야합니다.",
"description": "10진수 입력으로 hex값 입력을 도와줍니다"
},
+ "letsGoSetUp": {
+ "message": "네, 설정해볼게요!"
+ },
"likeToAddTokens": {
"message": "토큰을 추가하시겠습니까?"
},
@@ -641,6 +788,9 @@
"limit": {
"message": "한도"
},
+ "liveGasPricePredictions": {
+ "message": "실시간 가스 가격 예측"
+ },
"loading": {
"message": "로딩 중..."
},
@@ -665,6 +815,9 @@
"mainnet": {
"message": "이더리움 메인넷"
},
+ "memorizePhrase": {
+ "message": "이 구문을 기억하세요."
+ },
"menu": {
"message": "메뉴"
},
@@ -672,17 +825,20 @@
"message": "메시지"
},
"metamaskDescription": {
- "message": "메타마스크는 이더리움을 위한 안전한 신분 저장소입니다."
- },
- "metamaskVersion": {
- "message": "메타마스크 버전"
+ "message": "메타마스크는 이더리움을 위한 안전한 저장소입니다."
},
"metamaskSeedWords": {
"message": "메타마스크 시드 단어"
},
+ "metamaskVersion": {
+ "message": "메타마스크 버전"
+ },
"min": {
"message": "최소"
},
+ "missingYourTokens": {
+ "message": "당신의 토큰이 보이지 않나요?"
+ },
"myAccounts": {
"message": "내 계정"
},
@@ -722,11 +878,44 @@
"newPassword": {
"message": "새 비밀번호 (최소 8자 이상)"
},
+ "newPassword8Chars": {
+ "message": "새 비밀번호 (최소 8문자)"
+ },
"newRecipient": {
"message": "받는 사람"
},
- "newRPC": {
- "message": "새로운 RPC URL"
+ "newNetwork": {
+ "message": "새 네트워크"
+ },
+ "newToMetaMask": {
+ "message": "메타마스크를 처음 사용하시나요?"
+ },
+ "noAlreadyHaveSeed": {
+ "message": "아니요, 이미 시드 구문을 가지고 있습니다."
+ },
+ "rpcURL": {
+ "message": "새 RPC 주소"
+ },
+ "showAdvancedOptions": {
+ "message": "고급 옵션 보기"
+ },
+ "hideAdvancedOptions": {
+ "message": "고급 옵션 숨기기"
+ },
+ "optionalChainId": {
+ "message": "ChainID (선택)"
+ },
+ "optionalSymbol": {
+ "message": "Symbol (선택)"
+ },
+ "optionalNickname": {
+ "message": "Nickname (선택)"
+ },
+ "newTotal": {
+ "message": "새 합계"
+ },
+ "newTransactionFee": {
+ "message": "새 트랜잭션 수수료"
},
"next": {
"message": "다음"
@@ -752,12 +941,12 @@
"notStarted": {
"message": "시작 안 됨"
},
- "noWebcamFound": {
- "message": "컴퓨터의 웹캠을 찾을 수 없습니다. 다시 시도해보세요."
- },
"noWebcamFoundTitle": {
"message": "웹캠이 없습니다"
},
+ "noWebcamFound": {
+ "message": "컴퓨터의 웹캠을 찾을 수 없습니다. 다시 시도해보세요."
+ },
"oldUI": {
"message": "구버전 UI"
},
@@ -787,6 +976,12 @@
"parameters": {
"message": "매개변수"
},
+ "participateInMetaMetrics": {
+ "message": "MetaMetrics 참여"
+ },
+ "participateInMetaMetricsDescription": {
+ "message": "메타마스크를 더 좋게 만들기 위해 MetaMetrics에 참여하세요."
+ },
"password": {
"message": "비밀번호"
},
@@ -829,6 +1024,12 @@
"prev": {
"message": "이전"
},
+ "primaryCurrencySetting": {
+ "message": "주 화폐"
+ },
+ "primaryCurrencySettingDescription": {
+ "message": "체인의 고유 통화 값으로 우선 표기하시려면 네이티브를 선택하세요. (예: ETH) 설정하신 Fiat 통화 값으로 우선 표기하시려면 Fiat을 선택하세요."
+ },
"privacyMsg": {
"message": "개인정보 보호 정책"
},
@@ -896,6 +1097,9 @@
"restoreAccountWithSeed": {
"message": "시드 구문으로 계정 복구하기"
},
+ "requestsAwaitingAcknowledgement": {
+ "message": "요청이 인정되기까지 대기중"
+ },
"required": {
"message": "필요함"
},
@@ -951,11 +1155,11 @@
"save": {
"message": "저장"
},
- "speedUpTitle": {
- "message": "트랜잭션 속도 향상하기"
+ "slow": {
+ "message": "느림"
},
- "speedUpSubtitle": {
- "message": "트랜잭션 가스 가격을 올려서 해당 트랜잭션에 덮어쓰고 속도를 빠르게 합니다"
+ "slower": {
+ "message": "느려짐"
},
"saveAsCsvFile": {
"message": "CSV 파일로 저장"
@@ -979,11 +1183,23 @@
"searchResults": {
"message": "검색 결과"
},
+ "secretBackupPhrase": {
+ "message": "비밀 백업 구문"
+ },
+ "secretBackupPhraseDescription": {
+ "message": "비밀 백업 구문을 사용하면 계정을 쉽게 백업하고 복원할 수 있습니다."
+ },
+ "secretBackupPhraseWarning": {
+ "message": "경고: 백업 구문을 절대 공개하지 마세요. 이 구문을 가진 누군가 당신의 이더를 영원히 가지고 갈 수 있습니다."
+ },
"secretPhrase": {
"message": "12개 단어로 구성된 비밀 구문을 입력하여 저장소를 복구하세요."
},
- "newPassword8Chars": {
- "message": "새 비밀번호 (최소 8문자)"
+ "secondsShorthand": {
+ "message": "초"
+ },
+ "seedPhrasePlaceholder": {
+ "message": "각 단어를 스페이스로 구분해주세요"
},
"seedPhraseReq": {
"message": "시드 구문은 12개의 단어입니다"
@@ -994,6 +1210,9 @@
"selectCurrency": {
"message": "통화 선택"
},
+ "selectEachPhrase": {
+ "message": "백업 구문이 올바른지 확인하기 위해 각 단어를 순서에 맞게 선택해주세요."
+ },
"selectLocale": {
"message": "언어 선택"
},
@@ -1006,6 +1225,9 @@
"send": {
"message": "전송"
},
+ "sendAmount": {
+ "message": "전송 수량"
+ },
"sendETH": {
"message": "ETH 보내기"
},
@@ -1033,6 +1255,9 @@
"selectAnAccountHelp": {
"message": "메타마스크에서 보기 위한 계정 선택"
},
+ "selectAHigherGasFee": {
+ "message": "트랜잭션 처리를 가속하기 위해 더 높은 가스 요금을 선택하세요.*"
+ },
"selectHdPath": {
"message": "HD 경로 지정"
},
@@ -1048,6 +1273,18 @@
"shapeshiftBuy": {
"message": "Shapeshift를 통해서 구매하기"
},
+ "showAdvancedGasInline": {
+ "message": "고급 가스 제어"
+ },
+ "showAdvancedGasInlineDescription": {
+ "message": "전송 및 확인 화면에서 직접 가스 가격과 한도 제어를 표시하려면 이 옵션을 선택해주세요."
+ },
+ "showFiatConversionInTestnets": {
+ "message": "테스트 넷에서 fiat 변환 보여주기"
+ },
+ "showFiatConversionInTestnetsDescription": {
+ "message": "테스트 넷에서 fiat 변환을 보기 위해 활성화하세요"
+ },
"showPrivateKeys": {
"message": "개인키 보기"
},
@@ -1063,12 +1300,12 @@
"sign": {
"message": "서명"
},
- "signed": {
- "message": "서명됨"
- },
"signatureRequest": {
"message": "서명 요청"
},
+ "signed": {
+ "message": "서명됨"
+ },
"signMessage": {
"message": "메시지 서명"
},
@@ -1081,9 +1318,30 @@
"sigRequested": {
"message": "서명이 요청됨"
},
+ "somethingWentWrong": {
+ "message": "헉! 뭔가 잘못됐어요."
+ },
"spaceBetween": {
"message": "단어 사이에는 공백만 올 수 있습니다"
},
+ "speedUp": {
+ "message": "속도 향상"
+ },
+ "speedUpTitle": {
+ "message": "트랜잭션 속도 향상하기"
+ },
+ "speedUpSubtitle": {
+ "message": "트랜잭션 가스 가격을 올려서 해당 트랜잭션에 덮어쓰고 속도를 빠르게 합니다"
+ },
+ "speedUpCancellation": {
+ "message": "취소 속도 향상"
+ },
+ "speedUpTransaction": {
+ "message": "트랜잭션 속도 향상"
+ },
+ "switchNetworks": {
+ "message": "네트워크 변경"
+ },
"status": {
"message": "상태"
},
@@ -1114,6 +1372,9 @@
"step3HardwareWalletMsg": {
"message": "다른 이더리움 계정을 사용하듯 하드웨어 계정을 사용합니다. dApps을 로그인하거나, 이더를 보내거나, ERC20 토큰 혹은 대체 가능하지 않은 토큰 (예를 들어 CryptoKitties)을 사거나 저장하거나 합니다."
},
+ "storePhrase": {
+ "message": "이 구문을 1Password같은 암호 관리자에 저장하세요."
+ },
"submit": {
"message": "제출"
},
@@ -1123,8 +1384,8 @@
"supportCenter": {
"message": "지원 센터에 방문하기"
},
- "symbolBetweenZeroTen": {
- "message": "심볼은 0에서 10개 사이의 문자여야 합니다."
+ "symbolBetweenZeroTwelve": {
+ "message": "심볼은 0에서 12개 사이의 문자여야 합니다."
},
"takesTooLong": {
"message": "너무 오래 걸리나요?"
@@ -1135,8 +1396,14 @@
"testFaucet": {
"message": "파우셋 테스트"
},
+ "thisWillCreate": {
+ "message": "새로운 지갑과 시드 구문을 생성"
+ },
+ "tips": {
+ "message": "팁"
+ },
"to": {
- "message": "받는이: "
+ "message": "받는이"
},
"toETHviaShapeShift": {
"message": "ShapeShift를 통해 $1를 ETH로 바꾸기",
@@ -1154,6 +1421,9 @@
"tokenBalance": {
"message": "현재 토큰 잔액:"
},
+ "tokenContractAddress": {
+ "message": "토큰 컨트랙트 주소"
+ },
"tokenSelection": {
"message": "토큰을 검색하거나 유명한 토큰 리스트에서 선택하시기 바랍니다."
},
@@ -1169,21 +1439,63 @@
"transaction": {
"message": "트랜잭션"
},
+ "transactionConfirmed": {
+ "message": "트랜잭션이 승인됨 $2."
+ },
+ "transactionCreated": {
+ "message": "$1에 대한 트랜잭션이 생성됨 $2."
+ },
+ "transactionWithNonce": {
+ "message": "트랜잭션 $1"
+ },
+ "transactionDropped": {
+ "message": "트랜잭션이 드롭됨 $2."
+ },
+ "transactionSubmitted": {
+ "message": "$1의 가스 요금으로 트랜잭션이 제출됨 $2."
+ },
+ "transactionResubmitted": {
+ "message": "$1으로 가스 요금을 올려 트랜잭션이 다시 제출됨 $2."
+ },
+ "transactionUpdated": {
+ "message": "트랜잭션이 수정됨 $2."
+ },
+ "transactionUpdatedGas": {
+ "message": "$1의 가스 요금으로 트랜잭션이 수정됨 $2."
+ },
+ "transactionErrored": {
+ "message": "트랜잭션 오류 발생."
+ },
+ "transactionCancelAttempted": {
+ "message": "$1의 가스 요금으로 트랜잭션 취소가 시도됨 $2."
+ },
+ "transactionCancelSuccess": {
+ "message": "트랜잭션이 성공적으로 취소됨 $2."
+ },
"transactions": {
"message": "트랜잭션"
},
"transactionError": {
"message": "트랜잭션 오류. 컨트랙트 코드에서 예외 발생(Exception thrown)."
},
+ "transactionFee": {
+ "message": "수수료"
+ },
"transactionMemo": {
"message": "트랜잭션 메모 (선택사항)"
},
"transactionNumber": {
"message": "트랜잭션 번호"
},
+ "transactionTime": {
+ "message": "트랜잭션 시간"
+ },
"transfer": {
"message": "전송"
},
+ "transferFrom": {
+ "message": "보내는 이"
+ },
"transfers": {
"message": "전송"
},
@@ -1203,6 +1515,9 @@
"typePassword": {
"message": "비밀번호를 입력하세요"
},
+ "uiMigrationAnnouncement": {
+ "message": "새로운 메타마스크 UI에 오신 것을 환영합니다. UI에 대한 피드백 또는 기능 요청이 있는 경우, 당사의 지원팀 또는 GitHub에 연락해주세요."
+ },
"uiWelcome": {
"message": "새로운 UI에 오신 것을 환영합니다. (Beta)"
},
@@ -1243,7 +1558,10 @@
"message": "잠금 해제"
},
"unlockMessage": {
- "message": "우리가 기다리던 분권형 웹입니다"
+ "message": "우리가 기다리던 탈 중앙화 웹입니다"
+ },
+ "updatedWithDate": {
+ "message": "$1에 업데이트 됨"
},
"uriErrorMsg": {
"message": "URI는 HTTP/HTTPS로 시작해야 합니다."
@@ -1282,15 +1600,21 @@
"welcomeBack": {
"message": "환영합니다!"
},
- "welcomeBeta": {
+ "welcome": {
"message": "메타마스크 Beta에 오신 것을 환영합니다"
},
"whatsThis": {
"message": "이것은 무엇인가요?"
},
+ "writePhrase": {
+ "message": "이 구문을 종이에 써서 안전한 장소에 보관하세요. 만약 당신이 더 높은 수준의 보안을 원한다면, 그것을 여러 장의 종이에 적어서 각각 2-3개의 다른 위치에 보관하세요."
+ },
"yesLetsTry": {
"message": "네, 시도해보겠습니다."
},
+ "youNeedToAllowCameraAccess": {
+ "message": "이 기능을 사용하려면 카메라 접근을 허용해야 합니다."
+ },
"yourSigRequested": {
"message": "서명을 요청 중입니다."
},
@@ -1299,8 +1623,5 @@
},
"yourPrivateSeedPhrase": {
"message": "개인 시드 구문"
- },
- "youNeedToAllowCameraAccess": {
- "message": "이 기능을 사용하려면 카메라 접근을 허용해야 합니다."
}
}
diff --git a/app/_locales/nl/messages.json b/app/_locales/nl/messages.json
index 595b93795..12bde6585 100644
--- a/app/_locales/nl/messages.json
+++ b/app/_locales/nl/messages.json
@@ -750,8 +750,8 @@
"supportCenter": {
"message": "Bezoek ons ​​ondersteuningscentrum"
},
- "symbolBetweenZeroTen": {
- "message": "Het symbool moet tussen 0 en 10 tekens lang zijn."
+ "symbolBetweenZeroTwelve": {
+ "message": "Het symbool moet tussen 0 en 12 tekens lang zijn."
},
"takesTooLong": {
"message": "Duurt te lang?"
@@ -858,8 +858,8 @@
"warning": {
"message": "Waarschuwing"
},
- "welcomeBeta": {
- "message": "Welkom bij MetaMask Beta"
+ "welcome": {
+ "message": "Welkom bij MetaMask"
},
"whatsThis": {
"message": "Wat is dit?"
diff --git a/app/_locales/pl/messages.json b/app/_locales/pl/messages.json
index c6d797c34..026f4b3ec 100644
--- a/app/_locales/pl/messages.json
+++ b/app/_locales/pl/messages.json
@@ -119,6 +119,9 @@
"clickCopy": {
"message": "Kliknij żeby skopiować"
},
+ "clickToAdd": {
+ "message": "Przycisnij $1, aby dodać go do swojego konta"
+ },
"close": {
"message": "Zamknij"
},
@@ -337,6 +340,9 @@
"exchangeRate": {
"message": "Kurs wymiany"
},
+ "expandView": {
+ "message": "Rozwiń widok"
+ },
"exportPrivateKey": {
"message": "Eksportuj klucz prywatny"
},
@@ -596,6 +602,9 @@
"min": {
"message": "Minimum"
},
+ "missingYourTokens": {
+ "message": "Nie widzisz swoich token?"
+ },
"myAccounts": {
"message": "Moje konta"
},
@@ -1042,8 +1051,8 @@
"supportCenter": {
"message": "Odwiedź nasze Centrum Pomocy"
},
- "symbolBetweenZeroTen": {
- "message": "Symbol musi mieć od 0 do 10 znaków."
+ "symbolBetweenZeroTwelve": {
+ "message": "Symbol musi mieć od 0 do 12 znaków."
},
"takesTooLong": {
"message": "Trwa zbyt długo?"
@@ -1192,8 +1201,8 @@
"welcomeBack": {
"message": "Witaj z powrotem!"
},
- "welcomeBeta": {
- "message": "Witaj w MetaMask Beta"
+ "welcome": {
+ "message": "Witaj w MetaMask"
},
"whatsThis": {
"message": "Co to jest?"
@@ -1210,4 +1219,4 @@
"yourPrivateSeedPhrase": {
"message": "Twoja prywatna fraza seed"
}
-} \ No newline at end of file
+}
diff --git a/app/_locales/pt/messages.json b/app/_locales/pt/messages.json
index 83fcba6e5..e51b1f72e 100644
--- a/app/_locales/pt/messages.json
+++ b/app/_locales/pt/messages.json
@@ -750,8 +750,8 @@
"supportCenter": {
"message": "Visitar o nosso Centro de Suporte"
},
- "symbolBetweenZeroTen": {
- "message": "Símbolo deve conter entre 0 e 10 characters."
+ "symbolBetweenZeroTwelve": {
+ "message": "Símbolo deve conter entre 0 e 12 characters."
},
"takesTooLong": {
"message": "A demorar muito?"
@@ -858,8 +858,8 @@
"warning": {
"message": "Aviso"
},
- "welcomeBeta": {
- "message": "Bem-vindo ao MetaMask Beta"
+ "welcome": {
+ "message": "Bem-vindo ao MetaMask"
},
"whatsThis": {
"message": "O que é isto?"
diff --git a/app/_locales/ru/messages.json b/app/_locales/ru/messages.json
index 9d4eb2cc2..f80efcc56 100644
--- a/app/_locales/ru/messages.json
+++ b/app/_locales/ru/messages.json
@@ -825,8 +825,8 @@
"supportCenter": {
"message": "Перейти в наш Центр поддержки"
},
- "symbolBetweenZeroTen": {
- "message": "Символ должен быть от 0 до 10 символов."
+ "symbolBetweenZeroTwelve": {
+ "message": "Символ должен быть от 0 до 12 символов."
},
"takesTooLong": {
"message": "Слишком долго?"
@@ -936,8 +936,8 @@
"warning": {
"message": "Предупреждение"
},
- "welcomeBeta": {
- "message": "Добро пожаловать в MetaMask Beta"
+ "welcome": {
+ "message": "Добро пожаловать в MetaMask"
},
"whatsThis": {
"message": "Что это?"
diff --git a/app/_locales/sk/messages.json b/app/_locales/sk/messages.json
new file mode 100644
index 000000000..febcc9141
--- /dev/null
+++ b/app/_locales/sk/messages.json
@@ -0,0 +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": "Přijmout"
+ },
+ "account": {
+ "message": "Účet"
+ },
+ "accountDetails": {
+ "message": "Detaily účtu"
+ },
+ "accountName": {
+ "message": "Název účtu"
+ },
+ "address": {
+ "message": "Adresa"
+ },
+ "addCustomToken": {
+ "message": "Přidat vlastní token"
+ },
+ "addToken": {
+ "message": "Přidat token"
+ },
+ "addTokens": {
+ "message": "Přidat tokeny"
+ },
+ "amount": {
+ "message": "Částka"
+ },
+ "amountPlusGas": {
+ "message": "Částka + palivo"
+ },
+ "appDescription": {
+ "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": "Pokouším se připojit k blockchainu."
+ },
+ "attributions": {
+ "message": "Zásluhy"
+ },
+ "available": {
+ "message": "Dostupné"
+ },
+ "back": {
+ "message": "Zpět"
+ },
+ "balance": {
+ "message": "Zůstatek:"
+ },
+ "balances": {
+ "message": "Zůstatek tokenu"
+ },
+ "balanceIsInsufficientGas": {
+ "message": "Nedostatek prostředků pro aktuální množství paliva"
+ },
+ "beta": {
+ "message": "BETA"
+ },
+ "betweenMinAndMax": {
+ "message": "musí být větší nebo roven $1 a menší nebo roven $2.",
+ "description": "helper for inputting hex as decimal input"
+ },
+ "blockiesIdenticon": {
+ "message": "Použít Blockies Identicon"
+ },
+ "borrowDharma": {
+ "message": "Pújčit si přes Dharma (Beta)"
+ },
+ "builtInCalifornia": {
+ "message": "MetaMask je navržen a vytvořen v Kalifornii."
+ },
+ "buy": {
+ "message": "Koupit"
+ },
+ "buyCoinbase": {
+ "message": "Nákup na Coinbase"
+ },
+ "buyCoinbaseExplainer": {
+ "message": "Coinbase je světově nejoblíbenější místo k nákupu a prodeji bitcoinu, etherea nebo litecoinu."
+ },
+ "ok": {
+ "message": "Ok"
+ },
+ "cancel": {
+ "message": "Zrušit"
+ },
+ "classicInterface": {
+ "message": "Použít klasické rozhraní"
+ },
+ "clickCopy": {
+ "message": "Kliknutím zkopírovat"
+ },
+ "confirm": {
+ "message": "Potvrdit"
+ },
+ "confirmed": {
+ "message": "Potvrzeno"
+ },
+ "confirmContract": {
+ "message": "Potvrdit kontrakt"
+ },
+ "confirmPassword": {
+ "message": "Potvrdit heslo"
+ },
+ "confirmTransaction": {
+ "message": "Potvrdit transakci"
+ },
+ "continue": {
+ "message": "Pokračovat"
+ },
+ "continueToCoinbase": {
+ "message": "Přejít na Coinbase"
+ },
+ "contractDeployment": {
+ "message": "Nasazení kontraktu"
+ },
+ "conversionProgress": {
+ "message": "Provádí se převod"
+ },
+ "copiedButton": {
+ "message": "Zkopírováno"
+ },
+ "copiedClipboard": {
+ "message": "Zkopírováno do schránky"
+ },
+ "copiedExclamation": {
+ "message": "Zkopírováno!"
+ },
+ "copiedSafe": {
+ "message": "Zkopíroval jsem to na bezpečné místo"
+ },
+ "copy": {
+ "message": "Kopírovat"
+ },
+ "copyToClipboard": {
+ "message": "Kopírovat do schránky"
+ },
+ "copyButton": {
+ "message": " Kopírovat "
+ },
+ "copyPrivateKey": {
+ "message": "Toto je váš privátní klíč (kliknutím zkopírujte)"
+ },
+ "create": {
+ "message": "Vytvořit"
+ },
+ "createAccount": {
+ "message": "Vytvořit účet"
+ },
+ "createDen": {
+ "message": "Vytvořit"
+ },
+ "crypto": {
+ "message": "Krypto",
+ "description": "Exchange type (cryptocurrencies)"
+ },
+ "currentConversion": {
+ "message": "Aktuální převod"
+ },
+ "currentNetwork": {
+ "message": "Aktuální síť"
+ },
+ "customGas": {
+ "message": "Nastavit palivo"
+ },
+ "customToken": {
+ "message": "Vlastní token"
+ },
+ "customize": {
+ "message": "Nastavit"
+ },
+ "customRPC": {
+ "message": "Vlastní RPC"
+ },
+ "decimalsMustZerotoTen": {
+ "message": "Desetinných míst musí být od 0 do 36."
+ },
+ "decimal": {
+ "message": "Počet desetinných míst přesnosti"
+ },
+ "defaultNetwork": {
+ "message": "Výchozí síť pro Etherové transakce je Main Net."
+ },
+ "denExplainer": {
+ "message": "Váš DEN je heslem šifrované uložiště v MetaMasku."
+ },
+ "deposit": {
+ "message": "Vklad"
+ },
+ "depositBTC": {
+ "message": "Vložte BTC na níže uvedenou adresu:"
+ },
+ "depositCoin": {
+ "message": "Vložte $1 na níže uvedenou adresu",
+ "description": "Tells the user what coin they have selected to deposit with shapeshift"
+ },
+ "depositEth": {
+ "message": "Vložit Eth"
+ },
+ "depositEther": {
+ "message": "Vložit Ether"
+ },
+ "depositFiat": {
+ "message": "Vklad s fiat měnou"
+ },
+ "depositFromAccount": {
+ "message": "Vložte z jiného účtu"
+ },
+ "depositShapeShift": {
+ "message": "Vklad přes ShapeShift"
+ },
+ "depositShapeShiftExplainer": {
+ "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": "Přímý vklad"
+ },
+ "directDepositEther": {
+ "message": "Vložit Ether přímo"
+ },
+ "directDepositEtherExplainer": {
+ "message": "Pokud už vlastníte nějaký Ether, nejrychleji ho dostanete do peněženky přímým vkladem."
+ },
+ "done": {
+ "message": "Hotovo"
+ },
+ "downloadStateLogs": {
+ "message": "Stáhnout stavové protokoly"
+ },
+ "dropped": {
+ "message": "Zrušeno"
+ },
+ "edit": {
+ "message": "Upravit"
+ },
+ "editAccountName": {
+ "message": "Upravit název účtu"
+ },
+ "emailUs": {
+ "message": "Napište nám e-mail!"
+ },
+ "encryptNewDen": {
+ "message": "Zašifrujte svůj nový DEN"
+ },
+ "enterPassword": {
+ "message": "Zadejte heslo"
+ },
+ "enterPasswordConfirm": {
+ "message": "Zadejte heslo k potvrzení"
+ },
+ "passwordNotLongEnough": {
+ "message": "Heslo není dost dlouhé"
+ },
+ "passwordsDontMatch": {
+ "message": "Hesla nejsou stejná"
+ },
+ "etherscanView": {
+ "message": "Prohlédněte si účet na Etherscan"
+ },
+ "exchangeRate": {
+ "message": "Směnný kurz"
+ },
+ "exportPrivateKey": {
+ "message": "Exportovat privátní klíč"
+ },
+ "exportPrivateKeyWarning": {
+ "message": "Exportujte privátní klíč na vlastní riziko."
+ },
+ "failed": {
+ "message": "Neúspěšné"
+ },
+ "fiat": {
+ "message": "FIAT",
+ "description": "Exchange type"
+ },
+ "fileImportFail": {
+ "message": "Import souboru nefunguje? Klikněte sem!",
+ "description": "Helps user import their account from a JSON file"
+ },
+ "followTwitter": {
+ "message": "Sledujte nás na Twitteru"
+ },
+ "from": {
+ "message": "Od"
+ },
+ "fromToSame": {
+ "message": "Adresy odesílatele a příjemce nemohou být stejné"
+ },
+ "fromShapeShift": {
+ "message": "Z ShapeShift"
+ },
+ "gas": {
+ "message": "Palivo",
+ "description": "Short indication of gas cost"
+ },
+ "gasFee": {
+ "message": "Poplatek za palivo"
+ },
+ "gasLimit": {
+ "message": "Limit paliva"
+ },
+ "gasLimitCalculation": {
+ "message": "Počítáme doporučený limit paliva na základě úspěšnosti v síti."
+ },
+ "gasLimitRequired": {
+ "message": "Limit paliva je povinný"
+ },
+ "gasLimitTooLow": {
+ "message": "Limit paliva musí být alespoň 21000"
+ },
+ "generatingSeed": {
+ "message": "Generuji klíčovou frázi..."
+ },
+ "gasPrice": {
+ "message": "Cena paliva (GWEI)"
+ },
+ "gasPriceCalculation": {
+ "message": "Počítáme doporučenou cenu paliva na základě úspěšnosti v síti."
+ },
+ "gasPriceRequired": {
+ "message": "Cena paliva je povinná"
+ },
+ "getEther": {
+ "message": "Získejte Ether"
+ },
+ "getEtherFromFaucet": {
+ "message": "Získejte Ether z faucetu za $1.",
+ "description": "Displays network name for Ether faucet"
+ },
+ "greaterThanMin": {
+ "message": "musí být větší nebo roven $1.",
+ "description": "helper for inputting hex as decimal input"
+ },
+ "here": {
+ "message": "zde",
+ "description": "as in -click here- for more information (goes with troubleTokenBalances)"
+ },
+ "hereList": {
+ "message": "Tady je seznam!!!!"
+ },
+ "hide": {
+ "message": "Skrýt"
+ },
+ "hideToken": {
+ "message": "Skrýt token"
+ },
+ "hideTokenPrompt": {
+ "message": "Skrýt token?"
+ },
+ "howToDeposit": {
+ "message": "Jakým způsobem chcete vložit Ether?"
+ },
+ "holdEther": {
+ "message": "Dovoluje vám držet ether a tokeny a slouží jako most k decentralizovaným aplikacím."
+ },
+ "import": {
+ "message": "Import",
+ "description": "Button to import an account from a selected file"
+ },
+ "importAccount": {
+ "message": "Import účtu"
+ },
+ "importAccountMsg": {
+ "message": "Importované účty nebudou spojeny s vaší původní MetaMaskovou klíčovou frází. Zjistěte více o importovaných účtech "
+ },
+ "importAnAccount": {
+ "message": "Import účtu"
+ },
+ "importDen": {
+ "message": "Import existujícího DEN"
+ },
+ "imported": {
+ "message": "Importováno",
+ "description": "status showing that an account has been fully loaded into the keyring"
+ },
+ "infoHelp": {
+ "message": "Informace a nápověda"
+ },
+ "insufficientFunds": {
+ "message": "Nedostatek finančních prostředků."
+ },
+ "insufficientTokens": {
+ "message": "Nedostatek tokenů."
+ },
+ "invalidAddress": {
+ "message": "Neplatná adresa"
+ },
+ "invalidAddressRecipient": {
+ "message": "Adresa příjemce je neplatná"
+ },
+ "invalidGasParams": {
+ "message": "Neplatná parametry paliva"
+ },
+ "invalidInput": {
+ "message": "Neplatný vstup."
+ },
+ "invalidRequest": {
+ "message": "Neplatný požadavek"
+ },
+ "invalidRPC": {
+ "message": "Neplatné RPC URI"
+ },
+ "jsonFail": {
+ "message": "Něco se pokazilo. Prosím, ujistěte se, že váš JSON soubor má správný formát."
+ },
+ "jsonFile": {
+ "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": "Kovan Test Network"
+ },
+ "knowledgeDataBase": {
+ "message": "Navštivte naši Knowledge Base"
+ },
+ "max": {
+ "message": "Max"
+ },
+ "learnMore": {
+ "message": "Zjistěte více."
+ },
+ "lessThanMax": {
+ "message": "musí být menší nebo roven $1.",
+ "description": "helper for inputting hex as decimal input"
+ },
+ "likeToAddTokens": {
+ "message": "Chcete přidat tyto tokeny?"
+ },
+ "links": {
+ "message": "Odkazy"
+ },
+ "limit": {
+ "message": "Limit"
+ },
+ "loading": {
+ "message": "Načítám..."
+ },
+ "loadingTokens": {
+ "message": "Načítám tokeny..."
+ },
+ "localhost": {
+ "message": "Localhost 8545"
+ },
+ "login": {
+ "message": "Přihlásit"
+ },
+ "logout": {
+ "message": "Odhlásit"
+ },
+ "loose": {
+ "message": "Nevázané"
+ },
+ "loweCaseWords": {
+ "message": "slova klíčové fráze mají pouze malá písmena"
+ },
+ "mainnet": {
+ "message": "Main Ethereum Network"
+ },
+ "message": {
+ "message": "Zpráva"
+ },
+ "metamaskDescription": {
+ "message": "MetaMask je bezpečný osobní trezor pro Ethereum."
+ },
+ "min": {
+ "message": "Minimum"
+ },
+ "myAccounts": {
+ "message": "Moje účty"
+ },
+ "mustSelectOne": {
+ "message": "Musíte zvolit aspoň 1 token."
+ },
+ "needEtherInWallet": {
+ "message": "Potřebujete Ether v peněžence, abyste mohli pomocí MetaMasku interagovat s decentralizovanými aplikacemi."
+ },
+ "needImportFile": {
+ "message": "Musíte zvolit soubor k importu.",
+ "description": "User is important an account and needs to add a file to continue"
+ },
+ "needImportPassword": {
+ "message": "Musíte zadat heslo pro zvolený soubor.",
+ "description": "Password and file needed to import an account"
+ },
+ "negativeETH": {
+ "message": "Nelze odeslat zápornou částku ETH."
+ },
+ "networks": {
+ "message": "Sítě"
+ },
+ "newAccount": {
+ "message": "Nový účet"
+ },
+ "newAccountNumberName": {
+ "message": "Účet $1",
+ "description": "Default name of next account to be created on create account screen"
+ },
+ "newContract": {
+ "message": "Nový kontrakt"
+ },
+ "newPassword": {
+ "message": "Nové heslo (min 8 znaků)"
+ },
+ "newRecipient": {
+ "message": "Nový příjemce"
+ },
+ "newRPC": {
+ "message": "Nová RPC URL"
+ },
+ "next": {
+ "message": "Další"
+ },
+ "noAddressForName": {
+ "message": "Pro toto jméno nebyla nastavena žádná adresa."
+ },
+ "noDeposits": {
+ "message": "Žádný vklad"
+ },
+ "noTransactionHistory": {
+ "message": "Žádná historie transakcí."
+ },
+ "noTransactions": {
+ "message": "Žádné transakce"
+ },
+ "notStarted": {
+ "message": "Nezačalo"
+ },
+ "oldUI": {
+ "message": "Staré rozhraní"
+ },
+ "oldUIMessage": {
+ "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": "nebo",
+ "description": "choice between creating or importing a new account"
+ },
+ "passwordCorrect": {
+ "message": "Ujistěte se, že je vaše heslo správně."
+ },
+ "passwordMismatch": {
+ "message": "hesla nesouhlasí",
+ "description": "in password creation process, the two new password fields did not match"
+ },
+ "passwordShort": {
+ "message": "heslo je krátké",
+ "description": "in password creation process, the password is not long enough to be secure"
+ },
+ "pastePrivateKey": {
+ "message": "Vložte zde svůj privátní klíč:",
+ "description": "For importing an account from a private key"
+ },
+ "pasteSeed": {
+ "message": "Svou klíčovou frázi vložte zde!"
+ },
+ "personalAddressDetected": {
+ "message": "Detekována osobní adresa. Zadejte adresu kontraktu tokenu."
+ },
+ "pleaseReviewTransaction": {
+ "message": "Zkontrolujte si transakci."
+ },
+ "popularTokens": {
+ "message": "Oblíbené tokeny"
+ },
+ "privacyMsg": {
+ "message": "Zásady ochrany osobních údajů"
+ },
+ "privateKey": {
+ "message": "Privátní klíč",
+ "description": "select this type of file to use to import an account"
+ },
+ "privateKeyWarning": {
+ "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": "Soukromá síť"
+ },
+ "qrCode": {
+ "message": "Ukázat QR kód"
+ },
+ "readdToken": {
+ "message": "Tento token můžete v budoucnu přidat zpět s „Přidat token“ v nastavení účtu."
+ },
+ "readMore": {
+ "message": "Přečtěte si více zde."
+ },
+ "readMore2": {
+ "message": "Přečtěte si více."
+ },
+ "receive": {
+ "message": "Obrdžet"
+ },
+ "recipientAddress": {
+ "message": "Adresa příjemce"
+ },
+ "refundAddress": {
+ "message": "Adresa pro vrácení peněz"
+ },
+ "rejected": {
+ "message": "Odmítnuto"
+ },
+ "resetAccount": {
+ "message": "Resetovat účet"
+ },
+ "restoreFromSeed": {
+ "message": "Obnovit z seed fráze"
+ },
+ "restoreVault": {
+ "message": "Obnovit trezor"
+ },
+ "required": {
+ "message": "Povinné"
+ },
+ "retryWithMoreGas": {
+ "message": "Opakujte s vyšší cenou paliva"
+ },
+ "walletSeed": {
+ "message": "Klíčová fráze peněženky"
+ },
+ "revealSeedWords": {
+ "message": "Zobrazit slova klíčové fráze"
+ },
+ "revealSeedWordsWarning": {
+ "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": "Zvrátit"
+ },
+ "rinkeby": {
+ "message": "Rinkeby Test Network"
+ },
+ "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": "Např. můj nový účet",
+ "description": "Help user understand concept of adding a human-readable name to their account"
+ },
+ "save": {
+ "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": "Uložit do souboru",
+ "description": "Account export process"
+ },
+ "saveSeedAsFile": {
+ "message": "Uložit slova klíčové fráze do souboru"
+ },
+ "search": {
+ "message": "Hledat"
+ },
+ "secretPhrase": {
+ "message": "Zadejte svých 12 slov tajné fráze k obnovení trezoru."
+ },
+ "newPassword8Chars": {
+ "message": "Nové heslo (min 8 znaků)"
+ },
+ "seedPhraseReq": {
+ "message": "klíčové fráze mají 12 slov"
+ },
+ "select": {
+ "message": "Vybrat"
+ },
+ "selectCurrency": {
+ "message": "Vybrat měnu"
+ },
+ "selectService": {
+ "message": "Vybrat službu"
+ },
+ "selectType": {
+ "message": "Vybrat typ"
+ },
+ "send": {
+ "message": "Odeslat"
+ },
+ "sendETH": {
+ "message": "Odeslat ETH"
+ },
+ "sendTokens": {
+ "message": "Odeslat tokeny"
+ },
+ "onlySendToEtherAddress": {
+ "message": "Posílejte jen ETH na Ethereum adresu."
+ },
+ "searchTokens": {
+ "message": "Hledat tokeny"
+ },
+ "sendTokensAnywhere": {
+ "message": "Posílejte tokeny komukoli s Ethereum účtem"
+ },
+ "settings": {
+ "message": "Nastavení"
+ },
+ "info": {
+ "message": "Informace"
+ },
+ "shapeshiftBuy": {
+ "message": "Nakoupit na ShapeShift"
+ },
+ "showPrivateKeys": {
+ "message": "Zobrazit privátní klíče"
+ },
+ "showQRCode": {
+ "message": "Zobrazit QR kód"
+ },
+ "sign": {
+ "message": "Podepsat"
+ },
+ "signed": {
+ "message": "Podepsáno"
+ },
+ "signMessage": {
+ "message": "Podepsat zprávu"
+ },
+ "signNotice": {
+ "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": "Požadavek podpisu"
+ },
+ "sigRequested": {
+ "message": "Požádáno o podpis"
+ },
+ "spaceBetween": {
+ "message": "mezi slovy může být pouze mezera"
+ },
+ "status": {
+ "message": "Stav"
+ },
+ "stateLogs": {
+ "message": "Stavové protokoly"
+ },
+ "stateLogsDescription": {
+ "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": "Odeslat"
+ },
+ "submitted": {
+ "message": "Odesláno"
+ },
+ "supportCenter": {
+ "message": "Navštivte naše centrum podpory"
+ },
+ "symbolBetweenZeroTwelve": {
+ "message": "Symbol musí být mezi 0 a 12 znaky."
+ },
+ "takesTooLong": {
+ "message": "Trvá to dlouho?"
+ },
+ "terms": {
+ "message": "Podmínky použití"
+ },
+ "testFaucet": {
+ "message": "Testovací faucet"
+ },
+ "to": {
+ "message": "Komu"
+ },
+ "toETHviaShapeShift": {
+ "message": "$1 na ETH přes ShapeShift",
+ "description": "system will fill in deposit type in start of message"
+ },
+ "tokenAddress": {
+ "message": "Adresa tokenu"
+ },
+ "tokenAlreadyAdded": {
+ "message": "Token byl už přidán."
+ },
+ "tokenBalance": {
+ "message": "Váš zůstatek tokenu je:"
+ },
+ "tokenSelection": {
+ "message": "Vyhledejte token nebo je vyberte z našeho seznamu oblíbených tokenů."
+ },
+ "tokenSymbol": {
+ "message": "Symbol tokenu"
+ },
+ "tokenWarning1": {
+ "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": "Celkem"
+ },
+ "transactions": {
+ "message": "transakce"
+ },
+ "transactionError": {
+ "message": "Chyba transakce. Vyhozena výjimka v kódu kontraktu."
+ },
+ "transactionMemo": {
+ "message": "Poznámka transakce (nepovinné)"
+ },
+ "transactionNumber": {
+ "message": "Číslo transakce"
+ },
+ "transfers": {
+ "message": "Převody"
+ },
+ "troubleTokenBalances": {
+ "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": "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": "Zadejte své heslo"
+ },
+ "uiWelcome": {
+ "message": "Vítejte v novém rozhraní (Beta)"
+ },
+ "uiWelcomeMessage": {
+ "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": "Nedostupné"
+ },
+ "unknown": {
+ "message": "Neznámé"
+ },
+ "unknownNetwork": {
+ "message": "Neznámá soukromá síť"
+ },
+ "unknownNetworkId": {
+ "message": "Neznámé ID sítě"
+ },
+ "uriErrorMsg": {
+ "message": "URI vyžadují korektní HTTP/HTTPS prefix."
+ },
+ "usaOnly": {
+ "message": "jen v USA",
+ "description": "Using this exchange is limited to people inside the USA"
+ },
+ "usedByClients": {
+ "message": "Používána různými klienty"
+ },
+ "useOldUI": {
+ "message": "Použijte staré rozhraní"
+ },
+ "validFileImport": {
+ "message": "Musíte vybrat validní soubor k importu."
+ },
+ "vaultCreated": {
+ "message": "Trezor vytvořen"
+ },
+ "viewAccount": {
+ "message": "Zobrazit účet"
+ },
+ "visitWebSite": {
+ "message": "Navštivte naši stránku"
+ },
+ "warning": {
+ "message": "Varování"
+ },
+ "welcomeBeta": {
+ "message": "Vítejte v MetaMask Beta"
+ },
+ "whatsThis": {
+ "message": "Co to je?"
+ },
+ "yourSigRequested": {
+ "message": "Je vyžadován váš podpis"
+ },
+ "youSign": {
+ "message": "Podepisujete"
+ }
+}
diff --git a/app/_locales/sl/messages.json b/app/_locales/sl/messages.json
index 41abfa4de..2f3616dee 100644
--- a/app/_locales/sl/messages.json
+++ b/app/_locales/sl/messages.json
@@ -1,138 +1,222 @@
{
"privacyMode": {
- "message": "Režim súkromia"
+ "message": "Zasebnostni način"
},
"privacyModeDescription": {
- "message": "Webové stránky musia požiadať o prístup k zobrazeniu informácií o vašom účte."
+ "message": "Spletne strani morajo zahtevati dovoljenje za ogled podatkov o vašem računu."
+ },
+ "privacyNotice": {
+ "message": "Obvestilo o zasebnosti"
},
"exposeAccounts": {
- "message": "Vystavte účty"
+ "message": "Razkrij račune"
},
"exposeDescription": {
- "message": "Vystavte účty na aktuální webové stránky. Užitečné pro starší dappy."
+ "message": "Razkrij račune trenutni spletni strani. Priporočeno za starejše dApps."
},
"confirmExpose": {
- "message": "Opravdu chcete své účty vystavit na stávajícím webu?"
+ "message": "Ste prepričani da želite razkriti račune trenutni spletni strani?"
},
"confirmClear": {
- "message": "Naozaj chcete vymazať schválené webové stránky?"
+ "message": "Ste prepričani da želite počistiti odobrene spletne strani?"
+ },
+ "contractInteraction": {
+ "message": "Interakcija s pogodbo"
},
"clearApprovalDataSuccess": {
- "message": "Schválené údaje webových stránek byly úspěšně zrušeny."
+ "message": "Odobrene spletne strani uspešno počiščene."
},
"approvalData": {
- "message": "Údaje o schválení"
+ "message": "Podatki o odobritvi"
},
"approvalDataDescription": {
- "message": "Vymažte schválené údaje webových stránek, aby všechny weby znovu požádaly o schválení."
+ "message": "Počistite seznam odobrenih spletnih strani, tako da bodo morale ponovno zahtevati odobritev."
},
"clearApprovalData": {
- "message": "Jasné údaje o schválení"
- },
- "approve": {
- "message": "Schválit"
- },
- "reject": {
- "message": "Odmítnout"
+ "message": "Počisti podatke o odobritvi"
},
"providerAPIRequest": {
- "message": "Požadavek API Ethereum"
+ "message": "Zahteva za Ethereum API"
},
"reviewProviderRequest": {
- "message": "Přečtěte si prosím tuto žádost API Ethereum."
+ "message": "Preglejte zahtevo za Ethereum API."
},
"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ě."
+ "message": "Domena zahteva dostop do verige blokov in ogled vašega računa. Pred potrditvjo vedno preverite ali ste na želeni spletni strani."
},
"accept": {
- "message": "Přijmout"
+ "message": "Potrdi"
+ },
+ "acceleratingATransaction": {
+ "message": "* Pospešitev transakcije z višjo gas ceno poveča njene možnosti za hitrejšo obdelavo v omrežju, vendar ni vedno zagotovljena."
+ },
+ "accessingYourCamera": {
+ "message": "Dostopanje do vaše kamere ..."
},
"account": {
- "message": "Účet"
+ "message": "Račun"
},
"accountDetails": {
- "message": "Detaily účtu"
+ "message": "Podrobnosti računa"
},
"accountName": {
- "message": "Název účtu"
+ "message": "Ime računa"
+ },
+ "accountOptions": {
+ "message": "Možnosti računa"
+ },
+ "accountSelectionRequired": {
+ "message": "Izbrati morate račun!"
+ },
+ "activityLog": {
+ "message": "dnevnik dejavnosti"
},
"address": {
- "message": "Adresa"
+ "message": "Naslov"
+ },
+ "advancedOptions": {
+ "message": "Napredne možnosti"
},
"addCustomToken": {
- "message": "Přidat vlastní token"
+ "message": "Dodaj žeton po meri"
},
"addToken": {
- "message": "Přidat token"
+ "message": "Dodaj žeton"
},
"addTokens": {
- "message": "Přidat tokeny"
+ "message": "Dodaj žetone"
+ },
+ "addSuggestedTokens": {
+ "message": "Dodaj priporočene žetone"
+ },
+ "addAcquiredTokens": {
+ "message": "Dodaj žetone pridobljene z MetaMask"
+ },
+ "advanced": {
+ "message": "Napredno"
},
"amount": {
- "message": "Částka"
+ "message": "Znesek"
},
"amountPlusGas": {
- "message": "Částka + palivo"
+ "message": "Znesek + Gas"
+ },
+ "amountPlusTxFee": {
+ "message": "Znesek + TX Fee"
},
"appDescription": {
- "message": "Ethereum rozšíření prohlížeče",
+ "message": "Denarnica za Ethereum v brskalniku",
"description": "The description of the application"
},
"appName": {
"message": "MetaMask",
"description": "The name of the application"
},
+ "approve": {
+ "message": "Potrdi"
+ },
"approved": {
- "message": "Schváleno"
+ "message": "Potrjeno"
},
"attemptingConnect": {
- "message": "Pokouším se připojit k blockchainu."
+ "message": "Povezovanje z verigo blokov ..."
+ },
+ "attemptToCancel": {
+ "message": "Želite preklicati?"
+ },
+ "attemptToCancelDescription": {
+ "message": "Če pošljete ta poskus, ne boste zagotovili, da bo vaša prvotna transakcija preklicana. Če bo poskus preklica uspešen, se bo zaračunala zgornja transakcija."
},
"attributions": {
- "message": "Zásluhy"
+ "message": "Dodelitve"
},
"available": {
- "message": "Dostupné"
+ "message": "Na voljo"
+ },
+ "average": {
+ "message": "Povprečje"
},
"back": {
- "message": "Zpět"
+ "message": "Nazaj"
+ },
+ "backupPhraseConfirmation": {
+ "message": "Potrdite vašo tajno varnostno kopijo"
+ },
+ "backupPhraseSelect": {
+ "message": "Izberite vsako besedo, da se prepričate, da je pravilna."
+ },
+ "backupPhraseReveal": {
+ "message": "Kliknite tukaj, da razkrijete skrivne besede"
+ },
+ "backupPhraseTitle": {
+ "message": "Skrivna rezervna fraza"
+ },
+ "backupPhraseInfo": {
+ "message": "Vaša skrivna rezervna fraza omogoča preprosto varnostno kopiranje in obnovitev računa."
+ },
+ "backupPhraseWarning": {
+ "message": "OPOZORILO: Nikoli ne razkrijte varnostne fraze. Vsakdo s to frazo lahko vzame vaš Ether za vedno."
+ },
+ "backupPhraseTip1": {
+ "message": "Shranite to frazo v upravitelja gesel, na primer 1Password."
+ },
+ "backupPhraseTip2": {
+ "message": "Ta stavek napišite na list papirja in ga shranite na varno mesto. Če želite še več varnosti, jo zapišite na več listov papirja in shranite na od 2 do 3 različnih mestih."
+ },
+ "backupPhraseTip3": {
+ "message": "Zapomnite si to frazo."
+ },
+ "backupPhraseDownload": {
+ "message": "Prenesite varnostno kopijo"
+ },
+ "backupPhraseStore": {
+ "message": "in jo shranite na zunanji šifrirani trdi disk ali medij za shranjevanje."
},
"balance": {
- "message": "Zůstatek:"
+ "message": "Znesek"
},
"balances": {
- "message": "Zůstatek tokenu"
+ "message": "Znesek žetonov"
},
"balanceIsInsufficientGas": {
- "message": "Nedostatek prostředků pro aktuální množství paliva"
+ "message": "Nezadnosten znesek za trenutni gas"
+ },
+ "basic": {
+ "message": "Osnovno"
},
"beta": {
"message": "BETA"
},
"betweenMinAndMax": {
- "message": "musí být větší nebo roven $1 a menší nebo roven $2.",
+ "message": "mora biti večji ali enak $1 in manjši ali enak $1.",
"description": "helper for inputting hex as decimal input"
},
"blockiesIdenticon": {
- "message": "Použít Blockies Identicon"
+ "message": "Uporabi identifikacijo Blockies"
},
"borrowDharma": {
- "message": "Pújčit si přes Dharma (Beta)"
+ "message": "Izposoja z Dharma (Beta)"
+ },
+ "browserNotSupported": {
+ "message": "Vaš brskalnik ni podptrt ..."
},
"builtInCalifornia": {
- "message": "MetaMask je navržen a vytvořen v Kalifornii."
+ "message": "MetaMask je zasnovan in ustvarjen v Kaliforniji."
},
"buy": {
- "message": "Koupit"
+ "message": "Kupi"
},
"buyCoinbase": {
- "message": "Nákup na Coinbase"
+ "message": "Kupi na Coinbase"
},
"buyCoinbaseExplainer": {
- "message": "Coinbase je světově nejoblíbenější místo k nákupu a prodeji bitcoinu, etherea nebo litecoinu."
+ "message": "Coinbase je najpopularnejši načun za kupovanje in prodajo bitcoinov, ethereuma, in litecoina."
+ },
+ "bytes": {
+ "message": "Bajti"
},
"ok": {
- "message": "Ok"
+ "message": "V redu"
},
"buyCoinSwitch": {
"message": "Kupi na CoinSwitch"
@@ -141,826 +225,1334 @@
"message": "CoinSwitch je destinacija na enem mestu za izmenjavo več kot 300 kriptokotovitev po najboljši hitrosti."
},
"cancel": {
- "message": "Zrušit"
+ "message": "Prekliči"
+ },
+ "cancelAttempt": {
+ "message": "Prekliči poskus"
+ },
+ "cancellationGasFee": {
+ "message": "Preklicani znesek gas"
+ },
+ "cancelled": {
+ "message": "Preklicano"
+ },
+ "cancelN": {
+ "message": "Prekliči vseh $1 transakcij"
},
"classicInterface": {
- "message": "Použít klasické rozhraní"
+ "message": "Uporabi klasični vmesnik"
},
"clickCopy": {
- "message": "Kliknutím zkopírovat"
+ "message": "Kliknite za kopiranje"
+ },
+ "clickToAdd": {
+ "message": "Kliknite na $1 za dodajo v vaš račun"
+ },
+ "close": {
+ "message": "Zapri"
+ },
+ "chromeRequiredForHardwareWallets": {
+ "message": "Za uporabo strojne denarnice potrebujete Google Chrome."
},
"confirm": {
- "message": "Potvrdit"
+ "message": "Potrdi"
+ },
+ "confirmationTime": {
+ "message": "Čas potrditve (sec)"
},
"confirmed": {
- "message": "Potvrzeno"
+ "message": "Potrjeno"
},
"confirmContract": {
- "message": "Potvrdit kontrakt"
+ "message": "Potrdi pogodbo"
},
"confirmPassword": {
- "message": "Potvrdit heslo"
+ "message": "Potrdi geslo"
},
"confirmTransaction": {
- "message": "Potvrdit transakci"
+ "message": "Potrdi transakcijo"
+ },
+ "connectHardwareWallet": {
+ "message": "Poveži strojno denarnico"
+ },
+ "connect": {
+ "message": "Poveži"
+ },
+ "connecting": {
+ "message": "Povezovanje ..."
+ },
+ "connectingTo": {
+ "message": "Povezovanje na $1"
+ },
+ "connectingToKovan": {
+ "message": "Povezovanje na testno omrežje Kovan"
+ },
+ "connectingToMainnet": {
+ "message": "Povezovanje na glavno omrežje"
+ },
+ "connectingToRopsten": {
+ "message": "Povezovanje na testno omrežje Ropsten"
+ },
+ "connectingToRinkeby": {
+ "message": "Povezovanje na testno omrežje Rinkeby"
+ },
+ "connectingToUnknown": {
+ "message": "Povezovanje na neznano omrežje"
+ },
+ "connectToLedger": {
+ "message": "Poveži z Ledger"
+ },
+ "connectToTrezor": {
+ "message": "Poveži z Trezor"
},
"continue": {
- "message": "Pokračovat"
+ "message": "Nadaljuj"
},
"continueToCoinbase": {
- "message": "Přejít na Coinbase"
+ "message": "Nadaljuj na Coinbase"
},
"continueToCoinSwitch": {
"message": "Nadaljuj na CoinSwitch"
},
"contractDeployment": {
- "message": "Nasazení kontraktu"
+ "message": "Ustvarjanje pogodbe"
},
"conversionProgress": {
- "message": "Provádí se převod"
+ "message": "Pretvorba v teku"
},
"copiedButton": {
- "message": "Zkopírováno"
+ "message": "Kopirano"
},
"copiedClipboard": {
- "message": "Zkopírováno do schránky"
+ "message": "Kopirano v odložišče!"
},
"copiedExclamation": {
- "message": "Zkopírováno!"
+ "message": "Kopirano!"
},
"copiedSafe": {
- "message": "Zkopíroval jsem to na bezpečné místo"
+ "message": "Prilepil sem ga na varno"
},
"copy": {
- "message": "Kopírovat"
+ "message": "Kopiraj"
+ },
+ "copyAddress": {
+ "message": "Kopiraj naslov v odložišče"
},
"copyToClipboard": {
- "message": "Kopírovat do schránky"
+ "message": "Kopiraj v odložišče"
},
"copyButton": {
- "message": " Kopírovat "
+ "message": " Kopiraj "
},
"copyPrivateKey": {
- "message": "Toto je váš privátní klíč (kliknutím zkopírujte)"
+ "message": "To je vaš zesebni ključ (kliknite za kopiranje)"
},
"create": {
- "message": "Vytvořit"
+ "message": "Ustvari"
},
"createAccount": {
- "message": "Vytvořit účet"
+ "message": "Ustvari račun"
},
"createDen": {
- "message": "Vytvořit"
+ "message": "Ustvari"
+ },
+ "createPassword": {
+ "message": "Ustvari geslo"
},
"crypto": {
- "message": "Krypto",
+ "message": "Kripto",
"description": "Exchange type (cryptocurrencies)"
},
"currentConversion": {
- "message": "Aktuální převod"
+ "message": "Trenutna pretvorba"
+ },
+ "currentLanguage": {
+ "message": "Trenutni jezik"
},
"currentNetwork": {
- "message": "Aktuální síť"
+ "message": "Trenutno omrežje"
+ },
+ "currentRpc": {
+ "message": "Trenutni RPC"
},
"customGas": {
- "message": "Nastavit palivo"
+ "message": "Prilagodi gas"
+ },
+ "customGasSubTitle": {
+ "message": "Povečanje lahko skrajša čas obdelave, vendar ni zagotovljeno."
},
"customToken": {
- "message": "Vlastní token"
+ "message": "Žeton po meri"
},
"customize": {
- "message": "Nastavit"
+ "message": "Prilagodi"
},
"customRPC": {
- "message": "Vlastní RPC"
+ "message": "RPC po meri"
},
"decimalsMustZerotoTen": {
- "message": "Desetinných míst musí být od 0 do 36."
+ "message": "Decimalk mora biti med 0 in 36."
},
"decimal": {
- "message": "Počet desetinných míst přesnosti"
+ "message": "Decimalna natančnost"
},
"defaultNetwork": {
- "message": "Výchozí síť pro Etherové transakce je Main Net."
+ "message": "Privzeto omrežje za transkacije je glavno omrežje."
},
"denExplainer": {
- "message": "Váš DEN je heslem šifrované uložiště v MetaMasku."
+ "message": "Vaš DEN je z geslom šifrirana shramba v MetaMask."
},
"deposit": {
- "message": "Vklad"
+ "message": "Vplačaj"
},
"depositBTC": {
- "message": "Vložte BTC na níže uvedenou adresu:"
+ "message": "Vplačajte vaš BTC na spodnji naslov:"
},
"depositCoin": {
- "message": "Vložte $1 na níže uvedenou adresu",
+ "message": "Vplačajte vaš $1 na spodnji naslov",
"description": "Tells the user what coin they have selected to deposit with shapeshift"
},
"depositEth": {
- "message": "Vložit Eth"
+ "message": "Vplačilo ETH"
},
"depositEther": {
- "message": "Vložit Ether"
+ "message": "Vplačilo ethra"
},
"depositFiat": {
- "message": "Vklad s fiat měnou"
+ "message": "Vplačilo s klasičnimi valutami"
},
"depositFromAccount": {
- "message": "Vložte z jiného účtu"
+ "message": "Vplačilo iz drugega računa"
},
"depositShapeShift": {
- "message": "Vklad přes ShapeShift"
+ "message": "Vplačilo z ShapeShift"
},
"depositShapeShiftExplainer": {
- "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."
+ "message": "Če imate druge kriptovalute, lahko Ether vplačate neposredno v MetaMask. Brez računov."
},
"details": {
"message": "Podrobnosti"
},
"directDeposit": {
- "message": "Přímý vklad"
+ "message": "Neposredno vplačilo"
},
"directDepositEther": {
- "message": "Vložit Ether přímo"
+ "message": "Neposredno vplačilo ehera"
},
"directDepositEtherExplainer": {
- "message": "Pokud už vlastníte nějaký Ether, nejrychleji ho dostanete do peněženky přímým vkladem."
+ "message": "Če že imate Ether, ga lahko najhitreje dobite v MetaMask z neposrednim vplačilom."
},
"done": {
- "message": "Hotovo"
+ "message": "Končano"
+ },
+ "downloadGoogleChrome": {
+ "message": "Prenesi Google Chrome"
},
"downloadStateLogs": {
- "message": "Stáhnout stavové protokoly"
+ "message": "Prenesi dnevnike state"
+ },
+ "dontHaveAHardwareWallet": {
+ "message": "Nimate strojne denarnice?"
},
"dropped": {
- "message": "Zrušeno"
+ "message": "Izpusti"
},
"edit": {
- "message": "Upravit"
+ "message": "Uredi"
},
"editAccountName": {
- "message": "Upravit název účtu"
+ "message": "Uredi ime računa"
+ },
+ "editingTransaction": {
+ "message": "Uredite transakcijo"
},
"emailUs": {
- "message": "Napište nám e-mail!"
+ "message": "Pišite nam!"
},
"encryptNewDen": {
- "message": "Zašifrujte svůj nový DEN"
+ "message": "Šifrirajte vaš DEN"
+ },
+ "ensNameNotFound": {
+ "message": "Ime ENS ni najdeno"
},
"enterPassword": {
- "message": "Zadejte heslo"
+ "message": "Vnesite geslo"
},
"enterPasswordConfirm": {
- "message": "Zadejte heslo k potvrzení"
+ "message": "Potrdite geslo"
},
- "passwordNotLongEnough": {
- "message": "Heslo není dost dlouhé"
+ "enterPasswordContinue": {
+ "message": "Za nadaljevanje vnesite geslo"
},
- "passwordsDontMatch": {
- "message": "Hesla nejsou stejná"
+ "eth": {
+ "message": "ETH"
},
"etherscanView": {
- "message": "Prohlédněte si účet na Etherscan"
+ "message": "Poglej račun na Etherscan"
+ },
+ "estimatedProcessingTimes": {
+ "message": "Predviden čas obdelave"
},
"exchangeRate": {
- "message": "Směnný kurz"
+ "message": "Menjalni tečaj"
+ },
+ "expandView": {
+ "message": "Razširi pogled"
},
"exportPrivateKey": {
- "message": "Exportovat privátní klíč"
+ "message": "Izvozi zasebni ključ"
},
"exportPrivateKeyWarning": {
- "message": "Exportujte privátní klíč na vlastní riziko."
+ "message": "Izvoz zasebnega ključa na lastno odgovornost."
},
"failed": {
- "message": "Neúspěšné"
+ "message": "Ni uspelo"
+ },
+ "fast": {
+ "message": "Hiter"
+ },
+ "faster": {
+ "message": "Hitrejši"
+ },
+ "fastest": {
+ "message": "Najhitrejši"
+ },
+ "feeChartTitle": {
+ "message": "Live Transaction Fee Predictions"
},
"fiat": {
- "message": "FIAT",
+ "message": "Klasične",
"description": "Exchange type"
},
"fileImportFail": {
- "message": "Import souboru nefunguje? Klikněte sem!",
+ "message": "Uvoz z datoteko ne deluje? Kliknite tukaj!",
"description": "Helps user import their account from a JSON file"
},
"followTwitter": {
- "message": "Sledujte nás na Twitteru"
+ "message": "Sledite nam na Twitterju"
+ },
+ "forgetDevice": {
+ "message": "Pozabi to napravo"
},
"from": {
"message": "Od"
},
"fromToSame": {
- "message": "Adresy odesílatele a příjemce nemohou být stejné"
+ "message": "Naslova pošiljatelja in prejemnika ne smeta biti enaka"
},
"fromShapeShift": {
- "message": "Z ShapeShift"
+ "message": "Od ShapeShift"
+ },
+ "functionType": {
+ "message": "Vrsta funkcije"
},
"gas": {
- "message": "Palivo",
+ "message": "Gas",
"description": "Short indication of gas cost"
},
"gasFee": {
- "message": "Poplatek za palivo"
+ "message": "Gas Fee"
},
"gasLimit": {
- "message": "Limit paliva"
+ "message": "Gas Limit"
},
"gasLimitCalculation": {
- "message": "Počítáme doporučený limit paliva na základě úspěšnosti v síti."
+ "message": "Priporočen gas limit je izračunan glede na omrežje."
},
"gasLimitRequired": {
- "message": "Limit paliva je povinný"
+ "message": "Gas limit je zahtevan"
},
"gasLimitTooLow": {
- "message": "Limit paliva musí být alespoň 21000"
+ "message": "Gas limit mora biti vsaj 21000"
+ },
+ "gasUsed": {
+ "message": "Uporabljen gas"
},
"generatingSeed": {
- "message": "Generuji klíčovou frázi..."
+ "message": "Ustvarjenje seed ..."
},
"gasPrice": {
- "message": "Cena paliva (GWEI)"
+ "message": "Gas price (GWEI)"
+ },
+ "gasPriceExtremelyLow": {
+ "message": "Gas Price zelo nizkek"
+ },
+ "gasPriceNoDenom": {
+ "message": "Gas price"
},
"gasPriceCalculation": {
- "message": "Počítáme doporučenou cenu paliva na základě úspěšnosti v síti."
+ "message": "Priporočen gas price je izračunan glede na omrežje."
},
"gasPriceRequired": {
- "message": "Cena paliva je povinná"
+ "message": "Gas price je zahtevan"
+ },
+ "generatingTransaction": {
+ "message": "Ustvarjanje transakcije"
},
"getEther": {
- "message": "Získejte Ether"
+ "message": "Pridobi Ether"
},
"getEtherFromFaucet": {
- "message": "Získejte Ether z faucetu za $1.",
+ "message": "Pridobite Ether iz fauceta za $1",
"description": "Displays network name for Ether faucet"
},
+ "getHelp": {
+ "message": "Get Help."
+ },
"greaterThanMin": {
- "message": "musí být větší nebo roven $1.",
+ "message": "mora biti večji ali enak $1.",
"description": "helper for inputting hex as decimal input"
},
+ "hardware": {
+ "message": "strojna"
+ },
+ "hardwareWalletConnected": {
+ "message": "Strojna denarnica povezana"
+ },
+ "hardwareWallets": {
+ "message": "Poveži strojno denarnico"
+ },
+ "hardwareWalletsMsg": {
+ "message": "Izberite vrsto strojne denarnice"
+ },
+ "havingTroubleConnecting": {
+ "message": "Imate težave?"
+ },
"here": {
- "message": "zde",
+ "message": "tukaj",
"description": "as in -click here- for more information (goes with troubleTokenBalances)"
},
"hereList": {
- "message": "Tady je seznam!!!!"
+ "message": "Tukaj je seznam!!!!"
+ },
+ "hexData": {
+ "message": "Hex Data"
},
"hide": {
- "message": "Skrýt"
+ "message": "Skrij"
},
"hideToken": {
- "message": "Skrýt token"
+ "message": "Skrij žeton"
},
"hideTokenPrompt": {
- "message": "Skrýt token?"
+ "message": "Skrijem žeton?"
+ },
+ "history": {
+ "message": "Zgodovina"
},
"howToDeposit": {
- "message": "Jakým způsobem chcete vložit Ether?"
+ "message": "Kako želite vplačati Ether?"
},
"holdEther": {
- "message": "Dovoluje vám držet ether a tokeny a slouží jako most k decentralizovaným aplikacím."
+ "message": "Omogoča vam shranjevanje ethra in žetonov ter povezovanje decentraliziranih aplikacij."
},
"import": {
- "message": "Import",
+ "message": "Uvoz",
"description": "Button to import an account from a selected file"
},
"importAccount": {
- "message": "Import účtu"
+ "message": "Uvoz računa"
},
"importAccountMsg": {
- "message": "Importované účty nebudou spojeny s vaší původní MetaMaskovou klíčovou frází. Zjistěte více o importovaných účtech "
+ "message": " Uvoženi računa ne bodo povezani s prvotnim seed phase. Preberite več o uvoženih računih "
},
"importAnAccount": {
- "message": "Import účtu"
+ "message": "IUvozi račun"
},
"importDen": {
- "message": "Import existujícího DEN"
+ "message": "Uvozi DEN"
},
"imported": {
- "message": "Importováno",
+ "message": "Uvoženo",
"description": "status showing that an account has been fully loaded into the keyring"
},
+ "importUsingSeed": {
+ "message": "Uvozi z seed phase"
+ },
+ "info": {
+ "message": "Info"
+ },
"infoHelp": {
- "message": "Informace a nápověda"
+ "message": "Info & Pomoč"
+ },
+ "initialTransactionConfirmed": {
+ "message": "Vaša prvotna transakcija je bila potrjena. Pritisnite V redu in se vrnite nazaj."
+ },
+ "insufficientBalance": {
+ "message": "Nezadostno ravnovesje."
},
"insufficientFunds": {
- "message": "Nedostatek finančních prostředků."
+ "message": "Nezadostna sredstva."
},
"insufficientTokens": {
- "message": "Nedostatek tokenů."
+ "message": "Nezadostni žetoni."
},
"invalidAddress": {
- "message": "Neplatná adresa"
+ "message": "Neveljaven naslov"
},
"invalidAddressRecipient": {
- "message": "Adresa příjemce je neplatná"
+ "message": "Neveljaven nasklov prejemnika"
},
"invalidGasParams": {
- "message": "Neplatná parametry paliva"
+ "message": "Neveljavne gas nastavitve"
},
"invalidInput": {
- "message": "Neplatný vstup."
+ "message": "Neveljaven vnos."
},
"invalidRequest": {
- "message": "Neplatný požadavek"
+ "message": "Neveljavna zahteva"
},
"invalidRPC": {
- "message": "Neplatné RPC URI"
+ "message": "Neveljaven RPC URL"
+ },
+ "invalidSeedPhrase": {
+ "message": "Neveljavna seed phrase"
},
"jsonFail": {
- "message": "Něco se pokazilo. Prosím, ujistěte se, že váš JSON soubor má správný formát."
+ "message": "Nekaj je bilo narobe. Prepričajte se, da je datoteka JSON pravilno oblikovana."
},
"jsonFile": {
- "message": "JSON soubor",
+ "message": "Datoteka JSON",
"description": "format for importing an account"
},
"keepTrackTokens": {
- "message": "Udržujte si záznamy o tokenech, které jste koupili s účtem v MetaMasku."
+ "message": "Sledite žetonom, ki ste jih pridobili z MetaMask."
},
"kovan": {
- "message": "Kovan Test Network"
+ "message": "Testno omrežje Kovan"
},
"knowledgeDataBase": {
- "message": "Navštivte naši Knowledge Base"
+ "message": "Obiščite našo pomoč"
},
"max": {
"message": "Max"
},
"learnMore": {
- "message": "Zjistěte více."
+ "message": "Preberite več"
+ },
+ "ledgerAccountRestriction": {
+ "message": "Za dodajanje novega računa morate uporabiti zadnji račun."
},
"lessThanMax": {
- "message": "musí být menší nebo roven $1.",
+ "message": "mora biti manjši ali enak $1.",
"description": "helper for inputting hex as decimal input"
},
"likeToAddTokens": {
- "message": "Chcete přidat tyto tokeny?"
+ "message": "Želite dodati te žetone?"
},
"links": {
- "message": "Odkazy"
+ "message": "Povezave"
},
"limit": {
- "message": "Limit"
+ "message": "Meja"
+ },
+ "liveGasPricePredictions": {
+ "message": "Napovedi o gas price"
},
"loading": {
- "message": "Načítám..."
+ "message": "Nalaganje ..."
},
"loadingTokens": {
- "message": "Načítám tokeny..."
+ "message": "Nalaganje žetonov ..."
},
"localhost": {
"message": "Localhost 8545"
},
"login": {
- "message": "Přihlásit"
+ "message": "Prijava"
},
"logout": {
- "message": "Odhlásit"
+ "message": "Odjava"
},
"loose": {
- "message": "Nevázané"
+ "message": "Loose"
},
"loweCaseWords": {
- "message": "slova klíčové fráze mají pouze malá písmena"
+ "message": "seed words lahko vsebujejo samo male črke"
},
"mainnet": {
- "message": "Main Ethereum Network"
+ "message": "Glavno omrežje"
+ },
+ "menu": {
+ "message": "Meni"
},
"message": {
- "message": "Zpráva"
+ "message": "Sporočilo"
},
"metamaskDescription": {
- "message": "MetaMask je bezpečný osobní trezor pro Ethereum."
+ "message": "MetaMask je varen identitetni sklad za Ethereum."
+ },
+ "metamaskSeedWords": {
+ "message": "Seed Words"
+ },
+ "metamaskVersion": {
+ "message": "Različica"
},
"min": {
- "message": "Minimum"
+ "message": "Najmanj"
+ },
+ "missingYourTokens": {
+ "message": "Ne vidite vaših žetonov?"
+ },
+ "minutesShorthand": {
+ "message": "Min"
},
"myAccounts": {
- "message": "Moje účty"
+ "message": "Moji računi"
},
"mustSelectOne": {
- "message": "Musíte zvolit aspoň 1 token."
+ "message": "Izbran mora biti vsaj 1 žeton."
},
"needEtherInWallet": {
- "message": "Potřebujete Ether v peněžence, abyste mohli pomocí MetaMasku interagovat s decentralizovanými aplikacemi."
+ "message": "Za interakcijo z decentraliziranimi aplikacijami boste v svoji denarnici potrebovali Eter."
},
"needImportFile": {
- "message": "Musíte zvolit soubor k importu.",
+ "message": "Za uvoz morate izbrati datoteko.",
"description": "User is important an account and needs to add a file to continue"
},
"needImportPassword": {
- "message": "Musíte zadat heslo pro zvolený soubor.",
+ "message": "Za izbrano datoteko morate vnesti geslo.",
"description": "Password and file needed to import an account"
},
"negativeETH": {
- "message": "Nelze odeslat zápornou částku ETH."
+ "message": "Negativnih zneskov ETH ni mogoče poslati."
},
"networks": {
- "message": "Sítě"
+ "message": "Omrežja"
+ },
+ "nevermind": {
+ "message": "Pozabi"
},
"newAccount": {
- "message": "Nový účet"
+ "message": "Nov račun"
},
"newAccountNumberName": {
- "message": "Účet $1",
+ "message": "Račun $1",
"description": "Default name of next account to be created on create account screen"
},
"newContract": {
- "message": "Nový kontrakt"
+ "message": "Nova pogodba"
},
"newPassword": {
- "message": "Nové heslo (min 8 znaků)"
+ "message": "Novo geslo (min 8 znakov)"
+ },
+ "newPassword8Chars": {
+ "message": "Novo geslo (min 8 znakov)"
},
"newRecipient": {
- "message": "Nový příjemce"
+ "message": "Nov prejemnik"
+ },
+ "newNetwork": {
+ "message": "Novo omrežje"
+ },
+ "rpcURL": {
+ "message": "Nov RPC URL"
+ },
+ "showAdvancedOptions": {
+ "message": "Pokaži napredne možnosti"
+ },
+ "hideAdvancedOptions": {
+ "message": "Skrij napredne možnosti"
},
- "newRPC": {
- "message": "Nová RPC URL"
+ "optionalChainId": {
+ "message": "ChainID (nezahtevano)"
+ },
+ "optionalSymbol": {
+ "message": "Simbol (nezahtevano)"
+ },
+ "optionalNickname": {
+ "message": "Ime (nezahtevano)"
+ },
+ "newTotal": {
+ "message": "Novo skupno"
+ },
+ "newTransactionFee": {
+ "message": "Nova provizija za transakcije"
},
"next": {
- "message": "Další"
+ "message": "Naprej"
},
"noAddressForName": {
- "message": "Pro toto jméno nebyla nastavena žádná adresa."
+ "message": "Za to ime ni naslovov."
},
"noDeposits": {
- "message": "Žádný vklad"
+ "message": "Prejetih ni nič vplačil"
+ },
+ "noConversionRateAvailable": {
+ "message": "Menjalni tečaj ni na voljo"
},
"noTransactionHistory": {
- "message": "Žádná historie transakcí."
+ "message": "Ni zgodovine transakcij."
},
"noTransactions": {
- "message": "Žádné transakce"
+ "message": "Nimate transakcij"
+ },
+ "notFound": {
+ "message": "Ni najdeno"
},
"notStarted": {
- "message": "Nezačalo"
+ "message": "Ni začeto"
+ },
+ "noWebcamFoundTitle": {
+ "message": "Spletna kamera ni najdena"
+ },
+ "noWebcamFound": {
+ "message": "Spletna kamera ni najdena. Poskusite znova kasneje."
},
"oldUI": {
- "message": "Staré rozhraní"
+ "message": "Star UI"
},
"oldUIMessage": {
- "message": "Vrátili jste se ke starému rozhraní. Můžete přepnout na nové rozhraní v nastavení v pravém horním menu."
+ "message": "Vrnili ste se v star uporabniški vmesnik. V novega se lahko vrnete z možnostjo v spustnem meniju v zgornjem desnem kotu."
+ },
+ "onlySendToEtherAddress": {
+ "message": "Na Ethereum naslov pošljute samo ETH."
+ },
+ "onlySendTokensToAccountAddress": {
+ "message": "Na Ethereum naslov pošljute samo $1.",
+ "description": "displays token symbol"
+ },
+ "openInTab": {
+ "message": "Odpri v zavihku"
},
"or": {
- "message": "nebo",
+ "message": "ali",
"description": "choice between creating or importing a new account"
},
+ "orderOneHere": {
+ "message": "Naročite Trezor ali Ledger i n zavarujte svoje premoženje s strojno denarnico"
+ },
+ "origin": {
+ "message": "Izvor"
+ },
+ "outgoing": {
+ "message": "Odhodni"
+ },
+ "parameters": {
+ "message": "Parametri"
+ },
+ "originalTotal": {
+ "message": "Izvirna vsota"
+ },
+ "password": {
+ "message": "Geslo"
+ },
"passwordCorrect": {
- "message": "Ujistěte se, že je vaše heslo správně."
+ "message": "Prepričajte se, da je geslo pravilno."
+ },
+ "passwordsDontMatch": {
+ "message": "Gesli se ne ujemata"
},
"passwordMismatch": {
- "message": "hesla nesouhlasí",
+ "message": "gesli se ne ujemata",
"description": "in password creation process, the two new password fields did not match"
},
+ "passwordNotLongEnough": {
+ "message": "Geslo ni dovolj dolgo"
+ },
"passwordShort": {
- "message": "heslo je krátké",
+ "message": "geslo ni dovolj dolgo",
"description": "in password creation process, the password is not long enough to be secure"
},
"pastePrivateKey": {
- "message": "Vložte zde svůj privátní klíč:",
+ "message": "Tukaj prilepite vaš zasebni ključ:",
"description": "For importing an account from a private key"
},
"pasteSeed": {
- "message": "Svou klíčovou frázi vložte zde!"
+ "message": "Tukaj prilepite seed phase!"
+ },
+ "pending": {
+ "message": "v obdelavi"
},
"personalAddressDetected": {
- "message": "Detekována osobní adresa. Zadejte adresu kontraktu tokenu."
+ "message": "Zaznan je osebni naslov. Vnesite naslov pogodbe žetona."
+ },
+ "phishingWarning": {
+ "message": "Opozorilo o lažnem predstavljanju"
},
"pleaseReviewTransaction": {
- "message": "Zkontrolujte si transakci."
+ "message": "Preglejte vašo transakcijo."
},
"popularTokens": {
- "message": "Oblíbené tokeny"
+ "message": "Priljubljeni žetoni"
+ },
+ "prev": {
+ "message": "Prej"
+ },
+ "primaryCurrencySetting": {
+ "message": "Glavna valuta"
+ },
+ "primaryCurrencySettingDescription": {
+ "message": "Izberite Native za prikaz vrednosti v privzeti valuti verige (npr. ETH). Izberite Klasične za prikaz vrednosti v izbrani klasični valuti."
},
"privacyMsg": {
- "message": "Zásady ochrany osobních údajů"
+ "message": "Zasebnost"
},
"privateKey": {
- "message": "Privátní klíč",
+ "message": "Zasebni lljuč",
"description": "select this type of file to use to import an account"
},
"privateKeyWarning": {
- "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."
+ "message": "Opozorilo: Nikoli ne razkrijte tega ključa. Kdorkoli lahko z njim ukrade vse vaše premoženje v računu."
},
"privateNetwork": {
- "message": "Soukromá síť"
+ "message": "Zasebno omrežje"
},
"qrCode": {
- "message": "Ukázat QR kód"
+ "message": "Prikaži QR kodo"
+ },
+ "queue": {
+ "message": "Čakalna vrsta"
},
"readdToken": {
- "message": "Tento token můžete v budoucnu přidat zpět s „Přidat token“ v nastavení účtu."
+ "message": "Ta žeton lahko dodate tudi kasneje z uporabo gumba “Dodaj žeton” v možnostih vašega računa."
},
"readMore": {
- "message": "Přečtěte si více zde."
+ "message": "Tukaj preberite več."
},
"readMore2": {
- "message": "Přečtěte si více."
+ "message": "Preberite več."
},
"receive": {
- "message": "Obrdžet"
+ "message": "Prejmi"
},
"recipientAddress": {
- "message": "Adresa příjemce"
+ "message": "Prejemnikov naslov"
},
"refundAddress": {
- "message": "Adresa pro vrácení peněz"
+ "message": "Naslov za vračilo."
+ },
+ "reject": {
+ "message": "Zavrni"
+ },
+ "rejectAll": {
+ "message": "Zavrni vse"
+ },
+ "rejectTxsN": {
+ "message": "Zavrni $1 transakcij"
+ },
+ "rejectTxsDescription": {
+ "message": "Zavrnili boste $1 transakcij."
},
"rejected": {
- "message": "Odmítnuto"
+ "message": "Zavrnjeno"
+ },
+ "reset": {
+ "message": "Ponastavi"
},
"resetAccount": {
- "message": "Resetovat účet"
+ "message": "Ponastavi račun"
+ },
+ "resetAccountDescription": {
+ "message": "Ponastavljanje računa bo izbrisalo zgodovino transakcij."
},
"restoreFromSeed": {
- "message": "Obnovit z seed fráze"
+ "message": "Obnovim račun?"
},
"restoreVault": {
- "message": "Obnovit trezor"
+ "message": "Obnovi shrambo"
+ },
+ "restoreAccountWithSeed": {
+ "message": "Obnovi račun z seed phrase"
},
"required": {
- "message": "Povinné"
+ "message": "Zahtevano"
},
"retryWithMoreGas": {
- "message": "Opakujte s vyšší cenou paliva"
+ "message": "Poskusite z večjim gas price"
},
- "walletSeed": {
- "message": "Klíčová fráze peněženky"
+ "restore": {
+ "message": "Obnovi"
},
"revealSeedWords": {
- "message": "Zobrazit slova klíčové fráze"
+ "message": "Razkrij seed words"
+ },
+ "revealSeedWordsTitle": {
+ "message": "Seed Phrase"
+ },
+ "revealSeedWordsDescription": {
+ "message": "Če želite zamenjati brskalnik ali računalnik, potrebujete vaš seed phase za dostop do računa. Shranite ga na varno skrito mesto."
+ },
+ "revealSeedWordsWarningTitle": {
+ "message": "Tega ne delite z nikomer!"
},
"revealSeedWordsWarning": {
- "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ů."
+ "message": "S temi besedami lahko kdorkoli ukrade vse vaše račune."
},
"revert": {
- "message": "Zvrátit"
+ "message": "Obnovi"
},
- "rinkeby": {
- "message": "Rinkeby Test Network"
+ "remove": {
+ "message": "izbriši"
},
- "ropsten": {
- "message": "Ropsten Test Network"
+ "removeAccount": {
+ "message": "Izbriši račun"
},
- "currentRpc": {
- "message": "Současné RPC"
+ "removeAccountDescription": {
+ "message": "Ta račun bo izbrisan. Prepričajte se, da imate seed phase ali zasebni ključ tega računa, da ga boste lahko kasneje obnovili. "
},
- "connectingToMainnet": {
- "message": "Připojuji se k Main Ethereum Network"
+ "readyToConnect": {
+ "message": "Pripravljeni na povezovanje?"
},
- "connectingToRopsten": {
- "message": "Připojuji se k Ropsten Test Network"
- },
- "connectingToKovan": {
- "message": "Připojuji se k Kovan Test Network"
+ "rinkeby": {
+ "message": "Testno omrežje Rinkeby"
},
- "connectingToRinkeby": {
- "message": "Připojuji se k Rinkeby Test Network"
+ "ropsten": {
+ "message": "Testno omrežje Ropsten"
},
- "connectingToUnknown": {
- "message": "Připojuji se k neznámé síti"
+ "rpc": {
+ "message": "RPC po meri"
},
"sampleAccountName": {
- "message": "Např. můj nový účet",
+ "message": "npr. Moj račun",
"description": "Help user understand concept of adding a human-readable name to their account"
},
"save": {
- "message": "Uložit"
+ "message": "Shrani"
+ },
+ "slow": {
+ "message": "Počasen"
},
- "reprice_title": {
- "message": "Změnit cenu transakce"
+ "slower": {
+ "message": "Počasnejši"
},
- "reprice_subtitle": {
- "message": "Navyšte cenu paliva ve snaze k přepsání a urychlení vyší transakce"
+ "saveAsCsvFile": {
+ "message": "Shrani kot CSV datoteko"
},
"saveAsFile": {
- "message": "Uložit do souboru",
+ "message": "Shrani kot datoteko",
"description": "Account export process"
},
"saveSeedAsFile": {
- "message": "Uložit slova klíčové fráze do souboru"
+ "message": "Shrani seed words kot datoteko"
+ },
+ "scanInstructions": {
+ "message": "Postavite QR kodo pred vašo kamero"
+ },
+ "scanQrCode": {
+ "message": "Skeniraj QR kodo"
},
"search": {
- "message": "Hledat"
+ "message": "Iskanje"
+ },
+ "searchResults": {
+ "message": "Rezultati iskanja"
},
"secretPhrase": {
- "message": "Zadejte svých 12 slov tajné fráze k obnovení trezoru."
+ "message": "Vnesite vaših dvanajst besed za obnovitev vaših računov."
},
- "newPassword8Chars": {
- "message": "Nové heslo (min 8 znaků)"
+ "secondsShorthand": {
+ "message": "Sec"
},
"seedPhraseReq": {
- "message": "klíčové fráze mají 12 slov"
+ "message": "Seed phrase mora biti dolg 12 besed"
},
+ "seedPhraseAlert": {
+ "message": "Opozorilo o seed phrase"
+ },
"select": {
- "message": "Vybrat"
+ "message": "Izberi"
},
"selectCurrency": {
- "message": "Vybrat měnu"
+ "message": "Izberi valuto"
+ },
+ "selectLocale": {
+ "message": "Izberi jezik"
},
"selectService": {
- "message": "Vybrat službu"
+ "message": "Izberi storitev"
},
"selectType": {
- "message": "Vybrat typ"
+ "message": "Izberi vrsto"
},
"send": {
- "message": "Odeslat"
+ "message": "Pošlji"
+ },
+ "sendAmount": {
+ "message": "Pošlji znesek"
},
"sendETH": {
- "message": "Odeslat ETH"
+ "message": "Pošlji ETH"
},
"sendTokens": {
- "message": "Odeslat tokeny"
+ "message": "Pošlji žetone"
},
- "onlySendToEtherAddress": {
- "message": "Posílejte jen ETH na Ethereum adresu."
+ "sentEther": {
+ "message": "poslani ether"
+ },
+ "sentTokens": {
+ "message": "poslani žetoni"
+ },
+ "separateEachWord": {
+ "message": "Vsako besedo ločite z enim presledkom"
},
"searchTokens": {
- "message": "Hledat tokeny"
+ "message": "Iskanje žetonov"
+ },
+ "selectAnAddress": {
+ "message": "Izberi naslov"
+ },
+ "selectAnAccount": {
+ "message": "Izberi račun"
+ },
+ "selectAnAccountHelp": {
+ "message": "Izberi račun za prikaz v MetaMask"
+ },
+ "selectAHigherGasFee": {
+ "message": "Izberite višji gas fee, da pospešite obdelavo vaše transakcije.*"
+ },
+ "selectHdPath": {
+ "message": "Izberi HD Path"
+ },
+ "selectPathHelp": {
+ "message": "Če obstoječih Ledger ne vidite, poskusite izbrati \"Legacy (MEW / MyCrypto)\""
},
"sendTokensAnywhere": {
- "message": "Posílejte tokeny komukoli s Ethereum účtem"
+ "message": "Pošljite žetone komurkoli z Ethereum naslovom"
},
"settings": {
- "message": "Nastavení"
- },
- "info": {
- "message": "Informace"
+ "message": "Nastavitve"
},
"shapeshiftBuy": {
- "message": "Nakoupit na ShapeShift"
+ "message": "Kupi z Shapeshift"
},
"showPrivateKeys": {
- "message": "Zobrazit privátní klíče"
+ "message": "Pokaži zasebni ključ"
},
"showQRCode": {
- "message": "Zobrazit QR kód"
+ "message": "Pokaži QR kodo"
+ },
+ "showHexData": {
+ "message": "Pokaži Hex Data"
+ },
+ "showHexDataDescription": {
+ "message": "Izberite za prikaz hex podatkov na zaslonu za pošiljanje"
},
"sign": {
- "message": "Podepsat"
+ "message": "Podpiši"
+ },
+ "signatureRequest": {
+ "message": "Zahteva za podpis"
},
"signed": {
- "message": "Podepsáno"
+ "message": "Podpisano"
},
"signMessage": {
- "message": "Podepsat zprávu"
+ "message": "Podpiši sporočilo"
},
"signNotice": {
- "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. "
+ "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. "
},
"sigRequest": {
- "message": "Požadavek podpisu"
+ "message": "Zahteva za podpis"
},
"sigRequested": {
- "message": "Požádáno o podpis"
+ "message": "Podpis zahtevan"
+ },
+ "somethingWentWrong": {
+ "message": "Oops! Nekaj je šlo narobe."
},
"spaceBetween": {
- "message": "mezi slovy může být pouze mezera"
+ "message": "med besedami je lahko samo presledek"
+ },
+ "speedUp": {
+ "message": "pospeši"
+ },
+ "speedUpTitle": {
+ "message": "Pospeši transakcijo"
+ },
+ "speedUpSubtitle": {
+ "message": "Povečajte gas prise za pospešitev transakcije"
+ },
+ "speedUpCancellation": {
+ "message": "Pospešite preklic"
+ },
+ "speedUpTransaction": {
+ "message": "Pospešite transakcijo"
+ },
+ "switchNetworks": {
+ "message": "Preklop omrežja"
},
"status": {
- "message": "Stav"
+ "message": "Status"
},
"stateLogs": {
- "message": "Stavové protokoly"
+ "message": "State dnevniki"
},
"stateLogsDescription": {
- "message": "Stavové protokoly obsahují vaše veřejné adresy účtů a odeslané transakce."
+ "message": "State vsebujejo vaš javni nasklov in zgodovino transakcij."
},
"stateLogError": {
- "message": "Chyba během získávání stavových protokolů."
+ "message": "Napaka pri pridobivanju state dnevnikov."
+ },
+ "step1HardwareWallet": {
+ "message": "1. Povežite strojno denarnico"
+ },
+ "step1HardwareWalletMsg": {
+ "message": "Z računalnikom povežite strojno denarnico."
+ },
+ "step2HardwareWallet": {
+ "message": "2. Izberite račun"
+ },
+ "step2HardwareWalletMsg": {
+ "message": "Izberite račun, ki ga želute uporabiti. Trenutno lahko izberete le en račun na enkrat."
+ },
+ "step3HardwareWallet": {
+ "message": "3. Začnite uporabljati dApps in več!"
+ },
+ "step3HardwareWalletMsg": {
+ "message": "Uporabite strojno denarnico kot katerikoli drug Ethereum račun. Prijavite se v dApps, pošljite Ether in ERC20 žetone in žetone kot CryptoKitties."
},
"submit": {
- "message": "Odeslat"
+ "message": "Potrdi"
},
"submitted": {
- "message": "Odesláno"
+ "message": "Potrjeno"
},
"supportCenter": {
- "message": "Navštivte naše centrum podpory"
+ "message": "Obiščite naše središče za podporo"
},
- "symbolBetweenZeroTen": {
- "message": "Symbol musí být mezi 0 a 10 znaky."
+ "symbolBetweenZeroTwelve": {
+ "message": "Simbol mora imeti med 0 in 12 znakov."
},
"takesTooLong": {
- "message": "Trvá to dlouho?"
+ "message": "Trava predolgo?"
},
"terms": {
- "message": "Podmínky použití"
+ "message": "Pogoji uporabe"
},
"testFaucet": {
- "message": "Testovací faucet"
+ "message": "Testni faucet"
+ },
+ "tips": {
+ "message": "Nasveti"
},
"to": {
- "message": "Komu"
+ "message": "Za"
},
"toETHviaShapeShift": {
- "message": "$1 na ETH přes ShapeShift",
+ "message": "$1 v ETH prek ShapeShift",
"description": "system will fill in deposit type in start of message"
},
+ "token": {
+ "message": "Žeton"
+ },
"tokenAddress": {
- "message": "Adresa tokenu"
+ "message": "Naslov žetona"
},
"tokenAlreadyAdded": {
- "message": "Token byl už přidán."
+ "message": "Žeton je bil že dodan."
},
"tokenBalance": {
- "message": "Váš zůstatek tokenu je:"
+ "message": "Vaš znesek žetonov je:"
},
"tokenSelection": {
- "message": "Vyhledejte token nebo je vyberte z našeho seznamu oblíbených tokenů."
+ "message": "Iščite žetone ali pa jih izberite iz seznama priljubljenih."
},
"tokenSymbol": {
- "message": "Symbol tokenu"
+ "message": "Simbol žetona"
},
"tokenWarning1": {
- "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í."
+ "message": "Sledite žetonom, ki ste jih kupili z MetaMask metamask računom. Če ste jih kupili drugje, ne bodo prikazani tukaj."
},
"total": {
- "message": "Celkem"
+ "message": "Skupno"
+ },
+ "transaction": {
+ "message": "transakcija"
+ },
+ "transactionConfirmed": {
+ "message": "Transakcija potrjena na $2."
+ },
+ "transactionCreated": {
+ "message": "Transakcija z vrednostjo $1 ustvarjena na $2."
+ },
+ "transactionWithNonce": {
+ "message": "Transakcija $1"
+ },
+ "transactionDropped": {
+ "message": "Transakcija na $2 preklicana."
+ },
+ "transactionSubmitted": {
+ "message": "Transakcija z gas fee $1 oddana na $2."
+ },
+ "transactionResubmitted": {
+ "message": "Transakcija ponovno oddana s povečanim gas fee $1 na $2"
+ },
+ "transactionUpdated": {
+ "message": "Transakcija na $2 spremenjena."
+ },
+ "transactionUpdatedGas": {
+ "message": "Transakcija spremenjena z gas price $1 na $2."
+ },
+ "transactionErrored": {
+ "message": "Napaka pri transakciji."
+ },
+ "transactionCancelAttempted": {
+ "message": "Preklic transakcije je bil opravljen z gas fee v višini $1 na $2"
+ },
+ "transactionCancelSuccess": {
+ "message": "Transakcija je bila uspešno preklicana na $2"
},
"transactions": {
- "message": "transakce"
+ "message": "transakcije"
},
"transactionError": {
- "message": "Chyba transakce. Vyhozena výjimka v kódu kontraktu."
+ "message": "Napaka pri transakciji. Izjema sprožena v kodi pogodbe."
+ },
+ "transactionErrorNoContract": {
+ "message": "Poskus klica funkcije na naslovu, ki ni pogodba."
+ },
+ "transactionFee": {
+ "message": "Transakcijska provizija"
},
"transactionMemo": {
- "message": "Poznámka transakce (nepovinné)"
+ "message": "Opomba transakcije (nezahtevano)"
},
"transactionNumber": {
- "message": "Číslo transakce"
+ "message": "Številka transakcije"
+ },
+ "transactionTime": {
+ "message": "Transakcijski čas"
+ },
+ "transfer": {
+ "message": "Prenesi"
+ },
+ "transferFrom": {
+ "message": "Prenesi od"
},
"transfers": {
- "message": "Převody"
+ "message": "Prenosi"
+ },
+ "trezorHardwareWallet": {
+ "message": "Strojna denarnica TREZOR"
},
"troubleTokenBalances": {
- "message": "Měli jsme problém s načtením vašich tokenových zůstatků. Můžete je vidět ",
+ "message": "Če imate težave pri ogledu zneskov žetonov si jih lahko ogledate ",
"description": "Followed by a link (here) to view token balances"
},
+ "tryAgain": {
+ "message": "Poskusi znova"
+ },
"twelveWords": {
- "message": "Těchto 12 slov je jedinou možností, jak obnovit MetaMask účet. \nUložte je na bezpečné a neveřejné místo."
+ "message": "Edini način za obnovitev MetaMask računa, je teh 12 besed.\nShranite jih na varno in skrivno mesto."
},
"typePassword": {
- "message": "Zadejte své heslo"
+ "message": "Vnesite vaše MetaMask geslo"
},
"uiWelcome": {
- "message": "Vítejte v novém rozhraní (Beta)"
+ "message": "Dobrodošli v nov UI (Beta)"
},
"uiWelcomeMessage": {
- "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."
+ "message": "Uporabljate nov uporabniški vmesnik."
},
"unapproved": {
- "message": "Neschváleno"
+ "message": "Neodobreno"
},
"unavailable": {
- "message": "Nedostupné"
+ "message": "Ni na voljo"
+ },
+ "units": {
+ "message": "enote"
+ },
+ "uniqueImageTitle": {
+ "message": "Vaša edinstvena slika računa"
+ },
+ "uniqueImageBodyText1": {
+ "message": "Ta slika je bila programsko ustvarjena z vašo novo številko računa."
+ },
+ "uniqueImageBodyText2": {
+ "message": "To sliko boste videli vsakič, ko boste morali potrditi transakcijo."
},
"unknown": {
- "message": "Neznámé"
+ "message": "Neznano"
+ },
+ "unknownFunction": {
+ "message": "Neznana funkcija"
},
"unknownNetwork": {
- "message": "Neznámá soukromá síť"
+ "message": "Neznano zasebno omrežje"
},
"unknownNetworkId": {
- "message": "Neznámé ID sítě"
+ "message": "Neznan ID omrežja"
+ },
+ "unknownQrCode": {
+ "message": "Napaka: Te QR kode ni bilo mogoče prepoznati"
+ },
+ "unknownCameraErrorTitle": {
+ "message": "Ooops! Nekaj je šlo narobe ...."
+ },
+ "unknownCameraError": {
+ "message": "Pri dostopanju do vaše kamere je prišlo do napake. Poskusite znova kasneje ..."
+ },
+ "unlock": {
+ "message": "Odkleni"
+ },
+ "unlockMessage": {
+ "message": "Decentralizirana spletna denarnica"
+ },
+ "updatedWithDate": {
+ "message": "Posodobljeno $1"
},
"uriErrorMsg": {
- "message": "URI vyžadují korektní HTTP/HTTPS prefix."
+ "message": "URI zahtevajo ustrezno HTTP/HTTPS predpono."
},
"usaOnly": {
- "message": "jen v USA",
+ "message": "Samo za ZDA",
"description": "Using this exchange is limited to people inside the USA"
},
"usedByClients": {
- "message": "Používána různými klienty"
+ "message": "Uporabljen s strani večih različnih odjemalcev"
},
"useOldUI": {
- "message": "Použijte staré rozhraní"
+ "message": "Uporabi star UI"
},
"validFileImport": {
- "message": "Musíte vybrat validní soubor k importu."
+ "message": "Za uvoz morate izbrati pravilno datoteko."
},
"vaultCreated": {
- "message": "Trezor vytvořen"
+ "message": "Račun je ustvarjen"
},
"viewAccount": {
- "message": "Zobrazit účet"
+ "message": "Poglej račun"
+ },
+ "viewOnEtherscan": {
+ "message": "Poglej na Etherscan"
},
"visitWebSite": {
- "message": "Navštivte naši stránku"
+ "message": "Obiščite našo spletno stran"
+ },
+ "walletSeed": {
+ "message": "Wallet Seed"
},
"warning": {
- "message": "Varování"
+ "message": "Opozorilo"
},
- "welcomeBeta": {
- "message": "Vítejte v MetaMask Beta"
+ "welcomeBack": {
+ "message": "Dobrodošli nazaj!"
+ },
+ "welcome": {
+ "message": "Dobrodošli v MetaMask"
},
"whatsThis": {
- "message": "Co to je?"
+ "message": "Kaj je to?"
+ },
+ "yesLetsTry": {
+ "message": "Pa poskusimo"
+ },
+ "youNeedToAllowCameraAccess": {
+ "message": "Za uporabo te funkcije boste potrebovali dostop do kamere."
},
"yourSigRequested": {
- "message": "Je vyžadován váš podpis"
+ "message": "Zahtevan je bil vaš podpis"
},
"youSign": {
- "message": "Podepisujete"
+ "message": "Podpisali boste"
+ },
+ "yourPrivateSeedPhrase": {
+ "message": "Vaš zasebni seed phrase"
+ },
+ "zeroGasPriceOnSpeedUpError": {
+ "message":"Ničelni gas price na pospešitvi"
}
-} \ No newline at end of file
+}
diff --git a/app/_locales/th/messages.json b/app/_locales/th/messages.json
index a7af72ee7..d851d325f 100644
--- a/app/_locales/th/messages.json
+++ b/app/_locales/th/messages.json
@@ -750,8 +750,8 @@
"supportCenter": {
"message": "ไปที่ศูนย์สนับสนุนของเรา"
},
- "symbolBetweenZeroTen": {
- "message": "สัญลักษณ์ต้องมีความยาวตั้งแต่ 0 ถึง 10 อักขระ"
+ "symbolBetweenZeroTwelve": {
+ "message": "สัญลักษณ์ต้องมีความยาวตั้งแต่ 0 ถึง 12 อักขระ"
},
"takesTooLong": {
"message": "ใช้เวลานานเกินไปใช่หรือไม่?"
@@ -858,7 +858,7 @@
"warning": {
"message": "คำเตือน"
},
- "welcomeBeta": {
+ "welcome": {
"message": "ยินดีต้อนรับสู่ MetaMask เบต้า"
},
"whatsThis": {
diff --git a/app/_locales/tml/messages.json b/app/_locales/tml/messages.json
index 1a7f76588..e1ef45138 100644
--- a/app/_locales/tml/messages.json
+++ b/app/_locales/tml/messages.json
@@ -837,8 +837,8 @@
"supportCenter": {
"message": "எங்கள் ஆதரவு மையத்தைப் பார்வையிடவும்"
},
- "symbolBetweenZeroTen": {
- "message": "குறியீடு 0 மற்றும் 10 எழுத்துகளுக்கு இடையில் இருக்க வேண்டும்."
+ "symbolBetweenZeroTwelve": {
+ "message": "குறியீடு 0 மற்றும் 12 எழுத்துகளுக்கு இடையில் இருக்க வேண்டும்."
},
"takesTooLong": {
"message": "நீண்ட நேரம் எடுத்துக்கொள்கிறது?"
@@ -951,7 +951,7 @@
"warning": {
"message": "எச்சரிக்கை"
},
- "welcomeBeta": {
+ "welcome": {
"message": "மெட்டாமாஸ்க் பீட்டாவுக்கு வருக"
},
"whatsThis": {
diff --git a/app/_locales/tr/messages.json b/app/_locales/tr/messages.json
index 1e51d84c4..bcf96dece 100644
--- a/app/_locales/tr/messages.json
+++ b/app/_locales/tr/messages.json
@@ -837,8 +837,8 @@
"supportCenter": {
"message": "Destek merkezimizi ziyaret edin"
},
- "symbolBetweenZeroTen": {
- "message": "Sembol 0 ve 10 karakter aralığında olmalıdır."
+ "symbolBetweenZeroTwelve": {
+ "message": "Sembol 0 ve 12 karakter aralığında olmalıdır."
},
"takesTooLong": {
"message": "Çok mu uzun sürüyor?"
@@ -951,8 +951,8 @@
"warning": {
"message": "Uyarı"
},
- "welcomeBeta": {
- "message": "MetaMask Beta'ya Hoşgeldiniz"
+ "welcome": {
+ "message": "MetaMask'ya Hoşgeldiniz"
},
"whatsThis": {
"message": "Bu nedir?"
diff --git a/app/_locales/zh_CN/messages.json b/app/_locales/zh_CN/messages.json
index 5425d60da..0d3727703 100644
--- a/app/_locales/zh_CN/messages.json
+++ b/app/_locales/zh_CN/messages.json
@@ -873,8 +873,8 @@
"supportCenter": {
"message": "访问我们的支持中心"
},
- "symbolBetweenZeroTen": {
- "message": "符号应该有0-10个字符."
+ "symbolBetweenZeroTwelve": {
+ "message": "符号应该有0-12个字符."
},
"takesTooLong": {
"message": "花费太长时间?"
@@ -987,7 +987,7 @@
"warning": {
"message": "警告"
},
- "welcomeBeta": {
+ "welcome": {
"message": "欢迎使用 MetaMask 测试版"
},
"whatsThis": {
diff --git a/app/_locales/zh_TW/messages.json b/app/_locales/zh_TW/messages.json
index 9424b6ded..c645f2af1 100644
--- a/app/_locales/zh_TW/messages.json
+++ b/app/_locales/zh_TW/messages.json
@@ -3,28 +3,31 @@
"message": "隱私模式"
},
"privacyModeDescription": {
- "message": "網站必須請求訪問權限才能查看您的帳戶信息。"
+ "message": "網站必須請求訪問權限才能查看您的帳戶資訊"
},
"exposeAccounts": {
"message": "公開賬戶"
},
"exposeDescription": {
- "message": "將帳戶公開給當前網站。對傳統dapps很有用。"
+ "message": "將帳戶公開給當前網站。對傳統去中心化應用服務很有用。"
},
"confirmExpose": {
"message": "您確定要將帳戶公開到當前網站嗎?"
},
"confirmClear": {
- "message": "您確定要清除已批准的網站嗎?"
+ "message": "您確定要清除已批准的網站紀錄?"
+ },
+ "contractInteraction": {
+ "message": "合約互動"
},
"clearApprovalDataSuccess": {
- "message": "已批准的網站數據已成功清除。"
+ "message": "已批准的網站紀錄已成功清除。"
},
"approvalData": {
- "message": "審批數據"
+ "message": "審核紀錄"
},
"approvalDataDescription": {
- "message": "清除已批准的網站數據,以便所有網站都必須再次申請"
+ "message": "清除之前已批准過的網站審核紀錄,所有網站都必須再次申請"
},
"clearApprovalData": {
"message": "清除批准數據"
@@ -35,18 +38,27 @@
"reject": {
"message": "拒絕"
},
+ "providerRequest": {
+ "message": "$1 請求訪問帳戶權限"
+ },
+ "providerRequestInfo": {
+ "message": "此網站希望能讀取您的帳戶資訊。請務必確認您信任這個網站、並了解後續可能的交易行為。"
+ },
"providerAPIRequest": {
- "message": "Web3 API請求"
+ "message": "Web3 API 請求"
},
"reviewProviderRequest": {
"message": "請查看此Ethereum API請求。"
},
- "providerRequestInfo": {
- "message": "下面列出的域正在嘗試請求訪問Ethereum API,以便它可以與以太坊區塊鏈進行交互。在批准Ethereum訪問之前,請務必仔細檢查您是否在正確的站點上。"
- },
"accept": {
"message": "接受"
},
+ "acceleratingATransaction": {
+ "message": "* 提高交易費 Gas 價格將可加速處理時間,但不保證會有顯著效果"
+ },
+ "accessingYourCamera": {
+ "message": "正在存取您的攝影鏡頭..."
+ },
"account": {
"message": "帳戶"
},
@@ -56,8 +68,20 @@
"accountName": {
"message": "帳戶名稱"
},
+ "accountOptions": {
+ "message": "帳戶"
+ },
+ "accountSelectionRequired": {
+ "message": "必須先選擇一個帳戶!"
+ },
+ "activityLog": {
+ "message": "活動紀錄"
+ },
"address": {
- "message": "帳戶地址"
+ "message": "帳戶位址"
+ },
+ "advancedOptions": {
+ "message": "進階選項"
},
"addCustomToken": {
"message": "加入自訂代幣"
@@ -66,13 +90,25 @@
"message": "加入代幣"
},
"addTokens": {
- "message": "加入多筆代幣"
+ "message": "加入代幣"
+ },
+ "addSuggestedTokens": {
+ "message": "加入建議的代幣"
+ },
+ "addAcquiredTokens": {
+ "message": "將您已經擁有的代幣顯示於 MetaMask"
+ },
+ "advanced": {
+ "message": "進階"
},
"amount": {
- "message": "數額"
+ "message": "數量"
},
"amountPlusGas": {
- "message": "數額 + Gas"
+ "message": "數量 + Gas"
+ },
+ "amountPlusTxFee": {
+ "message": "數量 + 交易費"
},
"appDescription": {
"message": "乙太坊瀏覽器擴充插件",
@@ -83,29 +119,44 @@
"description": "The name of the application"
},
"approved": {
- "message": "已同意"
+ "message": "已批准"
},
"attemptingConnect": {
"message": "正在嘗試連接區塊鏈。"
},
+ "attemptToCancel": {
+ "message": "嘗試取消?"
+ },
+ "attemptToCancelDescription": {
+ "message": "送出取消並不保證您的交易一定會被取消。若取消成功,將會收取上方顯示交易費用"
+ },
"attributions": {
"message": "來源"
},
"available": {
"message": "可使用"
},
+ "average": {
+ "message": "平均"
+ },
"back": {
"message": "上一頁"
},
"balance": {
"message": "餘額:"
},
+ "balanceOutdated": {
+ "message": "顯示餘額不一定是最新資訊"
+ },
"balances": {
- "message": "你的餘額:"
+ "message": "您的餘額:"
},
"balanceIsInsufficientGas": {
"message": "當前餘額不足以支付 Gas"
},
+ "basic": {
+ "message": "基本"
+ },
"beta": {
"message": "BETA"
},
@@ -114,13 +165,16 @@
"description": "helper for inputting hex as decimal input"
},
"blockiesIdenticon": {
- "message": "使用 Blockies Identicon"
+ "message": "使用像素風格代表圖案"
},
"borrowDharma": {
"message": "透過 Dharma (Beta) 借用"
},
+ "browserNotSupported": {
+ "message": "您的瀏覽器尚未支援..."
+ },
"builtInCalifornia": {
- "message": "MetaMask 是在加州設計製造."
+ "message": "MetaMask 是在加州設計製造"
},
"buy": {
"message": "購買"
@@ -129,7 +183,10 @@
"message": "在 Coinbase 上購買"
},
"buyCoinbaseExplainer": {
- "message": "Coinbase 是世界上最流行的買賣比特幣,以太幣和萊特幣的交易所。"
+ "message": "Coinbase 是世界上最受歡迎的比特幣、以太幣和萊特幣的買賣交易所。"
+ },
+ "bytes": {
+ "message": "位元組"
},
"buyCoinSwitch": {
"message": "在CoinSwitch上购买"
@@ -143,15 +200,42 @@
"cancel": {
"message": "取消"
},
+ "cancelAttempt": {
+ "message": "嘗試取消"
+ },
+ "cancellationGasFee": {
+ "message": "需要的手續費"
+ },
+ "cancelled": {
+ "message": "已取消"
+ },
+ "cancelN": {
+ "message": "取消全部 $1 筆交易"
+ },
"classicInterface": {
"message": "使用舊版界面"
},
"clickCopy": {
"message": "點擊複製"
},
+ "clickToAdd": {
+ "message": "點選下方 $1 新增資訊"
+ },
+ "clickToRevealSeed": {
+ "message": "點選顯示助憶詞"
+ },
+ "close": {
+ "message": "關閉"
+ },
+ "chromeRequiredForHardwareWallets": {
+ "message": "您需要在 Google Chrome 瀏覽器使用 MetaMask 連結您的硬體錢包"
+ },
"confirm": {
"message": "確認"
},
+ "confirmationTime": {
+ "message": "確認時間 (秒)"
+ },
"confirmed": {
"message": "已確認"
},
@@ -161,9 +245,33 @@
"confirmPassword": {
"message": "確認密碼"
},
+ "confirmSecretBackupPhrase": {
+ "message": "確認您已經備份的助憶詞"
+ },
"confirmTransaction": {
"message": "確認交易"
},
+ "connectHardwareWallet": {
+ "message": "連線硬體錢包"
+ },
+ "connect": {
+ "message": "連線"
+ },
+ "connectRequest": {
+ "message": "連線請求"
+ },
+ "connecting": {
+ "message": "連線中..."
+ },
+ "connectingTo": {
+ "message": "連線到$1"
+ },
+ "connectToLedger": {
+ "message": "連線到 Ledger"
+ },
+ "connectToTrezor": {
+ "message": "連線到 Trezor"
+ },
"continue": {
"message": "繼續"
},
@@ -174,7 +282,7 @@
"message": "繼續前往 CoinSwitch"
},
"contractDeployment": {
- "message": "合約部署"
+ "message": "部署合約"
},
"conversionProgress": {
"message": "正在取得匯率"
@@ -194,6 +302,9 @@
"copy": {
"message": "複製"
},
+ "copyAddress": {
+ "message": "複製到剪貼簿"
+ },
"copyToClipboard": {
"message": "複製到剪貼簿"
},
@@ -201,7 +312,7 @@
"message": " 複製 "
},
"copyPrivateKey": {
- "message": "這是你的私鑰(點擊複製)"
+ "message": "這是您的私鑰(點擊複製)"
},
"create": {
"message": "建立"
@@ -212,19 +323,31 @@
"createDen": {
"message": "建立"
},
+ "createPassword": {
+ "message": "建立密碼"
+ },
"crypto": {
"message": "加密",
"description": "Exchange type (cryptocurrencies)"
},
+ "currencyConversion": {
+ "message": "轉換匯率"
+ },
"currentConversion": {
"message": "當前匯率"
},
+ "currentLanguage": {
+ "message": "當前語言"
+ },
"currentNetwork": {
"message": "當前網路"
},
"customGas": {
"message": "自訂 Gas"
},
+ "customGasSubTitle": {
+ "message": "提升費用可能會加快處理時間,但不保證"
+ },
"customToken": {
"message": "自訂代幣"
},
@@ -241,26 +364,26 @@
"message": "小數點精度"
},
"defaultNetwork": {
- "message": "預設 Ether 交易網路為主網路(Main Net)。"
+ "message": "預設乙太幣交易網路為主網路"
},
"denExplainer": {
- "message": "你的 DEN 是在你的 MetaMask 中的加密密碼儲存庫。"
+ "message": "您的 DEN 是 MetaMask 中您的的密碼加密儲存庫。"
},
"deposit": {
"message": "存入"
},
"depositBTC": {
- "message": "將你的 BTC 存入到下面的地址:"
+ "message": "將您的 BTC 存入到下面的位址:"
},
"depositCoin": {
- "message": "將你的 $1 存入到下面的地址",
+ "message": "將您的 $1 存入到下面的位址",
"description": "Tells the user what coin they have selected to deposit with shapeshift"
},
"depositEth": {
- "message": "存入 Eth"
+ "message": "存入乙太幣"
},
"depositEther": {
- "message": "存入 Ether"
+ "message": "存入乙太幣"
},
"depositFiat": {
"message": "從法定貨幣存入"
@@ -272,7 +395,7 @@
"message": "從 ShapeShift 存入"
},
"depositShapeShiftExplainer": {
- "message": "如果你擁有其他加密貨幣,你可以直接交易並存入 Ether 到你的 MetaMask 錢包。不需要開帳戶。"
+ "message": "如果您擁有其他加密貨幣,可直接轉換為乙太幣存入 MetaMask 錢包。不需開新帳戶。"
},
"details": {
"message": "詳情"
@@ -281,17 +404,26 @@
"message": "直接存入"
},
"directDepositEther": {
- "message": "直接存入 Ether"
+ "message": "直接存入乙太幣"
},
"directDepositEtherExplainer": {
- "message": "如果你已經擁有了一些 Ether,使用直接存入功能是讓你的新錢包最快取得 Ether 的方式。"
+ "message": "如果您已經擁有乙太幣,直接存入功能是讓新錢包最快取得乙太幣的方式。"
},
"done": {
"message": "完成"
},
+ "downloadGoogleChrome": {
+ "message": "下載 Google Chrome 瀏覽器"
+ },
+ "downloadSecretBackup": {
+ "message": "下載助憶詞文字檔案,並安全的保存在有加密功能的外接硬碟或其他儲存裝置。"
+ },
"downloadStateLogs": {
"message": "下載狀態紀錄"
},
+ "dontHaveAHardwareWallet": {
+ "message": "還沒有硬體錢包?"
+ },
"dropped": {
"message": "丟棄"
},
@@ -301,11 +433,17 @@
"editAccountName": {
"message": "編輯帳戶名稱"
},
+ "editingTransaction": {
+ "message": "修改交易"
+ },
"emailUs": {
"message": "寄 Email 給我們!"
},
"encryptNewDen": {
- "message": "加密你的新 DEN"
+ "message": "加密您的新 DEN"
+ },
+ "ensNameNotFound": {
+ "message": "ENS 名稱不存在"
},
"enterPassword": {
"message": "請輸入密碼"
@@ -313,18 +451,30 @@
"enterPasswordConfirm": {
"message": "請再次輸入密碼確認"
},
+ "enterPasswordContinue": {
+ "message": "請輸入密碼"
+ },
"passwordNotLongEnough": {
"message": "您所輸入的密碼長度不足"
},
"passwordsDontMatch": {
"message": "您所輸入的密碼不一致"
},
+ "eth": {
+ "message": "ETH"
+ },
"etherscanView": {
"message": "在 Etherscan 上查看帳戶"
},
+ "estimatedProcessingTimes": {
+ "message": "預估處理時間"
+ },
"exchangeRate": {
"message": "匯率"
},
+ "expandView": {
+ "message": "展開畫面"
+ },
"exportPrivateKey": {
"message": "導出私鑰"
},
@@ -332,28 +482,46 @@
"message": "您需要自行負擔導出私鑰產生的風險"
},
"failed": {
- "message": "失败"
+ "message": "交易失败"
+ },
+ "fast": {
+ "message": "快"
+ },
+ "faster": {
+ "message": "更快"
+ },
+ "fastest": {
+ "message": "最快"
+ },
+ "feeChartTitle": {
+ "message": "即時交易費預估"
},
"fiat": {
- "message": "FIAT",
+ "message": "法定貨幣",
"description": "Exchange type"
},
"fileImportFail": {
- "message": "檔案導入失敗?點擊這裡!",
+ "message": "檔案匯入失敗?點擊這裡!",
"description": "Helps user import their account from a JSON file"
},
"followTwitter": {
"message": "追蹤 Twitter"
},
+ "forgetDevice": {
+ "message": "移除此裝置"
+ },
"from": {
- "message": "來源地址"
+ "message": "來源帳戶"
},
"fromToSame": {
- "message": "來源和目的地址不能一樣"
+ "message": "來源和目的位址不能一樣"
},
"fromShapeShift": {
"message": "來自 ShapeShift"
},
+ "functionType": {
+ "message": "功能類型"
+ },
"gas": {
"message": "Gas",
"description": "Short indication of gas cost"
@@ -367,35 +535,71 @@
"gasLimitCalculation": {
"message": "我們根據網路成功率算出建議的 Gas 上限。"
},
+ "gasLimitInfoModalContent": {
+ "message": "Gas 上限代表願意為交易手續費所付出的最高總價"
+ },
"gasLimitRequired": {
"message": "必需填寫 Gas 上限"
},
"gasLimitTooLow": {
"message": "Gas 上限至少為 21000"
},
+ "gasUsed": {
+ "message": "Gas 用量"
+ },
"generatingSeed": {
"message": "產生助憶詞中..."
},
"gasPrice": {
"message": "Gas 價格 (GWEI)"
},
+ "gasPriceExtremelyLow": {
+ "message": "Gas 價格極低"
+ },
+ "gasPriceInfoModalContent": {
+ "message": "Gas 價格代表願意為交易手續費付出的單位價格,價格越高交易處理速度越快"
+ },
+ "gasPriceNoDenom": {
+ "message": "Gas 價格"
+ },
"gasPriceCalculation": {
"message": "我們根據網路成功率算出建議的 Gas 價格"
},
"gasPriceRequired": {
"message": "必需填寫 Gas 價格"
},
+ "generatingTransaction": {
+ "message": "產生交易"
+ },
"getEther": {
- "message": "取得 Ether"
+ "message": "取得乙太幣"
},
"getEtherFromFaucet": {
- "message": "從水管取得$1 Ether",
+ "message": "從水管取得 $1 乙太幣。",
"description": "Displays network name for Ether faucet"
},
+ "getHelp": {
+ "message": "取得協助"
+ },
"greaterThanMin": {
"message": "必須要大於等於 $1。",
"description": "helper for inputting hex as decimal input"
},
+ "hardware": {
+ "message": "硬體"
+ },
+ "hardwareWalletConnected": {
+ "message": "硬體錢包已連線"
+ },
+ "hardwareWallets": {
+ "message": "連線硬體錢包"
+ },
+ "hardwareWalletsMsg": {
+ "message": "選擇要連線到 MetaMask 的硬體錢包"
+ },
+ "havingTroubleConnecting": {
+ "message": "無法正確連線?"
+ },
"here": {
"message": "這裡",
"description": "as in -click here- for more information (goes with troubleTokenBalances)"
@@ -403,6 +607,9 @@
"hereList": {
"message": "Here's a list!!!!"
},
+ "hexData": {
+ "message": "16進位資料"
+ },
"hide": {
"message": "隱藏"
},
@@ -412,46 +619,68 @@
"hideTokenPrompt": {
"message": "隱藏代幣?"
},
+ "history": {
+ "message": "紀錄"
+ },
"howToDeposit": {
- "message": "你想怎麼存入 Ether?"
+ "message": "您想怎麼存入乙太幣?"
},
"holdEther": {
- "message": "MetaMask 讓您能保存 ether 和代幣, 並成為您接觸分散式應用程式的途徑."
+ "message": "能讓您保存乙太幣和代幣,並成為您與去中心化應用程式的橋梁"
},
"import": {
- "message": "導入",
+ "message": "匯入",
"description": "Button to import an account from a selected file"
},
"importAccount": {
- "message": "導入帳戶"
+ "message": "匯入帳戶"
},
"importAccountMsg": {
- "message": " 匯入的帳戶與您原有 MetaMask 帳戶的助憶詞並無關聯. 請查看與導入帳戶相關的資料 "
+ "message": " 匯入的帳戶與您原有 MetaMask 帳戶的助憶詞並無關聯。請查看與匯入帳戶相關的資料 "
+ },
+ "importAccountSeedPhrase": {
+ "message": "利用助憶詞還原"
},
"importAnAccount": {
- "message": "導入一個帳戶"
+ "message": "匯入一個帳戶"
},
"importDen": {
- "message": "導入現成的 DEN"
+ "message": "匯入現有的 DEN"
},
"imported": {
- "message": "已導入私鑰",
+ "message": "已匯入私鑰",
"description": "status showing that an account has been fully loaded into the keyring"
},
+ "importUsingSeed": {
+ "message": "利用助憶詞匯入帳戶" ,
+ "description": "登入頁面下方"
+ },
+ "importWithSeedPhrase": {
+ "message": "利用助憶詞還原"
+ },
"infoHelp": {
"message": "說明 & 資訊"
},
+ "initialTransactionConfirmed": {
+ "message": "交易已確認"
+ },
+ "insufficientBalance": {
+ "message": "餘額不足"
+ },
"insufficientFunds": {
- "message": "資金不足."
+ "message": "資金不足"
},
"insufficientTokens": {
- "message": "代幣不足."
+ "message": "代幣不足"
},
"invalidAddress": {
- "message": "錯誤的地址"
+ "message": "錯誤的位址"
},
"invalidAddressRecipient": {
- "message": "接收地址錯誤"
+ "message": "接收位址錯誤"
+ },
+ "knownAddressRecipient": {
+ "message": "已知合約位址"
},
"invalidGasParams": {
"message": "Gas 參數錯誤"
@@ -465,11 +694,14 @@
"invalidRPC": {
"message": "無效的 RPC URI"
},
+ "invalidSeedPhrase": {
+ "message": "無效的助憶詞"
+ },
"jsonFail": {
- "message": "有東西出錯了. 請確認你的 JSON 檔案格式正確。"
+ "message": "有東西出錯了. 請確認您的 JSON 檔案格式正確。"
},
"jsonFile": {
- "message": "JSON 檔案",
+ "message": "JSON 格式檔案",
"description": "format for importing an account"
},
"keepTrackTokens": {
@@ -485,14 +717,17 @@
"message": "最大值"
},
"learnMore": {
- "message": "了解更多。"
+ "message": "了解更多"
+ },
+ "ledgerAccountRestriction": {
+ "message": "您必須使用最後的帳戶才能產生新帳戶"
},
"lessThanMax": {
"message": "必須小於等於 $1.",
"description": "helper for inputting hex as decimal input"
},
"likeToAddTokens": {
- "message": "您確定要加入這些代幣嗎?"
+ "message": "確定要加入代幣?"
},
"links": {
"message": "連結"
@@ -500,6 +735,9 @@
"limit": {
"message": "上限"
},
+ "liveGasPricePredictions": {
+ "message": "即時 Gas 價格預估"
+ },
"loading": {
"message": "載入..."
},
@@ -524,38 +762,59 @@
"mainnet": {
"message": "乙太坊 主網路"
},
+ "memorizePhrase": {
+ "message": "絕對不要忘記您的助憶詞。"
+ },
+ "menu": {
+ "message": "選單"
+ },
"message": {
"message": "訊息"
},
"metamaskDescription": {
- "message": "MetaMask 是Ethereum的安全身份識別金庫."
+ "message": "MetaMask 是乙太坊安全身份識別金庫"
+ },
+ "metamaskSeedWords": {
+ "message": "MetaMask Seed Words"
+ },
+ "metamaskVersion": {
+ "message": "MetaMask 版本"
},
"min": {
"message": "最小"
},
+ "missingYourTokens": {
+ "message": "看不到您的代幣?"
+ },
+ "minutesShorthand": {
+ "message": "Min"
+ },
"myAccounts": {
"message": "我的帳戶"
},
"mustSelectOne": {
- "message": "必須選擇至少 1 代幣."
+ "message": "必須選擇至少 1 代幣"
},
"needEtherInWallet": {
- "message": "要使用 MetaMask 存取 DAPP 時,您的錢包中需要有 Ether。"
+ "message": "要使用 MetaMask 存取去中心化應用服務時,您的錢包中需要有乙太幣。"
},
"needImportFile": {
- "message": "您必須選擇一個檔案來導入。",
+ "message": "您必須選擇一個檔案來匯入",
"description": "User is important an account and needs to add a file to continue"
},
"needImportPassword": {
- "message": "您必須為選擇好的檔案輸入密碼。",
+ "message": "您必須為選擇好的檔案輸入密碼",
"description": "Password and file needed to import an account"
},
"negativeETH": {
- "message": "不能送出負值的 ETH。"
+ "message": "不能送出負值的乙太幣"
},
"networks": {
"message": "網路"
},
+ "nevermind": {
+ "message": "算了"
+ },
"newAccount": {
"message": "新帳戶"
},
@@ -564,45 +823,115 @@
"description": "Default name of next account to be created on create account screen"
},
"newContract": {
- "message": "新合約"
+ "message": "建立新合約"
},
"newPassword": {
- "message": "新密碼(至少8個字)"
+ "message": "新密碼(至少8個字元)"
+ },
+ "newPassword8Chars": {
+ "message": "新密碼 (至少8個字元)"
},
"newRecipient": {
"message": "新收款人"
},
- "newRPC": {
- "message": "New RPC URL"
+ "newNetwork": {
+ "message": "新增網路"
+ },
+ "rpcURL": {
+ "message": "RPC URL 位址"
+ },
+ "showAdvancedOptions": {
+ "message": "顯示進階選項"
+ },
+ "hideAdvancedOptions": {
+ "message": "隱藏進階選項"
+ },
+ "optionalChainId": {
+ "message": "ChainID (可選)"
+ },
+ "optionalSymbol": {
+ "message": "Symbol (可選)"
+ },
+ "optionalNickname": {
+ "message": "顯示名稱 (可選)"
+ },
+ "newTotal": {
+ "message": "總費用"
+ },
+ "newTransactionFee": {
+ "message": "自訂交易費"
},
"next": {
"message": "下一頁"
},
"noAddressForName": {
- "message": "此 ENS 尚未指定地址。"
+ "message": "此 ENS 尚未指定位址。"
},
"noDeposits": {
"message": "尚未有存款"
},
+ "noConversionRateAvailable": {
+ "message": "尚未有匯率比較值"
+ },
"noTransactionHistory": {
- "message": "尚未有交易紀錄。"
+ "message": "尚未有交易紀錄"
},
"noTransactions": {
"message": "尚未有交易"
},
+ "notFound": {
+ "message": "找不到"
+ },
"notStarted": {
"message": "尚未開始"
},
+ "noWebcamFoundTitle": {
+ "message": "找不到攝影鏡頭"
+ },
+ "noWebcamFound": {
+ "message": "無法搜尋到攝影鏡頭裝置。請再試一次"
+ },
+ "ofTextNofM": {
+ "message": "of"
+ },
"oldUI": {
"message": "舊版界面"
},
"oldUIMessage": {
- "message": "你已經切換到舊版界面。可以通過右上方下拉選單中的選項切換回新的使用者界面。"
+ "message": "您已經切換到舊版界面。可以通過右上方下拉選單中的選項切換回新的使用者界面。"
+ },
+ "onlySendToEtherAddress": {
+ "message": "只能發送到乙太坊位址"
+ },
+ "onlySendTokensToAccountAddress": {
+ "message": "只能發送 $1 到乙太坊位址",
+ "description": "displays token symbol"
+ },
+ "openInTab": {
+ "message": "頁籤中開啟"
},
"or": {
"message": "或",
"description": "choice between creating or importing a new account"
},
+ "orderOneHere": {
+ "message": "訂購 Trezor 或 Ledger 讓資產保存於硬體裝置。"
+ },
+ "origin": {
+ "message": "來源"
+ },
+ "outgoing": {
+ "message": "外出"
+ },
+ "parameters": {
+ "message": "參數"
+ },
+ "originalTotal": {
+ "message": "原始總量"
+ },
+ "password": {
+ "message": "密碼"
+ },
"passwordCorrect": {
"message": "請確認您的密碼是正確的。"
},
@@ -615,21 +944,33 @@
"description": "in password creation process, the password is not long enough to be secure"
},
"pastePrivateKey": {
- "message": "請貼上你的私鑰串:",
+ "message": "請貼上您的私鑰字串:",
"description": "For importing an account from a private key"
},
"pasteSeed": {
- "message": "請貼上你的助憶詞!"
+ "message": "請貼上您的助憶詞!"
+ },
+ "pending": {
+ "message": "等待處理"
},
"personalAddressDetected": {
- "message": "已偵測到個人地址. 請輸入代幣合約地址."
+ "message": "偵測為個人位址,請輸入代幣合約位址"
},
"pleaseReviewTransaction": {
- "message": "請檢查你的交易。"
+ "message": "請檢查您的交易。"
},
"popularTokens": {
"message": "常見的代幣"
},
+ "prev": {
+ "message": "Prev"
+ },
+ "primaryCurrencySetting": {
+ "message": "主要顯示"
+ },
+ "primaryCurrencySettingDescription": {
+ "message": "選擇使用乙太幣(ETH)或是法定貨幣(例如:美金)為主要錢幣顯示單位"
+ },
"privacyMsg": {
"message": "隱私政策"
},
@@ -638,7 +979,7 @@
"description": "select this type of file to use to import an account"
},
"privateKeyWarning": {
- "message": "注意:永遠不要公開這個私鑰。任何取得這把私鑰的人都可以竊取這個帳號中的任何資產。"
+ "message": "注意:永遠不要公開這個私鑰。任何取得這把私鑰的人都可以竊取這個帳戶中的所有資產。"
},
"privateNetwork": {
"message": "私有網路"
@@ -646,35 +987,60 @@
"qrCode": {
"message": "顯示 QR Code"
},
+ "queue": {
+ "message": "佇列"
+ },
"readdToken": {
- "message": "之後還可以透過帳戶選單中的“加入代幣”來加入此代幣。"
+ "message": "未來可以隨時重新加入此代幣"
},
"readMore": {
- "message": "了解更多。"
+ "message": "了解更多"
},
"readMore2": {
- "message": "了解更多。"
+ "message": "了解更多"
},
"receive": {
"message": "接收"
},
"recipientAddress": {
- "message": "接收地址"
+ "message": "接收位址"
},
"refundAddress": {
- "message": "你的退款地址"
+ "message": "您的退款位址"
+ },
+ "rejectAll": {
+ "message": "全部拒絕"
+ },
+ "rejectTxsN": {
+ "message": "拒絕 $1 筆交易"
+ },
+ "rejectTxsDescription": {
+ "message": "您將批次拒絕 $1 筆交易."
},
"rejected": {
"message": "拒絕"
},
+ "reset": {
+ "message": "重置"
+ },
"resetAccount": {
"message": "重置帳戶"
},
+ "resetAccountDescription": {
+ "message": "重置帳戶將清除您的交易紀錄"
+ },
"restoreFromSeed": {
- "message": "透過助憶詞重置"
+ "message": "還原帳戶?",
+ "description": "登入頁面下方"
},
"restoreVault": {
- "message": "重置金庫"
+ "message": "還原金庫"
+ },
+ "restoreAccountWithSeed": {
+ "message": "透過助憶詞還原您的帳戶"
+ },
+ "requestsAwaitingAcknowledgement": {
+ "message": "請求正在等待確認"
},
"required": {
"message": "必填"
@@ -682,24 +1048,51 @@
"retryWithMoreGas": {
"message": "改用更高的 Gas 價格重試"
},
+ "restore": {
+ "message": "Restore"
+ },
"walletSeed": {
- "message": "錢包助憶詞"
+ "message": "助憶詞"
},
"revealSeedWords": {
"message": "顯示助憶詞"
},
+ "revealSeedWordsTitle": {
+ "message": "助憶詞"
+ },
+ "revealSeedWordsDescription": {
+ "message": "若想在不同瀏覽器或電腦登入,將需要使用助憶詞還原帳戶資訊。請妥善並安全的保管您的助憶詞。"
+ },
+ "revealSeedWordsWarningTitle": {
+ "message": "請勿將助憶詞洩漏予他人"
+ },
"revealSeedWordsWarning": {
- "message": "別在公共場合回復你的助憶詞!這些詞可被用來竊取你的帳戶."
+ "message": "絕對不要在公共場合輸入助憶詞!這可被用來竊取您的帳戶。"
},
"revert": {
"message": "還原"
},
+ "remove": {
+ "message": "移除"
+ },
+ "removeAccount": {
+ "message": "移除帳戶"
+ },
+ "removeAccountDescription": {
+ "message": "此帳戶將由錢包中移除。在繼續進行之前請確認您已經匯出並妥善備份助憶詞或私鑰。"
+ },
+ "readyToConnect": {
+ "message": "準備連線?"
+ },
"rinkeby": {
"message": "Rinkeby 測試網路"
},
"ropsten": {
"message": "Ropsten 測試網路"
},
+ "rpc": {
+ "message": "自訂 RPC"
+ },
"currentRpc": {
"message": "當前的 RPC"
},
@@ -725,6 +1118,15 @@
"save": {
"message": "儲存"
},
+ "slow": {
+ "message": "慢"
+ },
+ "slower": {
+ "message": "更慢"
+ },
+ "saveAsCsvFile": {
+ "message": "儲存為CSV格式檔案"
+ },
"saveAsFile": {
"message": "儲存檔案",
"description": "Account export process"
@@ -732,14 +1134,35 @@
"saveSeedAsFile": {
"message": "將助憶詞儲存成檔案"
},
+ "scanInstructions": {
+ "message": "請將 QR code 放在攝影鏡頭前面"
+ },
+ "scanQrCode": {
+ "message": "掃描 QR Code"
+ },
"search": {
"message": "搜尋"
},
+ "searchResults": {
+ "message": "搜尋結果"
+ },
+ "secretBackupPhrase": {
+ "message": "助憶詞"
+ },
+ "secretBackupPhraseDescription": {
+ "message": "助憶詞將可協助您用更簡單的方式備份帳戶資訊。"
+ },
+ "secretBackupPhraseWarning": {
+ "message": "警告: 絕對不要洩漏您的助憶詞。任何人只要得知助憶詞代表他可以竊取您所有的乙太幣和代幣。"
+ },
"secretPhrase": {
- "message": "在此輸入你的12個祕密助憶詞以回復金庫."
+ "message": "輸入您的12個助憶詞以回復金庫"
},
- "newPassword8Chars": {
- "message": "新密碼 (至少 8 個字元)"
+ "secondsShorthand": {
+ "message": "秒"
+ },
+ "seedPhrasePlaceholder": {
+ "message": "單詞之間請用空白分隔"
},
"seedPhraseReq": {
"message": "助憶詞為 12 個詞語"
@@ -750,6 +1173,12 @@
"selectCurrency": {
"message": "選擇幣別"
},
+ "selectEachPhrase": {
+ "message": "請依照正確順序點選助憶詞"
+ },
+ "selectLocale": {
+ "message": "選擇地區"
+ },
"selectService": {
"message": "選擇服務"
},
@@ -759,18 +1188,45 @@
"send": {
"message": "發送"
},
+ "sendAmount": {
+ "message": "發送數量"
+ },
"sendETH": {
- "message": "發送 ETH"
+ "message": "發送乙太幣"
},
"sendTokens": {
"message": "發送代幣"
},
- "onlySendToEtherAddress": {
- "message": "只發送 ETH 到乙太坊地址."
+ "sentEther": {
+ "message": "發送乙太幣"
+ },
+ "sentTokens": {
+ "message": "發送代幣"
+ },
+ "separateEachWord": {
+ "message": "單詞之間請以空白間隔"
},
"searchTokens": {
"message": "搜尋代幣"
},
+ "selectAnAddress": {
+ "message": "選擇位址"
+ },
+ "selectAnAccount": {
+ "message": "選擇帳戶"
+ },
+ "selectAnAccountHelp": {
+ "message": "Select the account to view in MetaMask"
+ },
+ "selectAHigherGasFee": {
+ "message": "選擇更高的交易費可加速您的交易處理時間 *"
+ },
+ "selectHdPath": {
+ "message": "Select HD Path"
+ },
+ "selectPathHelp": {
+ "message": "若看不到您已經擁有的 Ledger 帳戶,請嘗試切換路徑為 \"Legacy (MEW / MyCrypto)\""
+ },
"sendTokensAnywhere": {
"message": "發送代幣給擁有乙太坊帳戶的任何人"
},
@@ -783,15 +1239,30 @@
"shapeshiftBuy": {
"message": "從 Shapeshift 購買"
},
+ "showAdvancedGasInline": {
+ "message": "顯示進階 Gas 控制選項"
+ },
+ "showAdvancedGasInlineDescription": {
+ "message": "在交易時顯示可微調 Gas 價格以及 Gas 上限的功能"
+ },
"showPrivateKeys": {
"message": "顯示私鑰"
},
"showQRCode": {
"message": "顯示 QR Code"
},
+ "showHexData": {
+ "message": "顯示16進位資料"
+ },
+ "showHexDataDescription": {
+ "message": "在交易時顯示16進位資料"
+ },
"sign": {
"message": "簽署"
},
+ "signatureRequest": {
+ "message": "請求簽署"
+ },
"signed": {
"message": "已簽署"
},
@@ -799,7 +1270,7 @@
"message": "簽署訊息"
},
"signNotice": {
- "message": "簽署此訊息可能會產生危險地副作用。 \n只從你完全信任的網站上簽署。這種危險的方法;將在未來的版本中被移除。"
+ "message": "簽署此訊息可能會產生危險地副作用。 \n只從您完全信任的網站上簽署。這種危險的方法,將在未來的版本中被移除。"
},
"sigRequest": {
"message": "請求簽署"
@@ -807,8 +1278,29 @@
"sigRequested": {
"message": "已請求簽署"
},
+ "somethingWentWrong": {
+ "message": "糟糕!出了點問題。"
+ },
"spaceBetween": {
- "message": "there can only be a space between words"
+ "message": "單詞之間只能有空白"
+ },
+ "speedUp": {
+ "message": "加速"
+ },
+ "speedUpTitle": {
+ "message": "加速交易"
+ },
+ "speedUpSubtitle": {
+ "message": "提高手續費可以加速交易處理時間"
+ },
+ "speedUpCancellation": {
+ "message": "加速取消"
+ },
+ "speedUpTransaction": {
+ "message": "加速這筆交易"
+ },
+ "switchNetworks": {
+ "message": "切換網路"
},
"status": {
"message": "狀態"
@@ -817,11 +1309,32 @@
"message": "狀態紀錄"
},
"stateLogsDescription": {
- "message": "狀態紀錄包含你的公開帳戶地址和已傳送的交易資訊."
+ "message": "狀態紀錄包含您的公開帳戶位址和已傳送的交易資訊"
},
"stateLogError": {
"message": "在取得狀態紀錄時發生錯誤."
},
+ "step1HardwareWallet": {
+ "message": "1. 連線硬體錢包"
+ },
+ "step1HardwareWalletMsg": {
+ "message": "將您的硬體錢包連接到電腦。"
+ },
+ "step2HardwareWallet": {
+ "message": "2. 選擇帳戶"
+ },
+ "step2HardwareWalletMsg": {
+ "message": "選擇想要檢視的帳戶。一次只能選擇一個帳戶。"
+ },
+ "step3HardwareWallet": {
+ "message": "3. 開始使用!"
+ },
+ "step3HardwareWalletMsg": {
+ "message": "使用您硬體錢包中的帳戶,與去中心化應用服務交易乙太幣、ERC20代幣、或迷戀貓等數位資產。"
+ },
+ "storePhrase": {
+ "message": "您可以用密碼管理系統例如 1Password 等軟體儲存助憶詞。"
+ },
"submit": {
"message": "送出"
},
@@ -831,8 +1344,8 @@
"supportCenter": {
"message": "造訪我們的協助中心"
},
- "symbolBetweenZeroTen": {
- "message": "代號必須介於 0 到 10 字元間."
+ "symbolBetweenZeroTwelve": {
+ "message": "代號必須介於 0 到 12 字元間."
},
"takesTooLong": {
"message": "花費太長時間?"
@@ -843,15 +1356,21 @@
"testFaucet": {
"message": "測試水管"
},
+ "tips": {
+ "message": "提示"
+ },
"to": {
- "message": "目的帳號"
+ "message": "目的帳戶"
},
"toETHviaShapeShift": {
"message": "$1 ETH 透過 ShapeShift",
"description": "system will fill in deposit type in start of message"
},
+ "token": {
+ "message": "代碼"
+ },
"tokenAddress": {
- "message": "代幣地址"
+ "message": "代幣位址"
},
"tokenAlreadyAdded": {
"message": "已加入過此代幣。"
@@ -866,45 +1385,111 @@
"message": "代幣代號"
},
"tokenWarning1": {
- "message": "使用 MetaMask 帳戶追蹤你已購得的代幣。如果你使用不同的帳戶保存購得的代幣,那些代幣就不會出現在這裡。"
+ "message": "使用 MetaMask 帳戶追蹤您已購得的代幣。如果使用不同的帳戶保存購得的代幣,那些代幣就不會出現在這裡。"
},
"total": {
"message": "總量"
},
+ "transaction": {
+ "message": "交易"
+ },
+ "transactionConfirmed": {
+ "message": "交易確認 時間 $2."
+ },
+ "transactionCreated": {
+ "message": "交易產生 數量 $1 時間 $2"
+ },
+ "transactionWithNonce": {
+ "message": "交易 $1"
+ },
+ "transactionDropped": {
+ "message": "交易廢除 時間 $2"
+ },
+ "transactionSubmitted": {
+ "message": "交易送出 手續費 $1 時間 $2"
+ },
+ "transactionResubmitted": {
+ "message": "交易重新送出 手續費提高至 $1 時間 $2"
+ },
+ "transactionUpdated": {
+ "message": "交易狀態更新 時間 $2"
+ },
+ "transactionUpdatedGas": {
+ "message": "交易狀態更新 手續費 $1 時間 $2."
+ },
+ "transactionErrored": {
+ "message": "交易錯誤"
+ },
+ "transactionCancelAttempted": {
+ "message": "交易取消請求 手續費 $1 時間 $2"
+ },
+ "transactionCancelSuccess": {
+ "message": "交易取消成功 $2"
+ },
"transactions": {
"message": "交易紀錄"
},
+ "transactionError": {
+ "message": "交易失敗。合約代碼拋出錯誤資訊"
+ },
+ "transactionErrorNoContract": {
+ "message": "合約位址錯誤"
+ },
+ "transactionFee": {
+ "message": "交易費"
+ },
"transactionMemo": {
"message": "交易備註(選填)"
},
"transactionNumber": {
"message": "交易號碼"
},
+ "transactionTime": {
+ "message": "交易時間"
+ },
+ "transfer": {
+ "message": "交易"
+ },
+ "transferFrom": {
+ "message": "交易來源"
+ },
"transfers": {
"message": "交易"
},
+ "trezorHardwareWallet": {
+ "message": "TREZOR 硬體錢包"
+ },
"troubleTokenBalances": {
"message": "無法取得代幣餘額。您k可以到這裡查看 ",
"description": "Followed by a link (here) to view token balances"
},
+ "tryAgain": {
+ "message": "再試一次"
+ },
"twelveWords": {
- "message": "這 12 個單詞是唯一回復你的 MetaMask 帳號的方法。\n將它們儲存到那些安全且隱密的地方吧。"
+ "message": "這 12 個單詞是唯一回復您的 MetaMask 帳戶的方法。\n將它們儲存到那些安全且隱密的地方吧。"
},
"typePassword": {
"message": "請輸入密碼"
},
+ "uiMigrationAnnouncement": {
+ "message": "歡迎使用 MetaMask 新版使用介面。若您有任何關於使用介面的改善建議,請到GitHub聯絡我們的服務小組。"
+ },
"uiWelcome": {
- "message": "歡迎使用新版界面 (Beta)"
+ "message": "歡迎使用新版界面 (Beta)"
},
"uiWelcomeMessage": {
- "message": "你現在正在使用新版 MetaMask 界面。試試諸如發送代幣等新功能吧,有任何問題請告知我們。"
+ "message": "您現在正在使用 MetaMask 新版界面。試試發送代幣等新功能吧,有任何問題請告知我們。"
},
"unapproved": {
- "message": "未同意"
+ "message": "未批准"
},
"unavailable": {
"message": "不可用"
},
+ "units": {
+ "message": "單位"
+ },
"unknown": {
"message": "未知"
},
@@ -912,10 +1497,28 @@
"message": "未知私有網路"
},
"unknownNetworkId": {
- "message": "未知網路 ID"
+ "message": "未知的網路ID"
+ },
+ "unknownQrCode": {
+ "message": "錯誤:無法辨識 QR code"
+ },
+ "unknownCameraErrorTitle": {
+ "message": "糟糕!出了些問題...."
+ },
+ "unknownCameraError": {
+ "message": "無法存取攝影鏡頭。請再試一次..."
+ },
+ "unlock": {
+ "message": "Unlock"
+ },
+ "unlockMessage": {
+ "message": "去中心化網路世界等待著您"
+ },
+ "updatedWithDate": {
+ "message": "更新時間 $1"
},
"uriErrorMsg": {
- "message": "URIs 需要加入適當的 HTTP/HTTPS 前綴."
+ "message": "URIs 需要加入適當的 HTTP/HTTPS 前綴字"
},
"usaOnly": {
"message": "僅限美國",
@@ -928,7 +1531,7 @@
"message": "使用舊版界面"
},
"validFileImport": {
- "message": "您必須選擇一個合法的檔案來導入."
+ "message": "您必須選擇一個合法的檔案來匯入."
},
"vaultCreated": {
"message": "已建立金庫"
@@ -936,22 +1539,52 @@
"viewAccount": {
"message": "查看帳戶"
},
+ "viewOnEtherscan": {
+ "message": "在 Etherscan 上瀏覽"
+ },
"visitWebSite": {
"message": "造訪我們的網站"
},
"warning": {
"message": "警告"
},
- "welcomeBeta": {
- "message": "歡迎到 MetaMask Beta"
+ "welcomeBack": {
+ "message": "歡迎回來!"
+ },
+ "welcome": {
+ "message": "歡迎來到 MetaMask"
},
"whatsThis": {
"message": "這是什麼?"
},
+ "writePhrase": {
+ "message": "將助憶詞寫在紙上,並保存在安全的場所。若想要更安全,將助憶詞分別寫在不同紙張上並存放在不同的地方。"
+ },
+ "yesLetsTry": {
+ "message": "了解,試試看"
+ },
+ "youNeedToAllowCameraAccess": {
+ "message": "需要准許存取攝影鏡頭才能啟用此功能"
+ },
"yourSigRequested": {
- "message": "正在請求你的簽署"
+ "message": "正在請求您的簽署"
},
"youSign": {
"message": "正在簽署"
+ },
+ "yourPrivateSeedPhrase": {
+ "message": "您的助憶詞"
+ },
+ "yourUniqueAccountImage": {
+ "message": "您的帳戶圖案"
+ },
+ "yourUniqueAccountImageDescription1": {
+ "message": "這個圖案是基於您的帳戶資訊由電腦自動產生。"
+ },
+ "yourUniqueAccountImageDescription2": {
+ "message": "您每一次在交易時,都會看到這個圖案。"
+ },
+ "zeroGasPriceOnSpeedUpError": {
+ "message":"加速的 Gas 價格為 0"
}
}
diff --git a/app/fonts/index.css b/app/fonts/index.css
new file mode 100644
index 000000000..b31179cb4
--- /dev/null
+++ b/app/fonts/index.css
@@ -0,0 +1,405 @@
+@import url('./Font_Awesome/font-awesome.min.css');
+
+@font-face {
+ font-family: 'Roboto';
+ font-style: normal;
+ font-weight: 100;
+ src: local('Roboto Thin'), local('Roboto-Thin'), url('./Roboto/Roboto-Thin.ttf') format('truetype');
+ unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
+}
+/* cyrillic */
+@font-face {
+ font-family: 'Roboto';
+ font-style: normal;
+ font-weight: 100;
+ src: local('Roboto Thin'), local('Roboto-Thin'), url('./Roboto/Roboto-Thin.ttf') format('truetype');
+ unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
+}
+/* greek-ext */
+@font-face {
+ font-family: 'Roboto';
+ font-style: normal;
+ font-weight: 100;
+ src: local('Roboto Thin'), local('Roboto-Thin'), url('./Roboto/Roboto-Thin.ttf') format('truetype');
+ unicode-range: U+1F00-1FFF;
+}
+/* greek */
+@font-face {
+ font-family: 'Roboto';
+ font-style: normal;
+ font-weight: 100;
+ src: local('Roboto Thin'), local('Roboto-Thin'), url('./Roboto/Roboto-Thin.ttf') format('truetype');
+ unicode-range: U+0370-03FF;
+}
+/* vietnamese */
+@font-face {
+ font-family: 'Roboto';
+ font-style: normal;
+ font-weight: 100;
+ src: local('Roboto Thin'), local('Roboto-Thin'), url('./Roboto/Roboto-Thin.ttf') format('truetype');
+ unicode-range: U+0102-0103, U+0110-0111, U+1EA0-1EF9, U+20AB;
+}
+/* latin-ext */
+@font-face {
+ font-family: 'Roboto';
+ font-style: normal;
+ font-weight: 100;
+ src: local('Roboto Thin'), local('Roboto-Thin'), url('./Roboto/Roboto-Thin.ttf') format('truetype');
+ unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;
+}
+/* latin */
+@font-face {
+ font-family: 'Roboto';
+ font-style: normal;
+ font-weight: 100;
+ src: local('Roboto Thin'), local('Roboto-Thin'), url('./Roboto/Roboto-Thin.ttf') format('truetype');
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
+}
+/* cyrillic-ext */
+@font-face {
+ font-family: 'Roboto';
+ font-style: normal;
+ font-weight: 300;
+ src: local('Roboto Light'), local('Roboto-Light'), url('./Roboto/Roboto-Light.ttf') format('truetype');
+ unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
+}
+/* cyrillic */
+@font-face {
+ font-family: 'Roboto';
+ font-style: normal;
+ font-weight: 300;
+ src: local('Roboto Light'), local('Roboto-Light'), url('./Roboto/Roboto-Light.ttf') format('truetype');
+ unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
+}
+/* greek-ext */
+@font-face {
+ font-family: 'Roboto';
+ font-style: normal;
+ font-weight: 300;
+ src: local('Roboto Light'), local('Roboto-Light'), url('./Roboto/Roboto-Light.ttf') format('truetype');
+ unicode-range: U+1F00-1FFF;
+}
+/* greek */
+@font-face {
+ font-family: 'Roboto';
+ font-style: normal;
+ font-weight: 300;
+ src: local('Roboto Light'), local('Roboto-Light'), url('./Roboto/Roboto-Light.ttf') format('truetype');
+ unicode-range: U+0370-03FF;
+}
+/* vietnamese */
+@font-face {
+ font-family: 'Roboto';
+ font-style: normal;
+ font-weight: 300;
+ src: local('Roboto Light'), local('Roboto-Light'), url('./Roboto/Roboto-Light.ttf') format('truetype');
+ unicode-range: U+0102-0103, U+0110-0111, U+1EA0-1EF9, U+20AB;
+}
+/* latin-ext */
+@font-face {
+ font-family: 'Roboto';
+ font-style: normal;
+ font-weight: 300;
+ src: local('Roboto Light'), local('Roboto-Light'), url('./Roboto/Roboto-Light.ttf') format('truetype');
+ unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;
+}
+/* latin */
+@font-face {
+ font-family: 'Roboto';
+ font-style: normal;
+ font-weight: 300;
+ src: local('Roboto Light'), local('Roboto-Light'), url('./Roboto/Roboto-Light.ttf') format('truetype');
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
+}
+/* cyrillic-ext */
+@font-face {
+ font-family: 'Roboto';
+ font-style: normal;
+ font-weight: 400;
+ src: local('Roboto'), local('Roboto-Regular'), url('./Roboto/Roboto-Regular.ttf') format('truetype');
+ unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
+}
+/* cyrillic */
+@font-face {
+ font-family: 'Roboto';
+ font-style: normal;
+ font-weight: 400;
+ src: local('Roboto'), local('Roboto-Regular'), url('./Roboto/Roboto-Regular.ttf') format('truetype');
+ unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
+}
+/* greek-ext */
+@font-face {
+ font-family: 'Roboto';
+ font-style: normal;
+ font-weight: 400;
+ src: local('Roboto'), local('Roboto-Regular'), url('./Roboto/Roboto-Regular.ttf') format('truetype');
+ unicode-range: U+1F00-1FFF;
+}
+/* greek */
+@font-face {
+ font-family: 'Roboto';
+ font-style: normal;
+ font-weight: 400;
+ src: local('Roboto'), local('Roboto-Regular'), url('./Roboto/Roboto-Regular.ttf') format('truetype');
+ unicode-range: U+0370-03FF;
+}
+/* vietnamese */
+@font-face {
+ font-family: 'Roboto';
+ font-style: normal;
+ font-weight: 400;
+ src: local('Roboto'), local('Roboto-Regular'), url('./Roboto/Roboto-Regular.ttf') format('truetype');
+ unicode-range: U+0102-0103, U+0110-0111, U+1EA0-1EF9, U+20AB;
+}
+/* latin-ext */
+@font-face {
+ font-family: 'Roboto';
+ font-style: normal;
+ font-weight: 400;
+ src: local('Roboto'), local('Roboto-Regular'), url('./Roboto/Roboto-Regular.ttf') format('truetype');
+ unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;
+}
+/* latin */
+@font-face {
+ font-family: 'Roboto';
+ font-style: normal;
+ font-weight: 400;
+ src: local('Roboto'), local('Roboto-Regular'), url('./Roboto/Roboto-Regular.ttf') format('truetype');
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
+}
+/* cyrillic-ext */
+@font-face {
+ font-family: 'Roboto';
+ font-style: normal;
+ font-weight: 500;
+ src: local('Roboto Medium'), local('Roboto-Medium'), url('./Roboto/Roboto-Medium.ttf') format('truetype');
+ unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
+}
+/* cyrillic */
+@font-face {
+ font-family: 'Roboto';
+ font-style: normal;
+ font-weight: 500;
+ src: local('Roboto Medium'), local('Roboto-Medium'), url('./Roboto/Roboto-Medium.ttf') format('truetype');
+ unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
+}
+/* greek-ext */
+@font-face {
+ font-family: 'Roboto';
+ font-style: normal;
+ font-weight: 500;
+ src: local('Roboto Medium'), local('Roboto-Medium'), url('./Roboto/Roboto-Medium.ttf') format('truetype');
+ unicode-range: U+1F00-1FFF;
+}
+/* greek */
+@font-face {
+ font-family: 'Roboto';
+ font-style: normal;
+ font-weight: 500;
+ src: local('Roboto Medium'), local('Roboto-Medium'), url('./Roboto/Roboto-Medium.ttf') format('truetype');
+ unicode-range: U+0370-03FF;
+}
+/* vietnamese */
+@font-face {
+ font-family: 'Roboto';
+ font-style: normal;
+ font-weight: 500;
+ src: local('Roboto Medium'), local('Roboto-Medium'), url('./Roboto/Roboto-Medium.ttf') format('truetype');
+ unicode-range: U+0102-0103, U+0110-0111, U+1EA0-1EF9, U+20AB;
+}
+/* latin-ext */
+@font-face {
+ font-family: 'Roboto';
+ font-style: normal;
+ font-weight: 500;
+ src: local('Roboto Medium'), local('Roboto-Medium'), url('./Roboto/Roboto-Medium.ttf') format('truetype');
+ unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;
+}
+/* latin */
+@font-face {
+ font-family: 'Roboto';
+ font-style: normal;
+ font-weight: 500;
+ src: local('Roboto Medium'), local('Roboto-Medium'), url('./Roboto/Roboto-Medium.ttf') format('truetype');
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
+}
+/* cyrillic-ext */
+@font-face {
+ font-family: 'Roboto';
+ font-style: normal;
+ font-weight: 700;
+ src: local('Roboto Bold'), local('Roboto-Bold'), url('./Roboto/Roboto-Bold.ttf') format('truetype');
+ unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
+}
+/* cyrillic */
+@font-face {
+ font-family: 'Roboto';
+ font-style: normal;
+ font-weight: 700;
+ src: local('Roboto Bold'), local('Roboto-Bold'), url('./Roboto/Roboto-Bold.ttf') format('truetype');
+ unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
+}
+/* greek-ext */
+@font-face {
+ font-family: 'Roboto';
+ font-style: normal;
+ font-weight: 700;
+ src: local('Roboto Bold'), local('Roboto-Bold'), url('./Roboto/Roboto-Bold.ttf') format('truetype');
+ unicode-range: U+1F00-1FFF;
+}
+/* greek */
+@font-face {
+ font-family: 'Roboto';
+ font-style: normal;
+ font-weight: 700;
+ src: local('Roboto Bold'), local('Roboto-Bold'), url('./Roboto/Roboto-Bold.ttf') format('truetype');
+ unicode-range: U+0370-03FF;
+}
+/* vietnamese */
+@font-face {
+ font-family: 'Roboto';
+ font-style: normal;
+ font-weight: 700;
+ src: local('Roboto Bold'), local('Roboto-Bold'), url('./Roboto/Roboto-Bold.ttf') format('truetype');
+ unicode-range: U+0102-0103, U+0110-0111, U+1EA0-1EF9, U+20AB;
+}
+/* latin-ext */
+@font-face {
+ font-family: 'Roboto';
+ font-style: normal;
+ font-weight: 700;
+ src: local('Roboto Bold'), local('Roboto-Bold'), url('./Roboto/Roboto-Bold.ttf') format('truetype');
+ unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;
+}
+/* latin */
+@font-face {
+ font-family: 'Roboto';
+ font-style: normal;
+ font-weight: 700;
+ src: local('Roboto Bold'), local('Roboto-Bold'), url('./Roboto/Roboto-Bold.ttf') format('truetype');
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
+}
+/* cyrillic-ext */
+@font-face {
+ font-family: 'Roboto';
+ font-style: normal;
+ font-weight: 900;
+ src: local('Roboto Black'), local('Roboto-Black'), url('./Roboto/Roboto-Black.ttf') format('truetype');
+ unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
+}
+/* cyrillic */
+@font-face {
+ font-family: 'Roboto';
+ font-style: normal;
+ font-weight: 900;
+ src: local('Roboto Black'), local('Roboto-Black'), url('./Roboto/Roboto-Black.ttf') format('truetype');
+ unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
+}
+/* greek-ext */
+@font-face {
+ font-family: 'Roboto';
+ font-style: normal;
+ font-weight: 900;
+ src: local('Roboto Black'), local('Roboto-Black'), url('./Roboto/Roboto-Black.ttf') format('truetype');
+ unicode-range: U+1F00-1FFF;
+}
+/* greek */
+@font-face {
+ font-family: 'Roboto';
+ font-style: normal;
+ font-weight: 900;
+ src: local('Roboto Black'), local('Roboto-Black'), url('./Roboto/Roboto-Black.ttf') format('truetype');
+ unicode-range: U+0370-03FF;
+}
+/* vietnamese */
+@font-face {
+ font-family: 'Roboto';
+ font-style: normal;
+ font-weight: 900;
+ src: local('Roboto Black'), local('Roboto-Black'), url('./Roboto/Roboto-Black.ttf') format('truetype');
+ unicode-range: U+0102-0103, U+0110-0111, U+1EA0-1EF9, U+20AB;
+}
+/* latin-ext */
+@font-face {
+ font-family: 'Roboto';
+ font-style: normal;
+ font-weight: 900;
+ src: local('Roboto Black'), local('Roboto-Black'), url('Roboto/Roboto-Black.ttf') format('truetype');
+ unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;
+}
+/* latin */
+@font-face {
+ font-family: 'Roboto';
+ font-style: normal;
+ font-weight: 900;
+ src: local('Roboto Black'), local('Roboto-Black'), url('./Roboto/Roboto-Black.ttf') format('truetype');
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
+}
+
+@font-face {
+ font-family: 'Montserrat Regular';
+ src: url('./Montserrat/Montserrat-Regular.woff') format('woff');
+ src: url('./Montserrat/Montserrat-Regular.ttf') format('truetype');
+ font-weight: 400;
+ font-style: normal;
+ font-size: small;
+}
+
+@font-face {
+ font-family: 'Montserrat Bold';
+ src: url('./Montserrat/Montserrat-Bold.woff') format('woff');
+ src: url('./Montserrat/Montserrat-Bold.ttf') format('truetype');
+ font-weight: 400;
+ font-style: normal;
+}
+
+@font-face {
+ font-family: 'Montserrat Light';
+ src: url('./Montserrat/Montserrat-Light.woff') format('woff');
+ src: url('./Montserrat/Montserrat-Light.ttf') format('truetype');
+ font-weight: 400;
+ font-style: normal;
+}
+
+@font-face {
+ font-family: 'Montserrat UltraLight';
+ src: url('./Montserrat/Montserrat-UltraLight.woff') format('woff');
+ src: url('./Montserrat/Montserrat-UltraLight.ttf') format('truetype');
+ font-weight: 400;
+ font-style: normal;
+}
+
+@font-face {
+ font-family: 'DIN OT';
+ src: url('./DIN_OT/DINOT-2.otf') format('opentype');
+ font-weight: 400;
+ font-style: normal;
+}
+
+@font-face {
+ font-family: 'DIN OT Light';
+ src: url('./DIN_OT/DINOT-2.otf') format('opentype');
+ font-weight: 200;
+ font-style: normal;
+}
+
+@font-face {
+ font-family: 'DIN NEXT';
+ src: url('./DIN Next/DIN Next W01 Regular.otf') format('opentype');
+ font-weight: 400;
+ font-style: normal;
+}
+
+@font-face {
+ font-family: 'DIN NEXT Light';
+ src: url('./DIN Next/DIN Next W10 Light.otf') format('opentype');
+ font-weight: 400;
+ font-style: normal;
+}
+
+@font-face {
+ font-family: 'Lato';
+ src: url('./Lato/Lato-Regular.ttf') format('truetype');
+ font-weight: 400;
+ font-style: normal;
+}
diff --git a/app/images/caret-left-black.svg b/app/images/caret-left-black.svg
new file mode 100644
index 000000000..872135ece
--- /dev/null
+++ b/app/images/caret-left-black.svg
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="9px" height="15px" viewBox="0 0 9 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!-- Generator: sketchtool 50.2 (55047) - http://www.bohemiancoding.com/sketch -->
+ <title>8439120D-5704-4273-B416-FEE134322584</title>
+ <desc>Created with sketchtool.</desc>
+ <defs></defs>
+ <g id="Action-Screens" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+ <g id="Approve---insufficient-amount" transform="translate(-75.000000, -69.000000)" stroke="#000000" stroke-width="2">
+ <g id="Group-7" transform="translate(53.000000, 51.000000)">
+ <g id="cancel" transform="translate(24.000000, 14.000000)">
+ <g id="Group">
+ <polyline id="Path-8" points="6.1263881 18.0633906 0 11.6306831 6.31493631 5"></polyline>
+ </g>
+ </g>
+ </g>
+ </g>
+ </g>
+</svg>
diff --git a/app/images/double-arrow.svg b/app/images/double-arrow.svg
new file mode 100644
index 000000000..a31a0550b
--- /dev/null
+++ b/app/images/double-arrow.svg
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="12px" height="8px" viewBox="0 0 12 8" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!-- Generator: Sketch 50.2 (55047) - http://www.bohemiancoding.com/sketch -->
+ <title>first/last</title>
+ <desc>Created with Sketch.</desc>
+ <defs></defs>
+ <g id="Action-Screens" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+ <g id="first/last" fill="#5F5C5D">
+ <polygon id="Path-12-Copy" points="12 0 12 8 6 4"></polygon>
+ <polygon id="Path-12-Copy-2" points="6 0 6 8 0 4"></polygon>
+ </g>
+ </g>
+</svg> \ No newline at end of file
diff --git a/app/images/download-alt.svg b/app/images/download-alt.svg
new file mode 100644
index 000000000..11c54fd66
--- /dev/null
+++ b/app/images/download-alt.svg
@@ -0,0 +1,5 @@
+<svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
+<rect x="40" y="40" width="40" height="4.57143" rx="2.28571" transform="rotate(-180 40 40)" fill="#979797"/>
+<rect x="22.5641" y="21.7144" width="4.10256" height="21.7143" rx="2.05128" transform="rotate(-180 22.5641 21.7144)" fill="#979797"/>
+<path d="M20.5 30L7.07661 12L33.9234 12L20.5 30Z" fill="#979797"/>
+</svg>
diff --git a/app/images/icons/cancelled.svg b/app/images/icons/cancelled.svg
new file mode 100755
index 000000000..ae4846dde
--- /dev/null
+++ b/app/images/icons/cancelled.svg
@@ -0,0 +1,3 @@
+<svg width="7" height="8" viewBox="0 0 7 8" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M1.97959 1.19291C1.66717 0.880488 1.16063 0.880488 0.848215 1.19291C0.535796 1.50533 0.535796 2.01186 0.848215 2.32428L2.52394 4L0.848215 5.67572C0.535796 5.98814 0.535796 6.49467 0.848215 6.80709C1.16063 7.11951 1.66717 7.11951 1.97959 6.80709L3.65531 5.13137L5.33122 6.80728C5.64364 7.1197 6.15017 7.1197 6.46259 6.80728C6.77501 6.49486 6.77501 5.98833 6.46259 5.67591L4.78668 4L6.46259 2.32409C6.77501 2.01167 6.77501 1.50514 6.46259 1.19272C6.15017 0.880297 5.64364 0.880297 5.33122 1.19272L3.65531 2.86863L1.97959 1.19291Z" fill="#F9FBFF"/>
+</svg>
diff --git a/app/images/icons/confirm.svg b/app/images/icons/confirm.svg
new file mode 100644
index 000000000..3263bf03e
--- /dev/null
+++ b/app/images/icons/confirm.svg
@@ -0,0 +1,3 @@
+<svg width="7" height="5" viewBox="0 0 7 5" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M5.97989 0.212475C6.27337 0.495775 6.27337 0.955095 5.97989 1.23839L2.16061 4.92513L0.220114 3.05198C-0.0733712 2.76868 -0.0733712 2.30936 0.220114 2.02606C0.513599 1.74276 0.989432 1.74276 1.28292 2.02606L2.16061 2.87329L4.91708 0.212475C5.21057 -0.070825 5.6864 -0.070825 5.97989 0.212475Z" fill="white"/>
+</svg>
diff --git a/app/images/icons/down-arrow.svg b/app/images/icons/down-arrow.svg
new file mode 100644
index 000000000..6cfb4a38b
--- /dev/null
+++ b/app/images/icons/down-arrow.svg
@@ -0,0 +1,4 @@
+<svg width="27" height="27" viewBox="0 0 27 27" fill="none" xmlns="http://www.w3.org/2000/svg">
+<circle cx="13.5" cy="13.5" r="13" fill="white" fill-opacity="0.25" stroke="#DCDDE6"/>
+<path d="M19.2 14.1L18.5 13.4L14.1 17.8V7H13.1V17.8L8.7 13.4L8 14.1L13.1 19.2L13.6 19.7L14.1 19.2L19.2 14.1Z" fill="#DCDDE6"/>
+</svg>
diff --git a/app/images/icons/error.svg b/app/images/icons/error.svg
new file mode 100644
index 000000000..bf5abf946
--- /dev/null
+++ b/app/images/icons/error.svg
@@ -0,0 +1,4 @@
+<svg width="2" height="8" viewBox="0 0 2 8" fill="none" xmlns="http://www.w3.org/2000/svg">
+<rect width="2" height="5" rx="1" fill="white"/>
+<rect y="6" width="2" height="2" rx="1" fill="white"/>
+</svg>
diff --git a/app/images/icons/new.svg b/app/images/icons/new.svg
new file mode 100755
index 000000000..f56c43e08
--- /dev/null
+++ b/app/images/icons/new.svg
@@ -0,0 +1,3 @@
+<svg width="10" height="10" viewBox="0 0 10 10" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M1.76923 4.2003C1.3274 4.2003 0.969231 4.55847 0.969231 5.0003C0.969231 5.44213 1.3274 5.8003 1.76923 5.8003H4.20048V8.23077C4.20048 8.6726 4.55865 9.03077 5.00048 9.03077C5.44231 9.03077 5.80048 8.6726 5.80048 8.23077V5.8003H8.23077C8.6726 5.8003 9.03077 5.44213 9.03077 5.0003C9.03077 4.55847 8.6726 4.2003 8.23077 4.2003L5.80048 4.2003L5.80048 1.76923C5.80048 1.3274 5.44231 0.969229 5.00048 0.969229C4.55865 0.969229 4.20048 1.3274 4.20048 1.76923V4.2003H1.76923Z" fill="#F9FBFF"/>
+</svg>
diff --git a/app/images/icons/retry.svg b/app/images/icons/retry.svg
new file mode 100755
index 000000000..ddaa198ca
--- /dev/null
+++ b/app/images/icons/retry.svg
@@ -0,0 +1,7 @@
+<svg width="8" height="8" viewBox="0 0 8 8" fill="none" xmlns="http://www.w3.org/2000/svg">
+<mask id="path-1-inside-1" fill="white">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M0.778067 3.8208C0.871457 2.12275 2.27987 0.769234 4 0.769234C4.96355 0.769234 5.83056 1.19264 6.42308 1.86404V1.25385C6.42056 1.07527 6.56316 0.928879 6.74111 0.926355C6.82882 0.925093 6.91274 0.959168 6.97458 1.02101C7.03642 1.08285 7.0705 1.16677 7.06923 1.25385V2.86923H6.57641C6.53919 2.87554 6.50196 2.87554 6.46536 2.86923H5.45385C5.33711 2.87113 5.22921 2.80992 5.17053 2.70896C5.11121 2.60863 5.11121 2.48369 5.17053 2.38336C5.22921 2.2824 5.33711 2.22119 5.45385 2.22308H5.87536C5.40526 1.72648 4.74081 1.41539 4 1.41539C2.61746 1.41539 1.49805 2.49378 1.42296 3.85613C1.41854 3.97224 1.35103 4.07699 1.24754 4.12999C1.14405 4.183 1.01974 4.17605 0.92257 4.11232C0.825394 4.04796 0.770495 3.9369 0.778067 3.8208ZM6.57705 4.14387C6.58399 3.96529 6.73417 3.82647 6.91274 3.83404C6.99982 3.83783 7.08185 3.87632 7.14054 3.94132C7.19859 4.00631 7.22825 4.09213 7.22194 4.17921C7.12855 5.87725 5.72014 7.23077 4 7.23077C3.03645 7.23077 2.16944 6.80736 1.57693 6.13597V6.74615C1.57882 6.86289 1.51761 6.97079 1.41665 7.02948C1.31632 7.08879 1.19138 7.08879 1.09105 7.02948C0.990088 6.97079 0.928879 6.86289 0.930771 6.74615V5.13077H1.42927C1.46335 5.12572 1.49742 5.12572 1.53149 5.13077H2.54616C2.66289 5.12888 2.7708 5.19008 2.82948 5.29104C2.88879 5.39138 2.88879 5.51632 2.82948 5.61665C2.7708 5.71761 2.66289 5.77882 2.54616 5.77692H2.12464C2.59538 6.27353 3.2592 6.58461 4 6.58461C5.38254 6.58461 6.50196 5.50622 6.57705 4.14387Z"/>
+</mask>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M0.778067 3.8208C0.871457 2.12275 2.27987 0.769234 4 0.769234C4.96355 0.769234 5.83056 1.19264 6.42308 1.86404V1.25385C6.42056 1.07527 6.56316 0.928879 6.74111 0.926355C6.82882 0.925093 6.91274 0.959168 6.97458 1.02101C7.03642 1.08285 7.0705 1.16677 7.06923 1.25385V2.86923H6.57641C6.53919 2.87554 6.50196 2.87554 6.46536 2.86923H5.45385C5.33711 2.87113 5.22921 2.80992 5.17053 2.70896C5.11121 2.60863 5.11121 2.48369 5.17053 2.38336C5.22921 2.2824 5.33711 2.22119 5.45385 2.22308H5.87536C5.40526 1.72648 4.74081 1.41539 4 1.41539C2.61746 1.41539 1.49805 2.49378 1.42296 3.85613C1.41854 3.97224 1.35103 4.07699 1.24754 4.12999C1.14405 4.183 1.01974 4.17605 0.92257 4.11232C0.825394 4.04796 0.770495 3.9369 0.778067 3.8208ZM6.57705 4.14387C6.58399 3.96529 6.73417 3.82647 6.91274 3.83404C6.99982 3.83783 7.08185 3.87632 7.14054 3.94132C7.19859 4.00631 7.22825 4.09213 7.22194 4.17921C7.12855 5.87725 5.72014 7.23077 4 7.23077C3.03645 7.23077 2.16944 6.80736 1.57693 6.13597V6.74615C1.57882 6.86289 1.51761 6.97079 1.41665 7.02948C1.31632 7.08879 1.19138 7.08879 1.09105 7.02948C0.990088 6.97079 0.928879 6.86289 0.930771 6.74615V5.13077H1.42927C1.46335 5.12572 1.49742 5.12572 1.53149 5.13077H2.54616C2.66289 5.12888 2.7708 5.19008 2.82948 5.29104C2.88879 5.39138 2.88879 5.51632 2.82948 5.61665C2.7708 5.71761 2.66289 5.77882 2.54616 5.77692H2.12464C2.59538 6.27353 3.2592 6.58461 4 6.58461C5.38254 6.58461 6.50196 5.50622 6.57705 4.14387Z" fill="#F9FBFF"/>
+<path d="M0.778067 3.8208L1.776 3.88588L1.77656 3.87571L0.778067 3.8208ZM6.42308 1.86404L5.6733 2.52573L7.42308 4.50843V1.86404H6.42308ZM6.42308 1.25385H7.42318L7.42298 1.23972L6.42308 1.25385ZM6.74111 0.926355L6.75529 1.92625L6.75549 1.92625L6.74111 0.926355ZM6.97458 1.02101L6.26747 1.72811L6.26748 1.72812L6.97458 1.02101ZM7.06923 1.25385L6.06934 1.23935L6.06923 1.2466V1.25385H7.06923ZM7.06923 2.86923V3.86923H8.06923V2.86923H7.06923ZM6.57641 2.86923V1.86923H6.49227L6.40931 1.88329L6.57641 2.86923ZM6.46536 2.86923L6.63526 1.88377L6.55093 1.86923H6.46536V2.86923ZM5.45385 2.86923V1.86923H5.44574L5.43763 1.86937L5.45385 2.86923ZM5.17053 2.70896L6.03511 2.20642L6.03134 2.20005L5.17053 2.70896ZM5.17053 2.38336L6.03137 2.89228L6.03509 2.88588L5.17053 2.38336ZM5.45385 2.22308L5.43763 3.22295L5.44574 3.22308H5.45385V2.22308ZM5.87536 2.22308V3.22308H8.19899L6.60158 1.53562L5.87536 2.22308ZM1.42296 3.85613L0.424475 3.8011L0.424006 3.8096L0.423682 3.81811L1.42296 3.85613ZM1.24754 4.12999L0.791666 3.23995L0.791661 3.23995L1.24754 4.12999ZM0.92257 4.11232L0.370365 4.94604L0.374142 4.94852L0.92257 4.11232ZM6.91274 3.83404L6.95618 2.83499L6.95511 2.83494L6.91274 3.83404ZM6.57705 4.14387L7.57553 4.1989L7.57598 4.19081L7.57629 4.18271L6.57705 4.14387ZM7.14054 3.94132L7.88636 3.27515L7.88276 3.27116L7.14054 3.94132ZM7.22194 4.17921L6.22455 4.10692L6.22392 4.1156L6.22345 4.12429L7.22194 4.17921ZM1.57693 6.13597L2.3267 5.47428L0.576926 3.49157V6.13597H1.57693ZM1.57693 6.74615H0.576926V6.75426L0.577057 6.76238L1.57693 6.74615ZM1.41665 7.02948L0.91411 6.16489L0.907735 6.16866L1.41665 7.02948ZM1.09105 7.02948L1.59998 6.16864L1.59358 6.16492L1.09105 7.02948ZM0.930771 6.74615L1.93064 6.76236L1.93077 6.75426V6.74615H0.930771ZM0.930771 5.13077V4.13077H-0.0692286V5.13077H0.930771ZM1.42927 5.13077V6.13077H1.50294L1.57582 6.11997L1.42927 5.13077ZM1.53149 5.13077L1.38494 6.11997L1.45782 6.13077H1.53149V5.13077ZM2.54616 5.13077V6.13077H2.55426L2.56237 6.13064L2.54616 5.13077ZM2.82948 5.29104L1.96489 5.79358L1.96866 5.79996L2.82948 5.29104ZM2.82948 5.61665L1.96864 5.10772L1.96492 5.11412L2.82948 5.61665ZM2.54616 5.77692L2.56237 4.77705L2.55426 4.77692H2.54616V5.77692ZM2.12464 5.77692V4.77692H-0.201132L1.39888 6.46487L2.12464 5.77692ZM4 -0.230766C1.74426 -0.230766 -0.098134 1.54236 -0.220424 3.76588L1.77656 3.87571C1.84105 2.70314 2.81549 1.76923 4 1.76923V-0.230766ZM7.17286 1.20234C6.39879 0.325232 5.26272 -0.230766 4 -0.230766V1.76923C4.66439 1.76923 5.26233 2.06005 5.6733 2.52573L7.17286 1.20234ZM5.42308 1.25385V1.86404H7.42308V1.25385H5.42308ZM6.72693 -0.0735444C5.99673 -0.0631869 5.41285 0.537233 5.42318 1.26798L7.42298 1.23972C7.42826 1.61331 7.12959 1.92095 6.75529 1.92625L6.72693 -0.0735444ZM7.68169 0.313905C7.42857 0.0607823 7.08431 -0.0786862 6.72672 -0.0735415L6.75549 1.92625C6.57333 1.92887 6.39691 1.85755 6.26747 1.72811L7.68169 0.313905ZM8.06913 1.26835C8.07432 0.910271 7.93407 0.566273 7.68168 0.313893L6.26748 1.72812C6.13878 1.59942 6.06667 1.42327 6.06934 1.23935L8.06913 1.26835ZM8.06923 2.86923V1.25385H6.06923V2.86923H8.06923ZM6.57641 3.86923H7.06923V1.86923H6.57641V3.86923ZM6.29545 3.85469C6.44544 3.88055 6.59664 3.88007 6.74352 3.85517L6.40931 1.88329C6.48173 1.87102 6.55847 1.87053 6.63526 1.88377L6.29545 3.85469ZM5.45385 3.86923H6.46536V1.86923H5.45385V3.86923ZM4.30596 3.21148C4.54571 3.62395 4.98964 3.87689 5.47006 3.8691L5.43763 1.86937C5.68458 1.86536 5.91271 1.99589 6.03509 2.20643L4.30596 3.21148ZM4.30971 1.87445C4.06482 2.28867 4.06482 2.80364 4.30971 3.21787L6.03134 2.20005C6.1576 2.41361 6.1576 2.6787 6.03134 2.89227L4.30971 1.87445ZM5.47006 1.22321C4.98964 1.21542 4.54571 1.46836 4.30596 1.88083L6.03509 2.88588C5.91271 3.09643 5.68458 3.22695 5.43763 3.22295L5.47006 1.22321ZM5.87536 1.22308H5.45385V3.22308H5.87536V1.22308ZM4 2.41539C4.45384 2.41539 4.85932 2.60438 5.14914 2.91054L6.60158 1.53562C5.9512 0.84857 5.02778 0.415388 4 0.415388V2.41539ZM2.42144 3.91117C2.46762 3.07348 3.15379 2.41539 4 2.41539V0.415388C2.08113 0.415388 0.528483 1.91409 0.424475 3.8011L2.42144 3.91117ZM1.70341 5.02004C2.12497 4.80412 2.40391 4.37587 2.42224 3.89415L0.423682 3.81811C0.433175 3.5686 0.577079 3.34986 0.791666 3.23995L1.70341 5.02004ZM0.374142 4.94852C0.770549 5.20851 1.27824 5.2378 1.70342 5.02003L0.791661 3.23995C1.00986 3.12819 1.26894 3.1436 1.471 3.27612L0.374142 4.94852ZM-0.219813 3.75572C-0.250677 4.22897 -0.0263505 4.68327 0.370371 4.94603L1.47477 3.27861C1.67714 3.41265 1.79167 3.64484 1.77595 3.88588L-0.219813 3.75572ZM6.95511 2.83494C6.22187 2.80385 5.60619 3.37471 5.5778 4.10503L7.57629 4.18271C7.56179 4.55588 7.24647 4.84909 6.87038 4.83315L6.95511 2.83494ZM7.88276 3.27116C7.64442 3.0072 7.31059 2.8504 6.95618 2.83499L6.86931 4.8331C6.68906 4.82526 6.51928 4.74545 6.39832 4.61147L7.88276 3.27116ZM8.21932 4.2515C8.24543 3.89125 8.12269 3.53976 7.88635 3.27516L6.39472 4.60747C6.27449 4.47286 6.21107 4.293 6.22455 4.10692L8.21932 4.2515ZM4 8.23077C6.25575 8.23077 8.09814 6.45764 8.22043 4.23412L6.22345 4.12429C6.15896 5.29686 5.18452 6.23077 4 6.23077V8.23077ZM0.82715 6.79766C1.60122 7.67477 2.73729 8.23077 4 8.23077V6.23077C3.33561 6.23077 2.73767 5.93995 2.3267 5.47428L0.82715 6.79766ZM2.57693 6.74615V6.13597H0.576926V6.74615H2.57693ZM1.91918 7.89404C2.33164 7.6543 2.58459 7.21037 2.57679 6.72993L0.577057 6.76238C0.573051 6.51541 0.703586 6.28729 0.914124 6.16491L1.91918 7.89404ZM0.582134 7.89029C0.996363 8.13519 1.51133 8.13519 1.92556 7.89029L0.907735 6.16866C1.1213 6.0424 1.38639 6.0424 1.59996 6.16866L0.582134 7.89029ZM-0.0690972 6.72995C-0.076884 7.21037 0.17606 7.65429 0.588515 7.89403L1.59358 6.16492C1.80412 6.28729 1.93464 6.51541 1.93064 6.76236L-0.0690972 6.72995ZM-0.0692286 5.13077V6.74615H1.93077V5.13077H-0.0692286ZM1.42927 4.13077H0.930771V6.13077H1.42927V4.13077ZM1.67805 4.14157C1.5468 4.12212 1.41396 4.12212 1.28272 4.14157L1.57582 6.11997C1.51273 6.12932 1.44804 6.12932 1.38494 6.11997L1.67805 4.14157ZM2.54616 4.13077H1.53149V6.13077H2.54616V4.13077ZM3.69404 4.78852C3.4543 4.37605 3.01037 4.12311 2.52994 4.1309L2.56237 6.13064C2.31542 6.13464 2.08729 6.00411 1.96492 5.79357L3.69404 4.78852ZM3.6903 6.12556C3.93519 5.71133 3.93519 5.19636 3.6903 4.78213L1.96866 5.79996C1.8424 5.58639 1.8424 5.3213 1.96866 5.10773L3.6903 6.12556ZM2.52994 6.77679C3.01036 6.78458 3.4543 6.53164 3.69404 6.11917L1.96492 5.11412C2.08729 4.90358 2.31542 4.77305 2.56237 4.77705L2.52994 6.77679ZM2.12464 6.77692H2.54616V4.77692H2.12464V6.77692ZM4 5.58461C3.54654 5.58461 3.14132 5.39588 2.8504 5.08897L1.39888 6.46487C2.04943 7.15117 2.97185 7.58461 4 7.58461V5.58461ZM5.57856 4.08883C5.53239 4.92653 4.84621 5.58461 4 5.58461V7.58461C5.91888 7.58461 7.47152 6.08591 7.57553 4.1989L5.57856 4.08883Z" fill="white" mask="url(#path-1-inside-1)"/>
+</svg>
diff --git a/app/images/icons/submitted.svg b/app/images/icons/submitted.svg
new file mode 100755
index 000000000..b5ced8777
--- /dev/null
+++ b/app/images/icons/submitted.svg
@@ -0,0 +1,3 @@
+<svg width="7" height="6" viewBox="0 0 7 6" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M5.24834 0.0498428C5.69016 0.0498428 6.04834 0.408016 6.04834 0.849844L6.04834 4.84984C6.04834 5.29167 5.69016 5.64984 5.24834 5.64984C4.80651 5.64984 4.44834 5.29167 4.44834 4.84984V2.68278L1.56558 5.56553C1.25316 5.87795 0.746632 5.87795 0.434212 5.56553C0.121793 5.25311 0.121793 4.74658 0.434212 4.43416L3.21853 1.64984L1.24834 1.64984C0.806507 1.64984 0.448335 1.29167 0.448335 0.849844C0.448335 0.408016 0.806507 0.0498428 1.24834 0.0498428L5.24834 0.0498428Z" fill="#F9FBFF"/>
+</svg>
diff --git a/app/images/icons/swap.svg b/app/images/icons/swap.svg
new file mode 100644
index 000000000..9d4bbbda5
--- /dev/null
+++ b/app/images/icons/swap.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M16 17.01V10h-2v7.01h-3L15 21l4-3.99h-3zM9 3L5 6.99h3V14h2V6.99h3L9 3z"/><path d="M0 0h24v24H0z" fill="none"/></svg>
diff --git a/app/images/logo/metamask-logo-horizontal-beta.svg b/app/images/logo/metamask-logo-horizontal-beta.svg
deleted file mode 100644
index b1fa040ac..000000000
--- a/app/images/logo/metamask-logo-horizontal-beta.svg
+++ /dev/null
@@ -1,115 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 22.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<svg version="1.1" id="Layer_1" xmlns:ev="http://www.w3.org/2001/xml-events"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 1672.1 241.2"
- style="enable-background:new 0 0 1672.1 241.2;" xml:space="preserve">
-<style type="text/css">
- .st0{fill:#161616;}
- .st1{fill:#E17726;stroke:#E17726;stroke-linecap:round;stroke-linejoin:round;}
- .st2{fill:#E27625;stroke:#E27625;stroke-linecap:round;stroke-linejoin:round;}
- .st3{fill:#D5BFB2;stroke:#D5BFB2;stroke-linecap:round;stroke-linejoin:round;}
- .st4{fill:#233447;stroke:#233447;stroke-linecap:round;stroke-linejoin:round;}
- .st5{fill:#CC6228;stroke:#CC6228;stroke-linecap:round;stroke-linejoin:round;}
- .st6{fill:#E27525;stroke:#E27525;stroke-linecap:round;stroke-linejoin:round;}
- .st7{fill:#F5841F;stroke:#F5841F;stroke-linecap:round;stroke-linejoin:round;}
- .st8{fill:#C0AC9D;stroke:#C0AC9D;stroke-linecap:round;stroke-linejoin:round;}
- .st9{fill:#161616;stroke:#161616;stroke-linecap:round;stroke-linejoin:round;}
- .st10{fill:#763E1A;stroke:#763E1A;stroke-linecap:round;stroke-linejoin:round;}
- .st11{fill:#F5841F;}
-</style>
-<g>
- <path class="st0" d="M1157.7,121.9c-6.8-4.5-14.3-7.7-21.4-11.7c-4.6-2.6-9.5-4.9-13.5-8.2c-6.8-5.6-5.4-16.6,1.7-21.4
- c10.2-6.8,27.1-3,28.9,10.9c0,0.3,0.3,0.5,0.6,0.5h15.4c0.4,0,0.7-0.3,0.6-0.7c-0.8-9.6-4.5-17.6-11.3-22.7
- c-6.5-4.9-13.9-7.5-21.8-7.5c-40.7,0-44.4,43.1-22.5,56.7c2.5,1.6,24,12.4,31.6,17.1s10,13.3,6.7,20.1c-3,6.2-10.8,10.5-18.6,10
- c-8.5-0.5-15.1-5.1-17.4-12.3c-0.4-1.3-0.6-3.8-0.6-4.9c0-0.3-0.3-0.6-0.6-0.6h-16.7c-0.3,0-0.6,0.3-0.6,0.6
- c0,12.1,3,18.8,11.2,24.9c7.7,5.8,16.1,8.2,24.8,8.2c22.8,0,34.6-12.9,37-26.3C1173.3,141.5,1169.4,129.7,1157.7,121.9z"/>
- <path class="st0" d="M432.6,63.3h-7.4h-8.1c-0.3,0-0.5,0.2-0.6,0.4l-13.7,45.2c-0.2,0.6-1,0.6-1.2,0l-13.7-45.2
- c-0.1-0.3-0.3-0.4-0.6-0.4h-8.1h-7.4h-10c-0.3,0-0.6,0.3-0.6,0.6v115.4c0,0.3,0.3,0.6,0.6,0.6h16.7c0.3,0,0.6-0.3,0.6-0.6V91.6
- c0-0.7,1-0.8,1.2-0.2l13.8,45.5l1,3.2c0.1,0.3,0.3,0.4,0.6,0.4h12.8c0.3,0,0.5-0.2,0.6-0.4l1-3.2l13.8-45.5
- c0.2-0.7,1.2-0.5,1.2,0.2v87.7c0,0.3,0.3,0.6,0.6,0.6h16.7c0.3,0,0.6-0.3,0.6-0.6V63.9c0-0.3-0.3-0.6-0.6-0.6L432.6,63.3
- L432.6,63.3z"/>
- <path class="st0" d="M902,63.3c-0.3,0-0.5,0.2-0.6,0.4l-13.7,45.2c-0.2,0.6-1,0.6-1.2,0l-13.7-45.2c-0.1-0.3-0.3-0.4-0.6-0.4h-25.4
- c-0.3,0-0.6,0.3-0.6,0.6v115.4c0,0.3,0.3,0.6,0.6,0.6h16.7c0.3,0,0.6-0.3,0.6-0.6V91.6c0-0.7,1-0.8,1.2-0.2l13.8,45.5l1,3.2
- c0.1,0.3,0.3,0.4,0.6,0.4h12.8c0.3,0,0.5-0.2,0.6-0.4l1-3.2l13.8-45.5c0.2-0.7,1.2-0.5,1.2,0.2v87.7c0,0.3,0.3,0.6,0.6,0.6h16.7
- c0.3,0,0.6-0.3,0.6-0.6V63.9c0-0.3-0.3-0.6-0.6-0.6L902,63.3L902,63.3z"/>
- <path class="st0" d="M686.6,63.3h-31.1h-16.7h-31.1c-0.3,0-0.6,0.3-0.6,0.6v14.4c0,0.3,0.3,0.6,0.6,0.6h30.5v100.4
- c0,0.3,0.3,0.6,0.6,0.6h16.7c0.3,0,0.6-0.3,0.6-0.6V78.9h30.5c0.3,0,0.6-0.3,0.6-0.6V63.9C687.2,63.6,687,63.3,686.6,63.3z"/>
- <path class="st0" d="M785.1,179.9h15.2c0.4,0,0.7-0.4,0.6-0.8L769.5,63.3c-0.1-0.3-0.3-0.4-0.6-0.4h-5.8h-10.2h-5.8
- c-0.3,0-0.5,0.2-0.6,0.4l-31.4,115.8c-0.1,0.4,0.2,0.8,0.6,0.8h15.2c0.3,0,0.5-0.2,0.6-0.4l9.1-33.7c0.1-0.3,0.3-0.4,0.6-0.4h33.6
- c0.3,0,0.5,0.2,0.6,0.4l9.1,33.7C784.6,179.7,784.9,179.9,785.1,179.9z M745.2,128.9l12.2-45.1c0.2-0.6,1-0.6,1.2,0l12.2,45.1
- c0.1,0.4-0.2,0.8-0.6,0.8h-24.4C745.4,129.7,745.1,129.3,745.2,128.9z"/>
- <path class="st0" d="M1044.3,179.9h15.2c0.4,0,0.7-0.4,0.6-0.8l-31.4-115.8c-0.1-0.3-0.3-0.4-0.6-0.4h-5.8h-10.2h-5.8
- c-0.3,0-0.5,0.2-0.6,0.4l-31.4,115.8c-0.1,0.4,0.2,0.8,0.6,0.8h15.2c0.3,0,0.5-0.2,0.6-0.4l9.1-33.7c0.1-0.3,0.3-0.4,0.6-0.4h33.6
- c0.3,0,0.5,0.2,0.6,0.4l9.1,33.7C1043.8,179.7,1044,179.9,1044.3,179.9z M1004.4,128.9l12.2-45.1c0.2-0.6,1-0.6,1.2,0l12.2,45.1
- c0.1,0.4-0.2,0.8-0.6,0.8H1005C1004.6,129.7,1004.3,129.3,1004.4,128.9z"/>
- <path class="st0" d="M510.8,162.8V127c0-0.3,0.3-0.6,0.6-0.6h44.5c0.3,0,0.6-0.3,0.6-0.6v-14.4c0-0.3-0.3-0.6-0.6-0.6h-44.5
- c-0.3,0-0.6-0.3-0.6-0.6V79.6c0-0.3,0.3-0.6,0.6-0.6H562c0.3,0,0.6-0.3,0.6-0.6V64c0-0.3-0.3-0.6-0.6-0.6h-51.2h-17.3
- c-0.3,0-0.6,0.3-0.6,0.6v15v31.9v15.6v37v15.8c0,0.3,0.3,0.6,0.6,0.6h17.3h53.3c0.3,0,0.6-0.3,0.6-0.6v-15.2c0-0.3-0.3-0.6-0.6-0.6
- h-52.8C511,163.4,510.8,163.2,510.8,162.8z"/>
- <path class="st0" d="M1310.3,178.9l-57.8-59.7c-0.2-0.2-0.2-0.6,0-0.8l52-54c0.4-0.4,0.1-1-0.4-1h-21.3c-0.2,0-0.3,0.1-0.4,0.2
- l-44.1,45.8c-0.4,0.4-1,0.1-1-0.4V64c0-0.3-0.3-0.6-0.6-0.6H1220c-0.3,0-0.6,0.3-0.6,0.6v115.4c0,0.3,0.3,0.6,0.6,0.6h16.7
- c0.3,0,0.6-0.3,0.6-0.6v-50.8c0-0.5,0.7-0.8,1-0.4l50,51.6c0.1,0.1,0.3,0.2,0.4,0.2h21.3C1310.4,179.9,1310.7,179.2,1310.3,178.9z"
- />
-</g>
-<g>
- <polygon class="st1" points="247.1,1.2 146,76.2 164.8,32 "/>
- <g>
- <polygon class="st2" points="13.9,1.2 114.1,76.9 96.2,32 "/>
- <polygon class="st2" points="210.7,175.1 183.8,216.3 241.4,232.2 257.9,176 "/>
- <polygon class="st2" points="3.2,176 19.6,232.2 77.1,216.3 50.3,175.1 "/>
- <polygon class="st2" points="74,105.5 58,129.7 115,132.3 113.1,70.8 "/>
- <polygon class="st2" points="187,105.5 147.3,70.1 146,132.3 203,129.7 "/>
- <polygon class="st2" points="77.1,216.3 111.6,199.6 81.9,176.4 "/>
- <polygon class="st2" points="149.4,199.6 183.8,216.3 179.1,176.4 "/>
- </g>
- <g>
- <polygon class="st3" points="183.8,216.3 149.4,199.6 152.2,222 151.9,231.5 "/>
- <polygon class="st3" points="77.1,216.3 109.1,231.5 108.9,222 111.6,199.6 "/>
- </g>
- <polygon class="st4" points="109.7,161.6 81.1,153.2 101.3,143.9 "/>
- <polygon class="st4" points="151.3,161.6 159.7,143.9 180,153.2 "/>
- <g>
- <polygon class="st5" points="77.1,216.3 82.1,175.1 50.3,176 "/>
- <polygon class="st5" points="178.9,175.1 183.8,216.3 210.7,176 "/>
- <polygon class="st5" points="203,129.7 146,132.3 151.3,161.6 159.7,143.9 180,153.2 "/>
- <polygon class="st5" points="81.1,153.2 101.3,143.9 109.7,161.6 115,132.3 58,129.7 "/>
- </g>
- <g>
- <polygon class="st6" points="58,129.7 81.9,176.4 81.1,153.2 "/>
- <polygon class="st6" points="180,153.2 179.1,176.4 203,129.7 "/>
- <polygon class="st6" points="115,132.3 109.7,161.6 116.4,196.2 117.9,150.6 "/>
- <polygon class="st6" points="146,132.3 143.2,150.5 144.6,196.2 151.3,161.6 "/>
- </g>
- <polygon class="st7" points="151.3,161.6 144.6,196.2 149.4,199.6 179.1,176.4 180,153.2 "/>
- <polygon class="st7" points="81.1,153.2 81.9,176.4 111.6,199.6 116.4,196.2 109.7,161.6 "/>
- <polygon class="st8" points="151.9,231.5 152.2,222 149.6,219.8 111.4,219.8 108.9,222 109.1,231.5 77.1,216.3 88.3,225.5
- 111,241.2 149.9,241.2 172.7,225.5 183.8,216.3 "/>
- <polygon class="st9" points="149.4,199.6 144.6,196.2 116.4,196.2 111.6,199.6 108.9,222 111.4,219.8 149.6,219.8 152.2,222 "/>
- <g>
- <polygon class="st10" points="251.4,81.1 259.9,39.7 247.1,1.2 149.4,73.7 187,105.5 240.1,121 251.8,107.3 246.7,103.6
- 254.8,96.2 248.6,91.4 256.7,85.2 "/>
- <polygon class="st10" points="1.1,39.7 9.7,81.1 4.2,85.2 12.4,91.4 6.2,96.2 14.3,103.6 9.2,107.3 20.9,121 74,105.5 111.6,73.7
- 13.9,1.2 "/>
- </g>
- <polygon class="st7" points="240.1,121 187,105.5 203,129.7 179.1,176.4 210.7,176 257.9,176 "/>
- <polygon class="st7" points="74,105.5 20.9,121 3.2,176 50.3,176 81.9,176.4 58,129.7 "/>
- <polygon class="st7" points="146,132.3 149.4,73.7 164.8,32 96.2,32 111.6,73.7 115,132.3 116.3,150.7 116.4,196.2 144.6,196.2
- 144.7,150.7 "/>
-</g>
-<g>
- <path class="st7" d="M1409.7,92.6V32.1h19.3c2.9,0,5.6,0.4,8.2,1c2.5,0.6,4.7,1.6,6.6,2.9c1.9,1.3,3.4,3,4.5,5.1
- c1.1,2.1,1.6,4.5,1.6,7.3c0,3-0.9,5.5-2.5,7.7c-1.6,2.1-3.8,3.8-6.6,4.9c1.7,0.5,3.2,1.1,4.5,2c1.3,0.9,2.4,1.9,3.3,3.1
- c0.9,1.2,1.6,2.6,2,4c0.5,1.5,0.7,3.1,0.7,4.7c0,2.9-0.5,5.4-1.6,7.6c-1.1,2.2-2.5,4-4.4,5.5c-1.9,1.5-4.1,2.6-6.6,3.3
- c-2.6,0.8-5.3,1.2-8.3,1.2H1409.7z M1419.8,57.6h9.6c1.5,0,2.9-0.2,4.2-0.6c1.3-0.4,2.4-0.9,3.3-1.7c0.9-0.7,1.7-1.6,2.2-2.7
- c0.6-1.1,0.8-2.3,0.8-3.7c0-1.5-0.3-2.8-0.8-3.9c-0.5-1.1-1.3-2-2.2-2.7c-1-0.7-2.1-1.2-3.4-1.5c-1.3-0.3-2.7-0.5-4.3-0.5h-9.5
- V57.6z M1419.8,65.2v19.3h10.9c1.6,0,3-0.3,4.3-0.7c1.3-0.5,2.4-1.1,3.4-1.9c0.9-0.8,1.7-1.8,2.2-2.9c0.5-1.2,0.8-2.5,0.8-3.9
- c0-1.5-0.2-2.9-0.7-4.1c-0.5-1.2-1.1-2.2-2-3.1c-0.9-0.8-2-1.5-3.2-1.9c-1.3-0.5-2.7-0.7-4.3-0.7H1419.8z"/>
- <path class="st7" d="M1506.3,65.5h-24.9v19h29.1v8.1h-39.1V32.1h38.8v8.2h-28.8v17.1h24.9V65.5z"/>
- <path class="st7" d="M1574.8,40.4h-18.6v52.2h-9.9V40.4h-18.4v-8.2h46.9V40.4z"/>
- <path class="st7" d="M1615.2,78.6h-18.9l-4.2,14h-10.3l19.6-60.5h8.8l19.3,60.5h-10.3L1615.2,78.6z M1598.9,70h13.9l-6.9-23.7
- L1598.9,70z"/>
-</g>
-<path class="st11" d="M1644.3,8c10.7,0,19.5,8.7,19.5,19.5v69.8c0,10.7-8.7,19.5-19.5,19.5H1395c-10.7,0-19.5-8.7-19.5-19.5V27.5
- c0-10.7,8.7-19.5,19.5-19.5H1644.3 M1644.3,0H1395c-15.2,0-27.5,12.3-27.5,27.5v69.8c0,15.2,12.3,27.5,27.5,27.5h249.2
- c15.2,0,27.5-12.3,27.5-27.5V27.5C1671.7,12.3,1659.4,0,1644.3,0L1644.3,0z"/>
-</svg>
diff --git a/app/images/logo/metamask-logo-horizontal.svg b/app/images/logo/metamask-logo-horizontal.svg
new file mode 100644
index 000000000..8e0bdb938
--- /dev/null
+++ b/app/images/logo/metamask-logo-horizontal.svg
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="1311px" height="242px" viewBox="0 0 1311 242" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!-- Generator: Sketch 51.3 (57544) - http://www.bohemiancoding.com/sketch -->
+ <title>metamask-logo-horizontal-beta</title>
+ <desc>Created with Sketch.</desc>
+ <defs></defs>
+ <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+ <g id="metamask-logo-horizontal-beta" transform="translate(1.000000, 1.000000)" fill-rule="nonzero">
+ <g id="Group" transform="translate(360.000000, 60.000000)" fill="#161616">
+ <path d="M796.7,60.9 C789.9,56.4 782.4,53.2 775.3,49.2 C770.7,46.6 765.8,44.3 761.8,41 C755,35.4 756.4,24.4 763.5,19.6 C773.7,12.8 790.6,16.6 792.4,30.5 C792.4,30.8 792.7,31 793,31 L808.4,31 C808.8,31 809.1,30.7 809,30.3 C808.2,20.7 804.5,12.7 797.7,7.6 C791.2,2.7 783.8,0.1 775.9,0.1 C735.2,0.1 731.5,43.2 753.4,56.8 C755.9,58.4 777.4,69.2 785,73.9 C792.6,78.6 795,87.2 791.7,94 C788.7,100.2 780.9,104.5 773.1,104 C764.6,103.5 758,98.9 755.7,91.7 C755.3,90.4 755.1,87.9 755.1,86.8 C755.1,86.5 754.8,86.2 754.5,86.2 L737.8,86.2 C737.5,86.2 737.2,86.5 737.2,86.8 C737.2,98.9 740.2,105.6 748.4,111.7 C756.1,117.5 764.5,119.9 773.2,119.9 C796,119.9 807.8,107 810.2,93.6 C812.3,80.5 808.4,68.7 796.7,60.9 Z" id="Shape"></path>
+ <path d="M71.6,2.3 L64.2,2.3 L56.1,2.3 C55.8,2.3 55.6,2.5 55.5,2.7 L41.8,47.9 C41.6,48.5 40.8,48.5 40.6,47.9 L26.9,2.7 C26.8,2.4 26.6,2.3 26.3,2.3 L18.2,2.3 L10.8,2.3 L0.8,2.3 C0.5,2.3 0.2,2.6 0.2,2.9 L0.2,118.3 C0.2,118.6 0.5,118.9 0.8,118.9 L17.5,118.9 C17.8,118.9 18.1,118.6 18.1,118.3 L18.1,30.6 C18.1,29.9 19.1,29.8 19.3,30.4 L33.1,75.9 L34.1,79.1 C34.2,79.4 34.4,79.5 34.7,79.5 L47.5,79.5 C47.8,79.5 48,79.3 48.1,79.1 L49.1,75.9 L62.9,30.4 C63.1,29.7 64.1,29.9 64.1,30.6 L64.1,118.3 C64.1,118.6 64.4,118.9 64.7,118.9 L81.4,118.9 C81.7,118.9 82,118.6 82,118.3 L82,2.9 C82,2.6 81.7,2.3 81.4,2.3 L71.6,2.3 Z" id="Shape"></path>
+ <path d="M541,2.3 C540.7,2.3 540.5,2.5 540.4,2.7 L526.7,47.9 C526.5,48.5 525.7,48.5 525.5,47.9 L511.8,2.7 C511.7,2.4 511.5,2.3 511.2,2.3 L485.8,2.3 C485.5,2.3 485.2,2.6 485.2,2.9 L485.2,118.3 C485.2,118.6 485.5,118.9 485.8,118.9 L502.5,118.9 C502.8,118.9 503.1,118.6 503.1,118.3 L503.1,30.6 C503.1,29.9 504.1,29.8 504.3,30.4 L518.1,75.9 L519.1,79.1 C519.2,79.4 519.4,79.5 519.7,79.5 L532.5,79.5 C532.8,79.5 533,79.3 533.1,79.1 L534.1,75.9 L547.9,30.4 C548.1,29.7 549.1,29.9 549.1,30.6 L549.1,118.3 C549.1,118.6 549.4,118.9 549.7,118.9 L566.4,118.9 C566.7,118.9 567,118.6 567,118.3 L567,2.9 C567,2.6 566.7,2.3 566.4,2.3 L541,2.3 Z" id="Shape"></path>
+ <path d="M325.6,2.3 L294.5,2.3 L277.8,2.3 L246.7,2.3 C246.4,2.3 246.1,2.6 246.1,2.9 L246.1,17.3 C246.1,17.6 246.4,17.9 246.7,17.9 L277.2,17.9 L277.2,118.3 C277.2,118.6 277.5,118.9 277.8,118.9 L294.5,118.9 C294.8,118.9 295.1,118.6 295.1,118.3 L295.1,17.9 L325.6,17.9 C325.9,17.9 326.2,17.6 326.2,17.3 L326.2,2.9 C326.2,2.6 326,2.3 325.6,2.3 Z" id="Shape"></path>
+ <path d="M424.1,118.9 L439.3,118.9 C439.7,118.9 440,118.5 439.9,118.1 L408.5,2.3 C408.4,2 408.2,1.9 407.9,1.9 L402.1,1.9 L391.9,1.9 L386.1,1.9 C385.8,1.9 385.6,2.1 385.5,2.3 L354.1,118.1 C354,118.5 354.3,118.9 354.7,118.9 L369.9,118.9 C370.2,118.9 370.4,118.7 370.5,118.5 L379.6,84.8 C379.7,84.5 379.9,84.4 380.2,84.4 L413.8,84.4 C414.1,84.4 414.3,84.6 414.4,84.8 L423.5,118.5 C423.6,118.7 423.9,118.9 424.1,118.9 Z M384.2,67.9 L396.4,22.8 C396.6,22.2 397.4,22.2 397.6,22.8 L409.8,67.9 C409.9,68.3 409.6,68.7 409.2,68.7 L384.8,68.7 C384.4,68.7 384.1,68.3 384.2,67.9 Z" id="Shape"></path>
+ <path d="M683.3,118.9 L698.5,118.9 C698.9,118.9 699.2,118.5 699.1,118.1 L667.7,2.3 C667.6,2 667.4,1.9 667.1,1.9 L661.3,1.9 L651.1,1.9 L645.3,1.9 C645,1.9 644.8,2.1 644.7,2.3 L613.3,118.1 C613.2,118.5 613.5,118.9 613.9,118.9 L629.1,118.9 C629.4,118.9 629.6,118.7 629.7,118.5 L638.8,84.8 C638.9,84.5 639.1,84.4 639.4,84.4 L673,84.4 C673.3,84.4 673.5,84.6 673.6,84.8 L682.7,118.5 C682.8,118.7 683,118.9 683.3,118.9 Z M643.4,67.9 L655.6,22.8 C655.8,22.2 656.6,22.2 656.8,22.8 L669,67.9 C669.1,68.3 668.8,68.7 668.4,68.7 L644,68.7 C643.6,68.7 643.3,68.3 643.4,67.9 Z" id="Shape"></path>
+ <path d="M149.8,101.8 L149.8,66 C149.8,65.7 150.1,65.4 150.4,65.4 L194.9,65.4 C195.2,65.4 195.5,65.1 195.5,64.8 L195.5,50.4 C195.5,50.1 195.2,49.8 194.9,49.8 L150.4,49.8 C150.1,49.8 149.8,49.5 149.8,49.2 L149.8,18.6 C149.8,18.3 150.1,18 150.4,18 L201,18 C201.3,18 201.6,17.7 201.6,17.4 L201.6,3 C201.6,2.7 201.3,2.4 201,2.4 L149.8,2.4 L132.5,2.4 C132.2,2.4 131.9,2.7 131.9,3 L131.9,18 L131.9,49.9 L131.9,65.5 L131.9,102.5 L131.9,118.3 C131.9,118.6 132.2,118.9 132.5,118.9 L149.8,118.9 L203.1,118.9 C203.4,118.9 203.7,118.6 203.7,118.3 L203.7,103.1 C203.7,102.8 203.4,102.5 203.1,102.5 L150.3,102.5 C150,102.4 149.8,102.2 149.8,101.8 Z" id="Shape"></path>
+ <path d="M949.3,117.9 L891.5,58.2 C891.3,58 891.3,57.6 891.5,57.4 L943.5,3.4 C943.9,3 943.6,2.4 943.1,2.4 L921.8,2.4 C921.6,2.4 921.5,2.5 921.4,2.6 L877.3,48.4 C876.9,48.8 876.3,48.5 876.3,48 L876.3,3 C876.3,2.7 876,2.4 875.7,2.4 L859,2.4 C858.7,2.4 858.4,2.7 858.4,3 L858.4,118.4 C858.4,118.7 858.7,119 859,119 L875.7,119 C876,119 876.3,118.7 876.3,118.4 L876.3,67.6 C876.3,67.1 877,66.8 877.3,67.2 L927.3,118.8 C927.4,118.9 927.6,119 927.7,119 L949,119 C949.4,118.9 949.7,118.2 949.3,117.9 Z" id="Shape"></path>
+ </g>
+ <g id="Group" stroke-linecap="round" stroke-linejoin="round">
+ <polygon id="Shape" stroke="#E17726" fill="#E17726" points="246.1 0.2 145 75.2 163.8 31"></polygon>
+ <g transform="translate(2.000000, 0.000000)" fill="#E27625" id="Shape" stroke="#E27625">
+ <polygon points="10.9 0.2 111.1 75.9 93.2 31"></polygon>
+ <polygon points="207.7 174.1 180.8 215.3 238.4 231.2 254.9 175"></polygon>
+ <polygon points="0.2 175 16.6 231.2 74.1 215.3 47.3 174.1"></polygon>
+ <polygon points="71 104.5 55 128.7 112 131.3 110.1 69.8"></polygon>
+ <polygon points="184 104.5 144.3 69.1 143 131.3 200 128.7"></polygon>
+ <polygon points="74.1 215.3 108.6 198.6 78.9 175.4"></polygon>
+ <polygon points="146.4 198.6 180.8 215.3 176.1 175.4"></polygon>
+ </g>
+ <g transform="translate(76.000000, 198.000000)" fill="#D5BFB2" id="Shape" stroke="#D5BFB2">
+ <polygon points="106.8 17.3 72.4 0.6 75.2 23 74.9 32.5"></polygon>
+ <polygon points="0.1 17.3 32.1 32.5 31.9 23 34.6 0.6"></polygon>
+ </g>
+ <polygon id="Shape" stroke="#233447" fill="#233447" points="108.7 160.6 80.1 152.2 100.3 142.9"></polygon>
+ <polygon id="Shape" stroke="#233447" fill="#233447" points="150.3 160.6 158.7 142.9 179 152.2"></polygon>
+ <g transform="translate(49.000000, 128.000000)" fill="#CC6228" id="Shape" stroke="#CC6228">
+ <polygon points="27.1 87.3 32.1 46.1 0.3 47"></polygon>
+ <polygon points="128.9 46.1 133.8 87.3 160.7 47"></polygon>
+ <polygon points="153 0.7 96 3.3 101.3 32.6 109.7 14.9 130 24.2"></polygon>
+ <polygon points="31.1 24.2 51.3 14.9 59.7 32.6 65 3.3 8 0.7"></polygon>
+ </g>
+ <g transform="translate(57.000000, 128.000000)" fill="#E27525" id="Shape" stroke="#E27525">
+ <polygon points="0 0.7 23.9 47.4 23.1 24.2"></polygon>
+ <polygon points="122 24.2 121.1 47.4 145 0.7"></polygon>
+ <polygon points="57 3.3 51.7 32.6 58.4 67.2 59.9 21.6"></polygon>
+ <polygon points="88 3.3 85.2 21.5 86.6 67.2 93.3 32.6"></polygon>
+ </g>
+ <polygon id="Shape" stroke="#F5841F" fill="#F5841F" points="150.3 160.6 143.6 195.2 148.4 198.6 178.1 175.4 179 152.2"></polygon>
+ <polygon id="Shape" stroke="#F5841F" fill="#F5841F" points="80.1 152.2 80.9 175.4 110.6 198.6 115.4 195.2 108.7 160.6"></polygon>
+ <polygon id="Shape" stroke="#C0AC9D" fill="#C0AC9D" points="150.9 230.5 151.2 221 148.6 218.8 110.4 218.8 107.9 221 108.1 230.5 76.1 215.3 87.3 224.5 110 240.2 148.9 240.2 171.7 224.5 182.8 215.3"></polygon>
+ <polygon id="Shape" stroke="#161616" fill="#161616" points="148.4 198.6 143.6 195.2 115.4 195.2 110.6 198.6 107.9 221 110.4 218.8 148.6 218.8 151.2 221"></polygon>
+ <g fill="#763E1A" id="Shape" stroke="#763E1A">
+ <polygon points="250.4 80.1 258.9 38.7 246.1 0.2 148.4 72.7 186 104.5 239.1 120 250.8 106.3 245.7 102.6 253.8 95.2 247.6 90.4 255.7 84.2"></polygon>
+ <polygon points="0.1 38.7 8.7 80.1 3.2 84.2 11.4 90.4 5.2 95.2 13.3 102.6 8.2 106.3 19.9 120 73 104.5 110.6 72.7 12.9 0.2"></polygon>
+ </g>
+ <polygon id="Shape" stroke="#F5841F" fill="#F5841F" points="239.1 120 186 104.5 202 128.7 178.1 175.4 209.7 175 256.9 175"></polygon>
+ <polygon id="Shape" stroke="#F5841F" fill="#F5841F" points="73 104.5 19.9 120 2.2 175 49.3 175 80.9 175.4 57 128.7"></polygon>
+ <polygon id="Shape" stroke="#F5841F" fill="#F5841F" points="145 131.3 148.4 72.7 163.8 31 95.2 31 110.6 72.7 114 131.3 115.3 149.7 115.4 195.2 143.6 195.2 143.7 149.7"></polygon>
+ </g>
+ </g>
+ </g>
+</svg> \ No newline at end of file
diff --git a/app/images/metrics-chart.svg b/app/images/metrics-chart.svg
new file mode 100644
index 000000000..e18934244
--- /dev/null
+++ b/app/images/metrics-chart.svg
@@ -0,0 +1,8 @@
+<svg width="95" height="82" viewBox="0 0 95 82" fill="none" xmlns="http://www.w3.org/2000/svg">
+<rect x="0.848145" y="35.7778" width="17.7707" height="27.2222" rx="4" fill="#C4C4C4"/>
+<rect x="24.542" y="17.8889" width="17.7707" height="45.1111" rx="4" fill="#C4C4C4"/>
+<rect x="48.2363" width="17.7707" height="63" rx="4" fill="#C4C4C4"/>
+<ellipse cx="74.5222" cy="61.0554" rx="19.6218" ry="20.6111" fill="white"/>
+<path d="M74.2257 45.1111C66.0108 45.1111 59.3428 52.1153 59.3428 60.7444C59.3428 69.3736 66.0108 76.3777 74.2257 76.3777C82.4407 76.3777 89.1086 69.3736 89.1086 60.7444C89.1086 52.1153 82.4407 45.1111 74.2257 45.1111ZM82.4407 70.4382C81.8005 70.046 81.1071 69.7098 80.4136 69.4296C79.8268 69.2055 79.2934 68.9253 78.7066 68.7012C77.1063 67.9167 76.8929 67.3564 76.8929 67.3003C76.8929 67.2443 76.8929 67.1883 76.8929 67.1322V67.0762V66.3478C76.8929 66.3478 79.8802 66.4598 81.3204 64.9469C81.3204 64.9469 79.24 64.3306 79.6134 60.3522C79.9868 56.3738 79.1333 52.8997 76.1461 53.2359C76.1461 53.2359 74.8125 51.5549 72.1986 52.6196C71.2918 52.9558 68.8913 53.9083 68.998 59.3436C69.1047 64.8349 67.131 64.8349 67.131 64.8349C67.131 64.8349 68.1445 66.4038 71.6119 66.3478V66.684C71.6119 66.796 71.6119 66.9641 71.5585 67.0762C71.5585 67.1322 71.5585 67.1883 71.5585 67.2443C71.5585 67.3564 71.3451 67.9167 69.7448 68.6451C69.158 68.9253 68.6246 69.1494 68.0378 69.3736C67.3443 69.6537 66.6509 69.9899 66.0108 70.3822C63.4503 68.0288 61.8499 64.5547 61.8499 60.6884C61.8499 53.5161 67.3977 47.6886 74.2257 47.6886C81.0537 47.6886 86.6015 53.5161 86.6015 60.6884C86.6015 64.6107 85.0012 68.0848 82.4407 70.4382Z" fill="#C4C4C4"/>
+<path d="M74.5518 64.0034H76.1523V65.5557H74.5518V64.0034ZM72.5913 60.1362C72.6343 59.1157 72.9906 58.3924 73.6602 57.9663C74.0827 57.6942 74.6019 57.5581 75.2178 57.5581C76.027 57.5581 76.6984 57.7515 77.2319 58.1382C77.769 58.5249 78.0376 59.0978 78.0376 59.8569C78.0376 60.3224 77.9212 60.7145 77.6885 61.0332C77.5524 61.2266 77.291 61.4736 76.9043 61.7744L76.5229 62.0698C76.3153 62.231 76.1774 62.4189 76.1094 62.6338C76.0664 62.7699 76.0431 62.9811 76.0396 63.2676H74.5894C74.6108 62.6624 74.6681 62.2453 74.7612 62.0161C74.8543 61.7834 75.0942 61.5166 75.481 61.2158L75.873 60.9097C76.002 60.813 76.1058 60.7074 76.1846 60.5928C76.3278 60.3958 76.3994 60.1792 76.3994 59.9429C76.3994 59.6707 76.3188 59.4237 76.1577 59.2017C76.0002 58.9761 75.7101 58.8633 75.2876 58.8633C74.8722 58.8633 74.5768 59.0011 74.4014 59.2769C74.2295 59.5526 74.1436 59.839 74.1436 60.1362H72.5913Z" fill="white"/>
+</svg>
diff --git a/app/images/single-arrow.svg b/app/images/single-arrow.svg
new file mode 100644
index 000000000..399da72d6
--- /dev/null
+++ b/app/images/single-arrow.svg
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="6px" height="8px" viewBox="0 0 6 8" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!-- Generator: Sketch 50.2 (55047) - http://www.bohemiancoding.com/sketch -->
+ <title>previous/next</title>
+ <desc>Created with Sketch.</desc>
+ <defs></defs>
+ <g id="Action-Screens" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+ <polygon id="previous/next" fill="#5F5C5D" points="6 0 6 8 0 4"></polygon>
+ </g>
+</svg> \ No newline at end of file
diff --git a/app/images/sleuth.svg b/app/images/sleuth.svg
new file mode 100644
index 000000000..f4ac8c787
--- /dev/null
+++ b/app/images/sleuth.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#66757F" d="M33 36v-1c0-3.313-2.687-6-6-6H9c-3.313 0-6 2.687-6 6v1h30z"/><path fill="#EF9645" d="M12 27.482C13.672 29.057 15.746 30 18 30s4.327-.944 6-2.518V26H12v1.482z"/><path fill="#66757F" d="M26.75 20.435c1.188.208 2.619.129 2.416.917-.479 1.854-2.604 1.167-2.979 1.188-.375.02.563-2.105.563-2.105z"/><path fill="#292F33" d="M27.062 20.645c1.875.25 2.541.416 1.166.958-.772.305-2.243 4.803-3.331 4.118-1.087-.685 2.165-5.076 2.165-5.076z"/><path fill="#66757F" d="M9.255 20.435c-1.188.208-2.619.129-2.416.917.479 1.854 2.604 1.167 2.979 1.188.375.02-.563-2.105-.563-2.105z"/><path fill="#292F33" d="M8.943 20.645c-1.875.25-2.541.416-1.166.958.772.305 2.243 4.803 3.331 4.118 1.088-.685-2.165-5.076-2.165-5.076z"/><path fill="#FFAC33" d="M8.055 11.031c-1.953 0-2.305 3.164-.664 3.594 0 0-1.367 3.32 1.953 3.32-.547-1.68-1.562-4.414-.781-6.406m19.38-.508c1.953 0 2.305 3.164.664 3.594 0 0 1.367 3.32-1.953 3.32.547-1.68 1.562-4.414.781-6.406"/><ellipse fill="#FFDC5D" cx="18" cy="15.5" rx="10" ry="12.5"/><path fill="#662113" d="M14 17c-.552 0-1-.448-1-1v-1c0-.552.448-1 1-1s1 .448 1 1v1c0 .552-.448 1-1 1zm8 0c-.553 0-1-.448-1-1v-1c0-.552.447-1 1-1s1 .448 1 1v1c0 .552-.447 1-1 1z"/><path fill="#C1694F" d="M19 20.5c0 .276-.224.5-.5.5h-1c-.276 0-.5-.224-.5-.5s.224-.5.5-.5h1c.276 0 .5.224.5.5z"/><path fill-rule="evenodd" clip-rule="evenodd" fill="#292F33" d="M7.657 14.788c.148.147.888.591 1.036 1.034.148.443.445 2.954 1.333 3.693.916.762 4.37.478 5.032.149 1.48-.738 1.662-2.798 1.924-3.842.148-.591 1.036-.591 1.036-.591s.888 0 1.036.591c.262 1.044.444 3.104 1.924 3.841.662.33 4.116.614 5.034-.147.887-.739 1.183-3.25 1.331-3.694.146-.443.888-.886 1.035-1.034.148-.148.148-.739 0-.887-.296-.295-3.788-.559-7.548-.148-.75.082-1.035.295-2.812.295-1.776 0-2.062-.214-2.812-.295-3.759-.411-7.252-.148-7.548.148-.149.148-.149.74-.001.887z"/><path fill="#66757F" d="M7.858 8.395S9.217-.506 13.79.023c3.512.406 4.89.825 7.833.097 1.947-.482 4.065 1.136 5.342 4.379.816 2.068 1.224 4.041 1.224 4.041s3.938-.385 4.165 1.732c.228 2.117-4.354 4.716-15.889 4.716C10 14.987 3.33 12.63 3.013 10.657c-.317-1.973 4.845-2.262 4.845-2.262z"/><path fill="#292F33" d="M8.125 7.15s-.27 1.104-.406 1.871c-.136.768.226 1.296 2.705 1.824 3.287.7 10.679.692 15.058-.383 1.759-.432 2.886-.72 2.751-1.583-.167-1.068-.196-1.066-.541-2.208 0 0-1.477.502-3.427.96-2.66.624-9.964.911-13.481.144-1.874-.41-2.659-.625-2.659-.625zm-.136 13.953c-.354.145 2.921 1.378 7.48 1.458 4.771.084 6.234.39 5.146 1.459-1.146 1.125-.852 2.894-.771 3.418.081.524 2.047 1.916 2.208 2.56.161.645-1.229 5.961-1.229 5.961l-8.729-.252c-2.565-8.844-2.883-8.501-4.105-13.604-.241-1.008 0-1 0-1z"/><path fill="#66757F" d="M6.989 21.144c-.354.146 2.921 1.378 7.48 1.458 4.771.084 6.234.39 5.146 1.459-1.146 1.125-.664 2.894-.583 3.418.081.524 1.859 1.916 2.021 2.561.16.644-1.231 5.96-1.231 5.96l-8.729-.252c-2.565-8.844-2.883-8.501-4.105-13.604-.24-1.008.001-1 .001-1z"/><path fill="#292F33" d="M28.052 21.103c.354.145-2.921 1.378-7.479 1.458-4.771.084-6.234.39-5.146 1.459 1.146 1.125 2.976 2.892 2.896 3.416-.081.524-4.172 1.918-4.333 2.562-.161.645 1.229 5.961 1.229 5.961l8.729-.252c2.565-8.844 2.883-8.501 4.104-13.604.241-1.008 0-1 0-1z"/><path fill="#66757F" d="M28.958 21.103c.354.145-2.921 1.378-7.479 1.458-4.771.084-6.234.39-5.146 1.459 1.146 1.125 2.977 2.892 2.896 3.416-.081.524-4.172 1.918-4.333 2.562-.161.645 1.229 5.961 1.229 5.961l8.657.01c2.565-8.844 2.955-8.763 4.177-13.866.24-1.008-.001-1-.001-1z"/></svg>
diff --git a/app/images/thin-plus.svg b/app/images/thin-plus.svg
new file mode 100644
index 000000000..f46c72a4a
--- /dev/null
+++ b/app/images/thin-plus.svg
@@ -0,0 +1,4 @@
+<svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
+<rect y="18" width="40" height="4" rx="2" fill="#979797"/>
+<rect x="18" width="4" height="40" rx="2" fill="#979797"/>
+</svg>
diff --git a/app/images/wyre.svg b/app/images/wyre.svg
new file mode 100644
index 000000000..a5209329d
--- /dev/null
+++ b/app/images/wyre.svg
@@ -0,0 +1,9 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="72" height="24" viewBox="0 0 72 24">
+ <g fill="#000000" fill-rule="evenodd">
+ <path d="M40.2451269,20.4956914 C42.4518577,20.8032343 43.7956269,20.4027771 44.8365115,19.3728343 C45.49005,18.7265486 45.9867808,17.96952 46.4253577,17.1740914 C48.2011269,13.9553486 52.4737038,6.17900571 52.4737038,6.17900571 L49.3957038,6.17900571 L46.1955115,12.5492914 L45.1968577,6.17900571 L41.9257038,6.17900571 L41.9257038,6.32712 C41.9257038,6.32712 43.03305,12.15912 43.6014346,15.1478057 C43.6862423,15.5931771 43.7738192,16.7393486 42.9603577,17.4806057 C42.5051654,17.89512 41.8478192,18.2396914 40.71555,18.0562629 L40.2451269,20.4956914 Z"/>
+ <polygon points="37.793 6.179 34.817 12.868 34.737 12.861 34.334 6.345 31.093 6.345 27.934 12.869 27.853 12.842 27.718 6.179 24.617 6.179 25.234 16.864 28.59 16.864 31.842 9.892 31.918 9.905 32.434 16.864 35.812 16.864 40.698 6.179"/>
+ <path d="M55.7303192 16.8643543L52.4737038 16.8643543C53.1992423 13.2612686 53.8922423 9.77921143 54.6174346 6.17886857L57.1422808 6.17886857 57.1422808 8.14481143C57.4801269 7.33258286 57.9412038 6.57624 58.7235115 6.24435429 59.4909346 5.91864 60.6772038 5.93578286 61.8866654 6.30366857 61.4103577 7.21738286 61.0472423 8.03029714 60.5314731 9.01944 60.0662423 8.92824 59.6477423 8.81166857 59.2216269 8.76984 58.2645115 8.67555429 57.5694346 9.05372571 57.2426654 9.95269714 57.01455 10.5804686 56.8726269 11.2452686 56.7348577 11.9011543 56.3893962 13.5444686 56.0685115 15.1918971 55.7303192 16.8643543M66.1421769 8.72009143C66.6077538 8.15952 67.4461385 7.84957714 68.0685231 8.04260571 68.8276385 8.27814857 69.0768692 9.11163429 68.5375615 9.69346286 68.3544462 9.89094857 68.0989846 10.0544914 67.8445615 10.14912 67.0612154 10.4405486 66.2505231 10.4316343 65.3976 10.2862629 65.5419462 9.66672 65.7704077 9.16752 66.1421769 8.72009143L66.1421769 8.72009143zM70.3102154 14.2082057C70.3102154 14.2082057 70.2828692 14.2078629 70.2011769 14.2078629 68.9543308 14.6816914 67.5707538 14.8058057 66.6171 14.5380343 65.5634077 14.2421486 64.9555615 13.33392 65.1469846 12.3080914 68.2872923 12.5696914 69.6203308 11.9775771 70.3358308 11.5538057 72.2742923 10.4055771 72.7672154 7.33220571 70.2378692 6.42226286 68.0155615 5.62272 64.9199077 6.00294857 63.4574077 7.75769143 62.1247154 9.35677714 61.7335615 11.1152914 61.9377923 13.0726629 62.0911385 14.5452343 63.1105615 16.6562057 66.4422923 16.9856914 68.4565615 17.1848914 69.7459846 16.67232 69.8397923 16.63392L70.3102154 14.2082057zM4.97682692 23.9956457L12.3824423 23.9956457C13.8428654 23.9956457 15.15825 23.1210171 15.7114038 21.7825029L19.7060192 12.11736 15.2226346 17.7649029C14.5431346 18.6614743 13.5147115 19.2443314 12.30525 19.2443314L6.94055769 19.2443314 4.97682692 23.9956457z"/>
+ <path d="M2.52183462,18.0546514 L9.92745,18.0546514 C11.3878731,18.0546514 12.7032577,17.1800229 13.2564115,15.8415086 L17.2513731,6.17670857 L12.7676423,11.8239086 C12.0881423,12.72048 11.0597192,13.3033371 9.85025769,13.3033371 L4.48556538,13.3033371 L2.52183462,18.0546514 Z"/>
+ <path d="M7.39111154,0.22872 L14.7967269,0.22872 L10.8014192,9.89489143 C10.2482654,11.2334057 8.93288077,12.1080343 7.47245769,12.1080343 L0.0668423077,12.1080343 L4.06215,2.44186286 C4.61530385,1.10334857 5.93068846,0.22872 7.39111154,0.22872"/>
+ </g>
+</svg>
diff --git a/app/manifest.json b/app/manifest.json
index 2dd8429af..6837adf61 100644
--- a/app/manifest.json
+++ b/app/manifest.json
@@ -1,7 +1,7 @@
{
"name": "__MSG_appName__",
"short_name": "__MSG_appName__",
- "version": "5.0.2",
+ "version": "6.3.0",
"manifest_version": 2,
"author": "https://metamask.io",
"description": "__MSG_appDescription__",
@@ -52,6 +52,14 @@
],
"run_at": "document_start",
"all_frames": true
+ },
+ {
+ "matches": [
+ "*://connect.trezor.io/*/popup.html"
+ ],
+ "js": [
+ "vendor/trezor/content-script.js"
+ ]
}
],
"permissions": [
diff --git a/app/phishing.html b/app/phishing.html
index 309021dc2..1e1c4d11c 100644
--- a/app/phishing.html
+++ b/app/phishing.html
@@ -1,70 +1,64 @@
-<!DOCTYPE HTML>
-
-<html>
-
+<!doctype html>
+<html lang="en">
<head>
- <title>Ethereum Phishing Detection - MetMask</title>
-
+ <title>Ethereum Phishing Detection - MetaMask</title>
+ <script src="./phishing-detect.js"></script>
+ <link href="fonts/index.css" type="text/css" rel="stylesheet">
<style>
- body {
- background: #c50000;
- padding: 50px;
- display: flex;
- justify-content: center;
- font-family: sans-serif;
- }
-
- .centered {
- display: flex;
- flex-direction: column;
- justify-content: center;
- color: white;
- max-width: 600px;
- }
-
- a {
- color: white;
- cursor: pointer;
- text-decoration: underline;
- }
+ * { margin: 0; padding: 0; box-sizing: border-box; }
+ body, html { background-color: rgb(217, 88, 70);
+ display: flex; flex-direction: column;
+ justify-content: center; align-items: center;
+ font-family: Roboto, Arial, sans-serif;
+ width: 100vw; min-height: 100vh; }
+ .content { display: flex; flex-direction: column; align-items: center;
+ width: 80%;
+ background-color: white; box-shadow: 0 0 15px #737373; }
+ .content__header { display: flex; flex-direction: column; align-items: center; justify-content: center;
+ width: 100%;
+ color: rgb(217, 88, 70); border-bottom: 1px solid rgb(212, 212, 212);
+ padding: 2em; }
+ .content__header h1 { font-size: 24px; font-weight: normal; }
+ .content__header h1 i { margin-right: 0.25em; }
+ .content__header img { margin-bottom: 3em; width: 160px; }
+ .content__body { background-color: rgb(245, 245, 245); font-size: 12pt; }
+ .content__body p { margin: 2em; }
+ .content__body p a { text-decoration: underline; color: inherit; cursor: pointer; }
</style>
-
-
- <script>
- (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
- (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
- m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
- })(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
- ga('create', 'UA-37075177-6', 'auto');
- ga('send', 'pageview');
- //Send referral data to EAL
- (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
- (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
- m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
- })(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
- ga('create', 'UA-68598031-1', 'auto' {'allowLinker':true});
- ga('send', 'pageview');
- ga('require', 'linker');
- ga('linker:autoLink', ['metamask.io'], false, true);
- </script>
- <script src="phishing-detect.js"></script>
</head>
-
<body>
- <div class="centered">
-
- <img src="/images/ethereum-metamask-chrome.png" style="width:100%">
- <h3>ATTENTION</h3>
- <p>MetaMask believes this domain could currently compromise your security and has prevented you from interacting with it.</p>
- <p>This is because the site tested positive on the <a href="https://github.com/metamask/eth-phishing-detect">Ethereum Phishing Detector</a>. This includes outright malicious websites and legitimate websites that have been compromised by a malicious actor.</p>
- <p id="esdbLink"></p>
- <p>You can turn MetaMask off to interact with this site, but it is advised not to.</p>
- <p>
- If you think this domain is incorrectly flagged or if a blocked legitimate website has resolved its security issues,
- <a href="https://github.com/metamask/eth-phishing-detect/issues/new">please file an issue</a>. If you believe this website
- is safe and understand the risks involved, you can <a id="unsafe-continue">visit this unsafe website at your own risk</a>.
- </p>
-
+ <div class="content">
+ <div class="content__header">
+ <img src="./images/info-logo.png" alt="">
+ <h1>
+ <i class="fa fa-exclamation-circle" aria-hidden="true"></i>
+ Ethereum Phishing Detection
+ </h1>
+ </div>
+ <div class="content__body">
+ <p>
+ This domain is currently on the MetaMask domain warning list. This means that based on information available to us,
+ MetaMask believes this domain could currently compromise your security and, as an added safety feature, MetaMask
+ has restricted access to the site. To override this, please read the rest of this warning for instructions on how to continue at your own risk.
+ </p>
+ <p>
+ There are many reasons sites can appear on our warning list, and our warning list compiles from other widely used industry lists.
+ Such reasons can include known fraud or security risks, such as domains that test positive on the
+ <a href="https://github.com/metamask/eth-phishing-detect">Ethereum Phishing Detector</a>.
+ Domains on these warning lists may include outright malicious websites and legitimate websites that have been compromised by a malicious actor.
+ </p>
+ <p>To read more about this site <a id="esdbLink">please review the domain on Etherscam</a>.</p>
+ <p>
+ Note that this warning list is compiled on a voluntary basis. This list may be inaccurate or incomplete.
+ Just because a domain does not appear on this list is not an implicit guarantee of that domain's safety.
+ As always, your transactions are your own responsibility. If you wish to interact with any domain on our warning list,
+ you can do so by <a id="unsafe-continue">continuing at your own risk</a>.
+ </p>
+ <p>
+ If you think this domain is incorrectly flagged or if a blocked legitimate website has resolved its security issues,
+ <a href="https://github.com/metamask/eth-phishing-detect/issues/new">please file an issue</a>.
+ </p>
+ </div>
</div>
</body>
</html>
diff --git a/app/scripts/background.js b/app/scripts/background.js
index 078e84928..7fea3c8c6 100644
--- a/app/scripts/background.js
+++ b/app/scripts/background.js
@@ -41,6 +41,7 @@ const {
const firstTimeState = Object.assign({}, rawFirstTimeState, global.METAMASK_TEST_CONFIG)
const STORAGE_KEY = 'metamask-config'
+const METAMASK_DEBUG = process.env.METAMASK_DEBUG
log.setDefaultLevel(process.env.METAMASK_DEBUG ? 'debug' : 'warn')
@@ -101,7 +102,6 @@ setupMetamaskMeshMetrics()
* @property {boolean} isInitialized - Whether the first vault has been created.
* @property {boolean} isUnlocked - Whether the vault is currently decrypted and accounts are available for selection.
* @property {boolean} isAccountMenuOpen - Represents whether the main account selection UI is currently displayed.
- * @property {boolean} isMascara - True if the current context is the extensionless MetaMascara project.
* @property {boolean} isPopup - Returns true if the current view is an externally-triggered notification.
* @property {string} rpcTarget - DEPRECATED - The URL of the current RPC provider.
* @property {Object} identities - An object matching lower-case hex addresses to Identity objects with "address" and "name" (nickname) keys.
@@ -266,7 +266,6 @@ function setupController (initState, initLangCode) {
platform,
encryptor: isEdge ? new EdgeEncryptor() : undefined,
})
- global.metamaskController = controller
const provider = controller.provider
setupEnsIpfsResolver({ provider })
@@ -332,6 +331,10 @@ function setupController (initState, initLangCode) {
[ENVIRONMENT_TYPE_FULLSCREEN]: true,
}
+ const metamaskBlacklistedPorts = [
+ 'trezor-connect',
+ ]
+
const isClientOpenStatus = () => {
return popupIsOpen || Boolean(Object.keys(openMetamaskTabsIDs).length) || notificationIsOpen
}
@@ -352,6 +355,10 @@ function setupController (initState, initLangCode) {
const processName = remotePort.name
const isMetaMaskInternalProcess = metamaskInternalProcessHash[processName]
+ if (metamaskBlacklistedPorts.includes(remotePort.name)) {
+ return false
+ }
+
if (isMetaMaskInternalProcess) {
const portStream = new PortStream(remotePort)
// communication with popup
@@ -406,18 +413,20 @@ function setupController (initState, initLangCode) {
controller.messageManager.on('updateBadge', updateBadge)
controller.personalMessageManager.on('updateBadge', updateBadge)
controller.typedMessageManager.on('updateBadge', updateBadge)
+ controller.providerApprovalController.store.on('update', updateBadge)
/**
* Updates the Web Extension's "badge" number, on the little fox in the toolbar.
* The number reflects the current number of pending transactions or message signatures needing user approval.
*/
function updateBadge () {
- var label = ''
- var unapprovedTxCount = controller.txController.getUnapprovedTxCount()
- var unapprovedMsgCount = controller.messageManager.unapprovedMsgCount
- var unapprovedPersonalMsgs = controller.personalMessageManager.unapprovedPersonalMsgCount
- var unapprovedTypedMsgs = controller.typedMessageManager.unapprovedTypedMessagesCount
- var count = unapprovedTxCount + unapprovedMsgCount + unapprovedPersonalMsgs + unapprovedTypedMsgs
+ let label = ''
+ const unapprovedTxCount = controller.txController.getUnapprovedTxCount()
+ const unapprovedMsgCount = controller.messageManager.unapprovedMsgCount
+ const unapprovedPersonalMsgs = controller.personalMessageManager.unapprovedPersonalMsgCount
+ const unapprovedTypedMsgs = controller.typedMessageManager.unapprovedTypedMessagesCount
+ const pendingProviderRequests = controller.providerApprovalController.store.getState().providerRequests.length
+ const count = unapprovedTxCount + unapprovedMsgCount + unapprovedPersonalMsgs + unapprovedTypedMsgs + pendingProviderRequests
if (count) {
label = String(count)
}
@@ -440,6 +449,7 @@ function triggerUi () {
const currentlyActiveMetamaskTab = Boolean(tabs.find(tab => openMetamaskTabsIDs[tab.id]))
if (!popupIsOpen && !currentlyActiveMetamaskTab && !notificationIsOpen) {
notificationManager.showPopup()
+ notificationIsOpen = true
}
})
}
@@ -452,7 +462,7 @@ function openPopup () {
triggerUi()
return new Promise(
(resolve) => {
- var interval = setInterval(() => {
+ const interval = setInterval(() => {
if (!notificationIsOpen) {
clearInterval(interval)
resolve()
@@ -461,3 +471,10 @@ function openPopup () {
}
)
}
+
+// On first install, open a new tab with MetaMask
+extension.runtime.onInstalled.addListener(({reason}) => {
+ if ((reason === 'install') && (!METAMASK_DEBUG)) {
+ platform.openExtensionInBrowser()
+ }
+})
diff --git a/app/scripts/contentscript.js b/app/scripts/contentscript.js
index ee38ee3ab..68b6117e5 100644
--- a/app/scripts/contentscript.js
+++ b/app/scripts/contentscript.js
@@ -7,7 +7,7 @@ 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 {Transform: TransformStream} = require('stream')
const inpageContent = fs.readFileSync(path.join(__dirname, '..', '..', 'dist', 'chrome', 'inpage.js')).toString()
const inpageSuffix = '//# sourceURL=' + extension.extension.getURL('inpage.js') + '\n'
@@ -158,7 +158,7 @@ function listenForProviderRequest () {
window.postMessage({ type: 'ethereumproviderlegacy', selectedAddress }, '*')
break
case 'reject-provider-request':
- window.postMessage({ type: 'ethereumprovider', error: 'User rejected provider access' }, '*')
+ window.postMessage({ type: 'ethereumprovider', error: 'User denied account authorization' }, '*')
break
case 'answer-is-approved':
window.postMessage({ type: 'ethereumisapproved', isApproved, caching }, '*')
@@ -170,6 +170,11 @@ function listenForProviderRequest () {
isEnabled = false
window.postMessage({ type: 'metamasksetlocked' }, '*')
break
+ case 'ethereum-ping-success':
+ window.postMessage({ type: 'ethereumpingsuccess' }, '*')
+ break
+ case 'ethereum-ping-error':
+ window.postMessage({ type: 'ethereumpingerror' }, '*')
}
})
}
@@ -247,7 +252,7 @@ function suffixCheck () {
* @returns {boolean} {@code true} if the documentElement is an html node or if none exists
*/
function documentElementCheck () {
- var documentElement = document.documentElement.nodeName
+ const documentElement = document.documentElement.nodeName
if (documentElement) {
return documentElement.toLowerCase() === 'html'
}
@@ -260,7 +265,7 @@ function documentElementCheck () {
* @returns {boolean} {@code true} if the current domain is blacklisted
*/
function blacklistedDomainCheck () {
- var blacklistedDomains = [
+ const blacklistedDomains = [
'uscourts.gov',
'dropbox.com',
'webbyawards.com',
@@ -271,8 +276,8 @@ function blacklistedDomainCheck () {
'ani.gamer.com.tw',
'blueskybooking.com',
]
- var currentUrl = window.location.href
- var currentRegex
+ const currentUrl = window.location.href
+ let currentRegex
for (let i = 0; i < blacklistedDomains.length; i++) {
const blacklistedDomain = blacklistedDomains[i].replace('.', '\\.')
currentRegex = new RegExp(`(?:https?:\\/\\/)(?:(?!${blacklistedDomain}).)*$`)
@@ -302,6 +307,11 @@ function getSiteName (window) {
return siteName.content
}
+ const metaTitle = document.querySelector('head > meta[name="title"]')
+ if (metaTitle) {
+ return metaTitle.content
+ }
+
return document.title
}
diff --git a/app/scripts/controllers/address-book.js b/app/scripts/controllers/address-book.js
deleted file mode 100644
index 4697e074c..000000000
--- a/app/scripts/controllers/address-book.js
+++ /dev/null
@@ -1,98 +0,0 @@
-const ObservableStore = require('obs-store')
-const extend = require('xtend')
-
-class AddressBookController {
-
-
- /**
- * Controller in charge of managing the address book functionality from the
- * recipients field on the send screen. Manages a history of all saved
- * addresses and all currently owned addresses.
- *
- * @typedef {Object} AddressBookController
- * @param {object} opts Overrides the defaults for the initial state of this.store
- * @property {array} opts.initState initializes the the state of the AddressBookController. Can contain an
- * addressBook property to initialize the addressBook array
- * @property {object} opts.preferencesStore the {@code PreferencesController} store
- * @property {object} store The the store of the current users address book
- * @property {array} store.addressBook An array of addresses and nicknames. These are set by the user when sending
- * to a new address.
- *
- */
- constructor ({initState, preferencesStore}) {
- this.store = new ObservableStore(extend({
- addressBook: [],
- }, initState))
- this._preferencesStore = preferencesStore
- }
-
- //
- // PUBLIC METHODS
- //
-
- /**
- * Sets a new address book in store by accepting a new address and nickname.
- *
- * @param {string} address A hex address of a new account that the user is sending to.
- * @param {string} name The name the user wishes to associate with the new account
- * @returns {Promise<void>} Promise resolves with undefined
- *
- */
- setAddressBook (address, name) {
- return this._addToAddressBook(address, name)
- .then((addressBook) => {
- this.store.updateState({
- addressBook,
- })
- return Promise.resolve()
- })
- }
-
- /**
- * Performs the logic to add the address and name into the address book. The pushed object is an object of two
- * fields. Current behavior does not set an upper limit to the number of addresses.
- *
- * @private
- * @param {string} address A hex address of a new account that the user is sending to.
- * @param {string} name The name the user wishes to associate with the new account
- * @returns {Promise<array>} Promises the updated addressBook array
- *
- */
- _addToAddressBook (address, name) {
- const addressBook = this._getAddressBook()
- const {identities} = this._preferencesStore.getState()
-
- const addressBookIndex = addressBook.findIndex((element) => { return element.address.toLowerCase() === address.toLowerCase() || element.name === name })
- const identitiesIndex = Object.keys(identities).findIndex((element) => { return element.toLowerCase() === address.toLowerCase() })
- // trigger this condition if we own this address--no need to overwrite.
- if (identitiesIndex !== -1) {
- return Promise.resolve(addressBook)
- // trigger this condition if we've seen this address before--may need to update nickname.
- } else if (addressBookIndex !== -1) {
- addressBook.splice(addressBookIndex, 1)
- } else if (addressBook.length > 15) {
- addressBook.shift()
- }
-
-
- addressBook.push({
- address: address,
- name,
- })
- return Promise.resolve(addressBook)
- }
-
- /**
- * Internal method to get the address book. Current persistence behavior should not require that this method be
- * called from the UI directly.
- *
- * @private
- * @returns {array} The addressBook array from the store.
- *
- */
- _getAddressBook () {
- return this.store.getState().addressBook
- }
-}
-
-module.exports = AddressBookController
diff --git a/app/scripts/controllers/cached-balances.js b/app/scripts/controllers/cached-balances.js
new file mode 100644
index 000000000..925c45334
--- /dev/null
+++ b/app/scripts/controllers/cached-balances.js
@@ -0,0 +1,83 @@
+const ObservableStore = require('obs-store')
+const extend = require('xtend')
+
+/**
+ * @typedef {Object} CachedBalancesOptions
+ * @property {Object} accountTracker An {@code AccountTracker} reference
+ * @property {Function} getNetwork A function to get the current network
+ * @property {Object} initState The initial controller state
+ */
+
+/**
+ * Background controller responsible for maintaining
+ * a cache of account balances in local storage
+ */
+class CachedBalancesController {
+ /**
+ * Creates a new controller instance
+ *
+ * @param {CachedBalancesOptions} [opts] Controller configuration parameters
+ */
+ constructor (opts = {}) {
+ const { accountTracker, getNetwork } = opts
+
+ this.accountTracker = accountTracker
+ this.getNetwork = getNetwork
+
+ const initState = extend({
+ cachedBalances: {},
+ }, opts.initState)
+ this.store = new ObservableStore(initState)
+
+ this._registerUpdates()
+ }
+
+ /**
+ * Updates the cachedBalances property for the current network. Cached balances will be updated to those in the passed accounts
+ * if balances in the passed accounts are truthy.
+ *
+ * @param {Object} obj The the recently updated accounts object for the current network
+ * @returns {Promise<void>}
+ */
+ async updateCachedBalances ({ accounts }) {
+ const network = await this.getNetwork()
+ const balancesToCache = await this._generateBalancesToCache(accounts, network)
+ this.store.updateState({
+ cachedBalances: balancesToCache,
+ })
+ }
+
+ _generateBalancesToCache (newAccounts, currentNetwork) {
+ const { cachedBalances } = this.store.getState()
+ const currentNetworkBalancesToCache = { ...cachedBalances[currentNetwork] }
+
+ Object.keys(newAccounts).forEach(accountID => {
+ const account = newAccounts[accountID]
+
+ if (account.balance) {
+ currentNetworkBalancesToCache[accountID] = account.balance
+ }
+ })
+ const balancesToCache = {
+ ...cachedBalances,
+ [currentNetwork]: currentNetworkBalancesToCache,
+ }
+
+ return balancesToCache
+ }
+
+ /**
+ * Sets up listeners and subscriptions which should trigger an update of cached balances. These updates will
+ * happen when the current account changes. Which happens on block updates, as well as on network and account
+ * selections.
+ *
+ * @private
+ *
+ */
+ _registerUpdates () {
+ const update = this.updateCachedBalances.bind(this)
+ this.accountTracker.store.subscribe(update)
+ }
+}
+
+module.exports = CachedBalancesController
diff --git a/app/scripts/controllers/detect-tokens.js b/app/scripts/controllers/detect-tokens.js
index 62e639795..e6940c613 100644
--- a/app/scripts/controllers/detect-tokens.js
+++ b/app/scripts/controllers/detect-tokens.js
@@ -5,7 +5,8 @@ const { MAINNET } = require('./network/enums')
// By default, poll every 3 minutes
const DEFAULT_INTERVAL = 180 * 1000
const ERC20_ABI = [{'constant': true, 'inputs': [{'name': '_owner', 'type': 'address'}], 'name': 'balanceOf', 'outputs': [{'name': 'balance', 'type': 'uint256'}], 'payable': false, 'type': 'function'}]
-
+const SINGLE_CALL_BALANCES_ABI = require('single-call-balance-checker-abi')
+const SINGLE_CALL_BALANCES_ADDRESS = '0xb1f8e55c7f64d203c1400b9d8555d050f94adf39'
/**
* A controller that polls for token exchange
* rates based on a user's current token list
@@ -30,12 +31,27 @@ class DetectTokensController {
async detectNewTokens () {
if (!this.isActive) { return }
if (this._network.store.getState().provider.type !== MAINNET) { return }
+ const tokensToDetect = []
this.web3.setProvider(this._network._provider)
for (const contractAddress in contracts) {
if (contracts[contractAddress].erc20 && !(this.tokenAddresses.includes(contractAddress.toLowerCase()))) {
- this.detectTokenBalance(contractAddress)
+ tokensToDetect.push(contractAddress)
}
}
+
+ const ethContract = this.web3.eth.contract(SINGLE_CALL_BALANCES_ABI).at(SINGLE_CALL_BALANCES_ADDRESS)
+ ethContract.balances([this.selectedAddress], tokensToDetect, (error, result) => {
+ if (error) {
+ warn(`MetaMask - DetectTokensController single call balance fetch failed`, error)
+ return
+ }
+ tokensToDetect.forEach((tokenAddress, index) => {
+ const balance = result[index]
+ if (!balance.isZero()) {
+ this._preferences.addToken(tokenAddress, contracts[tokenAddress].symbol, contracts[tokenAddress].decimals)
+ }
+ })
+ })
}
/**
diff --git a/app/scripts/controllers/network/contract-addresses.js b/app/scripts/controllers/network/contract-addresses.js
new file mode 100644
index 000000000..5cd7da1d0
--- /dev/null
+++ b/app/scripts/controllers/network/contract-addresses.js
@@ -0,0 +1,11 @@
+const SINGLE_CALL_BALANCES_ADDRESS = '0xb1f8e55c7f64d203c1400b9d8555d050f94adf39'
+const SINGLE_CALL_BALANCES_ADDRESS_RINKEBY = '0x9f510b19f1ad66f0dcf6e45559fab0d6752c1db7'
+const SINGLE_CALL_BALANCES_ADDRESS_ROPSTEN = '0xb8e671734ce5c8d7dfbbea5574fa4cf39f7a54a4'
+const SINGLE_CALL_BALANCES_ADDRESS_KOVAN = '0xb1d3fbb2f83aecd196f474c16ca5d9cffa0d0ffc'
+
+module.exports = {
+ SINGLE_CALL_BALANCES_ADDRESS,
+ SINGLE_CALL_BALANCES_ADDRESS_RINKEBY,
+ SINGLE_CALL_BALANCES_ADDRESS_ROPSTEN,
+ SINGLE_CALL_BALANCES_ADDRESS_KOVAN,
+}
diff --git a/app/scripts/controllers/network/createBlockTracker.js b/app/scripts/controllers/network/createBlockTracker.js
new file mode 100644
index 000000000..6573b18a1
--- /dev/null
+++ b/app/scripts/controllers/network/createBlockTracker.js
@@ -0,0 +1,19 @@
+const BlockTracker = require('eth-block-tracker')
+
+/**
+ * Creates a block tracker that sends platform events on success and failure
+ */
+module.exports = function createBlockTracker (args, platform) {
+ const blockTracker = new BlockTracker(args)
+ blockTracker.on('latest', () => {
+ if (platform && platform.sendMessage) {
+ platform.sendMessage({ action: 'ethereum-ping-success' })
+ }
+ })
+ blockTracker.on('error', () => {
+ if (platform && platform.sendMessage) {
+ platform.sendMessage({ action: 'ethereum-ping-error' })
+ }
+ })
+ return blockTracker
+}
diff --git a/app/scripts/controllers/network/createInfuraClient.js b/app/scripts/controllers/network/createInfuraClient.js
index c70fa9e38..884b94db3 100644
--- a/app/scripts/controllers/network/createInfuraClient.js
+++ b/app/scripts/controllers/network/createInfuraClient.js
@@ -7,14 +7,14 @@ const createInflightMiddleware = require('eth-json-rpc-middleware/inflight-cache
const createBlockTrackerInspectorMiddleware = require('eth-json-rpc-middleware/block-tracker-inspector')
const providerFromMiddleware = require('eth-json-rpc-middleware/providerFromMiddleware')
const createInfuraMiddleware = require('eth-json-rpc-infura')
-const BlockTracker = require('eth-block-tracker')
+const createBlockTracker = require('./createBlockTracker')
module.exports = createInfuraClient
-function createInfuraClient ({ network }) {
- const infuraMiddleware = createInfuraMiddleware({ network })
+function createInfuraClient ({ network, platform }) {
+ const infuraMiddleware = createInfuraMiddleware({ network, maxAttempts: 5, source: 'metamask' })
const infuraProvider = providerFromMiddleware(infuraMiddleware)
- const blockTracker = new BlockTracker({ provider: infuraProvider })
+ const blockTracker = createBlockTracker({ provider: infuraProvider }, platform)
const networkMiddleware = mergeMiddleware([
createNetworkAndChainIdMiddleware({ network }),
@@ -28,7 +28,7 @@ function createInfuraClient ({ network }) {
return { networkMiddleware, blockTracker }
}
-function createNetworkAndChainIdMiddleware({ network }) {
+function createNetworkAndChainIdMiddleware ({ network }) {
let chainId
let netId
diff --git a/app/scripts/controllers/network/createJsonRpcClient.js b/app/scripts/controllers/network/createJsonRpcClient.js
index a8cbf2aaf..369dcd299 100644
--- a/app/scripts/controllers/network/createJsonRpcClient.js
+++ b/app/scripts/controllers/network/createJsonRpcClient.js
@@ -5,14 +5,14 @@ const createBlockCacheMiddleware = require('eth-json-rpc-middleware/block-cache'
const createInflightMiddleware = require('eth-json-rpc-middleware/inflight-cache')
const createBlockTrackerInspectorMiddleware = require('eth-json-rpc-middleware/block-tracker-inspector')
const providerFromMiddleware = require('eth-json-rpc-middleware/providerFromMiddleware')
-const BlockTracker = require('eth-block-tracker')
+const createBlockTracker = require('./createBlockTracker')
module.exports = createJsonRpcClient
-function createJsonRpcClient ({ rpcUrl }) {
+function createJsonRpcClient ({ rpcUrl, platform }) {
const fetchMiddleware = createFetchMiddleware({ rpcUrl })
const blockProvider = providerFromMiddleware(fetchMiddleware)
- const blockTracker = new BlockTracker({ provider: blockProvider })
+ const blockTracker = createBlockTracker({ provider: blockProvider }, platform)
const networkMiddleware = mergeMiddleware([
createBlockRefRewriteMiddleware({ blockTracker }),
diff --git a/app/scripts/controllers/network/createLocalhostClient.js b/app/scripts/controllers/network/createLocalhostClient.js
index 09b1d3c1c..36593dc70 100644
--- a/app/scripts/controllers/network/createLocalhostClient.js
+++ b/app/scripts/controllers/network/createLocalhostClient.js
@@ -3,14 +3,14 @@ const createFetchMiddleware = require('eth-json-rpc-middleware/fetch')
const createBlockRefRewriteMiddleware = require('eth-json-rpc-middleware/block-ref-rewrite')
const createBlockTrackerInspectorMiddleware = require('eth-json-rpc-middleware/block-tracker-inspector')
const providerFromMiddleware = require('eth-json-rpc-middleware/providerFromMiddleware')
-const BlockTracker = require('eth-block-tracker')
+const createBlockTracker = require('./createBlockTracker')
module.exports = createLocalhostClient
-function createLocalhostClient () {
+function createLocalhostClient ({ platform }) {
const fetchMiddleware = createFetchMiddleware({ rpcUrl: 'http://localhost:8545/' })
const blockProvider = providerFromMiddleware(fetchMiddleware)
- const blockTracker = new BlockTracker({ provider: blockProvider, pollingInterval: 1000 })
+ const blockTracker = createBlockTracker({ provider: blockProvider, pollingInterval: 1000 }, platform)
const networkMiddleware = mergeMiddleware([
createBlockRefRewriteMiddleware({ blockTracker }),
diff --git a/app/scripts/controllers/network/network.js b/app/scripts/controllers/network/network.js
index b459b8013..0c6327f6e 100644
--- a/app/scripts/controllers/network/network.js
+++ b/app/scripts/controllers/network/network.js
@@ -37,8 +37,9 @@ const defaultNetworkConfig = {
module.exports = class NetworkController extends EventEmitter {
- constructor (opts = {}) {
+ constructor (opts = {}, platform) {
super()
+ this.platform = platform
// parse options
const providerConfig = opts.provider || defaultProviderConfig
@@ -105,12 +106,18 @@ 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 { type } = this.providerStore.getState()
const ethQuery = new EthQuery(this._provider)
+ const initialNetwork = this.getNetworkState()
ethQuery.sendAsync({ method: 'net_version' }, (err, network) => {
- if (err) return this.setNetworkState('loading')
- log.info('web3.getNetwork returned ' + network)
- this.setNetworkState(network, type)
+ const currentNetwork = this.getNetworkState()
+ if (initialNetwork === currentNetwork) {
+ if (err) {
+ return this.setNetworkState('loading')
+ }
+ log.info('web3.getNetwork returned ' + network)
+ this.setNetworkState(network, type)
+ }
})
}
@@ -152,7 +159,7 @@ module.exports = class NetworkController extends EventEmitter {
_switchNetwork (opts) {
this.setNetworkState('loading')
this._configureProvider(opts)
- this.emit('networkDidChange')
+ this.emit('networkDidChange', opts.type)
}
_configureProvider (opts) {
@@ -174,7 +181,7 @@ module.exports = class NetworkController extends EventEmitter {
_configureInfuraProvider ({ type }) {
log.info('NetworkController - configureInfuraProvider', type)
- const networkClient = createInfuraClient({ network: type })
+ const networkClient = createInfuraClient({ network: type, platform: this.platform })
this._setNetworkClient(networkClient)
// setup networkConfig
var settings = {
@@ -185,13 +192,13 @@ module.exports = class NetworkController extends EventEmitter {
_configureLocalhostProvider () {
log.info('NetworkController - configureLocalhostProvider')
- const networkClient = createLocalhostClient()
+ const networkClient = createLocalhostClient({ platform: this.platform })
this._setNetworkClient(networkClient)
}
_configureStandardProvider ({ rpcUrl, chainId, ticker, nickname }) {
log.info('NetworkController - configureStandardProvider', rpcUrl)
- const networkClient = createJsonRpcClient({ rpcUrl })
+ const networkClient = createJsonRpcClient({ rpcUrl, platform: this.platform })
// hack to add a 'rpc' network with chainId
networks.networkList['rpc'] = {
chainId: chainId,
diff --git a/app/scripts/controllers/preferences.js b/app/scripts/controllers/preferences.js
index ffb593b09..737411890 100644
--- a/app/scripts/controllers/preferences.js
+++ b/app/scripts/controllers/preferences.js
@@ -1,6 +1,6 @@
const ObservableStore = require('obs-store')
const normalizeAddress = require('eth-sig-util').normalize
-const { isValidAddress } = require('ethereumjs-util')
+const { isValidAddress, sha3, bufferToHex } = require('ethereumjs-util')
const extend = require('xtend')
@@ -18,7 +18,10 @@ class PreferencesController {
* @property {object} store.assetImages Contains assets objects related to assets added
* @property {boolean} store.useBlockie The users preference for blockie identicons within the UI
* @property {object} store.featureFlags A key-boolean map, where keys refer to features and booleans to whether the
- * user wishes to see that feature
+ * user wishes to see that feature.
+ *
+ * Feature flags can be set by the global function `setPreference(feature, enabled)`, and so should not expose any sensitive behavior.
+ * @property {object} store.knownMethodData Contains all data methods known by the user
* @property {string} store.currentLocale The preferred language locale key
* @property {string} store.selectedAddress A hex string that matches the currently selected address in the app
*
@@ -32,7 +35,17 @@ class PreferencesController {
tokens: [],
suggestedTokens: {},
useBlockie: false,
- featureFlags: {},
+
+ // WARNING: Do not use feature flags for security-sensitive things.
+ // Feature flag toggling is available in the global namespace
+ // for convenient testing of pre-release features, and should never
+ // perform sensitive operations.
+ featureFlags: {
+ privacyMode: true,
+ },
+ knownMethodData: {},
+ participateInMetaMetrics: null,
+ firstTimeFlowType: null,
currentLocale: opts.initLangCode,
identities: {},
lostIdentities: {},
@@ -41,6 +54,10 @@ class PreferencesController {
preferences: {
useNativeCurrencyAsPrimaryCurrency: true,
},
+ completedOnboarding: false,
+ completedUiMigration: true,
+ metaMetricsId: null,
+ metaMetricsSendCount: 0,
}, opts.initState)
this.diagnostics = opts.diagnostics
@@ -48,6 +65,10 @@ class PreferencesController {
this.store = new ObservableStore(initState)
this.openPopup = opts.openPopup
this._subscribeProviderType()
+
+ global.setPreference = (key, value) => {
+ return this.setFeatureFlag(key, value)
+ }
}
// PUBLIC METHODS
@@ -77,6 +98,44 @@ class PreferencesController {
this.store.updateState({ useBlockie: val })
}
+ /**
+ * Setter for the `participateInMetaMetrics` property
+ *
+ * @param {boolean} bool Whether or not the user wants to participate in MetaMetrics
+ * @returns {string|null} the string of the new metametrics id, or null if not set
+ *
+ */
+ setParticipateInMetaMetrics (bool) {
+ this.store.updateState({ participateInMetaMetrics: bool })
+ let metaMetricsId = null
+ if (bool && !this.store.getState().metaMetricsId) {
+ metaMetricsId = bufferToHex(sha3(String(Date.now()) + String(Math.round(Math.random() * Number.MAX_SAFE_INTEGER))))
+ this.store.updateState({ metaMetricsId })
+ } else if (bool === false) {
+ this.store.updateState({ metaMetricsId })
+ }
+ return metaMetricsId
+ }
+
+ setMetaMetricsSendCount (val) {
+ this.store.updateState({ metaMetricsSendCount: val })
+ }
+
+ getMetaMetricsSendCount () {
+ return this.store.getState().metaMetricsSendCount
+ }
+
+ /**
+ * Setter for the `firstTimeFlowType` property
+ *
+ * @param {String} type Indicates the type of first time flow - create or import - the user wishes to follow
+ *
+ */
+ setFirstTimeFlowType (type) {
+ this.store.updateState({ firstTimeFlowType: type })
+ }
+
+
getSuggestedTokens () {
return this.store.getState().suggestedTokens
}
@@ -96,6 +155,18 @@ class PreferencesController {
}
/**
+ * Add new methodData to state, to avoid requesting this information again through Infura
+ *
+ * @param {string} fourBytePrefix Four-byte method signature
+ * @param {string} methodData Corresponding data method
+ */
+ addKnownMethodData (fourBytePrefix, methodData) {
+ const knownMethodData = this.store.getState().knownMethodData
+ knownMethodData[fourBytePrefix] = methodData
+ this.store.updateState({ knownMethodData })
+ }
+
+ /**
* RPC engine middleware for requesting new asset added
*
* @param req
@@ -389,6 +460,32 @@ class PreferencesController {
}
/**
+ * updates custom RPC details
+ *
+ * @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.
+ *
+ */
+
+
+ updateRpc (newRpcDetails) {
+ const rpcList = this.getFrequentRpcListDetail()
+ const index = rpcList.findIndex((element) => { return element.rpcUrl === newRpcDetails.rpcUrl })
+ if (index > -1) {
+ const rpcDetail = rpcList[index]
+ const updatedRpc = extend(rpcDetail, newRpcDetails)
+ rpcList[index] = updatedRpc
+ this.store.updateState({ frequentRpcListDetail: rpcList })
+ } else {
+ const { rpcUrl, chainId, ticker, nickname } = newRpcDetails
+ return this.addToFrequentRpcList(rpcUrl, chainId, ticker, nickname)
+ }
+ return Promise.resolve(rpcList)
+ }
+ /**
* Adds custom RPC url to state.
*
* @param {string} url The RPC url to add to frequentRpcList.
@@ -405,7 +502,11 @@ class PreferencesController {
rpcList.splice(index, 1)
}
if (url !== 'http://localhost:8545') {
- rpcList.push({ rpcUrl: url, chainId, ticker, nickname })
+ let checkedChainId
+ if (!!chainId && !Number.isNaN(parseInt(chainId))) {
+ checkedChainId = chainId
+ }
+ rpcList.push({ rpcUrl: url, chainId: checkedChainId, ticker, nickname })
}
this.store.updateState({ frequentRpcListDetail: rpcList })
return Promise.resolve(rpcList)
@@ -495,6 +596,23 @@ class PreferencesController {
return this.store.getState().preferences
}
+ /**
+ * Sets the completedOnboarding state to true, indicating that the user has completed the
+ * onboarding process.
+ */
+ completeOnboarding () {
+ this.store.updateState({ completedOnboarding: true })
+ return Promise.resolve(true)
+ }
+
+ /**
+ * Sets the {@code completedUiMigration} state to {@code true}, indicating that the user has completed the UI switch.
+ */
+ completeUiMigration () {
+ this.store.updateState({ completedUiMigration: true })
+ return Promise.resolve(true)
+ }
+
//
// PRIVATE METHODS
//
diff --git a/app/scripts/controllers/provider-approval.js b/app/scripts/controllers/provider-approval.js
index 21d7fd22e..2c9182b52 100644
--- a/app/scripts/controllers/provider-approval.js
+++ b/app/scripts/controllers/provider-approval.js
@@ -22,23 +22,27 @@ class ProviderApprovalController {
this.platform = platform
this.preferencesController = preferencesController
this.publicConfigStore = publicConfigStore
- this.store = new ObservableStore()
+ this.store = new ObservableStore({
+ providerRequests: [],
+ })
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
+ platform.addMessageListener(({ action = '', force, origin, siteTitle, siteImage }, { tab }) => {
+ if (tab && tab.id) {
+ switch (action) {
+ case 'init-provider-request':
+ this._handleProviderRequest(origin, siteTitle, siteImage, force, tab.id)
+ break
+ case 'init-is-approved':
+ this._handleIsApproved(origin, tab.id)
+ break
+ case 'init-is-unlocked':
+ this._handleIsUnlocked(tab.id)
+ break
+ case 'init-privacy-request':
+ this._handlePrivacyRequest(tab.id)
+ break
+ }
}
})
}
@@ -51,11 +55,11 @@ class ProviderApprovalController {
* @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 }] })
+ _handleProviderRequest (origin, siteTitle, siteImage, force, tabID) {
+ this.store.updateState({ providerRequests: [{ origin, siteTitle, siteImage, tabID }] })
const isUnlocked = this.keyringController.memStore.getState().isUnlocked
if (!force && this.approvedOrigins[origin] && this.caching && isUnlocked) {
- this.approveProviderRequest(origin)
+ this.approveProviderRequest(tabID)
return
}
this.openPopup && this.openPopup()
@@ -66,32 +70,32 @@ class ProviderApprovalController {
*
* @param {string} origin - Origin of the window
*/
- _handleIsApproved (origin) {
+ _handleIsApproved (origin, tabID) {
this.platform && this.platform.sendMessage({
action: 'answer-is-approved',
isApproved: this.approvedOrigins[origin] && this.caching,
caching: this.caching,
- }, { active: true })
+ }, { id: tabID })
}
/**
* Called by a tab to determine if MetaMask is currently locked or unlocked
*/
- _handleIsUnlocked () {
+ _handleIsUnlocked (tabID) {
const isUnlocked = this.keyringController.memStore.getState().isUnlocked
- this.platform && this.platform.sendMessage({ action: 'answer-is-unlocked', isUnlocked }, { active: true })
+ this.platform && this.platform.sendMessage({ action: 'answer-is-unlocked', isUnlocked }, { id: tabID })
}
/**
* Called to check privacy mode; if privacy mode is off, this will automatically enable the provider (legacy behavior)
*/
- _handlePrivacyRequest () {
+ _handlePrivacyRequest (tabID) {
const privacyMode = this.preferencesController.getFeatureFlags().privacyMode
if (!privacyMode) {
this.platform && this.platform.sendMessage({
action: 'approve-legacy-provider-request',
selectedAddress: this.publicConfigStore.getState().selectedAddress,
- }, { active: true })
+ }, { id: tabID })
this.publicConfigStore.emit('update', this.publicConfigStore.getState())
}
}
@@ -99,17 +103,18 @@ class ProviderApprovalController {
/**
* Called when a user approves access to a full Ethereum provider API
*
- * @param {string} origin - Origin of the target window to approve provider access
+ * @param {string} tabID - ID of the target window that approved provider access
*/
- approveProviderRequest (origin) {
+ approveProviderRequest (tabID) {
this.closePopup && this.closePopup()
- const requests = this.store.getState().providerRequests || []
+ const requests = this.store.getState().providerRequests
+ const origin = requests.find(request => request.tabID === tabID).origin
this.platform && this.platform.sendMessage({
action: 'approve-provider-request',
selectedAddress: this.publicConfigStore.getState().selectedAddress,
- }, { active: true })
+ }, { id: tabID })
this.publicConfigStore.emit('update', this.publicConfigStore.getState())
- const providerRequests = requests.filter(request => request.origin !== origin)
+ const providerRequests = requests.filter(request => request.tabID !== tabID)
this.store.updateState({ providerRequests })
this.approvedOrigins[origin] = true
}
@@ -117,13 +122,14 @@ class ProviderApprovalController {
/**
* Called when a tab rejects access to a full Ethereum provider API
*
- * @param {string} origin - Origin of the target window to reject provider access
+ * @param {string} tabID - ID of the target window that rejected provider access
*/
- rejectProviderRequest (origin) {
+ rejectProviderRequest (tabID) {
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)
+ const requests = this.store.getState().providerRequests
+ const origin = requests.find(request => request.tabID === tabID).origin
+ this.platform && this.platform.sendMessage({ action: 'reject-provider-request' }, { id: tabID })
+ const providerRequests = requests.filter(request => request.tabID !== tabID)
this.store.updateState({ providerRequests })
delete this.approvedOrigins[origin]
}
diff --git a/app/scripts/controllers/recent-blocks.js b/app/scripts/controllers/recent-blocks.js
index d270f6f44..982ad2aa4 100644
--- a/app/scripts/controllers/recent-blocks.js
+++ b/app/scripts/controllers/recent-blocks.js
@@ -3,6 +3,14 @@ const extend = require('xtend')
const EthQuery = require('eth-query')
const log = require('loglevel')
const pify = require('pify')
+const {
+ ROPSTEN,
+ RINKEBY,
+ KOVAN,
+ MAINNET,
+} = require('./network/enums')
+const INFURA_PROVIDER_TYPES = [ROPSTEN, RINKEBY, KOVAN, MAINNET]
+
class RecentBlocksController {
@@ -24,7 +32,7 @@ class RecentBlocksController {
*
*/
constructor (opts = {}) {
- const { blockTracker, provider } = opts
+ const { blockTracker, provider, networkController } = opts
this.blockTracker = blockTracker
this.ethQuery = new EthQuery(provider)
this.historyLength = opts.historyLength || 40
@@ -33,13 +41,30 @@ class RecentBlocksController {
recentBlocks: [],
}, opts.initState)
this.store = new ObservableStore(initState)
-
- this.blockTracker.on('latest', async (newBlockNumberHex) => {
+ const blockListner = async (newBlockNumberHex) => {
try {
await this.processBlock(newBlockNumberHex)
} catch (err) {
log.error(err)
}
+ }
+ let isListening = false
+ const { type } = networkController.getProviderConfig()
+ if (!INFURA_PROVIDER_TYPES.includes(type) && type !== 'loading') {
+ this.blockTracker.on('latest', blockListner)
+ isListening = true
+ }
+ networkController.on('networkDidChange', (newType) => {
+ if (INFURA_PROVIDER_TYPES.includes(newType) && isListening) {
+ this.blockTracker.removeListener('latest', blockListner)
+ } else if (
+ !INFURA_PROVIDER_TYPES.includes(type) &&
+ type !== 'loading' &&
+ !isListening
+ ) {
+ this.blockTracker.on('latest', blockListner)
+
+ }
})
this.backfill()
}
diff --git a/app/scripts/controllers/token-rates.js b/app/scripts/controllers/token-rates.js
index b6f084841..867d36433 100644
--- a/app/scripts/controllers/token-rates.js
+++ b/app/scripts/controllers/token-rates.js
@@ -1,5 +1,6 @@
const ObservableStore = require('obs-store')
const log = require('loglevel')
+const normalizeAddress = require('eth-sig-util').normalize
// By default, poll every 3 minutes
const DEFAULT_INTERVAL = 180 * 1000
@@ -14,8 +15,9 @@ class TokenRatesController {
*
* @param {Object} [config] - Options to configure controller
*/
- constructor ({ interval = DEFAULT_INTERVAL, preferences } = {}) {
+ constructor ({ interval = DEFAULT_INTERVAL, currency, preferences } = {}) {
this.store = new ObservableStore()
+ this.currency = currency
this.preferences = preferences
this.interval = interval
}
@@ -26,33 +28,25 @@ class TokenRatesController {
async updateExchangeRates () {
if (!this.isActive) { return }
const contractExchangeRates = {}
- // 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)
+ const nativeCurrency = this.currency ? this.currency.getState().nativeCurrency.toUpperCase() : 'ETH'
+ const pairs = this._tokens.map(token => `pairs[]=${token.address}/${nativeCurrency}`)
+ const query = pairs.join('&')
+ if (this._tokens.length > 0) {
+ try {
+ const response = await fetch(`https://exchanges.balanc3.net/pie?${query}&autoConversion=false`)
+ const { prices = [] } = await response.json()
+ prices.forEach(({ pair, price }) => {
+ const address = pair.split('/')[0]
+ contractExchangeRates[normalizeAddress(address)] = typeof price === 'number' ? price : 0
+ })
+ } catch (error) {
+ log.warn(`MetaMask - TokenRatesController exchange rate fetch failed.`, error)
+ }
}
this.store.putState({ contractExchangeRates })
}
/**
- * Fetches a token exchange rate by address
- *
- * @param {String} address - Token contract address
- */
- async fetchExchangeRate (address) {
- try {
- const response = await fetch(`https://metamask.balanc3.net/prices?from=${address}&to=ETH&autoConversion=false&summaryOnly=true`)
- const json = await response.json()
- return json && json.length ? json[0].averagePrice : 0
- } catch (error) {
- log.warn(`MetaMask - TokenRatesController exchange rate fetch failed for ${address}.`, error)
- return 0
- }
- }
-
- /**
* @type {Number}
*/
set interval (interval) {
diff --git a/app/scripts/controllers/transactions/enums.js b/app/scripts/controllers/transactions/enums.js
index be6f16e0d..d41400b9f 100644
--- a/app/scripts/controllers/transactions/enums.js
+++ b/app/scripts/controllers/transactions/enums.js
@@ -3,10 +3,12 @@ const TRANSACTION_TYPE_RETRY = 'retry'
const TRANSACTION_TYPE_STANDARD = 'standard'
const TRANSACTION_STATUS_APPROVED = 'approved'
+const TRANSACTION_STATUS_CONFIRMED = 'confirmed'
module.exports = {
TRANSACTION_TYPE_CANCEL,
TRANSACTION_TYPE_RETRY,
TRANSACTION_TYPE_STANDARD,
TRANSACTION_STATUS_APPROVED,
+ TRANSACTION_STATUS_CONFIRMED,
}
diff --git a/app/scripts/controllers/transactions/index.js b/app/scripts/controllers/transactions/index.js
index 9f2290924..2ce736beb 100644
--- a/app/scripts/controllers/transactions/index.js
+++ b/app/scripts/controllers/transactions/index.js
@@ -1,4 +1,4 @@
-const EventEmitter = require('events')
+const EventEmitter = require('safe-event-emitter')
const ObservableStore = require('obs-store')
const ethUtil = require('ethereumjs-util')
const Transaction = require('ethereumjs-tx')
@@ -82,7 +82,12 @@ class TransactionController extends EventEmitter {
provider: this.provider,
nonceTracker: this.nonceTracker,
publishTransaction: (rawTx) => this.query.sendRawTransaction(rawTx),
- getPendingTransactions: this.txStateManager.getPendingTransactions.bind(this.txStateManager),
+ getPendingTransactions: () => {
+ const pending = this.txStateManager.getPendingTransactions()
+ const approved = this.txStateManager.getApprovedTransactions()
+ return [...pending, ...approved]
+ },
+ approveTransaction: this.approveTransaction.bind(this),
getCompletedTransactions: this.txStateManager.getConfirmedTransactions.bind(this.txStateManager),
})
@@ -91,7 +96,10 @@ class TransactionController extends EventEmitter {
// memstore is computed from a few different stores
this._updateMemstore()
this.txStateManager.store.subscribe(() => this._updateMemstore())
- this.networkStore.subscribe(() => this._updateMemstore())
+ this.networkStore.subscribe(() => {
+ this._onBootCleanUp()
+ this._updateMemstore()
+ })
this.preferencesStore.subscribe(() => this._updateMemstore())
// request state update to finalize initialization
@@ -186,10 +194,13 @@ class TransactionController extends EventEmitter {
txMeta = await this.addTxGasDefaults(txMeta)
} catch (error) {
log.warn(error)
- this.txStateManager.setTxStatusFailed(txMeta.id, error)
+ txMeta.loadingDefaults = false
+ this.txStateManager.updateTx(txMeta, 'Failed to calculate gas defaults.')
throw error
}
+
txMeta.loadingDefaults = false
+
// save txMeta
this.txStateManager.updateTx(txMeta)
@@ -219,12 +230,23 @@ class TransactionController extends EventEmitter {
to allow the user to resign the transaction with a higher gas values
@param originalTxId {number} - the id of the txMeta that
you want to attempt to retry
+ @param gasPrice {string=} - Optional gas price to be increased to use as the retry
+ transaction's gas price
@return {txMeta}
*/
- async retryTransaction (originalTxId) {
+ async retryTransaction (originalTxId, gasPrice) {
const originalTxMeta = this.txStateManager.getTx(originalTxId)
- const lastGasPrice = originalTxMeta.txParams.gasPrice
+ const { txParams } = originalTxMeta
+ const lastGasPrice = gasPrice || originalTxMeta.txParams.gasPrice
+ const suggestedGasPriceBN = new ethUtil.BN(ethUtil.stripHexPrefix(this.getGasPrice()), 16)
+ const lastGasPriceBN = new ethUtil.BN(ethUtil.stripHexPrefix(lastGasPrice), 16)
+ // essentially lastGasPrice * 1.1 but
+ // dont trust decimals so a round about way of doing that
+ const lastGasPriceBNBumped = lastGasPriceBN.mul(new ethUtil.BN(110, 10)).div(new ethUtil.BN(100, 10))
+ // transactions that are being retried require a >=%10 bump or the clients will throw an error
+ txParams.gasPrice = suggestedGasPriceBN.gt(lastGasPriceBNBumped) ? `0x${suggestedGasPriceBN.toString(16)}` : `0x${lastGasPriceBNBumped.toString(16)}`
+
const txMeta = this.txStateManager.generateTxMeta({
txParams: originalTxMeta.txParams,
lastGasPrice,
@@ -270,6 +292,29 @@ class TransactionController extends EventEmitter {
return newTxMeta
}
+ async createSpeedUpTransaction (originalTxId, customGasPrice) {
+ const originalTxMeta = this.txStateManager.getTx(originalTxId)
+ const { txParams } = originalTxMeta
+ const { gasPrice: lastGasPrice } = txParams
+
+ const newGasPrice = customGasPrice || bnToHex(BnMultiplyByFraction(hexToBn(lastGasPrice), 11, 10))
+
+ const newTxMeta = this.txStateManager.generateTxMeta({
+ txParams: {
+ ...txParams,
+ gasPrice: newGasPrice,
+ },
+ lastGasPrice,
+ loadingDefaults: false,
+ status: TRANSACTION_STATUS_APPROVED,
+ type: TRANSACTION_TYPE_RETRY,
+ })
+
+ this.addTx(newTxMeta)
+ await this.approveTransaction(newTxMeta.id)
+ return newTxMeta
+ }
+
/**
updates the txMeta in the txStateManager
@param txMeta {Object} - the updated txMeta
@@ -471,6 +516,8 @@ class TransactionController extends EventEmitter {
txMeta.loadingDefaults = false
this.txStateManager.updateTx(txMeta, 'transactions: gas estimation for tx on boot')
}).catch((error) => {
+ tx.loadingDefaults = false
+ this.txStateManager.updateTx(tx, 'failed to estimate gas during boot cleanup.')
this.txStateManager.setTxStatusFailed(tx.id, error)
})
})
diff --git a/app/scripts/controllers/transactions/pending-tx-tracker.js b/app/scripts/controllers/transactions/pending-tx-tracker.js
index 70cac096b..4bf40b1db 100644
--- a/app/scripts/controllers/transactions/pending-tx-tracker.js
+++ b/app/scripts/controllers/transactions/pending-tx-tracker.js
@@ -1,4 +1,4 @@
-const EventEmitter = require('events')
+const EventEmitter = require('safe-event-emitter')
const log = require('loglevel')
const EthQuery = require('ethjs-query')
@@ -27,6 +27,7 @@ class PendingTransactionTracker extends EventEmitter {
this.getPendingTransactions = config.getPendingTransactions
this.getCompletedTransactions = config.getCompletedTransactions
this.publishTransaction = config.publishTransaction
+ this.approveTransaction = config.approveTransaction
this.confirmTransaction = config.confirmTransaction
}
@@ -108,7 +109,7 @@ class PendingTransactionTracker extends EventEmitter {
if (txBlockDistance <= Math.pow(2, retryCount) - 1) return
// Only auto-submit already-signed txs:
- if (!('rawTx' in txMeta)) return
+ if (!('rawTx' in txMeta)) return this.approveTransaction(txMeta.id)
const rawTx = txMeta.rawTx
const txHash = await this.publishTransaction(rawTx)
@@ -129,6 +130,9 @@ class PendingTransactionTracker extends EventEmitter {
const txHash = txMeta.hash
const txId = txMeta.id
+ // Only check submitted txs
+ if (txMeta.status !== 'submitted') return
+
// extra check in case there was an uncaught error during the
// signature and submission process
if (!txHash) {
diff --git a/app/scripts/controllers/transactions/tx-gas-utils.js b/app/scripts/controllers/transactions/tx-gas-utils.js
index def67c2c3..765551167 100644
--- a/app/scripts/controllers/transactions/tx-gas-utils.js
+++ b/app/scripts/controllers/transactions/tx-gas-utils.js
@@ -7,7 +7,7 @@ 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'
+import { TRANSACTION_NO_CONTRACT_ERROR_KEY } from '../../../../ui/app/helpers/constants/error-keys'
/**
tx-gas-utils are gas utility methods for Transaction manager
@@ -35,7 +35,13 @@ class TxGasUtil {
txMeta.simulationFails = {
reason: err.message,
errorKey: err.errorKey,
+ debug: { blockNumber: block.number, blockGasLimit: block.gasLimit },
}
+
+ if (err.errorKey === TRANSACTION_NO_CONTRACT_ERROR_KEY) {
+ txMeta.simulationFails.debug.getCodeResponse = err.getCodeResponse
+ }
+
return txMeta
}
this.setTxGas(txMeta, block.gasLimit, estimatedGasHex)
@@ -74,6 +80,9 @@ class TxGasUtil {
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
+
+ // set the response on the error so that we can see in logs what the actual response was
+ err.getCodeResponse = code
throw err
}
diff --git a/app/scripts/controllers/transactions/tx-state-manager.js b/app/scripts/controllers/transactions/tx-state-manager.js
index 58c48e34e..420191d9c 100644
--- a/app/scripts/controllers/transactions/tx-state-manager.js
+++ b/app/scripts/controllers/transactions/tx-state-manager.js
@@ -1,5 +1,5 @@
const extend = require('xtend')
-const EventEmitter = require('events')
+const EventEmitter = require('safe-event-emitter')
const ObservableStore = require('obs-store')
const ethUtil = require('ethereumjs-util')
const log = require('loglevel')
@@ -45,11 +45,13 @@ class TransactionStateManager extends EventEmitter {
@returns {txMeta} the default txMeta object
*/
generateTxMeta (opts) {
+ const netId = this.getNetwork()
+ if (netId === 'loading') throw new Error('MetaMask is having trouble connecting to the network')
return extend({
id: createId(),
time: (new Date()).getTime(),
status: 'unapproved',
- metamaskNetworkId: this.getNetwork(),
+ metamaskNetworkId: netId,
loadingDefaults: true,
}, opts)
}
@@ -83,6 +85,17 @@ class TransactionStateManager extends EventEmitter {
/**
@param [address] {string} - hex prefixed address to sort the txMetas for [optional]
+ @returns {array} the tx list whos status is approved if no address is provide
+ returns all txMetas who's status is approved for the current network
+ */
+ getApprovedTransactions (address) {
+ const opts = { status: 'approved' }
+ if (address) opts.from = address
+ return this.getFilteredTxList(opts)
+ }
+
+ /**
+ @param [address] {string} - hex prefixed address to sort the txMetas for [optional]
@returns {array} the tx list whos status is submitted if no address is provide
returns all txMetas who's status is submitted for the current network
*/
@@ -350,13 +363,15 @@ class TransactionStateManager extends EventEmitter {
@param err {erroObject} - error object
*/
setTxStatusFailed (txId, err) {
+ const error = !err ? new Error('Internal metamask failure') : err
+
const txMeta = this.getTx(txId)
txMeta.err = {
- message: err.toString(),
- rpc: err.value,
- stack: err.stack,
+ message: error.toString(),
+ rpc: error.value,
+ stack: error.stack,
}
- this.updateTx(txMeta)
+ this.updateTx(txMeta, 'transactions:tx-state-manager#fail - add error')
this._setTxStatus(txId, 'failed')
}
diff --git a/app/scripts/createStandardProvider.js b/app/scripts/createStandardProvider.js
new file mode 100644
index 000000000..a5f9c5d03
--- /dev/null
+++ b/app/scripts/createStandardProvider.js
@@ -0,0 +1,92 @@
+class StandardProvider {
+ _isConnected
+ _provider
+
+ constructor (provider) {
+ this._provider = provider
+ this._onMessage('ethereumpingerror', this._onClose.bind(this))
+ this._onMessage('ethereumpingsuccess', this._onConnect.bind(this))
+ window.addEventListener('load', () => {
+ this._subscribe()
+ this._ping()
+ })
+ }
+
+ _onMessage (type, handler) {
+ window.addEventListener('message', function ({ data }) {
+ if (!data || data.type !== type) return
+ handler.apply(this, arguments)
+ })
+ }
+
+ _onClose () {
+ if (this._isConnected === undefined || this._isConnected) {
+ this._provider.emit('close', {
+ code: 1011,
+ reason: 'Network connection error',
+ })
+ }
+ this._isConnected = false
+ }
+
+ _onConnect () {
+ !this._isConnected && this._provider.emit('connect')
+ this._isConnected = true
+ }
+
+ async _ping () {
+ try {
+ await this.send('net_version')
+ window.postMessage({ type: 'ethereumpingsuccess' }, '*')
+ } catch (error) {
+ window.postMessage({ type: 'ethereumpingerror' }, '*')
+ }
+ }
+
+ _subscribe () {
+ this._provider.on('data', (error, { method, params }) => {
+ if (!error && method === 'eth_subscription') {
+ this._provider.emit('notification', params.result)
+ }
+ })
+ }
+
+ /**
+ * Initiate an RPC method call
+ *
+ * @param {string} method - RPC method name to call
+ * @param {string[]} params - Array of RPC method parameters
+ * @returns {Promise<*>} Promise resolving to the result if successful
+ */
+ send (method, params = []) {
+ if (method === 'eth_requestAccounts') return this._provider.enable()
+
+ return new Promise((resolve, reject) => {
+ try {
+ this._provider.sendAsync({ method, params, beta: true }, (error, response) => {
+ error = error || response.error
+ error ? reject(error) : resolve(response)
+ })
+ } catch (error) {
+ reject(error)
+ }
+ })
+ }
+}
+
+/**
+ * Converts a legacy provider into an EIP-1193-compliant standard provider
+ * @param {Object} provider - Legacy provider to convert
+ * @returns {Object} Standard provider
+ */
+export default function createStandardProvider (provider) {
+ const standardProvider = new StandardProvider(provider)
+ const sendLegacy = provider.send
+ provider.send = (methodOrPayload, callbackOrArgs) => {
+ if (typeof methodOrPayload === 'string' && !callbackOrArgs || Array.isArray(callbackOrArgs)) {
+ return standardProvider.send(methodOrPayload, callbackOrArgs)
+ }
+ return sendLegacy.call(provider, methodOrPayload, callbackOrArgs)
+ }
+ return provider
+}
diff --git a/app/scripts/inpage.js b/app/scripts/inpage.js
index 83392761e..68394d1ae 100644
--- a/app/scripts/inpage.js
+++ b/app/scripts/inpage.js
@@ -5,6 +5,7 @@ const log = require('loglevel')
const LocalMessageDuplexStream = require('post-message-stream')
const setupDappAutoReload = require('./lib/auto-reload.js')
const MetamaskInpageProvider = require('metamask-inpage-provider')
+const createStandardProvider = require('./createStandardProvider').default
let isEnabled = false
let warned = false
@@ -16,12 +17,6 @@ restoreContextAfterImports()
log.setDefaultLevel(process.env.METAMASK_DEBUG ? 'debug' : 'warn')
-console.warn('ATTENTION: In an effort to improve user privacy, MetaMask ' +
-'stopped exposing user accounts to dapps if "privacy mode" is enabled on ' +
-'November 2nd, 2018. Dapps should now call provider.enable() in order to view and use ' +
-'accounts. Please see https://bit.ly/2QQHXvF for complete information and up-to-date ' +
-'example code.')
-
/**
* Adds a postMessage listener for a specific message type
*
@@ -29,12 +24,13 @@ console.warn('ATTENTION: In an effort to improve user privacy, MetaMask ' +
* @param {Function} handler - event handler
* @param {boolean} remove - removes this handler after being triggered
*/
-function onMessage(messageType, handler, remove) {
- window.addEventListener('message', function ({ data }) {
+function onMessage (messageType, callback, remove) {
+ const handler = function ({ data }) {
if (!data || data.type !== messageType) { return }
remove && window.removeEventListener('message', handler)
- handler.apply(window, arguments)
- })
+ callback.apply(window, arguments)
+ }
+ window.addEventListener('message', handler)
}
//
@@ -42,13 +38,13 @@ function onMessage(messageType, handler, remove) {
//
// setup background connection
-var metamaskStream = new LocalMessageDuplexStream({
+const metamaskStream = new LocalMessageDuplexStream({
name: 'inpage',
target: 'contentscript',
})
// compose the inpage provider
-var inpageProvider = new MetamaskInpageProvider(metamaskStream)
+const inpageProvider = new MetamaskInpageProvider(metamaskStream)
// set a high max listener count to avoid unnecesary warnings
inpageProvider.setMaxListeners(100)
@@ -59,7 +55,9 @@ onMessage('metamasksetlocked', () => { isEnabled = false })
// set up a listener for privacy mode responses
onMessage('ethereumproviderlegacy', ({ data: { selectedAddress } }) => {
isEnabled = true
- inpageProvider.publicConfigStore.updateState({ selectedAddress })
+ setTimeout(() => {
+ inpageProvider.publicConfigStore.updateState({ selectedAddress })
+ }, 0)
}, true)
// augment the provider with its enable method
@@ -67,10 +65,15 @@ inpageProvider.enable = function ({ force } = {}) {
return new Promise((resolve, reject) => {
providerHandle = ({ data: { error, selectedAddress } }) => {
if (typeof error !== 'undefined') {
- reject(error)
+ reject({
+ message: error,
+ code: 4001,
+ })
} else {
window.removeEventListener('message', providerHandle)
- inpageProvider.publicConfigStore.updateState({ selectedAddress })
+ setTimeout(() => {
+ inpageProvider.publicConfigStore.updateState({ selectedAddress })
+ }, 0)
// wait for the background to update with an account
inpageProvider.sendAsync({ method: 'eth_accounts', params: [] }, (error, response) => {
@@ -88,6 +91,10 @@ inpageProvider.enable = function ({ force } = {}) {
})
}
+// give the dapps control of a refresh they can toggle this off on the window.ethereum
+// this will be default true so it does not break any old apps.
+inpageProvider.autoRefreshOnNetworkChange = true
+
// add metamask-specific convenience methods
inpageProvider._metamask = new Proxy({
/**
@@ -104,7 +111,7 @@ inpageProvider._metamask = new Proxy({
*
* @returns {Promise<boolean>} - Promise resolving to true if this domain has been previously approved
*/
- isApproved: function() {
+ isApproved: function () {
return new Promise((resolve) => {
isApprovedHandle = ({ data: { caching, isApproved } }) => {
if (caching) {
@@ -133,7 +140,7 @@ inpageProvider._metamask = new Proxy({
})
},
}, {
- get: function(obj, prop) {
+ 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.')
@@ -150,10 +157,10 @@ const proxiedInpageProvider = new Proxy(inpageProvider, {
deleteProperty: () => true,
})
-window.ethereum = proxiedInpageProvider
+window.ethereum = createStandardProvider(proxiedInpageProvider)
// detect eth_requestAccounts and pipe to enable for now
-function detectAccountRequest(method) {
+function detectAccountRequest (method) {
const originalMethod = inpageProvider[method]
inpageProvider[method] = function ({ method }) {
if (method === 'eth_requestAccounts') {
@@ -177,7 +184,7 @@ if (typeof window.web3 !== 'undefined') {
and try again.`)
}
-var web3 = new Web3(proxiedInpageProvider)
+const web3 = new Web3(proxiedInpageProvider)
web3.setProvider = function () {
log.debug('MetaMask - overrode web3.setProvider')
}
@@ -214,7 +221,7 @@ inpageProvider.publicConfigStore.subscribe(function (state) {
// need to make sure we aren't affected by overlapping namespaces
// and that we dont affect the app with our namespace
// mostly a fix for web3's BigNumber if AMD's "define" is defined...
-var __define
+let __define
/**
* Caches reference to global define object and deletes it to
diff --git a/app/scripts/lib/ComposableObservableStore.js b/app/scripts/lib/ComposableObservableStore.js
index d5ee708a1..abb779672 100644
--- a/app/scripts/lib/ComposableObservableStore.js
+++ b/app/scripts/lib/ComposableObservableStore.js
@@ -40,7 +40,9 @@ class ComposableObservableStore extends ObservableStore {
getFlatState () {
let flatState = {}
for (const key in this.config) {
- flatState = { ...flatState, ...this.config[key].getState() }
+ const controller = this.config[key]
+ const state = controller.getState ? controller.getState() : controller.state
+ flatState = { ...flatState, ...state }
}
return flatState
}
diff --git a/app/scripts/lib/account-tracker.js b/app/scripts/lib/account-tracker.js
index 2e9340018..24c5ef7ee 100644
--- a/app/scripts/lib/account-tracker.js
+++ b/app/scripts/lib/account-tracker.js
@@ -11,6 +11,12 @@ const EthQuery = require('eth-query')
const ObservableStore = require('obs-store')
const log = require('loglevel')
const pify = require('pify')
+const Web3 = require('web3')
+const SINGLE_CALL_BALANCES_ABI = require('single-call-balance-checker-abi')
+
+const { bnToHex } = require('./util')
+const { MAINNET_CODE, RINKEYBY_CODE, ROPSTEN_CODE, KOVAN_CODE } = require('../controllers/network/enums')
+const { SINGLE_CALL_BALANCES_ADDRESS, SINGLE_CALL_BALANCES_ADDRESS_RINKEBY, SINGLE_CALL_BALANCES_ADDRESS_ROPSTEN, SINGLE_CALL_BALANCES_ADDRESS_KOVAN } = require('../controllers/network/contract-addresses')
class AccountTracker {
@@ -50,6 +56,9 @@ class AccountTracker {
})
// bind function for easier listener syntax
this._updateForBlock = this._updateForBlock.bind(this)
+ this.network = opts.network
+
+ this.web3 = new Web3(this._provider)
}
start () {
@@ -116,7 +125,7 @@ class AccountTracker {
this.store.updateState({ accounts })
// fetch balances for the accounts if there is block number ready
if (!this._currentBlockNumber) return
- addresses.forEach(address => this._updateAccount(address))
+ this._updateAccounts()
}
/**
@@ -161,7 +170,8 @@ class AccountTracker {
}
/**
- * Calls this._updateAccount for each account in this.store
+ * balanceChecker is deployed on main eth (test)nets and requires a single call
+ * for all other networks, calls this._updateAccount for each account in this.store
*
* @returns {Promise} after all account balances updated
*
@@ -169,7 +179,28 @@ class AccountTracker {
async _updateAccounts () {
const accounts = this.store.getState().accounts
const addresses = Object.keys(accounts)
- await Promise.all(addresses.map(this._updateAccount.bind(this)))
+ const currentNetwork = parseInt(this.network.getNetworkState())
+
+ switch (currentNetwork) {
+ case MAINNET_CODE:
+ await this._updateAccountsViaBalanceChecker(addresses, SINGLE_CALL_BALANCES_ADDRESS)
+ break
+
+ case RINKEYBY_CODE:
+ await this._updateAccountsViaBalanceChecker(addresses, SINGLE_CALL_BALANCES_ADDRESS_RINKEBY)
+ break
+
+ case ROPSTEN_CODE:
+ await this._updateAccountsViaBalanceChecker(addresses, SINGLE_CALL_BALANCES_ADDRESS_ROPSTEN)
+ break
+
+ case KOVAN_CODE:
+ await this._updateAccountsViaBalanceChecker(addresses, SINGLE_CALL_BALANCES_ADDRESS_KOVAN)
+ break
+
+ default:
+ await Promise.all(addresses.map(this._updateAccount.bind(this)))
+ }
}
/**
@@ -192,6 +223,30 @@ class AccountTracker {
this.store.updateState({ accounts })
}
+ /**
+ * Updates current address balances from balanceChecker deployed contract instance
+ * @param {*} addresses
+ * @param {*} deployedContractAddress
+ */
+ async _updateAccountsViaBalanceChecker (addresses, deployedContractAddress) {
+ const accounts = this.store.getState().accounts
+ this.web3.setProvider(this._provider)
+ const ethContract = this.web3.eth.contract(SINGLE_CALL_BALANCES_ABI).at(deployedContractAddress)
+ const ethBalance = ['0x0']
+
+ ethContract.balances(addresses, ethBalance, (error, result) => {
+ if (error) {
+ log.warn(`MetaMask - Account Tracker single call balance fetch failed`, error)
+ return Promise.all(addresses.map(this._updateAccount.bind(this)))
+ }
+ addresses.forEach((address, index) => {
+ const balance = bnToHex(result[index])
+ accounts[address] = { address, balance }
+ })
+ this.store.updateState({ accounts })
+ })
+ }
+
}
module.exports = AccountTracker
diff --git a/app/scripts/lib/auto-reload.js b/app/scripts/lib/auto-reload.js
index 558391a06..44fbe847c 100644
--- a/app/scripts/lib/auto-reload.js
+++ b/app/scripts/lib/auto-reload.js
@@ -20,6 +20,10 @@ function setupDappAutoReload (web3, observable) {
})
observable.subscribe(function (state) {
+ // if the auto refresh on network change is false do not
+ // do anything
+ if (!window.ethereum.autoRefreshOnNetworkChange) return
+
// if reload in progress, no need to check reload logic
if (reloadInProgress) return
diff --git a/app/scripts/lib/buy-eth-url.js b/app/scripts/lib/buy-eth-url.js
index 46710a16f..d9d5155c2 100644
--- a/app/scripts/lib/buy-eth-url.js
+++ b/app/scripts/lib/buy-eth-url.js
@@ -16,6 +16,8 @@ function getBuyEthUrl({ network, amount, address, service }) {
if (!service) service = getDefaultServiceForNetwork(network)
switch (service) {
+ case 'wyre':
+ return `https://dash.sendwyre.com/sign-up`
case 'coinswitch':
return `https://metamask.coinswitch.co/?address=${address}&to=eth`
case 'coinbase':
@@ -33,7 +35,7 @@ function getBuyEthUrl({ network, amount, address, service }) {
function getDefaultServiceForNetwork (networkId) {
switch (network) {
case '1':
- return 'coinbase'
+ return 'wyre'
case '3':
return 'metamask-faucet'
case '4':
diff --git a/app/scripts/lib/ens-ipfs/resolver.js b/app/scripts/lib/ens-ipfs/resolver.js
index fe2dc1134..b98566190 100644
--- a/app/scripts/lib/ens-ipfs/resolver.js
+++ b/app/scripts/lib/ens-ipfs/resolver.js
@@ -38,7 +38,7 @@ async function resolveEnsToIpfsContentId ({ provider, name }) {
return contentId
}
-function hexValueIsEmpty(value) {
+function hexValueIsEmpty (value) {
return [undefined, null, '0x', '0x0', '0x0000000000000000000000000000000000000000000000000000000000000000'].includes(value)
}
diff --git a/app/scripts/lib/ens-ipfs/setup.js b/app/scripts/lib/ens-ipfs/setup.js
index 45eb1ce14..df756d0f7 100644
--- a/app/scripts/lib/ens-ipfs/setup.js
+++ b/app/scripts/lib/ens-ipfs/setup.js
@@ -6,7 +6,7 @@ const supportedTopLevelDomains = ['eth']
module.exports = setupEnsIpfsResolver
-function setupEnsIpfsResolver({ provider }) {
+function setupEnsIpfsResolver ({ provider }) {
// install listener
const urlPatterns = supportedTopLevelDomains.map(tld => `*://*.${tld}/*`)
@@ -35,11 +35,11 @@ function setupEnsIpfsResolver({ provider }) {
attemptResolve({ tabId, name, path, search })
}
- async function 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 || ''}`
+ const url = `https://gateway.ipfs.io/ipfs/${ipfsContentId}${path}${search || ''}`
try {
// check if ipfs gateway has result
const response = await fetch(url, { method: 'HEAD' })
diff --git a/app/scripts/lib/get-first-preferred-lang-code.js b/app/scripts/lib/get-first-preferred-lang-code.js
index 170d508c1..469235357 100644
--- a/app/scripts/lib/get-first-preferred-lang-code.js
+++ b/app/scripts/lib/get-first-preferred-lang-code.js
@@ -7,7 +7,13 @@ const getPreferredLocales = extension.i18n ? promisify(
{ errorFirst: false }
) : async () => []
-const existingLocaleCodes = allLocales.map(locale => locale.code.toLowerCase().replace('_', '-'))
+// mapping some browsers return hyphen instead underscore in locale codes (e.g. zh_TW -> zh-tw)
+const existingLocaleCodes = {}
+allLocales.forEach(locale => {
+ if (locale && locale.code) {
+ existingLocaleCodes[locale.code.toLowerCase().replace('_', '-')] = locale.code
+ }
+})
/**
* Returns a preferred language code, based on settings within the user's browser. If we have no translations for the
@@ -33,9 +39,10 @@ async function getFirstPreferredLangCode () {
}
const firstPreferredLangCode = userPreferredLocaleCodes
- .map(code => code.toLowerCase())
- .find(code => existingLocaleCodes.includes(code))
- return firstPreferredLangCode || 'en'
+ .map(code => code.toLowerCase().replace('_', '-'))
+ .find(code => existingLocaleCodes.hasOwnProperty(code))
+
+ return existingLocaleCodes[firstPreferredLangCode] || 'en'
}
module.exports = getFirstPreferredLangCode
diff --git a/app/scripts/lib/notification-manager.js b/app/scripts/lib/notification-manager.js
index 969a9459a..721d109a1 100644
--- a/app/scripts/lib/notification-manager.js
+++ b/app/scripts/lib/notification-manager.js
@@ -1,7 +1,6 @@
const extension = require('extensionizer')
-const height = 620
-const width = 360
-
+const NOTIFICATION_HEIGHT = 620
+const NOTIFICATION_WIDTH = 360
class NotificationManager {
@@ -26,13 +25,18 @@ class NotificationManager {
// bring focus to existing chrome popup
extension.windows.update(popup.id, { focused: true })
} else {
+ const {screenX, screenY, outerWidth, outerHeight} = window
+ const notificationTop = Math.round(screenY + (outerHeight / 2) - (NOTIFICATION_HEIGHT / 2))
+ const notificationLeft = Math.round(screenX + (outerWidth / 2) - (NOTIFICATION_WIDTH / 2))
const cb = (currentPopup) => { this._popupId = currentPopup.id }
// create new notification popup
const creation = extension.windows.create({
url: 'notification.html',
type: 'popup',
- width,
- height,
+ width: NOTIFICATION_WIDTH,
+ height: NOTIFICATION_HEIGHT,
+ top: Math.max(notificationTop, 0),
+ left: Math.max(notificationLeft, 0),
}, cb)
creation && creation.then && creation.then(cb)
}
diff --git a/app/scripts/lib/setupFetchDebugging.js b/app/scripts/lib/setupFetchDebugging.js
index c1ef22d21..431340e2b 100644
--- a/app/scripts/lib/setupFetchDebugging.js
+++ b/app/scripts/lib/setupFetchDebugging.js
@@ -6,13 +6,13 @@ module.exports = setupFetchDebugging
// https://github.com/getsentry/sentry-javascript/pull/1293
//
-function setupFetchDebugging() {
+function setupFetchDebugging () {
if (!global.fetch) return
const originalFetch = global.fetch
global.fetch = wrappedFetch
- async function wrappedFetch(...args) {
+ async function wrappedFetch (...args) {
const initialStack = getCurrentStack()
try {
return await originalFetch.call(window, ...args)
@@ -20,14 +20,14 @@ function setupFetchDebugging() {
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
+ err.stack = initialStack
}
throw err
}
}
}
-function getCurrentStack() {
+function getCurrentStack () {
try {
throw new Error('Fake error for generating stack trace')
} catch (err) {
diff --git a/app/scripts/lib/setupSentry.js b/app/scripts/lib/setupSentry.js
index 69042bc19..ba0e17df0 100644
--- a/app/scripts/lib/setupSentry.js
+++ b/app/scripts/lib/setupSentry.js
@@ -32,7 +32,7 @@ function setupSentry (opts) {
scope.setExtra('isBrave', isBrave)
})
- function rewriteReport(report) {
+ function rewriteReport (report) {
try {
// simplify certain complex error messages (e.g. Ethjs)
simplifyErrorMessages(report)
diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js
index 5ae0f608d..540aee936 100644
--- a/app/scripts/metamask-controller.js
+++ b/app/scripts/metamask-controller.js
@@ -19,16 +19,16 @@ const createSubscriptionManager = require('eth-json-rpc-filters/subscriptionMana
const createOriginMiddleware = require('./lib/createOriginMiddleware')
const createLoggerMiddleware = require('./lib/createLoggerMiddleware')
const createProviderMiddleware = require('./lib/createProviderMiddleware')
-const setupMultiplex = require('./lib/stream-utils.js').setupMultiplex
+const {setupMultiplex} = require('./lib/stream-utils.js')
const KeyringController = require('eth-keyring-controller')
const NetworkController = require('./controllers/network')
const PreferencesController = require('./controllers/preferences')
const CurrencyController = require('./controllers/currency')
const NoticeController = require('./notice-controller')
const ShapeShiftController = require('./controllers/shapeshift')
-const AddressBookController = require('./controllers/address-book')
const InfuraController = require('./controllers/infura')
const BlacklistController = require('./controllers/blacklist')
+const CachedBalancesController = require('./controllers/cached-balances')
const RecentBlocksController = require('./controllers/recent-blocks')
const MessageManager = require('./lib/message-manager')
const PersonalMessageManager = require('./lib/personal-message-manager')
@@ -41,18 +41,21 @@ const ProviderApprovalController = require('./controllers/provider-approval')
const nodeify = require('./lib/nodeify')
const accountImporter = require('./account-import-strategies')
const getBuyEthUrl = require('./lib/buy-eth-url')
-const Mutex = require('await-semaphore').Mutex
-const version = require('../manifest.json').version
-const BN = require('ethereumjs-util').BN
+const {Mutex} = require('await-semaphore')
+const {version} = require('../manifest.json')
+const {BN} = require('ethereumjs-util')
const GWEI_BN = new BN('1000000000')
const percentile = require('percentile')
const seedPhraseVerifier = require('./lib/seed-phrase-verifier')
const log = require('loglevel')
const TrezorKeyring = require('eth-trezor-keyring')
const LedgerBridgeKeyring = require('eth-ledger-bridge-keyring')
+const HW_WALLETS_KEYRINGS = [TrezorKeyring.type, LedgerBridgeKeyring.type]
const EthQuery = require('eth-query')
const ethUtil = require('ethereumjs-util')
const sigUtil = require('eth-sig-util')
+const { AddressBookController } = require('gaba')
+
module.exports = class MetamaskController extends EventEmitter {
@@ -84,7 +87,7 @@ module.exports = class MetamaskController extends EventEmitter {
this.createVaultMutex = new Mutex()
// network store
- this.networkController = new NetworkController(initState.NetworkController)
+ this.networkController = new NetworkController(initState.NetworkController, this.platform)
// preferences controller
this.preferencesController = new PreferencesController({
@@ -117,18 +120,21 @@ module.exports = class MetamaskController extends EventEmitter {
// token exchange rate tracker
this.tokenRatesController = new TokenRatesController({
+ currency: this.currencyController.store,
preferences: this.preferencesController.store,
})
this.recentBlocksController = new RecentBlocksController({
blockTracker: this.blockTracker,
provider: this.provider,
+ networkController: this.networkController,
})
// account tracker watches balances, nonces, and any code at their address.
this.accountTracker = new AccountTracker({
provider: this.provider,
blockTracker: this.blockTracker,
+ network: this.networkController,
})
// start and stop polling for balances based on activeControllerConnections
@@ -140,6 +146,12 @@ module.exports = class MetamaskController extends EventEmitter {
}
})
+ this.cachedBalancesController = new CachedBalancesController({
+ accountTracker: this.accountTracker,
+ getNetwork: this.networkController.getNetworkState.bind(this.networkController),
+ initState: initState.CachedBalancesController,
+ })
+
// ensure accountTracker updates balances after network change
this.networkController.on('networkDidChange', () => {
this.accountTracker._updateAccounts()
@@ -163,11 +175,7 @@ module.exports = class MetamaskController extends EventEmitter {
keyringMemStore: this.keyringController.memStore,
})
- // address book controller
- this.addressBookController = new AddressBookController({
- initState: initState.AddressBookController,
- preferencesStore: this.preferencesController.store,
- })
+ this.addressBookController = new AddressBookController(undefined, initState.AddressBookController)
// tx mgmt
this.txController = new TransactionController({
@@ -198,8 +206,8 @@ module.exports = class MetamaskController extends EventEmitter {
})
this.networkController.on('networkDidChange', () => {
this.balancesController.updateAllBalances()
- var currentCurrency = this.currencyController.getCurrentCurrency()
- this.setCurrentCurrency(currentCurrency, function() {})
+ const currentCurrency = this.currencyController.getCurrentCurrency()
+ this.setCurrentCurrency(currentCurrency, function () {})
})
this.balancesController.updateAllBalances()
@@ -233,12 +241,13 @@ module.exports = class MetamaskController extends EventEmitter {
TransactionController: this.txController.store,
KeyringController: this.keyringController.store,
PreferencesController: this.preferencesController.store,
- AddressBookController: this.addressBookController.store,
+ AddressBookController: this.addressBookController,
CurrencyController: this.currencyController.store,
NoticeController: this.noticeController.store,
ShapeShiftController: this.shapeshiftController.store,
NetworkController: this.networkController.store,
InfuraController: this.infuraController.store,
+ CachedBalancesController: this.cachedBalancesController.store,
})
this.memStore = new ComposableObservableStore(null, {
@@ -246,6 +255,7 @@ module.exports = class MetamaskController extends EventEmitter {
AccountTracker: this.accountTracker.store,
TxController: this.txController.memStore,
BalancesController: this.balancesController.store,
+ CachedBalancesController: this.cachedBalancesController.store,
TokenRatesController: this.tokenRatesController.store,
MessageManager: this.messageManager.memStore,
PersonalMessageManager: this.personalMessageManager.memStore,
@@ -253,7 +263,7 @@ module.exports = class MetamaskController extends EventEmitter {
KeyringController: this.keyringController.memStore,
PreferencesController: this.preferencesController.store,
RecentBlocksController: this.recentBlocksController.store,
- AddressBookController: this.addressBookController.store,
+ AddressBookController: this.addressBookController,
CurrencyController: this.currencyController.store,
NoticeController: this.noticeController.memStore,
ShapeshiftController: this.shapeshiftController.store,
@@ -362,7 +372,6 @@ module.exports = class MetamaskController extends EventEmitter {
const preferencesController = this.preferencesController
const txController = this.txController
const noticeController = this.noticeController
- const addressBookController = this.addressBookController
const networkController = this.networkController
const providerApprovalController = this.providerApprovalController
@@ -371,6 +380,9 @@ module.exports = class MetamaskController extends EventEmitter {
getState: (cb) => cb(null, this.getState()),
setCurrentCurrency: this.setCurrentCurrency.bind(this),
setUseBlockie: this.setUseBlockie.bind(this),
+ setParticipateInMetaMetrics: this.setParticipateInMetaMetrics.bind(this),
+ setMetaMetricsSendCount: this.setMetaMetricsSendCount.bind(this),
+ setFirstTimeFlowType: this.setFirstTimeFlowType.bind(this),
setCurrentLocale: this.setCurrentLocale.bind(this),
markAccountsFound: this.markAccountsFound.bind(this),
markPasswordForgotten: this.markPasswordForgotten.bind(this),
@@ -397,12 +409,16 @@ module.exports = class MetamaskController extends EventEmitter {
checkHardwareStatus: nodeify(this.checkHardwareStatus, this),
unlockHardwareWalletAccount: nodeify(this.unlockHardwareWalletAccount, this),
+ // mobile
+ fetchInfoToSync: nodeify(this.fetchInfoToSync, this),
+
// vault management
submitPassword: nodeify(this.submitPassword, this),
// network management
setProviderType: nodeify(networkController.setProviderType, networkController),
setCustomRpc: nodeify(this.setCustomRpc, this),
+ updateAndSetCustomRpc: nodeify(this.updateAndSetCustomRpc, this),
delCustomRpc: nodeify(this.delCustomRpc, this),
// PreferencesController
@@ -414,12 +430,15 @@ module.exports = class MetamaskController extends EventEmitter {
setAccountLabel: nodeify(preferencesController.setAccountLabel, preferencesController),
setFeatureFlag: nodeify(preferencesController.setFeatureFlag, preferencesController),
setPreference: nodeify(preferencesController.setPreference, preferencesController),
+ completeUiMigration: nodeify(preferencesController.completeUiMigration, preferencesController),
+ completeOnboarding: nodeify(preferencesController.completeOnboarding, preferencesController),
+ addKnownMethodData: nodeify(preferencesController.addKnownMethodData, preferencesController),
// BlacklistController
whitelistPhishingDomain: this.whitelistPhishingDomain.bind(this),
// AddressController
- setAddressBook: nodeify(addressBookController.setAddressBook, addressBookController),
+ setAddressBook: this.addressBookController.set.bind(this.addressBookController),
// KeyringController
setLocked: nodeify(this.setLocked, this),
@@ -434,6 +453,7 @@ module.exports = class MetamaskController extends EventEmitter {
updateAndApproveTransaction: nodeify(txController.updateAndApproveTransaction, txController),
retryTransaction: nodeify(this.retryTransaction, this),
createCancelTransaction: nodeify(this.createCancelTransaction, this),
+ createSpeedUpTransaction: nodeify(this.createSpeedUpTransaction, this),
getFilteredTxList: nodeify(txController.getFilteredTxList, txController),
isNonceTaken: nodeify(txController.isNonceTaken, txController),
estimateGas: nodeify(this.estimateGas, this),
@@ -568,6 +588,60 @@ module.exports = class MetamaskController extends EventEmitter {
})
}
+ /**
+ * Collects all the information that we want to share
+ * with the mobile client for syncing purposes
+ * @returns Promise<Object> Parts of the state that we want to syncx
+ */
+ async fetchInfoToSync () {
+ // Preferences
+ const {
+ accountTokens,
+ currentLocale,
+ frequentRpcList,
+ identities,
+ selectedAddress,
+ tokens,
+ } = this.preferencesController.store.getState()
+
+ const preferences = {
+ accountTokens,
+ currentLocale,
+ frequentRpcList,
+ identities,
+ selectedAddress,
+ tokens,
+ }
+
+ // Accounts
+ const hdKeyring = this.keyringController.getKeyringsByType('HD Key Tree')[0]
+ const hdAccounts = await hdKeyring.getAccounts()
+ const accounts = {
+ hd: hdAccounts.filter((item, pos) => (hdAccounts.indexOf(item) === pos)).map(address => ethUtil.toChecksumAddress(address)),
+ simpleKeyPair: [],
+ ledger: [],
+ trezor: [],
+ }
+
+ // transactions
+
+ let transactions = this.txController.store.getState().transactions
+ // delete tx for other accounts that we're not importing
+ transactions = transactions.filter(tx => {
+ const checksummedTxFrom = ethUtil.toChecksumAddress(tx.txParams.from)
+ return (
+ accounts.hd.includes(checksummedTxFrom)
+ )
+ })
+
+ return {
+ accounts,
+ preferences,
+ transactions,
+ network: this.networkController.store.getState(),
+ }
+ }
+
/*
* Submits the user's password and attempts to unlock the vault.
* Also synchronizes the preferencesController, to ensure its schema
@@ -1024,16 +1098,22 @@ module.exports = class MetamaskController extends EventEmitter {
const cleanMsgParams = await this.typedMessageManager.approveMessage(msgParams)
const address = sigUtil.normalize(cleanMsgParams.from)
const keyring = await this.keyringController.getKeyringForAccount(address)
- const wallet = keyring._getWalletForAccount(address)
- const privKey = ethUtil.toBuffer(wallet.getPrivateKey())
let signature
- switch (version) {
- case 'V1':
- signature = sigUtil.signTypedDataLegacy(privKey, { data: cleanMsgParams.data })
- break
- case 'V3':
- signature = sigUtil.signTypedData(privKey, { data: JSON.parse(cleanMsgParams.data) })
- break
+ // HW Wallet keyrings don't expose private keys
+ // so we need to handle it separately
+ if (!HW_WALLETS_KEYRINGS.includes(keyring.type)) {
+ const wallet = keyring._getWalletForAccount(address)
+ const privKey = ethUtil.toBuffer(wallet.getPrivateKey())
+ switch (version) {
+ case 'V1':
+ signature = sigUtil.signTypedDataLegacy(privKey, { data: cleanMsgParams.data })
+ break
+ case 'V3':
+ signature = sigUtil.signTypedData(privKey, { data: JSON.parse(cleanMsgParams.data) })
+ break
+ }
+ } else {
+ signature = await keyring.signTypedData(address, cleanMsgParams.data)
}
this.typedMessageManager.setMsgStatusSigned(msgId, signature)
return this.getState()
@@ -1126,8 +1206,8 @@ module.exports = class MetamaskController extends EventEmitter {
* @param {string} txId - The ID of the transaction to speed up.
* @param {Function} cb - The callback function called with a full state update.
*/
- async retryTransaction (txId, cb) {
- await this.txController.retryTransaction(txId)
+ async retryTransaction (txId, gasPrice, cb) {
+ await this.txController.retryTransaction(txId, gasPrice)
const state = await this.getState()
return state
}
@@ -1140,7 +1220,17 @@ module.exports = class MetamaskController extends EventEmitter {
* @returns {object} MetaMask state
*/
async createCancelTransaction (originalTxId, customGasPrice, cb) {
- await this.txController.createCancelTransaction(originalTxId, customGasPrice)
+ try {
+ await this.txController.createCancelTransaction(originalTxId, customGasPrice)
+ const state = await this.getState()
+ return state
+ } catch (error) {
+ throw error
+ }
+ }
+
+ async createSpeedUpTransaction (originalTxId, customGasPrice, cb) {
+ await this.txController.createSpeedUpTransaction(originalTxId, customGasPrice)
const state = await this.getState()
return state
}
@@ -1473,6 +1563,21 @@ module.exports = class MetamaskController extends EventEmitter {
}
// network
+ /**
+ * A method for selecting a custom URL for an ethereum RPC provider and updating it
+ * @param {string} rpcUrl - 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 updateAndSetCustomRpc (rpcUrl, chainId, ticker = 'ETH', nickname) {
+ await this.preferencesController.updateRpc({ rpcUrl, chainId, ticker, nickname })
+ this.networkController.setRpcTarget(rpcUrl, chainId, ticker, nickname)
+ return rpcUrl
+ }
+
/**
* A method for selecting a custom URL for an ethereum RPC provider.
@@ -1483,8 +1588,15 @@ module.exports = class MetamaskController extends EventEmitter {
* @returns {Promise<String>} - The RPC Target URL confirmed.
*/
async setCustomRpc (rpcTarget, chainId, ticker = 'ETH', nickname = '') {
- this.networkController.setRpcTarget(rpcTarget, chainId, ticker, nickname)
- await this.preferencesController.addToFrequentRpcList(rpcTarget, chainId, ticker, nickname)
+ const frequentRpcListDetail = this.preferencesController.getFrequentRpcListDetail()
+ const rpcSettings = frequentRpcListDetail.find((rpc) => rpcTarget === rpc.rpcUrl)
+
+ if (rpcSettings) {
+ this.networkController.setRpcTarget(rpcSettings.rpcUrl, rpcSettings.chainId, rpcSettings.ticker, rpcSettings.nickname)
+ } else {
+ this.networkController.setRpcTarget(rpcTarget, chainId, ticker, nickname)
+ await this.preferencesController.addToFrequentRpcList(rpcTarget, chainId, ticker, nickname)
+ }
return rpcTarget
}
@@ -1511,6 +1623,44 @@ module.exports = class MetamaskController extends EventEmitter {
}
/**
+ * Sets whether or not the user will have usage data tracked with MetaMetrics
+ * @param {boolean} bool - True for users that wish to opt-in, false for users that wish to remain out.
+ * @param {Function} cb - A callback function called when complete.
+ */
+ setParticipateInMetaMetrics (bool, cb) {
+ try {
+ const metaMetricsId = this.preferencesController.setParticipateInMetaMetrics(bool)
+ cb(null, metaMetricsId)
+ } catch (err) {
+ cb(err)
+ }
+ }
+
+ setMetaMetricsSendCount (val, cb) {
+ try {
+ this.preferencesController.setMetaMetricsSendCount(val)
+ cb(null)
+ } catch (err) {
+ cb(err)
+ }
+ }
+
+ /**
+ * Sets the type of first time flow the user wishes to follow: create or import
+ * @param {String} type - Indicates the type of first time flow the user wishes to follow
+ * @param {Function} cb - A callback function called when complete.
+ */
+ setFirstTimeFlowType (type, cb) {
+ try {
+ this.preferencesController.setFirstTimeFlowType(type)
+ cb(null)
+ } catch (err) {
+ cb(err)
+ }
+ }
+
+
+ /**
* A method for setting a user's current locale, affecting the language rendered.
* @param {string} key - Locale identifier.
* @param {Function} cb - A callback function called when complete.
@@ -1580,7 +1730,7 @@ module.exports = class MetamaskController extends EventEmitter {
/**
* Locks MetaMask
*/
- setLocked() {
+ setLocked () {
this.providerApprovalController.setLocked()
return this.keyringController.setLocked()
}
diff --git a/app/scripts/migrations/029.js b/app/scripts/migrations/029.js
new file mode 100644
index 000000000..e17479ccc
--- /dev/null
+++ b/app/scripts/migrations/029.js
@@ -0,0 +1,27 @@
+// next version number
+const version = 29
+const failTxsThat = require('./fail-tx')
+
+// time
+const seconds = 1000
+const minutes = 60 * seconds
+const hours = 60 * minutes
+const unacceptableDelay = 12 * hours
+
+/*
+
+normalizes txParams on unconfirmed txs
+
+*/
+
+module.exports = {
+ version,
+
+ migrate: failTxsThat(version, 'Stuck in approved state for too long.', (txMeta) => {
+ const isApproved = txMeta.status === 'approved'
+ const createdTime = txMeta.submittedTime
+ const now = Date.now()
+ return isApproved && now - createdTime > unacceptableDelay
+ }),
+}
+
diff --git a/app/scripts/migrations/030.js b/app/scripts/migrations/030.js
new file mode 100644
index 000000000..10f7d33b2
--- /dev/null
+++ b/app/scripts/migrations/030.js
@@ -0,0 +1,49 @@
+// next version number
+const version = 30
+
+/*
+
+removes invalid chaids from preferences and networkController for custom rpcs
+
+*/
+
+const clone = require('clone')
+
+module.exports = {
+ version,
+
+ migrate: async function (originalVersionedData) {
+ const versionedData = clone(originalVersionedData)
+ versionedData.meta.version = version
+ const state = versionedData.data
+ const newState = transformState(state)
+ versionedData.data = newState
+ return versionedData
+ },
+}
+
+function transformState (state) {
+ const newState = state
+ if (state.PreferencesController) {
+ const frequentRpcListDetail = newState.PreferencesController.frequentRpcListDetail
+ if (frequentRpcListDetail) {
+ frequentRpcListDetail.forEach((rpc, index) => {
+ if (!!rpc.chainId && Number.isNaN(parseInt(rpc.chainId))) {
+ delete frequentRpcListDetail[index].chainId
+ }
+ })
+ newState.PreferencesController.frequentRpcListDetail = frequentRpcListDetail
+ }
+ }
+ if (state.NetworkController) {
+ if (newState.NetworkController.network && Number.isNaN(parseInt(newState.NetworkController.network))) {
+ delete newState.NetworkController.network
+ }
+
+ if (newState.NetworkController.provider && newState.NetworkController.provider.chainId && Number.isNaN(parseInt(newState.NetworkController.provider.chainId))) {
+ delete newState.NetworkController.provider.chainId
+ }
+ }
+
+ return newState
+}
diff --git a/app/scripts/migrations/031.js b/app/scripts/migrations/031.js
new file mode 100644
index 000000000..98d182828
--- /dev/null
+++ b/app/scripts/migrations/031.js
@@ -0,0 +1,31 @@
+// next version number
+const version = 31
+const clone = require('clone')
+
+ /*
+ * The purpose of this migration is to properly set the completedOnboarding flag baesd on the state
+ * of the KeyringController.
+ */
+module.exports = {
+ version,
+
+ migrate: async function (originalVersionedData) {
+ const versionedData = clone(originalVersionedData)
+ versionedData.meta.version = version
+ const state = versionedData.data
+ const newState = transformState(state)
+ versionedData.data = newState
+ return versionedData
+ },
+}
+
+ function transformState (state) {
+ const { KeyringController, PreferencesController } = state
+
+ if (KeyringController && PreferencesController) {
+ const { vault } = KeyringController
+ PreferencesController.completedOnboarding = Boolean(vault)
+ }
+
+ return state
+}
diff --git a/app/scripts/migrations/032.js b/app/scripts/migrations/032.js
new file mode 100644
index 000000000..e89fe383f
--- /dev/null
+++ b/app/scripts/migrations/032.js
@@ -0,0 +1,29 @@
+const version = 32
+const clone = require('clone')
+
+/**
+ * The purpose of this migration is to set the {@code completedUiMigration} flag based on the user's UI preferences
+ */
+module.exports = {
+ version,
+ migrate: async function (originalVersionedData) {
+ const versionedData = clone(originalVersionedData)
+ versionedData.meta.version = version
+ const state = versionedData.data
+ versionedData.data = transformState(state)
+ return versionedData
+ },
+}
+
+function transformState (state) {
+ const { PreferencesController } = state
+
+ if (PreferencesController) {
+ const { betaUI } = PreferencesController.featureFlags || {}
+ // Users who have been using the "beta" UI are considered to have completed the migration
+ // as they'll see no difference in this version
+ PreferencesController.completedUiMigration = betaUI
+ }
+
+ return state
+}
diff --git a/app/scripts/migrations/fail-tx.js b/app/scripts/migrations/fail-tx.js
new file mode 100644
index 000000000..98e3ffddb
--- /dev/null
+++ b/app/scripts/migrations/fail-tx.js
@@ -0,0 +1,41 @@
+const clone = require('clone')
+
+module.exports = function (version, reason, condition) {
+ return function (originalVersionedData) {
+ const versionedData = clone(originalVersionedData)
+ versionedData.meta.version = version
+ try {
+ const state = versionedData.data
+ const newState = transformState(state, condition, reason)
+ versionedData.data = newState
+ } catch (err) {
+ console.warn(`MetaMask Migration #${version}` + err.stack)
+ }
+ return Promise.resolve(versionedData)
+
+ }
+}
+
+function transformState (state, condition, reason) {
+ const newState = state
+ const { TransactionController } = newState
+ if (TransactionController && TransactionController.transactions) {
+ const transactions = TransactionController.transactions
+
+ newState.TransactionController.transactions = transactions.map((txMeta) => {
+ if (!condition(txMeta)) {
+ return txMeta
+ }
+
+ txMeta.status = 'failed'
+ txMeta.err = {
+ message: reason,
+ note: `Tx automatically failed by migration because ${reason}`,
+ }
+
+ return txMeta
+ })
+ }
+ return newState
+}
+
diff --git a/app/scripts/migrations/index.js b/app/scripts/migrations/index.js
index 3b512715e..eb1b51685 100644
--- a/app/scripts/migrations/index.js
+++ b/app/scripts/migrations/index.js
@@ -39,4 +39,7 @@ module.exports = [
require('./026'),
require('./027'),
require('./028'),
+ require('./029'),
+ require('./030'),
+ require('./031'),
]
diff --git a/app/scripts/notice-controller.js b/app/scripts/notice-controller.js
index ce686d9d1..6fe8b8cf0 100644
--- a/app/scripts/notice-controller.js
+++ b/app/scripts/notice-controller.js
@@ -1,4 +1,4 @@
-const EventEmitter = require('events').EventEmitter
+const {EventEmitter} = require('events')
const semver = require('semver')
const extend = require('xtend')
const ObservableStore = require('obs-store')
@@ -46,8 +46,8 @@ module.exports = class NoticeController extends EventEmitter {
markNoticeRead (noticeToMark, cb) {
cb = cb || function (err) { if (err) throw err }
try {
- var notices = this.getNoticesList()
- var index = notices.findIndex((currentNotice) => currentNotice.id === noticeToMark.id)
+ const notices = this.getNoticesList()
+ const index = notices.findIndex((currentNotice) => currentNotice.id === noticeToMark.id)
notices[index].read = true
notices[index].body = ''
this.setNoticesList(notices)
diff --git a/app/scripts/phishing-detect.js b/app/scripts/phishing-detect.js
index 0889c831e..b30c76b72 100644
--- a/app/scripts/phishing-detect.js
+++ b/app/scripts/phishing-detect.js
@@ -1,16 +1,9 @@
-window.onload = function () {
- if (window.location.pathname === '/phishing.html') {
- const {hostname} = parseHash()
- document.getElementById('esdbLink').innerHTML = '<b>To read more about this scam, navigate to: <a href="https://etherscamdb.info/domain/' + hostname + '"> https://etherscamdb.info/domain/' + hostname + '</a></b>'
- }
-}
-
const querystring = require('querystring')
const dnode = require('dnode')
const { EventEmitter } = require('events')
const PortStream = require('extension-port-stream')
const extension = require('extensionizer')
-const setupMultiplex = require('./lib/stream-utils.js').setupMultiplex
+const {setupMultiplex} = require('./lib/stream-utils.js')
const { getEnvironmentType } = require('./lib/util')
const ExtensionPlatform = require('./platforms/extension')
@@ -18,6 +11,10 @@ document.addEventListener('DOMContentLoaded', start)
function start () {
const windowType = getEnvironmentType(window.location.href)
+ const hash = window.location.hash.substring(1)
+ const suspect = querystring.parse(hash)
+
+ document.getElementById('esdbLink').href = `https://etherscamdb.info/domain/${suspect.hostname}`
global.platform = new ExtensionPlatform()
global.METAMASK_UI_TYPE = windowType
@@ -30,14 +27,10 @@ function start () {
return
}
- const suspect = parseHash()
- const unsafeContinue = () => {
- window.location.href = suspect.href
- }
const continueLink = document.getElementById('unsafe-continue')
continueLink.addEventListener('click', () => {
metaMaskController.whitelistPhishingDomain(suspect.hostname)
- unsafeContinue()
+ window.location.href = suspect.href
})
})
}
@@ -52,8 +45,3 @@ function setupControllerConnection (connectionStream, cb) {
connectionStream.pipe(accountManagerDnode).pipe(connectionStream)
accountManagerDnode.once('remote', (accountManager) => cb(null, accountManager))
}
-
-function parseHash () {
- const hash = window.location.hash.substring(1)
- return querystring.parse(hash)
-}
diff --git a/app/scripts/platforms/extension.js b/app/scripts/platforms/extension.js
index 9ef0d22c9..099b0d7ea 100644
--- a/app/scripts/platforms/extension.js
+++ b/app/scripts/platforms/extension.js
@@ -1,5 +1,5 @@
const extension = require('extensionizer')
-const explorerLink = require('etherscan-link').createExplorerLink
+const {createExplorerLink: explorerLink} = require('etherscan-link')
class ExtensionPlatform {
@@ -48,10 +48,13 @@ class ExtensionPlatform {
}
showTransactionNotification (txMeta) {
+ const { status, txReceipt: { status: receiptStatus } = {} } = txMeta
- const status = txMeta.status
if (status === 'confirmed') {
- this._showConfirmedTransaction(txMeta)
+ // There was an on-chain failure
+ receiptStatus === '0x0'
+ ? this._showFailedTransaction(txMeta, 'Transaction encountered an error.')
+ : this._showConfirmedTransaction(txMeta)
} else if (status === 'failed') {
this._showFailedTransaction(txMeta)
}
@@ -62,9 +65,11 @@ class ExtensionPlatform {
}
sendMessage (message, query = {}) {
- extension.tabs.query(query, tabs => {
+ const id = query.id
+ delete query.id
+ extension.tabs.query({ ...query }, tabs => {
tabs.forEach(tab => {
- extension.tabs.sendMessage(tab.id, message)
+ extension.tabs.sendMessage(id || tab.id, message)
})
})
}
@@ -81,11 +86,11 @@ class ExtensionPlatform {
this._showNotification(title, message, url)
}
- _showFailedTransaction (txMeta) {
+ _showFailedTransaction (txMeta, errorMessage) {
const nonce = parseInt(txMeta.txParams.nonce, 16)
const title = 'Failed transaction'
- const message = `Transaction ${nonce} failed! ${txMeta.err.message}`
+ const message = `Transaction ${nonce} failed! ${errorMessage || txMeta.err.message}`
this._showNotification(title, message)
}
@@ -108,7 +113,7 @@ class ExtensionPlatform {
_viewOnEtherScan (txId) {
if (txId.startsWith('http://')) {
- global.metamaskController.platform.openWindow({ url: txId })
+ extension.tabs.create({ url: txId })
}
}
}
diff --git a/app/scripts/popup-core.js b/app/scripts/popup-core.js
index db885ec93..e964d001d 100644
--- a/app/scripts/popup-core.js
+++ b/app/scripts/popup-core.js
@@ -1,11 +1,11 @@
-const EventEmitter = require('events').EventEmitter
+const {EventEmitter} = require('events')
const async = require('async')
const Dnode = require('dnode')
const Eth = require('ethjs')
const EthQuery = require('eth-query')
const launchMetamaskUi = require('../../ui')
const StreamProvider = require('web3-stream-provider')
-const setupMultiplex = require('./lib/stream-utils.js').setupMultiplex
+const {setupMultiplex} = require('./lib/stream-utils.js')
module.exports = initializePopup
@@ -32,7 +32,7 @@ function initializePopup ({ container, connectionStream }, cb) {
function connectToAccountManager (connectionStream, cb) {
// setup communication with background
// setup multiplexing
- var mx = setupMultiplex(connectionStream)
+ const mx = setupMultiplex(connectionStream)
// connect features
setupControllerConnection(mx.createStream('controller'), cb)
setupWeb3Connection(mx.createStream('provider'))
@@ -44,7 +44,7 @@ function connectToAccountManager (connectionStream, cb) {
* @param {PortDuplexStream} connectionStream PortStream instance establishing a background connection
*/
function setupWeb3Connection (connectionStream) {
- var providerStream = new StreamProvider()
+ const providerStream = new StreamProvider()
providerStream.pipe(connectionStream).pipe(providerStream)
connectionStream.on('error', console.error.bind(console))
providerStream.on('error', console.error.bind(console))
@@ -62,8 +62,8 @@ function setupWeb3Connection (connectionStream) {
function setupControllerConnection (connectionStream, cb) {
// this is a really sneaky way of adding EventEmitter api
// to a bi-directional dnode instance
- var eventEmitter = new EventEmitter()
- var accountManagerDnode = Dnode({
+ const eventEmitter = new EventEmitter()
+ const accountManagerDnode = Dnode({
sendUpdate: function (state) {
eventEmitter.emit('update', state)
},
diff --git a/app/scripts/ui.js b/app/scripts/ui.js
index c4f6615db..67ec6bf06 100644
--- a/app/scripts/ui.js
+++ b/app/scripts/ui.js
@@ -1,10 +1,9 @@
const injectCss = require('inject-css')
-const OldMetaMaskUiCss = require('../../old-ui/css')
const NewMetaMaskUiCss = require('../../ui/css')
const startPopup = require('./popup-core')
const PortStream = require('extension-port-stream')
const { getEnvironmentType } = require('./lib/util')
-const { ENVIRONMENT_TYPE_NOTIFICATION } = require('./lib/enums')
+const { ENVIRONMENT_TYPE_NOTIFICATION, ENVIRONMENT_TYPE_FULLSCREEN } = require('./lib/enums')
const extension = require('extensionizer')
const ExtensionPlatform = require('./platforms/extension')
const NotificationManager = require('./lib/notification-manager')
@@ -23,7 +22,7 @@ async function start () {
const release = global.platform.getVersion()
setupSentry({ release, getState })
// provide app state to append to error logs
- function getState() {
+ function getState () {
// get app state
const state = window.getCleanAppState()
// remove unnecessary data
@@ -33,10 +32,6 @@ async function start () {
return state
}
- // inject css
- // const css = MetaMaskUiCss()
- // injectCss(css)
-
// identify window type (popup, notification)
const windowType = getEnvironmentType(window.location.href)
global.METAMASK_UI_TYPE = windowType
@@ -51,30 +46,15 @@ async function start () {
startPopup({ container, connectionStream }, (err, store) => {
if (err) return displayCriticalError(err)
- // Code commented out until we begin auto adding users to NewUI
- // const { isMascara, identities = {}, featureFlags = {} } = store.getState().metamask
- // const firstTime = Object.keys(identities).length === 0
- const { isMascara, featureFlags = {} } = store.getState().metamask
- let betaUIState = featureFlags.betaUI
-
- // Code commented out until we begin auto adding users to NewUI
- // const useBetaCss = isMascara || firstTime || betaUIState
- const useBetaCss = isMascara || betaUIState
+ const state = store.getState()
+ const { metamask: { completedOnboarding } = {} } = state
- let css = useBetaCss ? NewMetaMaskUiCss() : OldMetaMaskUiCss()
- let deleteInjectedCss = injectCss(css)
- let newBetaUIState
+ if (!completedOnboarding && windowType !== ENVIRONMENT_TYPE_FULLSCREEN) {
+ global.platform.openExtensionInBrowser()
+ return
+ }
- store.subscribe(() => {
- const state = store.getState()
- newBetaUIState = state.metamask.featureFlags.betaUI
- if (newBetaUIState !== betaUIState) {
- deleteInjectedCss()
- betaUIState = newBetaUIState
- css = betaUIState ? NewMetaMaskUiCss() : OldMetaMaskUiCss()
- deleteInjectedCss = injectCss(css)
- }
- })
+ injectCss(NewMetaMaskUiCss())
})
diff --git a/app/trezor-usb-permissions.html b/app/trezor-usb-permissions.html
new file mode 100644
index 000000000..16f28e5e1
--- /dev/null
+++ b/app/trezor-usb-permissions.html
@@ -0,0 +1,33 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="UTF-8" />
+ <meta http-equiv="X-UA-Compatible" content="IE=Edge" />
+ <meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=0" />
+ <title>TrezorConnect | Trezor</title>
+ <meta name="description" content="" />
+ <meta name="keywords" content="" />
+ <meta name="author" content="Trezor info@trezor.io" />
+ <meta name="robots" content="noindex, nofollow" />
+ <meta name="title" content="Trezor Connect" />
+ <meta name="theme-color" content="#ffffff" />
+ <meta http-equiv="Pragma" content="no-cache" />
+ <meta http-equiv="Expires" content="-1" />
+ <style>
+ * {
+ margin: 0;
+ padding: 0;
+ }
+ html, body {
+ position: relative;
+ width: 100%;
+ height: 100%;
+ min-height: 500px;
+ min-width: 328px;
+ }
+ </style>
+</head>
+<body>
+ <iframe id="trezor-usb-permissions" src="https://connect.trezor.io/5/extension-permissions.html" allow="usb" frameborder="0" width="100%" height="100%"></iframe>
+ <script type="text/javascript" src="./vendor/trezor/usb-permissions.js"></script>
+</body> \ No newline at end of file
diff --git a/app/vendor/trezor/content-script.js b/app/vendor/trezor/content-script.js
new file mode 100644
index 000000000..a21332f46
--- /dev/null
+++ b/app/vendor/trezor/content-script.js
@@ -0,0 +1,21 @@
+/*
+Passing messages from background script to popup
+*/
+
+let port = chrome.runtime.connect({ name: 'trezor-connect' });
+port.onMessage.addListener(message => {
+ window.postMessage(message, window.location.origin);
+});
+port.onDisconnect.addListener(d => {
+ port = null;
+});
+
+/*
+Passing messages from popup to background script
+*/
+
+window.addEventListener('message', event => {
+ if (port && event.source === window && event.data) {
+ port.postMessage(event.data);
+ }
+});
diff --git a/app/vendor/trezor/usb-permissions.js b/app/vendor/trezor/usb-permissions.js
new file mode 100644
index 000000000..9de47e0a1
--- /dev/null
+++ b/app/vendor/trezor/usb-permissions.js
@@ -0,0 +1,50 @@
+/*
+Handling messages from usb permissions iframe
+*/
+
+const switchToPopupTab = (event) => {
+
+ window.removeEventListener('beforeunload', switchToPopupTab);
+
+ if (!event) {
+ // triggered from 'usb-permissions-close' message
+ // switch tab to previous index and close current
+ chrome.tabs.query({
+ currentWindow: true,
+ active: true,
+ }, (current) => {
+ if (current.length < 0) return;
+ chrome.tabs.query({
+ index: current[0].index - 1
+ }, popup => {
+ if (popup.length < 0) return;
+ chrome.tabs.update(popup[0].id, { active: true });
+ })
+ chrome.tabs.remove(current[0].id);
+ });
+ return;
+ }
+
+ // triggered from 'beforeunload' event
+ // find tab by popup pattern and switch to it
+ chrome.tabs.query({
+ url: "*://connect.trezor.io/*/popup.html"
+ }, (tabs) => {
+ if (tabs.length < 0) return;
+ chrome.tabs.update(tabs[0].id, { active: true });
+ });
+}
+
+window.addEventListener('message', event => {
+ if (event.data === 'usb-permissions-init') {
+ const iframe = document.getElementById('trezor-usb-permissions');
+ iframe.contentWindow.postMessage({
+ type: 'usb-permissions-init',
+ extension: chrome.runtime.id,
+ }, '*');
+ } else if (event.data === 'usb-permissions-close') {
+ switchToPopupTab();
+ }
+});
+
+window.addEventListener('beforeunload', switchToPopupTab); \ No newline at end of file