aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--CHANGELOG.md1
-rw-r--r--app/_locales/hn/messages.json20
-rw-r--r--app/_locales/index.json1
-rw-r--r--app/_locales/tml/messages.json912
-rw-r--r--app/scripts/lib/config-manager.js22
-rw-r--r--app/scripts/metamask-controller.js2
-rw-r--r--mascara/src/app/first-time/confirm-seed-screen.js14
-rw-r--r--mascara/src/app/first-time/seed-screen.js71
-rw-r--r--test/integration/lib/tx-list-items.js2
-rw-r--r--ui/app/actions.js16
-rw-r--r--ui/app/app.js14
-rw-r--r--ui/app/components/account-dropdowns.js5
-rw-r--r--ui/app/components/dropdowns/components/account-dropdowns.js5
-rw-r--r--ui/app/components/modals/export-private-key-modal.js7
-rw-r--r--ui/app/components/qr-code.js13
-rw-r--r--ui/app/components/send/account-list-item.js3
-rw-r--r--ui/app/components/tx-list-item.js5
-rw-r--r--ui/app/components/tx-view.js4
-rw-r--r--ui/app/components/wallet-view.js9
-rw-r--r--ui/app/util.js15
-rw-r--r--ui/lib/icon-factory.js4
21 files changed, 1085 insertions, 60 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 9537657ec..3e2b481de 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6,6 +6,7 @@
- Improved performance of 3D fox logo.
- Fetch token prices based on contract address, not symbol
- Fix bug that prevents setting language locale in settings.
+- Show checksum addresses throughout the UI
## 4.5.5 Fri Apr 06 2018
diff --git a/app/_locales/hn/messages.json b/app/_locales/hn/messages.json
index 323f4b4b3..b869560e5 100644
--- a/app/_locales/hn/messages.json
+++ b/app/_locales/hn/messages.json
@@ -9,7 +9,7 @@
"message": "खाता विवरण"
},
"accountName": {
- "message": "खाता का नाम"
+ "message": "खाते का नाम"
},
"address": {
"message": "खाते का पता"
@@ -21,7 +21,7 @@
"message": "टोकन जोड़ें"
},
"addTokens": {
- "message": "टोकनो को जोड़ें"
+ "message": "टोकनों को जोड़ें"
},
"amount": {
"message": "राशि"
@@ -30,7 +30,7 @@
"message": "राशि + गैस"
},
"appDescription": {
- "message": "एथरेम ब्राउज़र एक्सटेंशन",
+ "message": "इथीरियम ब्राउज़र एक्सटेंशन",
"description": "आवेदन का विवरण"
},
"appName": {
@@ -53,7 +53,7 @@
"message": "उपलब्ध बैलेंस।"
},
"balances": {
- "message": "ापके उपलब्ध बैलेंस"
+ "message": "आपके उपलब्ध बैलेंस"
},
"balanceIsInsufficientGas": {
"message": "वर्तमान गैस कुल के लिए अपर्याप्त शेष"
@@ -78,10 +78,10 @@
"message": "खरीदें"
},
"buyCoinbase": {
- "message": "कॉनबेस पर खरीदें"
+ "message": "कॉइनबेस पर खरीदें"
},
"buyCoinbaseExplainer": {
- "message": "बिल्टकोइन, एथरेम और लाइटकोइन खरीदने और बेचने के लिए दुनिया का सबसे लोकप्रिय तरीका Coinbase है।"
+ "message": "बिल्टकोइन, इथीरियम और लाइटकोइन खरीदने और बेचने के लिए दुनिया का सबसे लोकप्रिय तरीका कॉइनबेस है।"
},
"cancel": {
"message": "रद्द करें"
@@ -108,7 +108,7 @@
"message": "जारी रखें"
},
"continueToCoinbase": {
- "message": "कॉ्ोनबेस को ब्हेजना जारी रखें"
+ "message": "कॉइनबेस को ब्हेजना जारी रखें"
},
"contractDeployment": {
"message": "अनुबंध परिनियोजन व तैनाती"
@@ -435,13 +435,13 @@
"message": "बीज शब्द में केवल लोअरकेस वर्ण होते हैं"
},
"mainnet": {
- "message": "मुख्य ईथरम नेटवर्क"
+ "message": "मुख्य इथीरियम नेटवर्क"
},
"message": {
"message": "संदेश"
},
"metamaskDescription": {
- "message": "मेटामास्क एथर्मम के लिए एक सुरक्षित पहचान वॉल्ट है।"
+ "message": "मेटामास्क इथीरियम के लिए एक सुरक्षित पहचान वॉल्ट है।"
},
"min": {
"message": "न्यूनतम"
@@ -649,7 +649,7 @@
"message": "भेजें टोकन"
},
"sendTokensAnywhere": {
- "message": "इटोरम खाते वाले किसी को भी टोकन भेजें"
+ "message": "इथीरियम खाते वाले किसी को भी टोकन भेजें"
},
"settings": {
"message": "सेटिंग्स"
diff --git a/app/_locales/index.json b/app/_locales/index.json
index facee3c35..7717502b7 100644
--- a/app/_locales/index.json
+++ b/app/_locales/index.json
@@ -14,6 +14,7 @@
{ "code": "ru", "name": "Russian" },
{ "code": "sl", "name": "Slovenian" },
{ "code": "th", "name": "Thai" },
+ { "code": "tml", "name": "Tamil" },
{ "code": "tr", "name": "Turkish" },
{ "code": "vi", "name": "Vietnamese" },
{ "code": "zh_CN", "name": "Mandarin" },
diff --git a/app/_locales/tml/messages.json b/app/_locales/tml/messages.json
new file mode 100644
index 000000000..fcc418bac
--- /dev/null
+++ b/app/_locales/tml/messages.json
@@ -0,0 +1,912 @@
+{
+ "accept": {
+ "message": "ஏற்கவும்"
+ },
+ "account": {
+ "message": "கணக்கு"
+ },
+ "accountDetails": {
+ "message": "கணக்கு விவரங்கள்"
+ },
+ "accountName": {
+ "message": "கணக்கின் பெயர்"
+ },
+ "address": {
+ "message": "முகவரி"
+ },
+ "addCustomToken": {
+ "message": "தனிப்பயன் டோக்கனைச் சேர்க்கவும்"
+ },
+ "addToken": {
+ "message": "டோக்கனைச் சேர்"
+ },
+ "addTokens": {
+ "message": "டோக்கன்களைச் சேர்"
+ },
+ "amount": {
+ "message": "தொகை"
+ },
+ "amountPlusGas": {
+ "message": "தொகை + எரிவாயு"
+ },
+ "appDescription": {
+ "message": "எதெரியும் பிரௌசர் நீட்டிப்பு",
+ "description": "பயன்பாட்டின் விளக்கம்"
+ },
+ "appName": {
+ "message": "மேடமஸ்க் ",
+ "description": "பயன்பாட்டின் பெயர்"
+ },
+ "approved": {
+ "message": "அங்கீகரிக்கப்பட்ட"
+ },
+ "attemptingConnect": {
+ "message": "இணைக்க முயற்சி செய்க ப்ளாக்சைன்"
+ },
+ "attributions": {
+ "message": "பண்புகளும்"
+ },
+ "available": {
+ "message": "கிடைக்கும்"
+ },
+ "back": {
+ "message": "மீண்டும்"
+ },
+ "balance": {
+ "message": "இருப்பு:"
+ },
+ "balances": {
+ "message": "உங்கள் இருப்பு"
+ },
+ "balanceIsInsufficientGas": {
+ "message": "நடப்பு வாயு மொத்தம் போதுமான சமநிலை"
+ },
+ "beta": {
+ "message": "பீட்டா"
+ },
+ "betweenMinAndMax": {
+ "message": "$ 1 க்கும் அதிகமாகவும் அல்லது $ 2 க்கு சமமாகவும் இருக்க வேண்டும்.",
+ "description": "ஹெக்ஸ் உள்ளீடு தசம உள்ளீடு என உதவி"
+ },
+ "blockiesIdenticon": {
+ "message": "ப்ளாக்கிஸ் ஐடென்டிகோன் பயன்பாட்டு"
+ },
+ "borrowDharma": {
+ "message": "தர்மத்துடன் கடன் வாங்குங்கள் (பீட்டா)"
+ },
+ "builtInCalifornia": {
+ "message": "மேடமஸ்க் வடிவமைக்கப்பட்டு கலிபோர்னியாவில் கட்டப்பட்டுள்ளது."
+ },
+ "buy": {
+ "message": "வாங்க"
+ },
+ "buyCoinbase": {
+ "message": "கோஇன்பசே வாங்கவும்"
+ },
+ "buyCoinbaseExplainer": {
+ "message": "கோஇன்பசே பிறகாய்ன் , எதெரியும் மற்றும் ளிட்டசோன் வாங்க மற்றும் விற்க உலகின் மிகவும் பிரபலமான வழி"
+ },
+ "ok": {
+ "message": "சரி"
+ },
+ "cancel": {
+ "message": "ரத்து"
+ },
+ "classicInterface": {
+ "message": "கிளாசிக் இடைமுகத்தைப் பயன்படுத்தவும்"
+ },
+ "clickCopy": {
+ "message": "நகலெடுக்க கிளிக் செய்யவும்"
+ },
+ "confirm": {
+ "message": "உறுதிப்படுத்தவும்"
+ },
+ "confirmed": {
+ "message": "உறுதி"
+ },
+ "confirmContract": {
+ "message": "ஒப்பந்தத்தை உறுதிப்படுத்துக"
+ },
+ "confirmPassword": {
+ "message": "கடவுச்சொல்லை உறுதிப்படுத்துக"
+ },
+ "confirmTransaction": {
+ "message": "பரிவர்த்தனை உறுதிபடுத்தவும்"
+ },
+ "continue": {
+ "message": "தொடர்ந்து"
+ },
+ "continueToCoinbase": {
+ "message": "கோஇன்பசே ஐத் தொடரவும்"
+ },
+ "contractDeployment": {
+ "message": "ஒப்பந்த வரிசைப்படுத்தல்"
+ },
+ "conversionProgress": {
+ "message": "மாற்றம் முன்னேற்றம்"
+ },
+ "copiedButton": {
+ "message": "நகலெடுக்கப்பட்டன"
+ },
+ "copiedClipboard": {
+ "message": "கிளிப்போர்டுக்கு நகலெடுக்கப்பட்டது"
+ },
+ "copiedExclamation": {
+ "message": "நகலெடுக்கப்பட்டன!"
+ },
+ "copiedSafe": {
+ "message": "நான் எங்காவது பாதுகாப்பாக நகலெடுத்திருக்கிறேன்"
+ },
+ "copy": {
+ "message": "நகல்"
+ },
+ "copyToClipboard": {
+ "message": "கிளிப்போர்டுக்கு நகலெடுக்கப்பட்டது"
+ },
+ "copyButton": {
+ "message": " நகல் "
+ },
+ "copyPrivateKey": {
+ "message": "இது உங்கள் தனிப்பட்ட விசை (நகலெடுக்க கிளிக் செய்யவும்)"
+ },
+ "create": {
+ "message": "உருவாக்கவும்"
+ },
+ "createAccount": {
+ "message": "உங்கள் கணக்கை துவங்குங்கள்"
+ },
+ "createDen": {
+ "message": "உருவாக்கவும்"
+ },
+ "crypto": {
+ "message": "கிரிப்டோ",
+ "description": "பரிமாற்ற வகை (கிரிப்டோசுர்ரென்சிஸ்)"
+ },
+ "currentConversion": {
+ "message": "தற்போதைய மாற்றம்"
+ },
+ "currentNetwork": {
+ "message": "தற்போதைய நெட்வொர்க்"
+ },
+ "customGas": {
+ "message": "எரிவாயுவைத் தனிப்பயனாக்குங்கள்"
+ },
+ "customToken": {
+ "message": "தனிப்பயன் டோக்கன்"
+ },
+ "customize": {
+ "message": "தனிப்பயனாக்கலாம்"
+ },
+ "customRPC": {
+ "message": "விருப்ப RPC ஐ"
+ },
+ "decimalsMustZerotoTen": {
+ "message": "தசமங்கள் குறைந்தபட்சம் 0, மற்றும் 36 க்கு மேல் இருக்க வேண்டும்."
+ },
+ "decimal": {
+ "message": "துல்லியத்தின் முடிவு"
+ },
+ "defaultNetwork": {
+ "message": "எதிர் பரிவர்த்தனைகளுக்கான முன்னிருப்பு வலையமைப்பு முதன்மை நிகரமாகும்."
+ },
+ "denExplainer": {
+ "message": "உங்கள் DEN என்பது உங்கள் கடவுச்சொல்-மறைகுறியாக்கப்பட்ட சேமிப்பகம் மெட்டாமாஸ்க்கிற்குள்."
+ },
+ "deposit": {
+ "message": "வைப்புத்தொகை"
+ },
+ "depositBTC": {
+ "message": "கீழே உங்கள் முகவரிக்கு உங்கள் BTC வைப்போம்:"
+ },
+ "depositCoin": {
+ "message": "உங்கள் முகவரிக்கு $ 1 ஐ கீழே உள்ளிடவும்",
+ "description": "சேபஷிபிட் உடன் வைப்புக்குத் தேர்ந்தெடுக்கப்பட்ட நாணயத்தை பயனரிடம் கூறுகிறார்"
+ },
+ "depositEth": {
+ "message": "வைப்புத்தொகை எது "
+ },
+ "depositEther": {
+ "message": "வைப்புத்தொகை எதிர் "
+ },
+ "depositFiat": {
+ "message": "ஃபியட் உடன் வைப்பு"
+ },
+ "depositFromAccount": {
+ "message": "மற்றொரு கணக்கிலிருந்து வைப்பு"
+ },
+ "depositShapeShift": {
+ "message": "ShapeShift உடன் வைப்பு"
+ },
+ "depositShapeShiftExplainer": {
+ "message": "நீங்கள் மற்ற கிரிப்டோகிராரன்கள் சொந்தமாக வைத்திருந்தால், உங்கள் மெட்டாமாஸ்க் பணப்பையில் நேரடியாக ஈதரை வர்த்தகம் செய்யலாம் மற்றும் வைப்பு செய்யலாம். கணக்கு தேவையில்லை."
+ },
+ "details": {
+ "message": "விவரங்கள்"
+ },
+ "directDeposit": {
+ "message": "நேரடி வைப்பு"
+ },
+ "directDepositEther": {
+ "message": "நேரடியாக வைப்புத்தொகை"
+ },
+ "directDepositEtherExplainer": {
+ "message": "நீங்கள் ஏற்கனவே ஏதெர் இருந்தால், நேரடி வைப்பு மூலம் உங்கள் புதிய பணப்பையில் ஈத்தர் பெற விரைவான வழி."
+ },
+ "done": {
+ "message": "முடிந்தது"
+ },
+ "downloadStateLogs": {
+ "message": "மாநில பதிவுகள் பதிவிறக்க"
+ },
+ "dropped": {
+ "message": "நீக்கப்பட்டார்"
+ },
+ "edit": {
+ "message": "தொகு"
+ },
+ "editAccountName": {
+ "message": "கணக்கு பெயரை மாற்றுக"
+ },
+ "emailUs": {
+ "message": "எங்களுக்கு மின்னஞ்சல்!"
+ },
+ "encryptNewDen": {
+ "message": "உங்கள் புதிய DEN ஐ குறியாக்குக"
+ },
+ "enterPassword": {
+ "message": "கடவுச்சொல்லை உள்ளிடவும்"
+ },
+ "enterPasswordConfirm": {
+ "message": "உறுதிப்படுத்த உங்கள் கடவுச்சொல்லை உள்ளிடவும்"
+ },
+ "passwordNotLongEnough": {
+ "message": "கடவுச்சொல் போதாது"
+ },
+ "passwordsDontMatch": {
+ "message": "கடவுச்சொற்கள் பொருந்தாதே"
+ },
+ "etherscanView": {
+ "message": "Etherscan கணக்கைப் பார்க்கவும்"
+ },
+ "exchangeRate": {
+ "message": "மாற்று விகிதம்"
+ },
+ "exportPrivateKey": {
+ "message": "தனியார் விசை ஐ ஏற்றுமதி செய்க"
+ },
+ "exportPrivateKeyWarning": {
+ "message": "தனிப்பட்ட விசைகளை உங்கள் சொந்த ஆபத்தில் ஏற்றுமதி செய்யுங்கள்."
+ },
+ "failed": {
+ "message": "தோல்வி"
+ },
+ "fiat": {
+ "message": "FIAT",
+ "description": "பரிமாற்ற வகை"
+ },
+ "fileImportFail": {
+ "message": "கோப்பு இறக்குமதி வேலை செய்யவில்லையா? இங்கே கிளிக் செய்யவும்!",
+ "description": "JSON கோப்பில் பயனர் கணக்கை தங்கள் கணக்கை இறக்குமதி செய்ய உதவுகிறது"
+ },
+ "followTwitter": {
+ "message": "Twitter இல் எங்களைப் பின்தொடரவும்"
+ },
+ "from": {
+ "message": "இருந்து"
+ },
+ "fromToSame": {
+ "message": "இருந்து மற்றும் முகவரி அதே இருக்க முடியாது"
+ },
+ "fromShapeShift": {
+ "message": "ShapeShift இலிருந்து"
+ },
+ "gas": {
+ "message": "எரிவாயு",
+ "description": "எரிவாயு விலை குறையும்"
+ },
+ "gasFee": {
+ "message": "எரிவாயு கட்டணம்"
+ },
+ "gasLimit": {
+ "message": "எரிவாயு வரம்பு"
+ },
+ "gasLimitCalculation": {
+ "message": "நெட்வொர்க் வெற்றி விகிதங்களின் அடிப்படையில் பரிந்துரைக்கப்பட்ட எரிவாயு வரம்பை நாங்கள் கணக்கிடுகிறோம்."
+ },
+ "gasLimitRequired": {
+ "message": "எரிவாயு வரம்பு தேவை"
+ },
+ "gasLimitTooLow": {
+ "message": "எரிவாயு வரம்பு குறைந்தது 21000 ஆக இருக்க வேண்டும்"
+ },
+ "generatingSeed": {
+ "message": "விதை உருவாக்குகிறது ..."
+ },
+ "gasPrice": {
+ "message": "எரிவாயு விலை (GWEI)"
+ },
+ "gasPriceCalculation": {
+ "message": "நெட்வொர்க் வெற்றி விகிதங்களின் அடிப்படையில் பரிந்துரைக்கப்பட்ட எரிவாயு விலைகளை நாங்கள் கணக்கிடுகிறோம்."
+ },
+ "gasPriceRequired": {
+ "message": "எரிவாயு விலை தேவைப்படுகிறது"
+ },
+ "getEther": {
+ "message": "ஈத்தர் கிடைக்கும்"
+ },
+ "getEtherFromFaucet": {
+ "message": "$ 1 க்கு ஒரு குழாய் இருந்து ஈதர் கிடைக்கும்$1",
+ "description": "ஈத்தர் குழாய் ஐந்து பிணைய பெயர் காட்டுகிறது"
+ },
+ "greaterThanMin": {
+ "message": "$ 1 க்கும் அதிகமாகவோ அல்லது சமமாகவோ இருக்க வேண்டும்",
+ "description": "ஹெக்ஸ் உள்ளீடு தசம உள்ளீடு என உதவி"
+ },
+ "here": {
+ "message": "இங்கே",
+ "description": "இங்கே-கிளிக் செய்யவும்- மேலும் தகவலுக்கு (troubleTokenBalances செல்கிறது)"
+ },
+ "hereList": {
+ "message": "இங்கே ஒரு பட்டியல் !!!!"
+ },
+ "hide": {
+ "message": "மறை"
+ },
+ "hideToken": {
+ "message": "டோக்கனை மறை"
+ },
+ "hideTokenPrompt": {
+ "message": "டோக்கனை மறை?"
+ },
+ "howToDeposit": {
+ "message": "எப்படி ஈத்தர் வைப்பது?"
+ },
+ "holdEther": {
+ "message": "இது நீங்கள் ஈத்தர் மற்றும் டோக்கன்களை வைத்திருக்க உதவுகிறது, மற்றும் பரவலாக்கப்பட்ட பயன்பாடுகளுக்கு உங்கள் பாலமாக செயல்படுகிறது."
+ },
+ "import": {
+ "message": "இறக்குமதி",
+ "description": "தேர்ந்தெடுக்கப்பட்ட கோப்பிலிருந்து ஒரு கணக்கை இறக்குமதி செய்ய பொத்தானை அழுத்தவும்"
+ },
+ "importAccount": {
+ "message": "கணக்கை இறக்குமதி செய்க"
+ },
+ "importAccountMsg": {
+ "message":" இறக்குமதி செய்யப்பட்ட கணக்கு உங்கள் முதலில் உருவாக்கப்பட்ட மெட்டாமாஸ்க் கணக்கு விதை மூலம் தொடர்புடையதாக இருக்காது. இறக்குமதி செய்யப்பட்ட கணக்குகள் பற்றி மேலும் அறிக "
+ },
+ "importAnAccount": {
+ "message": "ஒரு கணக்கை இறக்குமதி செய்க"
+ },
+ "importDen": {
+ "message": "இறக்குமதி DEN இறக்குமதி"
+ },
+ "imported": {
+ "message": "இறக்குமதி",
+ "description": "ஒரு கணக்கு முழுமையாக விசைப்பலகையில் ஏற்றப்பட்டதைக் காட்டுகிறது"
+ },
+ "infoHelp": {
+ "message": "தகவல் மற்றும் உதவி"
+ },
+ "insufficientFunds": {
+ "message": "போதுமான பணம் இல்லை."
+ },
+ "insufficientTokens": {
+ "message": "போதுமான டோக்கன்கள்."
+ },
+ "invalidAddress": {
+ "message": "தவறான முகவரி"
+ },
+ "invalidAddressRecipient": {
+ "message": "பெறுநர் முகவரி தவறானது"
+ },
+ "invalidGasParams": {
+ "message": "தவறான எரிவாயு அளவுருக்கள்"
+ },
+ "invalidInput": {
+ "message": "தவறான உள்ளீடு.."
+ },
+ "invalidRequest": {
+ "message": "தவறான கோரிக்கை"
+ },
+ "invalidRPC": {
+ "message": "தவறான RPC URI"
+ },
+ "jsonFail": {
+ "message": "ஏதோ தவறு நடந்துவிட்டது. உங்கள் JSON கோப்பு ஒழுங்காக வடிவமைக்கப்பட்டுள்ளது என்பதை உறுதிப்படுத்தவும்"
+ },
+ "jsonFile": {
+ "message": "JSON கோப்பு",
+ "description": "ஒரு கணக்கை இறக்குமதி செய்ய வடிவமைக்கப்பட்டுள்ளது"
+ },
+ "keepTrackTokens": {
+ "message": "உங்கள் மேடமஸ்க் கணக்குடன் நீங்கள் வாங்கிய டோக்கன்களை கண்காணியுங்கள்."
+ },
+ "kovan": {
+ "message": "கோவன் டெஸ்ட் நெட்வொர்க்"
+ },
+ "knowledgeDataBase": {
+ "message": "எங்கள் அறிவுத் தளத்தைப் பார்வையிடவும்"
+ },
+ "max": {
+ "message": "மேக்ஸ்"
+ },
+ "learnMore": {
+ "message": "மேலும் அறிக"
+ },
+ "lessThanMax": {
+ "message": "$ 1 க்கும் குறைவாகவோ அல்லது சமமாகவோ இருக்க வேண்டும்.",
+ "description": "ஹெக்ஸ் உள்ளீடு தசம உள்ளீடு என உதவி"
+ },
+ "likeToAddTokens": {
+ "message": "இந்த டோக்கன்களைச் சேர்க்க விரும்புகிறீர்களா?"
+ },
+ "links": {
+ "message": "இணைப்புகள்"
+ },
+ "limit": {
+ "message": "அளவு"
+ },
+ "loading": {
+ "message": "ஏற்றுதல் ..."
+ },
+ "loadingTokens": {
+ "message": "டோக்கன்களை ஏற்றுகிறது ..."
+ },
+ "localhost": {
+ "message": "லோக்கல் ஹோஸ்ட் 8545"
+ },
+ "login": {
+ "message": "உள் நுழை"
+ },
+ "logout": {
+ "message": "வெளியேறு"
+ },
+ "loose": {
+ "message": "லூஸ்"
+ },
+ "loweCaseWords": {
+ "message": "விதை வார்த்தைகள் ஸ்மால் எழுத்துகள் மட்டுமே"
+ },
+ "mainnet": {
+ "message": "முதன்மை எதெரியும் நெட்வொர்க்"
+ },
+ "message": {
+ "message": "செய்தி"
+ },
+ "metamaskDescription": {
+ "message": "மேடமஸ்க் என்பது ஒரு பாதுகாப்பான அடையாள வால்ட் எதெரியும்"
+ },
+ "min": {
+ "message": "குறைந்தபட்ச"
+ },
+ "myAccounts": {
+ "message": "எனது கணக்குகள்"
+ },
+ "mustSelectOne": {
+ "message": "குறைந்தது 1 டோக்கனை தேர்ந்தெடுக்க வேண்டும்."
+ },
+ "needEtherInWallet": {
+ "message": "மேடமஸ்க் ஐ பயன்படுத்தி பரவலாக்கப்பட்ட பயன்பாடுகளுடன் தொடர்பு கொள்ள, உங்கள் பணப்பரிமாற்றத்தில் ஈதர் தேவை."
+ },
+ "needImportFile": {
+ "message": "இறக்குமதி செய்ய ஒரு கோப்பை நீங்கள் தேர்ந்தெடுக்க வேண்டும்.",
+ "description": "பயனர் ஒரு கணக்கு முக்கியம் மற்றும் தொடர ஒரு கோப்பு சேர்க்க வேண்டும்"
+ },
+ "needImportPassword": {
+ "message": "நீங்கள் தேர்ந்தெடுத்த கோப்புக்கு ஒரு கடவுச்சொல்லை உள்ளிட வேண்டும்.",
+ "description": "ஒரு கணக்கை இறக்குமதி செய்ய கடவுச்சொல் மற்றும் கோப்பு தேவை"
+ },
+ "negativeETH": {
+ "message": "ETH எதிர்மறை அளவுகளை அனுப்ப முடியாது."
+ },
+ "networks": {
+ "message": "நெட்வொர்க்ஸ்"
+ },
+ "newAccount": {
+ "message": "புதிய கணக்கு"
+ },
+ "newAccountNumberName": {
+ "message": "கணக்கு $ 1",
+ "description": "கணக்கு கணக்கை உருவாக்குவதற்கு அடுத்த கணக்கின் இயல்புநிலை பெயர் உருவாக்கப்படும்"
+ },
+ "newContract": {
+ "message": "புதிய ஒப்பந்தம்"
+ },
+ "newPassword": {
+ "message": "புதிய கடவுச்சொல் (min 8 எழுத்துகள்)"
+ },
+ "newRecipient": {
+ "message": "புதிய பெறுநர்"
+ },
+ "newRPC": {
+ "message": "புதிய RPC URL"
+ },
+ "next": {
+ "message": "அடுத்த"
+ },
+ "noAddressForName": {
+ "message": "இந்த பெயருக்கான முகவரி அமைக்கப்படவில்லை."
+ },
+ "noDeposits": {
+ "message": "எந்த வைப்புகளும் கிடைக்கவில்லை"
+ },
+ "noTransactionHistory": {
+ "message": "பரிவர்த்தனை வரலாறு இல்லை."
+ },
+ "noTransactions": {
+ "message": "பரிவர்த்தனைகள் இல்லை"
+ },
+ "notStarted": {
+ "message": "துவங்கவில்லை"
+ },
+ "oldUI": {
+ "message": "பழைய UI"
+ },
+ "oldUIMessage": {
+ "message": "நீங்கள் பழைய UI க்கு திரும்பியுள்ளீர்கள். மேல் வலது கீழ்தோன்றும் மெனுவில் உள்ள விருப்பத்தின் மூலம் புதிய UI ஐ மீண்டும் மாறலாம்."
+ },
+ "or": {
+ "message": "அல்லது",
+ "description": "ஒரு புதிய கணக்கை உருவாக்க அல்லது இறக்குமதி செய்வதற்கு இடையே தேர்வு"
+ },
+ "passwordCorrect": {
+ "message": "தயவுசெய்து உங்கள் கடவுச்சொல் சரியானதா என உறுதிப்படுத்தவும்."
+ },
+ "passwordMismatch": {
+ "message": "கடவுச்சொற்கள் பொருந்தவில்லை",
+ "description": "கடவுச்சொல் உருவாக்கத்தில், இரண்டு புதிய கடவுச்சொல் புலங்கள் பொருந்தவில்லை"
+ },
+ "passwordShort": {
+ "message": "கடவுச்சொல் நீண்ட காலமாக இல்லை",
+ "description": "கடவுச்சொல் உருவாக்கத்தில், பாதுகாப்பானதாக இருக்கும் கடவுச்சொல் போதும்"
+ },
+ "pastePrivateKey": {
+ "message": "இங்கே உங்கள் தனிப்பட்ட விசை சரத்தை ஒட்டுக:",
+ "description": "ஒரு தனிப்பட்ட விசை ஒரு கணக்கை இறக்குமதி செய்ய"
+ },
+ "pasteSeed": {
+ "message": "இங்கே உங்கள் விதை சொற்றொடரை ஒட்டவும்!"
+ },
+ "personalAddressDetected": {
+ "message": "தனிப்பட்ட முகவரி கண்டறியப்பட்டது. டோக்கன் ஒப்பந்த முகவரியை உள்ளிடவும்."
+ },
+ "pleaseReviewTransaction": {
+ "message": "உங்கள் பரிவர்த்தனை மதிப்பாய்வு செய்யவும்."
+ },
+ "popularTokens": {
+ "message": "பிரபலமான டோக்கன்கள்"
+ },
+ "privacyMsg": {
+ "message": "தனியுரிமை கொள்கை"
+ },
+ "privateKey": {
+ "message": "தனிப்பட்ட விசை",
+ "description": "ஒரு கணக்கை இறக்குமதி செய்ய பயன்படுத்த இந்த வகை கோப்பை தேர்ந்தெடுக்கவும்"
+ },
+ "privateKeyWarning": {
+ "message": "எச்சரிக்கை: இந்த விசையை எப்போதும் வெளியிட வேண்டாம். உங்கள் தனிப்பட்ட விசைகளைக் கொண்ட எவரும் உங்கள் கணக்கில் உள்ள எந்த சொத்துக்களையும் திருடலாம்."
+ },
+ "privateNetwork": {
+ "message": "தனியார் நெட்வொர்க்"
+ },
+ "qrCode": {
+ "message": "QR குறியீட்டைக் காட்டு"
+ },
+ "readdToken": {
+ "message": "உங்கள் கணக்கு விருப்பங்கள் மெனுவில் \"டோக்கனைச் சேர்\" என்பதன் மூலம் நீங்கள் எதிர்காலத்தில் இந்த டோக்கனை மீண்டும் சேர்க்கலாம்."
+ },
+ "readMore": {
+ "message": "மேலும் வாசிக்க இங்கே."
+ },
+ "readMore2": {
+ "message": "மேலும் வாசிக்க."
+ },
+ "receive": {
+ "message": "பெறுக"
+ },
+ "recipientAddress": {
+ "message": "பெறுநர் முகவரி"
+ },
+ "refundAddress": {
+ "message": "உங்கள் பணத்தை திருப்பி அனுப்பும் முகவரி"
+ },
+ "rejected": {
+ "message": "நிராகரிக்கப்பட்டது"
+ },
+ "resetAccount": {
+ "message": "கணக்கை மீட்டமை"
+ },
+ "restoreFromSeed": {
+ "message": "விதை வாக்கியத்திலிருந்து மீட்கவும்"
+ },
+ "restoreVault": {
+ "message": "வால்ட் மீட்கவும்"
+ },
+ "required": {
+ "message": "தேவையான"
+ },
+ "retryWithMoreGas": {
+ "message": "இங்கே அதிக எரிவாயு விலை மீண்டும் முயற்சிக்கவும்"
+ },
+ "walletSeed": {
+ "message": "வால்ட் விதை"
+ },
+ "revealSeedWords": {
+ "message": "விதை வார்த்தைகள் வெளிப்படுத்த"
+ },
+ "revealSeedWordsWarning": {
+ "message": "உங்கள் விதை வார்த்தைகள் ஒரு பொது இடத்தில் மீட்க வேண்டாம்! உங்கள் எல்லா கணக்குகளையும் திருட இந்த வார்த்தைகள் பயன்படுத்தப்படலாம்."
+ },
+ "revert": {
+ "message": "மாற்றியமை"
+ },
+ "rinkeby": {
+ "message": "ரிங்கெப்ய டெஸ்ட் நெட்வொர்க்"
+ },
+ "ropsten": {
+ "message": "ரொப்ஸ்டென் டெஸ்ட் நெட்வொர்க்"
+ },
+ "currentRpc": {
+ "message": "தற்போதைய RPC"
+ },
+ "connectingToMainnet": {
+ "message": "முக்கிய எதெரியும் நெட்வொர்க் இணைக்கும்"
+ },
+ "connectingToRopsten": {
+ "message": "ரொப்ஸ்டென் டெஸ்ட் நெட்வொர்க்குடன் இணைக்கிறது"
+ },
+ "connectingToKovan": {
+ "message": "கோவன் டெஸ்ட் நெட்வொர்க்குடன் இணைத்தல்"
+ },
+ "connectingToRinkeby": {
+ "message": "ரிங்கெப்ய டெஸ்ட் நெட்வொர்க்குடன் இணைக்கிறது"
+ },
+ "connectingToUnknown": {
+ "message": "தெரியாத நெட்வொர்க்குடன் இணைக்கிறது"
+ },
+ "sampleAccountName": {
+ "message": "உதாரணமாக எனது புதிய கணக்கு",
+ "description": "தங்கள் கணக்கில் மனிதர் படிக்கக்கூடிய பெயரைச் சேர்க்கும் கருத்தை பயனர் புரிந்து கொள்ள உதவுங்கள்"
+ },
+ "save": {
+ "message": "சேமி"
+ },
+ "reprice_title": {
+ "message": "ரெப்ரிஸ் பரிவர்த்தனை"
+ },
+ "reprice_subtitle": {
+ "message": "உங்கள் பரிவர்த்தனைகளை மேலெழுதும் முயற்சியை அதிகரிக்க உங்கள் எரிவாயு விலையை அதிகரிக்கவும்"
+ },
+ "saveAsFile": {
+ "message": "கோப்பாக சேமிக்கவும்",
+ "description": "கணக்கு ஏற்றுமதி செயல்முறை"
+ },
+ "saveSeedAsFile": {
+ "message": "கோப்பு என விதை வார்த்தைகள் சேமிக்கவும்"
+ },
+ "search": {
+ "message": "தேடல்"
+ },
+ "secretPhrase": {
+ "message": "உங்கள் பெட்டகத்தை மீட்டெடுப்பதற்காக இங்கே உங்கள் ரகசிய பன்னிரண்டு வார்த்தை சொற்றொடரை உள்ளிடவும்."
+ },
+ "newPassword8Chars": {
+ "message": "புதிய கடவுச்சொல் (குறைந்தபட்சம் 8 எழுத்துகள்)"
+ },
+ "seedPhraseReq": {
+ "message": "விதை வாக்கியங்கள் 12 வார்த்தைகள் நீண்டவை"
+ },
+ "select": {
+ "message": "தேர்வு"
+ },
+ "selectCurrency": {
+ "message": "நாணயத்தைத் தேர்ந்தெடு"
+ },
+ "selectService": {
+ "message": "சேவை தேர்ந்தெடுக்கவும்"
+ },
+ "selectType": {
+ "message": "வகை தேர்ந்தெடு"
+ },
+ "send": {
+ "message": "அனுப்பு"
+ },
+ "sendETH": {
+ "message": "ETH ஐ அனுப்பு"
+ },
+ "sendTokens": {
+ "message": "டோக்கன்களை அனுப்பவும்"
+ },
+ "onlySendToEtherAddress": {
+ "message": "ETH ஐ ஒரு எதரியும் முகவரிக்கு மட்டும் அனுப்பவும்."
+ },
+ "searchTokens": {
+ "message": "தேடல் டோக்கன்ஸ்"
+ },
+ "sendTokensAnywhere": {
+ "message": "யாருடனும் டோக்கன்களை அனுப்பவும் எதெரியும் கணக்கு"
+ },
+ "settings": {
+ "message": "அமைப்புகள்"
+ },
+ "info": {
+ "message": "தகவல்"
+ },
+ "shapeshiftBuy": {
+ "message": "Shapeshift உடன் வாங்கவும்"
+ },
+ "showPrivateKeys": {
+ "message": "தனிப்பட்ட விசைகளைக் காண்பி"
+ },
+ "showQRCode": {
+ "message": "QR குறியீட்டைக் காட்டு"
+ },
+ "sign": {
+ "message": "உள்நுழை"
+ },
+ "signed": {
+ "message": "கையொப்பமிடப்பட்ட"
+ },
+ "signMessage": {
+ "message": "செய்தியை பதிவு செய்க"
+ },
+ "signNotice": {
+ "message": "இந்த செய்தியில் கையொப்பமிடலாம் \nஆபத்தான பக்க விளைவுகள் இருக்கலாம். \n உங்கள் மொத்த கணக்கில் முழுமையாக நம்பக்கூடிய தளங்களில் செய்திகளை மட்டுமே கையொப்பமிடுங்கள். \n இந்த ஆபத்தான முறை எதிர்கால பதிப்பில் அகற்றப்படும்."
+ },
+ "sigRequest": {
+ "message": "கையொப்பம் கோரிக்கை"
+ },
+ "sigRequested": {
+ "message": "கையொப்பம் கோரப்பட்டது"
+ },
+ "spaceBetween": {
+ "message": "வார்த்தைகள் இடையே இடைவெளி மட்டுமே இருக்க முடியும்"
+ },
+ "status": {
+ "message": "நிலைமை"
+ },
+ "stateLogs": {
+ "message": "மாநில பதிவுகள்"
+ },
+ "stateLogsDescription": {
+ "message": "மாநில பதிவுகள் உங்கள் பொது கணக்கு முகவரிகள் மற்றும் பரிமாற்றங்களை அனுப்பியுள்ளன."
+ },
+ "stateLogError": {
+ "message": "மாநில பதிவுகளை மீட்டெடுப்பதில் பிழை."
+ },
+ "submit": {
+ "message": "சமர்ப்பி"
+ },
+ "submitted": {
+ "message": "சமர்ப்பிக்கப்பட்டது"
+ },
+ "supportCenter": {
+ "message": "எங்கள் ஆதரவு மையத்தைப் பார்வையிடவும்"
+ },
+ "symbolBetweenZeroTen": {
+ "message": "குறியீடு 0 மற்றும் 10 எழுத்துகளுக்கு இடையில் இருக்க வேண்டும்."
+ },
+ "takesTooLong": {
+ "message": "நீண்ட நேரம் எடுத்துக்கொள்கிறது?"
+ },
+ "terms": {
+ "message": "பயன்பாட்டு விதிமுறைகளை"
+ },
+ "testFaucet": {
+ "message": "சோதனை குழாய்"
+ },
+ "to": {
+ "message": "பெறுநர்: "
+ },
+ "toETHviaShapeShift": {
+ "message": "$ 1 முதல் ETH வரை வடிவம்",
+ "description": "செய்தி தொடக்கத்தில் வைப்பு வகைகளில் நிரப்பப்படும்"
+ },
+ "tokenAddress": {
+ "message": "டோக்கன் முகவரி"
+ },
+ "tokenAlreadyAdded": {
+ "message": "டோக்கன் ஏற்கனவே சேர்க்கப்பட்டது."
+ },
+ "tokenBalance": {
+ "message": "உங்கள் டோக்கன் இருப்பு:"
+ },
+ "tokenSelection": {
+ "message": "டோக்கன்களைத் தேடு அல்லது பிரபல டோக்கன்களின் பட்டியலிலிருந்து தேர்ந்தெடுக்கவும்."
+ },
+ "tokenSymbol": {
+ "message": "டோக்கன் சின்னம்"
+ },
+ "tokenWarning1": {
+ "message": "உங்கள் மேடமஸ்க் கணக்குடன் நீங்கள் வாங்கிய டோக்கன்களை கண்காணியுங்கள். வேறு கணக்கைப் பயன்படுத்தி டோக்கன்களை வாங்கிவிட்டால், அந்த டோக்கன்கள் இங்கே தோன்றாது."
+ },
+ "total": {
+ "message": "மொத்த"
+ },
+ "transactions": {
+ "message": "பரிவர்த்தனைகள்"
+ },
+ "transactionError": {
+ "message": "பரிவர்த்தனை பிழை. விதிமுறை ஒப்பந்தத்தில் விதிவிலக்கு."
+ },
+ "transactionMemo": {
+ "message": "பரிவர்த்தனை குறிப்பு (விருப்பம்)"
+ },
+ "transactionNumber": {
+ "message": "பரிவர்த்தனை எண்"
+ },
+ "transfers": {
+ "message": "இடமாற்றங்கள்"
+ },
+ "troubleTokenBalances": {
+ "message": "உங்கள் டோக்கன் நிலுவைகளை ஏற்றுவதில் சிக்கல் ஏற்பட்டது. நீங்கள் அவர்களை பார்க்க முடியும்.",
+ "description": "டோக்கன் நிலுவைகளை காண ஒரு இணைப்பு (இங்கே) தொடர்ந்து"
+ },
+ "twelveWords": {
+ "message": "இந்த 12 வார்த்தைகள் உங்கள் மெட்டாமாஸ்க் கணக்கை மீட்க ஒரே வழி. \n அவற்றை எங்காவது பாதுகாப்பாகவும் ரகசியமாகவும் சேமிக்கவும்."
+ },
+ "typePassword": {
+ "message": "உங்கள் கடவுச்சொல்லை தட்டச்சு செய்யவும்"
+ },
+ "uiWelcome": {
+ "message": "புதிய UI (பீட்டா) க்கு வரவேற்கிறோம்"
+ },
+ "uiWelcomeMessage": {
+ "message": "இப்போது நீங்கள் புதிய மெட்டாமாஸ்க்கு UI ஐ பயன்படுத்துகிறீர்கள். சுற்றி பாருங்கள், டோக்கன்களை அனுப்பும் புதிய அம்சங்களை முயற்சிக்கவும், உங்களிடம் ஏதேனும் சிக்கல் இருந்தால் எங்களுக்குத் தெரியப்படுத்தவும்."
+ },
+ "unapproved": {
+ "message": "அங்கீகரிக்கப்படாத"
+ },
+ "unavailable": {
+ "message": "கிடைக்கவில்லை"
+ },
+ "unknown": {
+ "message": "தெரியாத"
+ },
+ "unknownNetwork": {
+ "message": "அறியப்படாத தனியார் நெட்வொர்க்"
+ },
+ "unknownNetworkId": {
+ "message": "தெரியாத நெட்வொர்க் ஐடி"
+ },
+ "uriErrorMsg": {
+ "message": "URI கள் சரியான HTTP / HTTPS முன்னொட்டு தேவை."
+ },
+ "usaOnly": {
+ "message": "அமெரிக்கா மட்டும்",
+ "description": "இந்த பரிமாற்றத்தைப் பயன்படுத்தி அமெரிக்காவில் உள்ளவர்களுக்கு மட்டுமே இது வரையறுக்கப்படுகிறது"
+ },
+ "usedByClients": {
+ "message": "பல்வேறு வாடிக்கையாளர்கள் பல்வேறு பயன்படுத்திய"
+ },
+ "useOldUI": {
+ "message": "உஸ் ஓல்ட் உய் "
+ },
+ "validFileImport": {
+ "message": "இறக்குமதி செய்ய சரியான கோப்பு தேர்ந்தெடுக்க வேண்டும்."
+ },
+ "vaultCreated": {
+ "message": "வால்ட் உருவாக்கப்பட்டது"
+ },
+ "viewAccount": {
+ "message": "கணக்கைக் காட்டு"
+ },
+ "visitWebSite": {
+ "message": "எங்கள் வலைத்தளத்தைப் பார்வையிடவும்"
+ },
+ "warning": {
+ "message": "எச்சரிக்கை"
+ },
+ "welcomeBeta": {
+ "message": "மெட்டாமாஸ்க் பீட்டாவுக்கு வருக"
+ },
+ "whatsThis": {
+ "message": "இது என்ன?"
+ },
+ "yourSigRequested": {
+ "message": "உங்கள் கையொப்பம் கோரப்படுகிறது"
+ },
+ "youSign": {
+ "message": "நீங்கள் கையெழுத்திடுகிறீர்கள்"
+ }
+}
diff --git a/app/scripts/lib/config-manager.js b/app/scripts/lib/config-manager.js
index 34b603b96..63d27c40e 100644
--- a/app/scripts/lib/config-manager.js
+++ b/app/scripts/lib/config-manager.js
@@ -102,7 +102,6 @@ ConfigManager.prototype.setShowSeedWords = function (should) {
this.setData(data)
}
-
ConfigManager.prototype.getShouldShowSeedWords = function () {
var data = this.getData()
return data.showSeedWords
@@ -118,6 +117,27 @@ ConfigManager.prototype.getSeedWords = function () {
var data = this.getData()
return data.seedWords
}
+
+/**
+ * Called to set the isRevealingSeedWords flag. This happens only when the user chooses to reveal
+ * the seed words and not during the first time flow.
+ * @param {boolean} reveal - Value to set the isRevealingSeedWords flag.
+ */
+ConfigManager.prototype.setIsRevealingSeedWords = function (reveal = false) {
+ const data = this.getData()
+ data.isRevealingSeedWords = reveal
+ this.setData(data)
+}
+
+/**
+ * Returns the isRevealingSeedWords flag.
+ * @returns {boolean|undefined}
+ */
+ConfigManager.prototype.getIsRevealingSeedWords = function () {
+ const data = this.getData()
+ return data.isRevealingSeedWords
+}
+
ConfigManager.prototype.setRpcTarget = function (rpcUrl) {
var config = this.getConfig()
config.provider = {
diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js
index a12b6776e..782bc50ac 100644
--- a/app/scripts/metamask-controller.js
+++ b/app/scripts/metamask-controller.js
@@ -308,6 +308,7 @@ module.exports = class MetamaskController extends EventEmitter {
lostAccounts: this.configManager.getLostAccounts(),
seedWords: this.configManager.getSeedWords(),
forgottenPassword: this.configManager.getPasswordForgotten(),
+ isRevealingSeedWords: Boolean(this.configManager.getIsRevealingSeedWords()),
},
}
}
@@ -347,6 +348,7 @@ module.exports = class MetamaskController extends EventEmitter {
clearSeedWordCache: this.clearSeedWordCache.bind(this),
resetAccount: nodeify(this.resetAccount, this),
importAccountWithStrategy: this.importAccountWithStrategy.bind(this),
+ setIsRevealingSeedWords: this.configManager.setIsRevealingSeedWords.bind(this.configManager),
// vault management
submitPassword: nodeify(keyringController.submitPassword, keyringController),
diff --git a/mascara/src/app/first-time/confirm-seed-screen.js b/mascara/src/app/first-time/confirm-seed-screen.js
index 438f383b1..7c0431431 100644
--- a/mascara/src/app/first-time/confirm-seed-screen.js
+++ b/mascara/src/app/first-time/confirm-seed-screen.js
@@ -9,7 +9,7 @@ import Identicon from '../../../../ui/app/components/identicon'
import { confirmSeedWords, showModal } from '../../../../ui/app/actions'
import Breadcrumbs from './breadcrumbs'
import LoadingScreen from './loading-screen'
-import { DEFAULT_ROUTE } from '../../../../ui/app/routes'
+import { DEFAULT_ROUTE, INITIALIZE_BACKUP_PHRASE_ROUTE } from '../../../../ui/app/routes'
class ConfirmSeedScreen extends Component {
static propTypes = {
@@ -53,7 +53,7 @@ class ConfirmSeedScreen extends Component {
}
render () {
- const { seedWords } = this.props
+ const { seedWords, history } = this.props
const { selectedSeeds, shuffledSeeds } = this.state
const isValid = seedWords === selectedSeeds.map(([_, seed]) => seed).join(' ')
@@ -66,6 +66,16 @@ class ConfirmSeedScreen extends Component {
<div className="first-view-main-wrapper">
<div className="first-view-main">
<div className="backup-phrase">
+ <a
+ className="backup-phrase__back-button"
+ onClick={e => {
+ e.preventDefault()
+ history.push(INITIALIZE_BACKUP_PHRASE_ROUTE)
+ }}
+ href="#"
+ >
+ {`< Back`}
+ </a>
<Identicon address={this.props.address} diameter={70} />
<div className="backup-phrase__content-wrapper">
<div>
diff --git a/mascara/src/app/first-time/seed-screen.js b/mascara/src/app/first-time/seed-screen.js
index d004be77b..9af9ca3be 100644
--- a/mascara/src/app/first-time/seed-screen.js
+++ b/mascara/src/app/first-time/seed-screen.js
@@ -8,6 +8,7 @@ import Identicon from '../../../../ui/app/components/identicon'
import Breadcrumbs from './breadcrumbs'
import LoadingScreen from './loading-screen'
import { DEFAULT_ROUTE, INITIALIZE_CONFIRM_SEED_ROUTE } from '../../../../ui/app/routes'
+import { confirmSeedWords } from '../../../../ui/app/actions'
const LockIcon = props => (
<svg
@@ -44,6 +45,8 @@ class BackupPhraseScreen extends Component {
address: PropTypes.string.isRequired,
seedWords: PropTypes.string,
history: PropTypes.object,
+ isRevealingSeedWords: PropTypes.bool,
+ clearSeedWords: PropTypes.func,
};
static defaultProps = {
@@ -58,6 +61,14 @@ class BackupPhraseScreen extends Component {
}
componentWillMount () {
+ this.checkSeedWords()
+ }
+
+ componentDidUpdate () {
+ this.checkSeedWords()
+ }
+
+ checkSeedWords () {
const { seedWords, history } = this.props
if (!seedWords) {
@@ -92,9 +103,29 @@ class BackupPhraseScreen extends Component {
)
}
- renderSecretScreen () {
+ renderSubmitButton () {
+ const { isRevealingSeedWords, clearSeedWords, history } = this.props
const { isShowingSecret } = this.state
- const { history } = this.props
+
+ return isRevealingSeedWords
+ ? <button
+ className="first-time-flow__button"
+ onClick={() => clearSeedWords().then(() => history.push(DEFAULT_ROUTE))}
+ disabled={!isShowingSecret}
+ >
+ Done
+ </button>
+ : <button
+ className="first-time-flow__button"
+ onClick={() => isShowingSecret && history.push(INITIALIZE_CONFIRM_SEED_ROUTE)}
+ disabled={!isShowingSecret}
+ >
+ Next
+ </button>
+ }
+
+ renderSecretScreen () {
+ const { isRevealingSeedWords } = this.props
return (
<div className="backup-phrase__content-wrapper">
@@ -121,14 +152,8 @@ class BackupPhraseScreen extends Component {
</div>
</div>
<div className="backup-phrase__next-button">
- <button
- className="first-time-flow__button"
- onClick={() => isShowingSecret && history.push(INITIALIZE_CONFIRM_SEED_ROUTE)}
- disabled={!isShowingSecret}
- >
- Next
- </button>
- <Breadcrumbs total={3} currentIndex={1} />
+ { this.renderSubmitButton() }
+ { !isRevealingSeedWords && <Breadcrumbs total={3} currentIndex={1} />}
</div>
</div>
)
@@ -150,13 +175,25 @@ class BackupPhraseScreen extends Component {
}
}
+const mapStateToProps = ({ metamask, appState }) => {
+ const { selectedAddress, seedWords, isRevealingSeedWords } = metamask
+ const { isLoading } = appState
+
+ return {
+ seedWords,
+ isRevealingSeedWords,
+ isLoading,
+ address: selectedAddress,
+ }
+}
+
+const mapDispatchToProps = dispatch => {
+ return {
+ clearSeedWords: () => dispatch(confirmSeedWords()),
+ }
+}
+
export default compose(
withRouter,
- connect(
- ({ metamask: { selectedAddress, seedWords }, appState: { isLoading } }) => ({
- seedWords,
- isLoading,
- address: selectedAddress,
- })
- )
+ connect(mapStateToProps, mapDispatchToProps),
)(BackupPhraseScreen)
diff --git a/test/integration/lib/tx-list-items.js b/test/integration/lib/tx-list-items.js
index d0056eb94..0c0c5a77f 100644
--- a/test/integration/lib/tx-list-items.js
+++ b/test/integration/lib/tx-list-items.js
@@ -53,7 +53,7 @@ async function runTxListItemsTest(assert, done) {
const confirmedTokenTx = txListItems[6]
const confirmedTokenTxAddress = await findAsync($(confirmedTokenTx), '.tx-list-account')
- assert.equal(confirmedTokenTxAddress[0].textContent, '0xe7884118...81a9', 'confirmedTokenTx has correct address')
+ assert.equal(confirmedTokenTxAddress[0].textContent, '0xE7884118...81a9', 'confirmedTokenTx has correct address')
const rejectedTx = txListItems[7]
const rejectedTxRenderedStatus = await findAsync($(rejectedTx), '.tx-list-status')
diff --git a/ui/app/actions.js b/ui/app/actions.js
index f5cdd32bc..73335db97 100644
--- a/ui/app/actions.js
+++ b/ui/app/actions.js
@@ -351,7 +351,6 @@ function confirmSeedWords () {
log.debug(`background.clearSeedWordCache`)
return new Promise((resolve, reject) => {
background.clearSeedWordCache((err, account) => {
- dispatch(actions.hideLoadingIndication())
if (err) {
dispatch(actions.displayWarning(err.message))
return reject(err)
@@ -362,6 +361,9 @@ function confirmSeedWords () {
resolve(account)
})
})
+ .then(() => dispatch(setIsRevealingSeedWords(false)))
+ .then(() => dispatch(actions.hideLoadingIndication()))
+ .catch(() => dispatch(actions.hideLoadingIndication()))
}
}
@@ -446,11 +448,13 @@ function requestRevealSeed (password) {
}
dispatch(actions.showNewVaultSeed(result))
- dispatch(actions.hideLoadingIndication())
resolve()
})
})
})
+ .then(() => dispatch(setIsRevealingSeedWords(true)))
+ .then(() => dispatch(actions.hideLoadingIndication()))
+ .catch(() => dispatch(actions.hideLoadingIndication()))
}
}
@@ -1907,3 +1911,11 @@ function updateNetworkEndpointType (networkEndpointType) {
value: networkEndpointType,
}
}
+
+function setIsRevealingSeedWords (reveal) {
+ return dispatch => {
+ log.debug(`background.setIsRevealingSeedWords`)
+ background.setIsRevealingSeedWords(reveal)
+ return forceUpdateMetamaskState(dispatch)
+ }
+}
diff --git a/ui/app/app.js b/ui/app/app.js
index e462701fa..0b38b1326 100644
--- a/ui/app/app.js
+++ b/ui/app/app.js
@@ -56,11 +56,20 @@ const {
class App extends Component {
componentWillMount () {
- const { currentCurrency, setCurrentCurrencyToUSD } = this.props
+ const {
+ currentCurrency,
+ setCurrentCurrencyToUSD,
+ isRevealingSeedWords,
+ clearSeedWords,
+ } = this.props
if (!currentCurrency) {
setCurrentCurrencyToUSD()
}
+
+ if (isRevealingSeedWords) {
+ clearSeedWords()
+ }
}
renderRoutes () {
@@ -393,6 +402,8 @@ App.propTypes = {
isMouseUser: PropTypes.bool,
setMouseUserState: PropTypes.func,
t: PropTypes.func,
+ isRevealingSeedWords: PropTypes.bool,
+ clearSeedWords: PropTypes.func,
}
function mapStateToProps (state) {
@@ -473,6 +484,7 @@ function mapDispatchToProps (dispatch, ownProps) {
setCurrentCurrencyToUSD: () => dispatch(actions.setCurrentCurrency('usd')),
toggleAccountMenu: () => dispatch(actions.toggleAccountMenu()),
setMouseUserState: (isMouseUser) => dispatch(actions.setMouseUserState(isMouseUser)),
+ clearSeedWords: () => dispatch(actions.confirmSeedWords()),
}
}
diff --git a/ui/app/components/account-dropdowns.js b/ui/app/components/account-dropdowns.js
index 03955e077..043008a36 100644
--- a/ui/app/components/account-dropdowns.js
+++ b/ui/app/components/account-dropdowns.js
@@ -7,8 +7,8 @@ const connect = require('react-redux').connect
const Dropdown = require('./dropdown').Dropdown
const DropdownMenuItem = require('./dropdown').DropdownMenuItem
const Identicon = require('./identicon')
-const ethUtil = require('ethereumjs-util')
const copyToClipboard = require('copy-to-clipboard')
+const { checksumAddress } = require('../util')
class AccountDropdowns extends Component {
constructor (props) {
@@ -212,8 +212,7 @@ class AccountDropdowns extends Component {
closeMenu: () => {},
onClick: () => {
const { selected } = this.props
- const checkSumAddress = selected && ethUtil.toChecksumAddress(selected)
- copyToClipboard(checkSumAddress)
+ copyToClipboard(checksumAddress(selected))
},
},
this.context.t('copyAddress'),
diff --git a/ui/app/components/dropdowns/components/account-dropdowns.js b/ui/app/components/dropdowns/components/account-dropdowns.js
index a133f0e29..179b6617f 100644
--- a/ui/app/components/dropdowns/components/account-dropdowns.js
+++ b/ui/app/components/dropdowns/components/account-dropdowns.js
@@ -7,7 +7,7 @@ const connect = require('react-redux').connect
const Dropdown = require('./dropdown').Dropdown
const DropdownMenuItem = require('./dropdown').DropdownMenuItem
const Identicon = require('../../identicon')
-const ethUtil = require('ethereumjs-util')
+const { checksumAddress } = require('../../../util')
const copyToClipboard = require('copy-to-clipboard')
const { formatBalance } = require('../../../util')
@@ -311,8 +311,7 @@ class AccountDropdowns extends Component {
closeMenu: () => {},
onClick: () => {
const { selected } = this.props
- const checkSumAddress = selected && ethUtil.toChecksumAddress(selected)
- copyToClipboard(checkSumAddress)
+ copyToClipboard(checksumAddress(selected))
},
style: Object.assign(
dropdownMenuItemStyle,
diff --git a/ui/app/components/modals/export-private-key-modal.js b/ui/app/components/modals/export-private-key-modal.js
index 1f80aed39..447e43b7a 100644
--- a/ui/app/components/modals/export-private-key-modal.js
+++ b/ui/app/components/modals/export-private-key-modal.js
@@ -3,12 +3,13 @@ const PropTypes = require('prop-types')
const h = require('react-hyperscript')
const inherits = require('util').inherits
const connect = require('react-redux').connect
-const ethUtil = require('ethereumjs-util')
+const { stripHexPrefix } = require('ethereumjs-util')
const actions = require('../../actions')
const AccountModalContainer = require('./account-modal-container')
const { getSelectedIdentity } = require('../../selectors')
const ReadOnlyInput = require('../readonly-input')
const copyToClipboard = require('copy-to-clipboard')
+const { checksumAddress } = require('../../util')
function mapStateToProps (state) {
return {
@@ -60,7 +61,7 @@ ExportPrivateKeyModal.prototype.renderPasswordLabel = function (privateKey) {
}
ExportPrivateKeyModal.prototype.renderPasswordInput = function (privateKey) {
- const plainKey = privateKey && ethUtil.stripHexPrefix(privateKey)
+ const plainKey = privateKey && stripHexPrefix(privateKey)
return privateKey
? h(ReadOnlyInput, {
@@ -121,7 +122,7 @@ ExportPrivateKeyModal.prototype.render = function () {
h(ReadOnlyInput, {
wrapperClass: 'ellip-address-wrapper',
inputClass: 'qr-ellip-address ellip-address',
- value: address,
+ value: checksumAddress(address),
}),
h('div.account-modal-divider'),
diff --git a/ui/app/components/qr-code.js b/ui/app/components/qr-code.js
index 83885539c..3b2c62f49 100644
--- a/ui/app/components/qr-code.js
+++ b/ui/app/components/qr-code.js
@@ -3,8 +3,9 @@ const h = require('react-hyperscript')
const qrCode = require('qrcode-npm').qrcode
const inherits = require('util').inherits
const connect = require('react-redux').connect
-const isHexPrefixed = require('ethereumjs-util').isHexPrefixed
+const { isHexPrefixed } = require('ethereumjs-util')
const ReadOnlyInput = require('./readonly-input')
+const { checksumAddress } = require('../util')
module.exports = connect(mapStateToProps)(QrCodeView)
@@ -24,16 +25,16 @@ function QrCodeView () {
QrCodeView.prototype.render = function () {
const props = this.props
- const Qr = props.Qr
- const address = `${isHexPrefixed(Qr.data) ? 'ethereum:' : ''}${Qr.data}`
+ const { message, data } = props.Qr
+ const address = `${isHexPrefixed(data) ? 'ethereum:' : ''}${data}`
const qrImage = qrCode(4, 'M')
qrImage.addData(address)
qrImage.make()
return h('.div.flex-column.flex-center', [
- Array.isArray(Qr.message)
+ Array.isArray(message)
? h('.message-container', this.renderMultiMessage())
- : Qr.message && h('.qr-header', Qr.message),
+ : message && h('.qr-header', message),
this.props.warning ? this.props.warning && h('span.error.flex-center', {
style: {
@@ -50,7 +51,7 @@ QrCodeView.prototype.render = function () {
h(ReadOnlyInput, {
wrapperClass: 'ellip-address-wrapper',
inputClass: 'qr-ellip-address',
- value: Qr.data,
+ value: checksumAddress(data),
}),
])
}
diff --git a/ui/app/components/send/account-list-item.js b/ui/app/components/send/account-list-item.js
index 1ad3f69c1..b5e604a6e 100644
--- a/ui/app/components/send/account-list-item.js
+++ b/ui/app/components/send/account-list-item.js
@@ -2,6 +2,7 @@ const Component = require('react').Component
const h = require('react-hyperscript')
const inherits = require('util').inherits
const connect = require('react-redux').connect
+const { checksumAddress } = require('../../util')
const Identicon = require('../identicon')
const CurrencyDisplay = require('./currency-display')
const { conversionRateSelector, getCurrentCurrency } = require('../../selectors')
@@ -56,7 +57,7 @@ AccountListItem.prototype.render = function () {
]),
- displayAddress && name && h('div.account-list-item__account-address', address),
+ displayAddress && name && h('div.account-list-item__account-address', checksumAddress(address)),
displayBalance && h(CurrencyDisplay, {
primaryCurrency: 'ETH',
diff --git a/ui/app/components/tx-list-item.js b/ui/app/components/tx-list-item.js
index 403f83ab9..bd4ea80a6 100644
--- a/ui/app/components/tx-list-item.js
+++ b/ui/app/components/tx-list-item.js
@@ -9,6 +9,7 @@ const abiDecoder = require('abi-decoder')
abiDecoder.addABI(abi)
const Identicon = require('./identicon')
const contractMap = require('eth-contract-metadata')
+const { checksumAddress } = require('../util')
const actions = require('../actions')
const { conversionUtil, multiplyCurrencies } = require('../conversion-util')
@@ -74,10 +75,12 @@ TxListItem.prototype.getAddressText = function () {
const decodedData = txParams.data && abiDecoder.decodeMethod(txParams.data)
const { name: txDataName, params = [] } = decodedData || {}
const { value } = params[0] || {}
+ const checksummedAddress = checksumAddress(address)
+ const checksummedValue = checksumAddress(value)
let addressText
if (txDataName === 'transfer' || address) {
- const addressToRender = txDataName === 'transfer' ? value : address
+ const addressToRender = txDataName === 'transfer' ? checksummedValue : checksummedAddress
addressText = `${addressToRender.slice(0, 10)}...${addressToRender.slice(-4)}`
} else if (isMsg) {
addressText = this.context.t('sigRequest')
diff --git a/ui/app/components/tx-view.js b/ui/app/components/tx-view.js
index 80aac35c4..263f992c0 100644
--- a/ui/app/components/tx-view.js
+++ b/ui/app/components/tx-view.js
@@ -2,13 +2,13 @@ const Component = require('react').Component
const PropTypes = require('prop-types')
const connect = require('react-redux').connect
const h = require('react-hyperscript')
-const ethUtil = require('ethereumjs-util')
const inherits = require('util').inherits
const { withRouter } = require('react-router-dom')
const { compose } = require('recompose')
const actions = require('../actions')
const selectors = require('../selectors')
const { SEND_ROUTE } = require('../routes')
+const { checksumAddress: toChecksumAddress } = require('../util')
const BalanceComponent = require('./balance-component')
const TxList = require('./tx-list')
@@ -32,7 +32,7 @@ function mapStateToProps (state) {
const network = state.metamask.network
const selectedTokenAddress = state.metamask.selectedTokenAddress
const selectedAddress = state.metamask.selectedAddress || Object.keys(accounts)[0]
- const checksumAddress = selectedAddress && ethUtil.toChecksumAddress(selectedAddress)
+ const checksumAddress = toChecksumAddress(selectedAddress)
const identity = identities[selectedAddress]
return {
diff --git a/ui/app/components/wallet-view.js b/ui/app/components/wallet-view.js
index e3e1b8903..9e430f87b 100644
--- a/ui/app/components/wallet-view.js
+++ b/ui/app/components/wallet-view.js
@@ -6,6 +6,7 @@ const { withRouter } = require('react-router-dom')
const { compose } = require('recompose')
const inherits = require('util').inherits
const classnames = require('classnames')
+const { checksumAddress } = require('../util')
const Identicon = require('./identicon')
// const AccountDropdowns = require('./dropdowns/index.js').AccountDropdowns
const Tooltip = require('./tooltip-v2.js')
@@ -107,6 +108,8 @@ WalletView.prototype.render = function () {
// temporary logs + fake extra wallets
// console.log('walletview, selectedAccount:', selectedAccount)
+ const checksummedAddress = checksumAddress(selectedAddress)
+
const keyring = keyrings.find((kr) => {
return kr.accounts.includes(selectedAddress) ||
kr.accounts.includes(selectedIdentity.address)
@@ -135,7 +138,7 @@ WalletView.prototype.render = function () {
}, [
h(Identicon, {
diameter: 54,
- address: selectedAddress,
+ address: checksummedAddress,
}),
h('span.account-name', {
@@ -158,7 +161,7 @@ WalletView.prototype.render = function () {
'wallet-view__address__pressed': this.state.copyToClipboardPressed,
}),
onClick: () => {
- copyToClipboard(selectedAddress)
+ copyToClipboard(checksummedAddress)
this.setState({ hasCopied: true })
setTimeout(() => this.setState({ hasCopied: false }), 3000)
},
@@ -169,7 +172,7 @@ WalletView.prototype.render = function () {
this.setState({ copyToClipboardPressed: false })
},
}, [
- `${selectedAddress.slice(0, 4)}...${selectedAddress.slice(-4)}`,
+ `${checksummedAddress.slice(0, 4)}...${checksummedAddress.slice(-4)}`,
h('i.fa.fa-clipboard', { style: { marginLeft: '8px' } }),
]),
]),
diff --git a/ui/app/util.js b/ui/app/util.js
index bbe2bb09e..8e9390dfb 100644
--- a/ui/app/util.js
+++ b/ui/app/util.js
@@ -57,6 +57,7 @@ module.exports = {
isInvalidChecksumAddress,
allNull,
getTokenAddressFromTokenObject,
+ checksumAddress,
}
function valuesFor (obj) {
@@ -67,7 +68,7 @@ function valuesFor (obj) {
function addressSummary (address, firstSegLength = 10, lastSegLength = 4, includeHex = true) {
if (!address) return ''
- let checked = ethUtil.toChecksumAddress(address)
+ let checked = checksumAddress(address)
if (!includeHex) {
checked = ethUtil.stripHexPrefix(checked)
}
@@ -76,7 +77,7 @@ function addressSummary (address, firstSegLength = 10, lastSegLength = 4, includ
function miniAddressSummary (address) {
if (!address) return ''
- var checked = ethUtil.toChecksumAddress(address)
+ var checked = checksumAddress(address)
return checked ? checked.slice(0, 4) + '...' + checked.slice(-4) : '...'
}
@@ -287,3 +288,13 @@ function allNull (obj) {
function getTokenAddressFromTokenObject (token) {
return Object.values(token)[0].address.toLowerCase()
}
+
+/**
+ * Safely checksumms a potentially-null address
+ *
+ * @param {String} [address] - address to checksum
+ * @returns {String} - checksummed address
+ */
+function checksumAddress (address) {
+ return address ? ethUtil.toChecksumAddress(address) : ''
+}
diff --git a/ui/lib/icon-factory.js b/ui/lib/icon-factory.js
index 31498a3a9..7fadbceff 100644
--- a/ui/lib/icon-factory.js
+++ b/ui/lib/icon-factory.js
@@ -1,6 +1,6 @@
var iconFactory
const isValidAddress = require('ethereumjs-util').isValidAddress
-const toChecksumAddress = require('ethereumjs-util').toChecksumAddress
+const { checksumAddress } = require('../app/util')
const contractMap = require('eth-contract-metadata')
module.exports = function (jazzicon) {
@@ -16,7 +16,7 @@ function IconFactory (jazzicon) {
}
IconFactory.prototype.iconForAddress = function (address, diameter) {
- const addr = toChecksumAddress(address)
+ const addr = checksumAddress(address)
if (iconExistsFor(addr)) {
return imageElFor(addr)
}