1
0
mirror of https://github.com/kremalicious/metamask-extension.git synced 2024-12-23 09:52:26 +01:00

Merge pull request #7474 from MetaMask/Version-v7.6.1

Version v7.6.1 RC
This commit is contained in:
Thomas Huang 2019-11-19 15:00:37 -08:00 committed by GitHub
commit 72eb233ee9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
85 changed files with 207 additions and 107 deletions

View File

@ -148,6 +148,7 @@
"operator-linebreak": [2, "after", { "overrides": { "?": "ignore", ":": "ignore" } }], "operator-linebreak": [2, "after", { "overrides": { "?": "ignore", ":": "ignore" } }],
"padded-blocks": "off", "padded-blocks": "off",
"quotes": [2, "single", {"avoidEscape": true, "allowTemplateLiterals": true}], "quotes": [2, "single", {"avoidEscape": true, "allowTemplateLiterals": true}],
"react/jsx-boolean-value": 2,
"react/jsx-curly-brace-presence": [2, { "props": "never", "children": "never" }], "react/jsx-curly-brace-presence": [2, { "props": "never", "children": "never" }],
"react/jsx-equals-spacing": 2, "react/jsx-equals-spacing": 2,
"react/no-deprecated": 0, "react/no-deprecated": 0,

View File

@ -2,7 +2,15 @@
## Current Develop Branch ## Current Develop Branch
## 7.6.1 Tue Nov 19 2019
- [#7475](https://github.com/MetaMask/metamask-extension/pull/7475): Add 'Remind Me Later' to the Maker notification
- [#7436](https://github.com/MetaMask/metamask-extension/pull/7436): Add additional rpcUrl verification
- [#7468](https://github.com/MetaMask/metamask-extension/pull/7468): Show transaction fee units on approve screen
## 7.6.0 Mon Nov 18 2019 ## 7.6.0 Mon Nov 18 2019
- [#7450](https://github.com/MetaMask/metamask-extension/pull/7450): Add migration notification for users with non-zero Sai
- [#7461](https://github.com/MetaMask/metamask-extension/pull/7461): Import styles for showing multiple notifications
- [#7451](https://github.com/MetaMask/metamask-extension/pull/7451): Add button disabled when password is empty
## 7.5.3 Fri Nov 15 2019 ## 7.5.3 Fri Nov 15 2019
- [#7412](https://github.com/MetaMask/metamask-extension/pull/7412): lock eth-contract-metadata (#7412) - [#7412](https://github.com/MetaMask/metamask-extension/pull/7412): lock eth-contract-metadata (#7412)

View File

@ -1344,7 +1344,7 @@
"updatedWithDate": { "updatedWithDate": {
"message": "የዘመነ $1" "message": "የዘመነ $1"
}, },
"uriErrorMsg": { "urlErrorMsg": {
"message": "URIs አግባብነት ያለው የ HTTP/HTTPS ቅድመ ቅጥያ ይፈልጋል።" "message": "URIs አግባብነት ያለው የ HTTP/HTTPS ቅድመ ቅጥያ ይፈልጋል።"
}, },
"usedByClients": { "usedByClients": {

View File

@ -1340,7 +1340,7 @@
"updatedWithDate": { "updatedWithDate": {
"message": "تم تحديث $1" "message": "تم تحديث $1"
}, },
"uriErrorMsg": { "urlErrorMsg": {
"message": "تتطلب الروابط بادئة HTTP/HTTPS مناسبة." "message": "تتطلب الروابط بادئة HTTP/HTTPS مناسبة."
}, },
"usedByClients": { "usedByClients": {

View File

@ -1343,7 +1343,7 @@
"updatedWithDate": { "updatedWithDate": {
"message": "Актуализирано $1 " "message": "Актуализирано $1 "
}, },
"uriErrorMsg": { "urlErrorMsg": {
"message": "URI изискват съответния HTTP / HTTPS префикс." "message": "URI изискват съответния HTTP / HTTPS префикс."
}, },
"usedByClients": { "usedByClients": {

View File

@ -1347,7 +1347,7 @@
"updatedWithDate": { "updatedWithDate": {
"message": "আপডেট করা $1" "message": "আপডেট করা $1"
}, },
"uriErrorMsg": { "urlErrorMsg": {
"message": "URI গুলির যথাযথ HTTP/HTTPS প্রেফিক্সের প্রয়োজন।" "message": "URI গুলির যথাযথ HTTP/HTTPS প্রেফিক্সের প্রয়োজন।"
}, },
"usedByClients": { "usedByClients": {

View File

@ -1316,7 +1316,7 @@
"updatedWithDate": { "updatedWithDate": {
"message": "Actualitzat $1" "message": "Actualitzat $1"
}, },
"uriErrorMsg": { "urlErrorMsg": {
"message": "Els URIs requereixen el prefix HTTP/HTTPS apropiat." "message": "Els URIs requereixen el prefix HTTP/HTTPS apropiat."
}, },
"usedByClients": { "usedByClients": {

View File

@ -529,7 +529,7 @@
"unknownNetwork": { "unknownNetwork": {
"message": "Neznámá soukromá síť" "message": "Neznámá soukromá síť"
}, },
"uriErrorMsg": { "urlErrorMsg": {
"message": "URI vyžadují korektní HTTP/HTTPS prefix." "message": "URI vyžadují korektní HTTP/HTTPS prefix."
}, },
"usedByClients": { "usedByClients": {

View File

@ -1313,7 +1313,7 @@
"updatedWithDate": { "updatedWithDate": {
"message": "Opdaterede $1" "message": "Opdaterede $1"
}, },
"uriErrorMsg": { "urlErrorMsg": {
"message": "Links kræver det rette HTTP/HTTPS-præfix." "message": "Links kræver det rette HTTP/HTTPS-præfix."
}, },
"usedByClients": { "usedByClients": {

View File

@ -1304,7 +1304,7 @@
"updatedWithDate": { "updatedWithDate": {
"message": "$1 aktualisiert" "message": "$1 aktualisiert"
}, },
"uriErrorMsg": { "urlErrorMsg": {
"message": "URIs benötigen die korrekten HTTP/HTTPS Präfixe." "message": "URIs benötigen die korrekten HTTP/HTTPS Präfixe."
}, },
"usedByClients": { "usedByClients": {

View File

@ -1341,7 +1341,7 @@
"updatedWithDate": { "updatedWithDate": {
"message": "Ενημερώθηκε το $1" "message": "Ενημερώθηκε το $1"
}, },
"uriErrorMsg": { "urlErrorMsg": {
"message": "Τα URI απαιτούν το κατάλληλο πρόθεμα HTTP/HTTPS." "message": "Τα URI απαιτούν το κατάλληλο πρόθεμα HTTP/HTTPS."
}, },
"usedByClients": { "usedByClients": {

View File

@ -2,6 +2,9 @@
"migrateSai": { "migrateSai": {
"message": "A message from Maker: The new Multi-Collateral Dai token has been released. Your old tokens are now called Sai. Please upgrade your Sai tokens to the new Dai." "message": "A message from Maker: The new Multi-Collateral Dai token has been released. Your old tokens are now called Sai. Please upgrade your Sai tokens to the new Dai."
}, },
"migrateSaiInfo": {
"message": "To dismiss this notification you can migrate your tokens or hide SAI from the token list."
},
"migrate": { "migrate": {
"message": "Migrate" "message": "Migrate"
}, },
@ -1474,8 +1477,11 @@
"updatedWithDate": { "updatedWithDate": {
"message": "Updated $1" "message": "Updated $1"
}, },
"uriErrorMsg": { "urlErrorMsg": {
"message": "URIs require the appropriate HTTP/HTTPS prefix." "message": "URLs require the appropriate HTTP/HTTPS prefix."
},
"urlExistsErrorMsg": {
"message": "URL is already present in existing list of networks"
}, },
"usedByClients": { "usedByClients": {
"message": "Used by a variety of different clients" "message": "Used by a variety of different clients"

View File

@ -1091,7 +1091,7 @@
"updatedWithDate": { "updatedWithDate": {
"message": "Actualizado $1" "message": "Actualizado $1"
}, },
"uriErrorMsg": { "urlErrorMsg": {
"message": "URI necesita el prefijo HTTP/HTTPS apropiado" "message": "URI necesita el prefijo HTTP/HTTPS apropiado"
}, },
"usedByClients": { "usedByClients": {

View File

@ -1326,7 +1326,7 @@
"updatedWithDate": { "updatedWithDate": {
"message": "Actualización: $1" "message": "Actualización: $1"
}, },
"uriErrorMsg": { "urlErrorMsg": {
"message": "Los URI deben tener el prefijo HTTP/HTTPS apropiado." "message": "Los URI deben tener el prefijo HTTP/HTTPS apropiado."
}, },
"usedByClients": { "usedByClients": {

View File

@ -1337,7 +1337,7 @@
"updatedWithDate": { "updatedWithDate": {
"message": "Värskendatud $1" "message": "Värskendatud $1"
}, },
"uriErrorMsg": { "urlErrorMsg": {
"message": "URI-d nõuavad sobivat HTTP/HTTPS-i prefiksit." "message": "URI-d nõuavad sobivat HTTP/HTTPS-i prefiksit."
}, },
"usedByClients": { "usedByClients": {

View File

@ -1347,7 +1347,7 @@
"updatedWithDate": { "updatedWithDate": {
"message": "بروزرسانی شد 1$1" "message": "بروزرسانی شد 1$1"
}, },
"uriErrorMsg": { "urlErrorMsg": {
"message": "URl ها نیازمند پیشوند مناسب HTTP/HTTPS اند." "message": "URl ها نیازمند پیشوند مناسب HTTP/HTTPS اند."
}, },
"usedByClients": { "usedByClients": {

View File

@ -1344,7 +1344,7 @@
"updatedWithDate": { "updatedWithDate": {
"message": "$1 päivitetty" "message": "$1 päivitetty"
}, },
"uriErrorMsg": { "urlErrorMsg": {
"message": "URI:t vaativat asianmukaisen HTTP/HTTPS-etuliitteen." "message": "URI:t vaativat asianmukaisen HTTP/HTTPS-etuliitteen."
}, },
"usedByClients": { "usedByClients": {

View File

@ -1235,7 +1235,7 @@
"updatedWithDate": { "updatedWithDate": {
"message": "Na-update ang $1" "message": "Na-update ang $1"
}, },
"uriErrorMsg": { "urlErrorMsg": {
"message": "Kinakailangan ng mga URI ang naaangkop na HTTP/HTTPS prefix." "message": "Kinakailangan ng mga URI ang naaangkop na HTTP/HTTPS prefix."
}, },
"usedByClients": { "usedByClients": {

View File

@ -1308,7 +1308,7 @@
"updatedWithDate": { "updatedWithDate": {
"message": "Mis à jour $1" "message": "Mis à jour $1"
}, },
"uriErrorMsg": { "urlErrorMsg": {
"message": "Les URLs requièrent un préfixe HTTP/HTTPS approprié." "message": "Les URLs requièrent un préfixe HTTP/HTTPS approprié."
}, },
"usedByClients": { "usedByClients": {

View File

@ -1341,7 +1341,7 @@
"updatedWithDate": { "updatedWithDate": {
"message": "עודכן $1" "message": "עודכן $1"
}, },
"uriErrorMsg": { "urlErrorMsg": {
"message": "כתובות URI דורשות את קידומת HTTP/HTTPS המתאימה." "message": "כתובות URI דורשות את קידומת HTTP/HTTPS המתאימה."
}, },
"usedByClients": { "usedByClients": {

View File

@ -1341,7 +1341,7 @@
"updatedWithDate": { "updatedWithDate": {
"message": "$1 अपडेट किया गया" "message": "$1 अपडेट किया गया"
}, },
"uriErrorMsg": { "urlErrorMsg": {
"message": "URI को उपयुक्त HTTP/HTTPS प्रीफ़िक्स की आवश्यकता होती है।" "message": "URI को उपयुक्त HTTP/HTTPS प्रीफ़िक्स की आवश्यकता होती है।"
}, },
"usedByClients": { "usedByClients": {

View File

@ -491,7 +491,7 @@
"unknownNetwork": { "unknownNetwork": {
"message": "अज्ञात निजी नेटवर्क" "message": "अज्ञात निजी नेटवर्क"
}, },
"uriErrorMsg": { "urlErrorMsg": {
"message": "URI-यूआरआई को उपयुक्त HTTP / HTTPS उपसर्ग की आवश्यकता होती है।" "message": "URI-यूआरआई को उपयुक्त HTTP / HTTPS उपसर्ग की आवश्यकता होती है।"
}, },
"usedByClients": { "usedByClients": {

View File

@ -1337,7 +1337,7 @@
"updatedWithDate": { "updatedWithDate": {
"message": "Ažurirano $1" "message": "Ažurirano $1"
}, },
"uriErrorMsg": { "urlErrorMsg": {
"message": "URI-jevima se zahtijeva prikladan prefiks HTTP/HTTPS." "message": "URI-jevima se zahtijeva prikladan prefiks HTTP/HTTPS."
}, },
"usedByClients": { "usedByClients": {

View File

@ -851,7 +851,7 @@
"updatedWithDate": { "updatedWithDate": {
"message": "Mete ajou $1" "message": "Mete ajou $1"
}, },
"uriErrorMsg": { "urlErrorMsg": {
"message": "URIs mande pou apwopriye prefiks HTTP / HTTPS a." "message": "URIs mande pou apwopriye prefiks HTTP / HTTPS a."
}, },
"usedByClients": { "usedByClients": {

View File

@ -1337,7 +1337,7 @@
"updatedWithDate": { "updatedWithDate": {
"message": "$1 frissítve" "message": "$1 frissítve"
}, },
"uriErrorMsg": { "urlErrorMsg": {
"message": "Az URI-hez szükség van a megfelelő HTTP/HTTPS előtagra." "message": "Az URI-hez szükség van a megfelelő HTTP/HTTPS előtagra."
}, },
"usedByClients": { "usedByClients": {

View File

@ -1316,7 +1316,7 @@
"updatedWithDate": { "updatedWithDate": {
"message": "Diperbarui $1" "message": "Diperbarui $1"
}, },
"uriErrorMsg": { "urlErrorMsg": {
"message": "URI memerlukan awalan HTTP/HTTPS yang sesuai." "message": "URI memerlukan awalan HTTP/HTTPS yang sesuai."
}, },
"usedByClients": { "usedByClients": {

View File

@ -1307,7 +1307,7 @@
"updatedWithDate": { "updatedWithDate": {
"message": "Aggiornata $1" "message": "Aggiornata $1"
}, },
"uriErrorMsg": { "urlErrorMsg": {
"message": "Gli URI richiedono un prefisso HTTP/HTTPS." "message": "Gli URI richiedono un prefisso HTTP/HTTPS."
}, },
"usedByClients": { "usedByClients": {

View File

@ -1347,7 +1347,7 @@
"updatedWithDate": { "updatedWithDate": {
"message": "$1 ನವೀಕರಿಸಲಾಗಿದೆ" "message": "$1 ನವೀಕರಿಸಲಾಗಿದೆ"
}, },
"uriErrorMsg": { "urlErrorMsg": {
"message": "URI ಗಳಿಗೆ ಸೂಕ್ತವಾದ HTTP/HTTPS ಪೂರ್ವಪ್ರತ್ಯಯದ ಅಗತ್ಯವಿದೆ." "message": "URI ಗಳಿಗೆ ಸೂಕ್ತವಾದ HTTP/HTTPS ಪೂರ್ವಪ್ರತ್ಯಯದ ಅಗತ್ಯವಿದೆ."
}, },
"usedByClients": { "usedByClients": {

View File

@ -1338,7 +1338,7 @@
"updatedWithDate": { "updatedWithDate": {
"message": "$1에 업데이트 됨" "message": "$1에 업데이트 됨"
}, },
"uriErrorMsg": { "urlErrorMsg": {
"message": "URI는 HTTP/HTTPS로 시작해야 합니다." "message": "URI는 HTTP/HTTPS로 시작해야 합니다."
}, },
"usedByClients": { "usedByClients": {

View File

@ -1347,7 +1347,7 @@
"updatedWithDate": { "updatedWithDate": {
"message": "Atnaujinta $1" "message": "Atnaujinta $1"
}, },
"uriErrorMsg": { "urlErrorMsg": {
"message": "URI reikia atitinkamo HTTP/HTTPS priešdėlio." "message": "URI reikia atitinkamo HTTP/HTTPS priešdėlio."
}, },
"usedByClients": { "usedByClients": {

View File

@ -1343,7 +1343,7 @@
"updatedWithDate": { "updatedWithDate": {
"message": "Atjaunināts $1" "message": "Atjaunināts $1"
}, },
"uriErrorMsg": { "urlErrorMsg": {
"message": "URI jāsākas ar atbilstošo HTTP/HTTPS priedēkli." "message": "URI jāsākas ar atbilstošo HTTP/HTTPS priedēkli."
}, },
"usedByClients": { "usedByClients": {

View File

@ -1315,7 +1315,7 @@
"updatedWithDate": { "updatedWithDate": {
"message": "Dikemaskini $1" "message": "Dikemaskini $1"
}, },
"uriErrorMsg": { "urlErrorMsg": {
"message": "URI memerlukan awalan HTTP/HTTPS yang sesuai." "message": "URI memerlukan awalan HTTP/HTTPS yang sesuai."
}, },
"usedByClients": { "usedByClients": {

View File

@ -478,7 +478,7 @@
"unknownNetwork": { "unknownNetwork": {
"message": "Onbekend privénetwerk" "message": "Onbekend privénetwerk"
}, },
"uriErrorMsg": { "urlErrorMsg": {
"message": "Voor URI's is het juiste HTTP / HTTPS-voorvoegsel vereist." "message": "Voor URI's is het juiste HTTP / HTTPS-voorvoegsel vereist."
}, },
"usedByClients": { "usedByClients": {

View File

@ -1319,7 +1319,7 @@
"updatedWithDate": { "updatedWithDate": {
"message": "Oppdatert $1" "message": "Oppdatert $1"
}, },
"uriErrorMsg": { "urlErrorMsg": {
"message": "URI-er krever det aktuelle HTTP/HTTPS-prefikset." "message": "URI-er krever det aktuelle HTTP/HTTPS-prefikset."
}, },
"usedByClients": { "usedByClients": {

View File

@ -1332,7 +1332,7 @@
"updatedWithDate": { "updatedWithDate": {
"message": "Zaktualizowano $1" "message": "Zaktualizowano $1"
}, },
"uriErrorMsg": { "urlErrorMsg": {
"message": "URI wymaga prawidłowego prefiksu HTTP/HTTPS." "message": "URI wymaga prawidłowego prefiksu HTTP/HTTPS."
}, },
"usedByClients": { "usedByClients": {

View File

@ -488,7 +488,7 @@
"unknownNetwork": { "unknownNetwork": {
"message": "Rede Privada Desconhecida" "message": "Rede Privada Desconhecida"
}, },
"uriErrorMsg": { "urlErrorMsg": {
"message": "Links requerem o prefixo HTTP/HTTPS apropriado." "message": "Links requerem o prefixo HTTP/HTTPS apropriado."
}, },
"usedByClients": { "usedByClients": {

View File

@ -1326,7 +1326,7 @@
"updatedWithDate": { "updatedWithDate": {
"message": "$1 atualizado" "message": "$1 atualizado"
}, },
"uriErrorMsg": { "urlErrorMsg": {
"message": "URIs exigem o devido prefixo HTTP/HTTPS." "message": "URIs exigem o devido prefixo HTTP/HTTPS."
}, },
"usedByClients": { "usedByClients": {

View File

@ -1328,7 +1328,7 @@
"updatedWithDate": { "updatedWithDate": {
"message": "Actualizat $1" "message": "Actualizat $1"
}, },
"uriErrorMsg": { "urlErrorMsg": {
"message": "URL necesită prefixul potrivit HTTP/HTTPS." "message": "URL necesită prefixul potrivit HTTP/HTTPS."
}, },
"usedByClients": { "usedByClients": {

View File

@ -542,7 +542,7 @@
"unknownNetwork": { "unknownNetwork": {
"message": "Неизвестная частная сеть" "message": "Неизвестная частная сеть"
}, },
"uriErrorMsg": { "urlErrorMsg": {
"message": "Для URI требуется соответствующий префикс HTTP/HTTPS." "message": "Для URI требуется соответствующий префикс HTTP/HTTPS."
}, },
"usedByClients": { "usedByClients": {

View File

@ -1301,7 +1301,7 @@
"updatedWithDate": { "updatedWithDate": {
"message": "Aktualizované $1" "message": "Aktualizované $1"
}, },
"uriErrorMsg": { "urlErrorMsg": {
"message": "URI vyžadují korektní HTTP/HTTPS prefix." "message": "URI vyžadují korektní HTTP/HTTPS prefix."
}, },
"usedByClients": { "usedByClients": {

View File

@ -1329,7 +1329,7 @@
"updatedWithDate": { "updatedWithDate": {
"message": "Posodobljeno $1" "message": "Posodobljeno $1"
}, },
"uriErrorMsg": { "urlErrorMsg": {
"message": "URI zahtevajo ustrezno HTTP/HTTPS predpono." "message": "URI zahtevajo ustrezno HTTP/HTTPS predpono."
}, },
"usedByClients": { "usedByClients": {

View File

@ -1332,7 +1332,7 @@
"updatedWithDate": { "updatedWithDate": {
"message": "Ažuriran $1" "message": "Ažuriran $1"
}, },
"uriErrorMsg": { "urlErrorMsg": {
"message": "URI-ovi zahtevaju odgovarajući prefiks HTTP / HTTPS." "message": "URI-ovi zahtevaju odgovarajući prefiks HTTP / HTTPS."
}, },
"usedByClients": { "usedByClients": {

View File

@ -1322,7 +1322,7 @@
"updatedWithDate": { "updatedWithDate": {
"message": "Uppdaterat $1" "message": "Uppdaterat $1"
}, },
"uriErrorMsg": { "urlErrorMsg": {
"message": "URI:er kräver lämpligt HTTP/HTTPS-prefix." "message": "URI:er kräver lämpligt HTTP/HTTPS-prefix."
}, },
"usedByClients": { "usedByClients": {

View File

@ -1325,7 +1325,7 @@
"updatedWithDate": { "updatedWithDate": {
"message": "Imesasishwa $1" "message": "Imesasishwa $1"
}, },
"uriErrorMsg": { "urlErrorMsg": {
"message": "URI huhitaji kiambishi sahihi cha HTTP/HTTPS." "message": "URI huhitaji kiambishi sahihi cha HTTP/HTTPS."
}, },
"usedByClients": { "usedByClients": {

View File

@ -554,7 +554,7 @@
"unknownNetwork": { "unknownNetwork": {
"message": "அறியப்படாத தனியார் நெட்வொர்க்" "message": "அறியப்படாத தனியார் நெட்வொர்க்"
}, },
"uriErrorMsg": { "urlErrorMsg": {
"message": "URI கள் சரியான HTTP / HTTPS முன்னொட்டு தேவை." "message": "URI கள் சரியான HTTP / HTTPS முன்னொட்டு தேவை."
}, },
"usedByClients": { "usedByClients": {

View File

@ -656,7 +656,7 @@
"updatedWithDate": { "updatedWithDate": {
"message": "อัปเดต $1 แล้ว" "message": "อัปเดต $1 แล้ว"
}, },
"uriErrorMsg": { "urlErrorMsg": {
"message": "URI ต้องมีคำนำหน้าเป็น HTTP หรือ HTTPS" "message": "URI ต้องมีคำนำหน้าเป็น HTTP หรือ HTTPS"
}, },
"usedByClients": { "usedByClients": {

View File

@ -547,7 +547,7 @@
"unknownNetwork": { "unknownNetwork": {
"message": "Bilinmeyen özel ağ" "message": "Bilinmeyen özel ağ"
}, },
"uriErrorMsg": { "urlErrorMsg": {
"message": "URIler için HTTP/HTTPS öneki gerekmektedir." "message": "URIler için HTTP/HTTPS öneki gerekmektedir."
}, },
"usedByClients": { "usedByClients": {

View File

@ -1347,7 +1347,7 @@
"updatedWithDate": { "updatedWithDate": {
"message": "Оновлено $1" "message": "Оновлено $1"
}, },
"uriErrorMsg": { "urlErrorMsg": {
"message": "URIs вимагають відповідного префікса HTTP/HTTPS." "message": "URIs вимагають відповідного префікса HTTP/HTTPS."
}, },
"usedByClients": { "usedByClients": {

View File

@ -1320,7 +1320,7 @@
"updatedWithDate": { "updatedWithDate": {
"message": "更新時間 $1" "message": "更新時間 $1"
}, },
"uriErrorMsg": { "urlErrorMsg": {
"message": "URIs 需要加入適當的 HTTP/HTTPS 前綴字" "message": "URIs 需要加入適當的 HTTP/HTTPS 前綴字"
}, },
"usedByClients": { "usedByClients": {

View File

@ -1,7 +1,7 @@
{ {
"name": "__MSG_appName__", "name": "__MSG_appName__",
"short_name": "__MSG_appName__", "short_name": "__MSG_appName__",
"version": "7.6.0", "version": "7.6.1",
"manifest_version": 2, "manifest_version": 2,
"author": "https://metamask.io", "author": "https://metamask.io",
"description": "__MSG_appDescription__", "description": "__MSG_appDescription__",

View File

@ -13,6 +13,7 @@ class AppStateController {
this.onInactiveTimeout = onInactiveTimeout || (() => {}) this.onInactiveTimeout = onInactiveTimeout || (() => {})
this.store = new ObservableStore(extend({ this.store = new ObservableStore(extend({
timeoutMinutes: 0, timeoutMinutes: 0,
mkrMigrationReminderTimestamp: null,
}, initState)) }, initState))
this.timer = null this.timer = null
@ -23,6 +24,12 @@ class AppStateController {
this._setInactiveTimeout(preferences.autoLogoutTimeLimit) this._setInactiveTimeout(preferences.autoLogoutTimeLimit)
} }
setMkrMigrationReminderTimestamp (timestamp) {
this.store.updateState({
mkrMigrationReminderTimestamp: timestamp,
})
}
/** /**
* Sets the last active time to the current time * Sets the last active time to the current time
* @return {void} * @return {void}

View File

@ -508,6 +508,7 @@ module.exports = class MetamaskController extends EventEmitter {
// AppStateController // AppStateController
setLastActiveTime: nodeify(this.appStateController.setLastActiveTime, this.appStateController), setLastActiveTime: nodeify(this.appStateController.setLastActiveTime, this.appStateController),
setMkrMigrationReminderTimestamp: nodeify(this.appStateController.setMkrMigrationReminderTimestamp, this.appStateController),
// EnsController // EnsController
tryReverseResolveAddress: nodeify(this.ensController.reverseResolveAddress, this.ensController), tryReverseResolveAddress: nodeify(this.ensController.reverseResolveAddress, this.ensController),

View File

@ -1190,7 +1190,7 @@ describe('MetaMask', function () {
await driver.wait(until.stalenessOf(gasModal)) await driver.wait(until.stalenessOf(gasModal))
const gasFeeInEth = await findElement(driver, By.css('.confirm-approve-content__transaction-details-content__secondary-fee')) const gasFeeInEth = await findElement(driver, By.css('.confirm-approve-content__transaction-details-content__secondary-fee'))
assert.equal(await gasFeeInEth.getText(), '0.0006') assert.equal(await gasFeeInEth.getText(), '0.0006 ETH')
}) })
it('edits the permission', async () => { it('edits the permission', async () => {

View File

@ -71,7 +71,7 @@ export default class AppHeader extends PureComponent {
<Identicon <Identicon
address={selectedAddress} address={selectedAddress}
diameter={32} diameter={32}
addBorder={true} addBorder
/> />
</div> </div>
) )
@ -92,7 +92,7 @@ export default class AppHeader extends PureComponent {
className={classnames('app-header', { 'app-header--back-drop': isUnlocked })}> className={classnames('app-header', { 'app-header--back-drop': isUnlocked })}>
<div className="app-header__contents"> <div className="app-header__contents">
<MetaFoxLogo <MetaFoxLogo
unsetIconHeight={true} unsetIconHeight
onClick={() => history.push(DEFAULT_ROUTE)} onClick={() => history.push(DEFAULT_ROUTE)}
/> />
<div className="app-header__account-menu-container"> <div className="app-header__account-menu-container">

View File

@ -1,3 +1,4 @@
import { DateTime } from 'luxon'
import React, { PureComponent } from 'react' import React, { PureComponent } from 'react'
import PropTypes from 'prop-types' import PropTypes from 'prop-types'
import HomeNotification from '../home-notification' import HomeNotification from '../home-notification'
@ -8,18 +9,37 @@ export default class DaiV1MigrationNotification extends PureComponent {
} }
static defaultProps = { static defaultProps = {
mkrMigrationReminderTimestamp: null,
string: '', string: '',
symbol: '', symbol: '',
} }
static propTypes = { static propTypes = {
setMkrMigrationReminderTimestamp: PropTypes.func.isRequired,
mkrMigrationReminderTimestamp: PropTypes.string,
string: PropTypes.string, string: PropTypes.string,
symbol: PropTypes.string, symbol: PropTypes.string,
} }
remindMeLater = () => {
const nextWeek = DateTime.utc().plus({
days: 7,
})
this.props.setMkrMigrationReminderTimestamp(nextWeek.toString())
}
render () { render () {
const { t } = this.context const { t } = this.context
const { string: balanceString, symbol } = this.props const { mkrMigrationReminderTimestamp, string: balanceString, symbol } = this.props
if (mkrMigrationReminderTimestamp) {
const reminderDateTime = DateTime.fromISO(mkrMigrationReminderTimestamp, {
zone: 'UTC',
})
if (reminderDateTime > DateTime.utc()) {
return null
}
}
if (!balanceString || !symbol) { if (!balanceString || !symbol) {
return null return null
@ -31,15 +51,27 @@ export default class DaiV1MigrationNotification extends PureComponent {
return ( return (
<HomeNotification <HomeNotification
descriptionText={t('migrateSai')} descriptionText={(
<div>
{t('migrateSai')}
&nbsp;
<a
href="#"
onClick={() => {
window.open('https://blog.makerdao.com/multi-collateral-dai-is-live/', '_blank', 'noopener')
}}
>
{t('learnMore')}.
</a>
</div>
)}
acceptText={t('migrate')} acceptText={t('migrate')}
onAccept={() => { onAccept={() => {
window.open('https://migrate.makerdao.com', '_blank', 'noopener') window.open('https://migrate.makerdao.com', '_blank', 'noopener')
}} }}
ignoreText={t('learnMore')} ignoreText={t('remindMeLater')}
onIgnore={() => { onIgnore={this.remindMeLater}
window.open('https://blog.makerdao.com/multi-collateral-dai-is-live/', '_blank', 'noopener') infoText={t('migrateSaiInfo')}
}}
/> />
) )
} }

View File

@ -3,18 +3,32 @@ import { compose } from 'recompose'
import DaiMigrationNotification from './dai-migration-notification.component' import DaiMigrationNotification from './dai-migration-notification.component'
import withTokenTracker from '../../../helpers/higher-order-components/with-token-tracker' import withTokenTracker from '../../../helpers/higher-order-components/with-token-tracker'
import { getSelectedAddress, getDaiV1Token } from '../../../selectors/selectors' import { getSelectedAddress, getDaiV1Token } from '../../../selectors/selectors'
import { setMkrMigrationReminderTimestamp } from '../../../store/actions'
const mapStateToProps = (state) => { const mapStateToProps = (state) => {
const {
metamask: {
mkrMigrationReminderTimestamp,
},
} = state
const userAddress = getSelectedAddress(state) const userAddress = getSelectedAddress(state)
const oldDai = getDaiV1Token(state) const oldDai = getDaiV1Token(state)
return { return {
mkrMigrationReminderTimestamp,
userAddress, userAddress,
token: oldDai, token: oldDai,
} }
} }
const mapDispatchToProps = (dispatch) => {
return {
setMkrMigrationReminderTimestamp: (t) => dispatch(setMkrMigrationReminderTimestamp(t)),
}
}
export default compose( export default compose(
connect(mapStateToProps), connect(mapStateToProps, mapDispatchToProps),
withTokenTracker, withTokenTracker,
)(DaiMigrationNotification) )(DaiMigrationNotification)

View File

@ -11,7 +11,7 @@ describe('Dropdown Menu Components', () => {
beforeEach(() => { beforeEach(() => {
wrapper = shallow( wrapper = shallow(
<Menu className="Test Class" isShowing={true}/> <Menu className="Test Class" isShowing/>
) )
}) })

View File

@ -26,9 +26,9 @@ describe('AdvancedTabContent Component', function () {
timeRemaining="21500" timeRemaining="21500"
transactionFee="$0.25" transactionFee="$0.25"
insufficientBalance={false} insufficientBalance={false}
customPriceIsSafe={true} customPriceIsSafe
isSpeedUp={false} isSpeedUp={false}
isEthereumNetwork={true} isEthereumNetwork
/>) />)
}) })

View File

@ -23,7 +23,7 @@ export default class BasicTabContent extends Component {
{!gasPriceButtonGroupProps.loading {!gasPriceButtonGroupProps.loading
? <GasPriceButtonGroup ? <GasPriceButtonGroup
className="gas-price-button-group--alt" className="gas-price-button-group--alt"
showCheck={true} showCheck
{...gasPriceButtonGroupProps} {...gasPriceButtonGroupProps}
/> />
: <Loading /> : <Loading />

View File

@ -204,7 +204,7 @@ export default class GasModalPageContainer extends Component {
}} }}
submitText={this.context.t('save')} submitText={this.context.t('save')}
headerCloseText={this.context.t('close')} headerCloseText={this.context.t('close')}
hideCancel={true} hideCancel
/> />
</div> </div>
) )

View File

@ -200,7 +200,7 @@ describe('GasModalPageContainer Component', function () {
customGasLimitInHex="mockCustomGasLimitInHex" customGasLimitInHex="mockCustomGasLimitInHex"
insufficientBalance={false} insufficientBalance={false}
disableSave={false} disableSave={false}
hideBasic={true} hideBasic
/>) />)
const renderTabsResult = wrapper.instance().renderTabs() const renderTabsResult = wrapper.instance().renderTabs()

View File

@ -17,12 +17,12 @@ export default class HomeNotification extends PureComponent {
} }
static propTypes = { static propTypes = {
acceptText: PropTypes.string.isRequired, acceptText: PropTypes.node.isRequired,
onAccept: PropTypes.func, onAccept: PropTypes.func,
ignoreText: PropTypes.string, ignoreText: PropTypes.node,
onIgnore: PropTypes.func, onIgnore: PropTypes.func,
descriptionText: PropTypes.string.isRequired, descriptionText: PropTypes.node.isRequired,
infoText: PropTypes.string, infoText: PropTypes.node,
classNames: PropTypes.array, classNames: PropTypes.array,
} }

View File

@ -110,7 +110,7 @@ describe('Modal Component', () => {
cancelText="Cancel" cancelText="Cancel"
onSubmit={handleSubmit} onSubmit={handleSubmit}
submitText="Submit" submitText="Submit"
submitDisabled={true} submitDisabled
headerText="My Header" headerText="My Header"
onClose={handleCancel} onClose={handleCancel}
/> />

View File

@ -90,7 +90,7 @@ describe('TransactionActivityLog Component', () => {
onCancel={() => {}} onCancel={() => {}}
onRetry={() => {}} onRetry={() => {}}
primaryTransactionStatus="pending" primaryTransactionStatus="pending"
isEarliestNonce={true} isEarliestNonce
/>, />,
{ context: { t: (str1, str2) => str2 ? str1 + str2 : str1 } } { context: { t: (str1, str2) => str2 ? str1 + str2 : str1 } }
) )

View File

@ -70,7 +70,7 @@ describe('TransactionListItemDetails Component', () => {
const wrapper = shallow( const wrapper = shallow(
<TransactionListItemDetails <TransactionListItemDetails
transactionGroup={transactionGroup} transactionGroup={transactionGroup}
showSpeedUp={true} showSpeedUp
/>, />,
{ context: { t: (str1, str2) => str2 ? str1 + str2 : str1 } } { context: { t: (str1, str2) => str2 ? str1 + str2 : str1 } }
) )

View File

@ -53,7 +53,7 @@ export default class TransactionViewBalance extends PureComponent {
value={balance} value={balance}
type={PRIMARY} type={PRIMARY}
ethNumberOfDecimals={4} ethNumberOfDecimals={4}
hideTitle={true} hideTitle
/> />
{ {
balanceIsCached ? <span className="transaction-view-balance__cached-star">*</span> : null balanceIsCached ? <span className="transaction-view-balance__cached-star">*</span> : null
@ -69,7 +69,7 @@ export default class TransactionViewBalance extends PureComponent {
value={balance} value={balance}
type={SECONDARY} type={SECONDARY}
ethNumberOfDecimals={4} ethNumberOfDecimals={4}
hideTitle={true} hideTitle
/> />
) )
} }

View File

@ -18,7 +18,7 @@ describe('UserPreferencedCurrencyDisplay Component', () => {
it('should pass all props to the CurrencyDisplay child component', () => { it('should pass all props to the CurrencyDisplay child component', () => {
const wrapper = shallow( const wrapper = shallow(
<UserPreferencedCurrencyDisplay <UserPreferencedCurrencyDisplay
prop1={true} prop1
prop2="test" prop2="test"
prop3={1} prop3={1}
/> />

View File

@ -130,7 +130,7 @@ describe('CurrencyInput Component', () => {
fiatSuffix="USD" fiatSuffix="USD"
nativeSuffix="ETH" nativeSuffix="ETH"
useFiat useFiat
hideFiat={true} hideFiat
nativeCurrency="ETH" nativeCurrency="ETH"
currentCurrency="usd" currentCurrency="usd"
conversionRate={231.06} conversionRate={231.06}

View File

@ -16,7 +16,7 @@ describe('MetaFoxLogo', () => {
it('does not set icon height and width when unsetIconHeight is true', () => { it('does not set icon height and width when unsetIconHeight is true', () => {
const wrapper = mount( const wrapper = mount(
<MetaFoxLogo unsetIconHeight={true} /> <MetaFoxLogo unsetIconHeight />
) )
assert.equal(wrapper.find('img.app-header__metafox-logo--icon').prop('width'), null) assert.equal(wrapper.find('img.app-header__metafox-logo--icon').prop('width'), null)

View File

@ -13,7 +13,7 @@ describe('Page Container Header', () => {
onClose = sinon.spy() onClose = sinon.spy()
wrapper = shallow(<PageContainerHeader wrapper = shallow(<PageContainerHeader
showBackButton={true} showBackButton
onBackButtonClick={onBackButtonClick} onBackButtonClick={onBackButtonClick}
backButtonStyles={style} backButtonStyles={style}
title="Test Title" title="Test Title"

View File

@ -5,6 +5,7 @@ import Identicon from '../../../components/ui/identicon'
import { import {
addressSummary, addressSummary,
} from '../../../helpers/utils/util' } from '../../../helpers/utils/util'
import { formatCurrency } from '../../../helpers/utils/confirm-tx.util'
export default class ConfirmApproveContent extends Component { export default class ConfirmApproveContent extends Component {
static contextTypes = { static contextTypes = {
@ -26,6 +27,7 @@ export default class ConfirmApproveContent extends Component {
tokenBalance: PropTypes.string, tokenBalance: PropTypes.string,
data: PropTypes.string, data: PropTypes.string,
toAddress: PropTypes.string, toAddress: PropTypes.string,
currentCurrency: PropTypes.string,
fiatTransactionTotal: PropTypes.string, fiatTransactionTotal: PropTypes.string,
ethTransactionTotal: PropTypes.string, ethTransactionTotal: PropTypes.string,
} }
@ -68,6 +70,7 @@ export default class ConfirmApproveContent extends Component {
renderTransactionDetailsContent () { renderTransactionDetailsContent () {
const { t } = this.context const { t } = this.context
const { const {
currentCurrency,
ethTransactionTotal, ethTransactionTotal,
fiatTransactionTotal, fiatTransactionTotal,
} = this.props } = this.props
@ -78,10 +81,10 @@ export default class ConfirmApproveContent extends Component {
</div> </div>
<div className="confirm-approve-content__transaction-details-content__fee"> <div className="confirm-approve-content__transaction-details-content__fee">
<div className="confirm-approve-content__transaction-details-content__primary-fee"> <div className="confirm-approve-content__transaction-details-content__primary-fee">
{ fiatTransactionTotal } { formatCurrency(fiatTransactionTotal, currentCurrency) }
</div> </div>
<div className="confirm-approve-content__transaction-details-content__secondary-fee"> <div className="confirm-approve-content__transaction-details-content__secondary-fee">
{ ethTransactionTotal } { `${ethTransactionTotal} ETH` }
</div> </div>
</div> </div>
</div> </div>

View File

@ -62,6 +62,7 @@ export default class ConfirmApprove extends Component {
data, data,
decimals, decimals,
txData, txData,
currentCurrency,
ethTransactionTotal, ethTransactionTotal,
fiatTransactionTotal, fiatTransactionTotal,
...restProps ...restProps
@ -78,7 +79,7 @@ export default class ConfirmApprove extends Component {
<ConfirmTransactionBase <ConfirmTransactionBase
toAddress={toAddress} toAddress={toAddress}
identiconAddress={tokenAddress} identiconAddress={tokenAddress}
showAccountInHeader={true} showAccountInHeader
title={tokensText} title={tokensText}
contentComponent={<ConfirmApproveContent contentComponent={<ConfirmApproveContent
siteImage={siteImage} siteImage={siteImage}
@ -95,10 +96,11 @@ export default class ConfirmApprove extends Component {
showEditApprovalPermissionModal={showEditApprovalPermissionModal} showEditApprovalPermissionModal={showEditApprovalPermissionModal}
data={data} data={data}
toAddress={toAddress} toAddress={toAddress}
currentCurrency={currentCurrency}
ethTransactionTotal={ethTransactionTotal} ethTransactionTotal={ethTransactionTotal}
fiatTransactionTotal={fiatTransactionTotal} fiatTransactionTotal={fiatTransactionTotal}
/>} />}
hideSenderToRecipient={true} hideSenderToRecipient
customTxParamsData={customPermissionAmount customTxParamsData={customPermissionAmount
? getCustomTxParamsData(data, { customPermissionAmount, tokenAmount, decimals }) ? getCustomTxParamsData(data, { customPermissionAmount, tokenAmount, decimals })
: null : null

View File

@ -261,7 +261,7 @@ export default class ConfirmTransactionBase extends Component {
customGasPrice={customGas.gasPrice} customGasPrice={customGas.gasPrice}
customGasLimit={customGas.gasLimit} customGasLimit={customGas.gasLimit}
insufficientBalance={insufficientBalance} insufficientBalance={insufficientBalance}
customPriceIsSafe={true} customPriceIsSafe
isSpeedUp={false} isSpeedUp={false}
/> />
: null : null

View File

@ -47,17 +47,17 @@ export default class CreateAccountPage extends Component {
<div className="new-account__form"> <div className="new-account__form">
<Switch> <Switch>
<Route <Route
exact={true} exact
path={NEW_ACCOUNT_ROUTE} path={NEW_ACCOUNT_ROUTE}
component={NewAccountCreateForm} component={NewAccountCreateForm}
/> />
<Route <Route
exact={true} exact
path={IMPORT_ACCOUNT_ROUTE} path={IMPORT_ACCOUNT_ROUTE}
component={NewAccountImportForm} component={NewAccountImportForm}
/> />
<Route <Route
exact={true} exact
path={CONNECT_HARDWARE_ROUTE} path={CONNECT_HARDWARE_ROUTE}
component={ConnectHardwareForm} component={ConnectHardwareForm}
/> />

View File

@ -58,13 +58,13 @@ export default class NewAccountCreateForm extends Component {
<div className="new-account-create-form__buttons"> <div className="new-account-create-form__buttons">
<Button <Button
type="default" type="default"
large={true} large
className="new-account-create-form__button" className="new-account-create-form__button"
onClick={() => history.push(DEFAULT_ROUTE)} onClick={() => history.push(DEFAULT_ROUTE)}
>{this.context.t('cancel')}</Button> >{this.context.t('cancel')}</Button>
<Button <Button
type="secondary" type="secondary"
large={true} large
className="new-account-create-form__button" className="new-account-create-form__button"
onClick={createClick} onClick={createClick}
>{this.context.t('create')}</Button> >{this.context.t('create')}</Button>

View File

@ -83,7 +83,7 @@ export default class AccountListItem extends Component {
<UserPreferencedCurrencyDisplay <UserPreferencedCurrencyDisplay
type={PRIMARY} type={PRIMARY}
value={balance} value={balance}
hideTitle={true} hideTitle
/> />
{ {
balanceIsCached ? <span className="account-list-item__cached-star">*</span> : null balanceIsCached ? <span className="account-list-item__cached-star">*</span> : null
@ -94,7 +94,7 @@ export default class AccountListItem extends Component {
<UserPreferencedCurrencyDisplay <UserPreferencedCurrencyDisplay
type={SECONDARY} type={SECONDARY}
value={balance} value={balance}
hideTitle={true} hideTitle
/> />
) )
} }

View File

@ -130,7 +130,7 @@ export default class SendGasRow extends Component {
customGasPrice={gasPrice} customGasPrice={gasPrice}
customGasLimit={gasLimit} customGasLimit={gasLimit}
insufficientBalance={insufficientBalance} insufficientBalance={insufficientBalance}
customPriceIsSafe={true} customPriceIsSafe
isSpeedUp={false} isSpeedUp={false}
/> />
{ this.renderAdvancedOptionsButton() } { this.renderAdvancedOptionsButton() }

View File

@ -16,7 +16,7 @@ describe('SendContent Component', function () {
beforeEach(() => { beforeEach(() => {
wrapper = shallow( wrapper = shallow(
<SendContent <SendContent
showHexData={true} showHexData
/>, />,
{ context: { t: str => str + '_t' } } { context: { t: str => str + '_t' } }
) )

View File

@ -29,7 +29,7 @@ describe('SendFooter Component', function () {
addToAddressBookIfNew={propsMethodSpies.addToAddressBookIfNew} addToAddressBookIfNew={propsMethodSpies.addToAddressBookIfNew}
amount="mockAmount" amount="mockAmount"
clearSend={propsMethodSpies.clearSend} clearSend={propsMethodSpies.clearSend}
disabled={true} disabled
editingTransactionId="mockEditingTransactionId" editingTransactionId="mockEditingTransactionId"
errors={{}} errors={{}}
from={ { address: 'mockAddress', balance: 'mockBalance' } } from={ { address: 'mockAddress', balance: 'mockBalance' } }
@ -186,7 +186,7 @@ describe('SendFooter Component', function () {
addToAddressBookIfNew={propsMethodSpies.addToAddressBookIfNew} addToAddressBookIfNew={propsMethodSpies.addToAddressBookIfNew}
amount="mockAmount" amount="mockAmount"
clearSend={propsMethodSpies.clearSend} clearSend={propsMethodSpies.clearSend}
disabled={true} disabled
editingTransactionId="mockEditingTransactionId" editingTransactionId="mockEditingTransactionId"
errors={{}} errors={{}}
from={ { address: 'mockAddress', balance: 'mockBalance' } } from={ { address: 'mockAddress', balance: 'mockBalance' } }

View File

@ -58,7 +58,7 @@ describe('Send Component', function () {
recentBlocks={['mockBlock']} recentBlocks={['mockBlock']}
selectedAddress="mockSelectedAddress" selectedAddress="mockSelectedAddress"
selectedToken="mockSelectedToken" selectedToken="mockSelectedToken"
showHexData={true} showHexData
tokenBalance="mockTokenBalance" tokenBalance="mockTokenBalance"
tokenContract="mockTokenContract" tokenContract="mockTokenContract"
updateAndSetGasLimit={propsMethodSpies.updateAndSetGasLimit} updateAndSetGasLimit={propsMethodSpies.updateAndSetGasLimit}

View File

@ -61,7 +61,7 @@ export default class ToAutoComplete extends Component {
}} }}
icon={this.getListItemIcon(account.address, to)} icon={this.getListItemIcon(account.address, to)}
displayBalance={false} displayBalance={false}
displayAddress={true} displayAddress
/> />
))} ))}
</div> </div>

View File

@ -100,7 +100,7 @@ export default class EditContact extends PureComponent {
onChange={e => this.setState({ newMemo: e.target.value })} onChange={e => this.setState({ newMemo: e.target.value })}
fullWidth fullWidth
margin="dense" margin="dense"
multiline={true} multiline
rows={3} rows={3}
classes={{ classes={{
inputMultiline: 'address-book__view-contact__text-area', inputMultiline: 'address-book__view-contact__text-area',

View File

@ -24,6 +24,7 @@ export default class NetworkForm extends PureComponent {
isCurrentRpcTarget: PropTypes.bool, isCurrentRpcTarget: PropTypes.bool,
blockExplorerUrl: PropTypes.string, blockExplorerUrl: PropTypes.string,
rpcPrefs: PropTypes.object, rpcPrefs: PropTypes.object,
rpcUrls: PropTypes.array,
} }
state = { state = {
@ -211,16 +212,28 @@ export default class NetworkForm extends PureComponent {
) )
} }
validateUrl = (url, stateKey) => { isValidWhenAppended = url => {
const invalidUrlErrorMsg = stateKey === 'rpcUrl' ? 'invalidRPC' : 'invalidBlockExplorerURL' const appendedRpc = `http://${url}`
return validUrl.isWebUri(appendedRpc) && !url.match(/^https?:\/\/$/)
}
if (validUrl.isWebUri(url) || (stateKey === 'blockExplorerUrl' && url === '')) { validateBlockExplorerURL = (url, stateKey) => {
this.setErrorTo(stateKey, '') if (!validUrl.isWebUri(url) && url !== '') {
this.setErrorTo(stateKey, this.context.t(this.isValidWhenAppended(url) ? 'urlErrorMsg' : 'invalidBlockExplorerURL'))
} else { } else {
const appendedRpc = `http://${url}` this.setErrorTo(stateKey, '')
const validWhenAppended = validUrl.isWebUri(appendedRpc) && !url.match(/^https?:\/\/$/) }
}
this.setErrorTo(stateKey, this.context.t(validWhenAppended ? 'uriErrorMsg' : invalidUrlErrorMsg)) validateUrlRpcUrl = (url, stateKey) => {
const { rpcUrls } = this.props
if (!validUrl.isWebUri(url) && url !== '') {
this.setErrorTo(stateKey, this.context.t(this.isValidWhenAppended(url) ? 'urlErrorMsg' : 'invalidRPC'))
} else if (rpcUrls.includes(url)) {
this.setErrorTo(stateKey, this.context.t('urlExistsErrorMsg'))
} else {
this.setErrorTo(stateKey, '')
} }
} }
@ -254,7 +267,7 @@ export default class NetworkForm extends PureComponent {
{this.renderFormTextField( {this.renderFormTextField(
'rpcUrl', 'rpcUrl',
'rpc-url', 'rpc-url',
this.setStateWithValue('rpcUrl', this.validateUrl), this.setStateWithValue('rpcUrl', this.validateUrlRpcUrl),
rpcUrl, rpcUrl,
)} )}
{this.renderFormTextField( {this.renderFormTextField(
@ -274,7 +287,7 @@ export default class NetworkForm extends PureComponent {
{this.renderFormTextField( {this.renderFormTextField(
'blockExplorerUrl', 'blockExplorerUrl',
'block-explorer-url', 'block-explorer-url',
this.setStateWithValue('blockExplorerUrl', this.validateUrl), this.setStateWithValue('blockExplorerUrl', this.validateBlockExplorerURL),
blockExplorerUrl, blockExplorerUrl,
'optionalBlockExplorerUrl', 'optionalBlockExplorerUrl',
)} )}

View File

@ -20,7 +20,7 @@ export default class NetworksTab extends PureComponent {
location: PropTypes.object.isRequired, location: PropTypes.object.isRequired,
networkIsSelected: PropTypes.bool, networkIsSelected: PropTypes.bool,
networksTabIsInAddMode: PropTypes.bool, networksTabIsInAddMode: PropTypes.bool,
networksToRender: PropTypes.array.isRequired, networksToRender: PropTypes.arrayOf(PropTypes.object).isRequired,
selectedNetwork: PropTypes.object, selectedNetwork: PropTypes.object,
setNetworksTabAddMode: PropTypes.func.isRequired, setNetworksTabAddMode: PropTypes.func.isRequired,
setRpcTarget: PropTypes.func.isRequired, setRpcTarget: PropTypes.func.isRequired,
@ -177,6 +177,7 @@ export default class NetworksTab extends PureComponent {
editRpc, editRpc,
networkDefaultedToProvider, networkDefaultedToProvider,
providerUrl, providerUrl,
networksToRender,
} = this.props } = this.props
const envIsPopup = getEnvironmentType() === ENVIRONMENT_TYPE_POPUP const envIsPopup = getEnvironmentType() === ENVIRONMENT_TYPE_POPUP
@ -189,6 +190,7 @@ export default class NetworksTab extends PureComponent {
shouldRenderNetworkForm shouldRenderNetworkForm
? ( ? (
<NetworkForm <NetworkForm
rpcUrls={networksToRender.map(network => network.rpcUrl)}
setRpcTarget={setRpcTarget} setRpcTarget={setRpcTarget}
editRpc={editRpc} editRpc={editRpc}
networkName={label || labelKey && t(labelKey) || ''} networkName={label || labelKey && t(labelKey) || ''}

View File

@ -367,6 +367,7 @@ var actions = {
// AppStateController-related actions // AppStateController-related actions
SET_LAST_ACTIVE_TIME: 'SET_LAST_ACTIVE_TIME', SET_LAST_ACTIVE_TIME: 'SET_LAST_ACTIVE_TIME',
setLastActiveTime, setLastActiveTime,
setMkrMigrationReminderTimestamp,
getContractMethodData, getContractMethodData,
loadingMethoDataStarted, loadingMethoDataStarted,
@ -2755,6 +2756,16 @@ function setLastActiveTime () {
} }
} }
function setMkrMigrationReminderTimestamp (timestamp) {
return (dispatch) => {
background.setMkrMigrationReminderTimestamp(timestamp, (err) => {
if (err) {
return dispatch(actions.displayWarning(err.message))
}
})
}
}
function loadingMethoDataStarted () { function loadingMethoDataStarted () {
return { return {
type: actions.LOADING_METHOD_DATA_STARTED, type: actions.LOADING_METHOD_DATA_STARTED,