From 722c4e5b636eb0cc6ae9593ba3f2b8088cdc4b4a Mon Sep 17 00:00:00 2001 From: Alex Miller Date: Mon, 8 Nov 2021 08:48:41 -0600 Subject: [PATCH] Support for GridPlus Lattice1 hardware wallet (#12053) * GridPlus: Adds support for GridPlus Lattice1 hardware wallet * Fixes issue with switching hardware HD path The main `Select HD Path` piece of the account selection component was not properly hooked up to the state manager (`onPathChange`) and the extra `Popover` component was being used instead. I'm not sure what the origin of this is, but I don't see why the Popover is needed at all. I have remove it and hooked `onPathChange` directly into the HD path selector dropdown. This was an issue that nearly every Lattice user who had come from Ledger has contacted us about. * GridPlus: Addresses QA issues * Adds Lattice tutorial + image * Cleans up connectivity issues (see: https://github.com/GridPlus/eth-lattice-keyring/pull/16) * GridPlus: Adds Firefox support To connect to the Lattice you need to open a new tab/window and get login data from it. We were not able to do this for Firefox because we relied on the `window` API. This is now fixed. See corresponding changes: * `eth-lattice-keyring`: https://github.com/GridPlus/eth-lattice-keyring/pull/17 * Lattice connector: https://github.com/GridPlus/wallet-web/pull/152 * GridPlus: Adds missing error path for Firefox See: https://github.com/GridPlus/eth-lattice-keyring/commit/242a93f559943c324eeb5e0c0a952e14ed9ae6fd --- app/_locales/am/messages.json | 3 - app/_locales/ar/messages.json | 3 - app/_locales/bg/messages.json | 3 - app/_locales/bn/messages.json | 3 - app/_locales/ca/messages.json | 3 - app/_locales/da/messages.json | 3 - app/_locales/de/messages.json | 3 - app/_locales/el/messages.json | 3 - app/_locales/en/messages.json | 22 +- app/_locales/es/messages.json | 13 - app/_locales/es_419/messages.json | 13 - app/_locales/et/messages.json | 3 - app/_locales/fa/messages.json | 3 - app/_locales/fi/messages.json | 3 - app/_locales/fil/messages.json | 3 - app/_locales/fr/messages.json | 3 - app/_locales/he/messages.json | 3 - app/_locales/hi/messages.json | 13 - app/_locales/hr/messages.json | 3 - app/_locales/ht/messages.json | 3 - app/_locales/hu/messages.json | 3 - app/_locales/id/messages.json | 13 - app/_locales/it/messages.json | 3 - app/_locales/ja/messages.json | 13 - app/_locales/kn/messages.json | 3 - app/_locales/ko/messages.json | 13 - app/_locales/lt/messages.json | 3 - app/_locales/lv/messages.json | 3 - app/_locales/ms/messages.json | 3 - app/_locales/no/messages.json | 3 - app/_locales/ph/messages.json | 13 - app/_locales/pl/messages.json | 3 - app/_locales/pt_BR/messages.json | 13 - app/_locales/ro/messages.json | 3 - app/_locales/ru/messages.json | 13 - app/_locales/sk/messages.json | 3 - app/_locales/sl/messages.json | 3 - app/_locales/sr/messages.json | 3 - app/_locales/sv/messages.json | 3 - app/_locales/sw/messages.json | 3 - app/_locales/tl/messages.json | 3 - app/_locales/uk/messages.json | 3 - app/_locales/vi/messages.json | 13 - app/_locales/zh_CN/messages.json | 3 - app/images/connect-lattice.svg | 18 + app/images/lattice-logo.png | Bin 0 -> 27102 bytes app/manifest/_base.json | 1 + app/scripts/metamask-controller.js | 23 +- development/states/navigate-txs.json | 320 ++++++++++++++++++ package.json | 2 + shared/constants/hardware-wallets.js | 1 + .../account-menu/account-menu.component.js | 1 + ui/ducks/app/app.js | 1 + ui/ducks/app/app.test.js | 1 + .../connect-hardware/account-list.js | 61 +--- .../create-account/connect-hardware/index.js | 24 +- .../connect-hardware/select-hardware.js | 65 ++++ ui/selectors/selectors.js | 1 + yarn.lock | 204 ++++++++++- 59 files changed, 661 insertions(+), 313 deletions(-) create mode 100644 app/images/connect-lattice.svg create mode 100644 app/images/lattice-logo.png create mode 100644 development/states/navigate-txs.json diff --git a/app/_locales/am/messages.json b/app/_locales/am/messages.json index 124a4d294..4c4b6732c 100644 --- a/app/_locales/am/messages.json +++ b/app/_locales/am/messages.json @@ -844,9 +844,6 @@ "selectAnAccount": { "message": "መለያ ይምረጡ" }, - "selectAnAccountHelp": { - "message": "መለያውን በ MetaMask ለማየት ይምረጡ" - }, "selectEachPhrase": { "message": "እባክዎ እያንዳንዱን ሐረግ በመምረጥ ትክክለኛነቱን ያረጋግጡ።" }, diff --git a/app/_locales/ar/messages.json b/app/_locales/ar/messages.json index 78750b0d2..4dbec586e 100644 --- a/app/_locales/ar/messages.json +++ b/app/_locales/ar/messages.json @@ -840,9 +840,6 @@ "selectAnAccount": { "message": "قم بتحديد حساب" }, - "selectAnAccountHelp": { - "message": "حدد الحساب لعرضه في MetaMask" - }, "selectEachPhrase": { "message": "يُرجى تحديد كل عبارة للتأكد من صحتها." }, diff --git a/app/_locales/bg/messages.json b/app/_locales/bg/messages.json index 79c0fc2d6..4105c3729 100644 --- a/app/_locales/bg/messages.json +++ b/app/_locales/bg/messages.json @@ -843,9 +843,6 @@ "selectAnAccount": { "message": "Изберете акаунт" }, - "selectAnAccountHelp": { - "message": "Изберете акаунта за преглед в MetaMask" - }, "selectEachPhrase": { "message": "Моля, изберете всяка фраза, за да се уверите, че е правилна." }, diff --git a/app/_locales/bn/messages.json b/app/_locales/bn/messages.json index ed0cf5418..1e3996595 100644 --- a/app/_locales/bn/messages.json +++ b/app/_locales/bn/messages.json @@ -847,9 +847,6 @@ "selectAnAccount": { "message": "একটি অ্যাকাউন্ট নির্বাচন করুন" }, - "selectAnAccountHelp": { - "message": "MetaMask এ দেখতে অ্যাকাউন্টটি নির্বাচন করুন" - }, "selectEachPhrase": { "message": "ফ্রেজগুলি সঠিক তা নিশ্চিত করতে অনুগ্রহ করে প্রতিটি ফ্রেজ নির্বাচন করুন।" }, diff --git a/app/_locales/ca/messages.json b/app/_locales/ca/messages.json index 971ab3a80..0d910f560 100644 --- a/app/_locales/ca/messages.json +++ b/app/_locales/ca/messages.json @@ -825,9 +825,6 @@ "selectAnAccount": { "message": "Selecciona un Compte" }, - "selectAnAccountHelp": { - "message": "Selecciona el compte que vols veure a MetaMask" - }, "selectEachPhrase": { "message": "Si us plau selecciona cada frase per a assegurar-te que és correcta." }, diff --git a/app/_locales/da/messages.json b/app/_locales/da/messages.json index c6451cc4e..c333d6692 100644 --- a/app/_locales/da/messages.json +++ b/app/_locales/da/messages.json @@ -828,9 +828,6 @@ "selectAnAccount": { "message": "Vælg en Konto" }, - "selectAnAccountHelp": { - "message": "Vælg kontoen der skal vises i MetaMask" - }, "selectEachPhrase": { "message": "Vælg venligst hver sætning, for at sikre at de er korrekte." }, diff --git a/app/_locales/de/messages.json b/app/_locales/de/messages.json index 6a9d2a4f1..fdd26afb6 100644 --- a/app/_locales/de/messages.json +++ b/app/_locales/de/messages.json @@ -819,9 +819,6 @@ "selectAnAccount": { "message": "Ein Konto auswählen" }, - "selectAnAccountHelp": { - "message": "Wählen Sie das Konto aus, das in MetaMask angezeigt werden soll." - }, "selectEachPhrase": { "message": "Bitte wählen Sie jede Phrase aus, um sicherzustellen, dass sie korrekt ist." }, diff --git a/app/_locales/el/messages.json b/app/_locales/el/messages.json index 30013f869..02871aad7 100644 --- a/app/_locales/el/messages.json +++ b/app/_locales/el/messages.json @@ -844,9 +844,6 @@ "selectAnAccount": { "message": "Επιλέξτε Λογαριασμό" }, - "selectAnAccountHelp": { - "message": "Επιλέξτε τον λογαριασμό για προβολή στο MetaMask" - }, "selectEachPhrase": { "message": "Παρακαλούμε επιλέξτε κάθε φράση, για να βεβαιωθείτε ότι είναι σωστή." }, diff --git a/app/_locales/en/messages.json b/app/_locales/en/messages.json index d1f2af8dd..144ddd140 100644 --- a/app/_locales/en/messages.json +++ b/app/_locales/en/messages.json @@ -2123,13 +2123,6 @@ "selectAnAccountAlreadyConnected": { "message": "This account has already been connected to MetaMask" }, - "selectAnAccountHelp": { - "message": "Select an account to view in MetaMask." - }, - "selectAnAccountHelpDirections": { - "message": "Don't see your account? $1", - "description": "$1 represents the `hardwareWalletSupportLinkConversion` localization key" - }, "selectEachPhrase": { "message": "Please select each phrase in order to make sure it is correct." }, @@ -2137,7 +2130,7 @@ "message": "Select HD Path" }, "selectPathHelp": { - "message": "If you don't see your existing Ledger accounts below, try switching paths to \"Legacy (MEW / MyCrypto)\"" + "message": "If you don't see the accounts you expect, try switching the HD path." }, "selectType": { "message": "Select Type" @@ -2310,6 +2303,13 @@ "statusNotConnected": { "message": "Not connected" }, + "step1LatticeWallet": { + "message": "Make sure your Lattice1 is ready to connect" + }, + "step1LatticeWalletMsg": { + "message": "You can connect MetaMask to your Lattice1 device once it is set up and online. Unlock your device and have your Device ID ready. For more on using hardware wallets, $1", + "description": "$1 represents the `hardwareWalletSupportLinkConversion` localization key" + }, "step1LedgerWallet": { "message": "Download Ledger app" }, @@ -2673,12 +2673,6 @@ "switchEthereumChainConfirmationTitle": { "message": "Allow this site to switch the network?" }, - "switchLedgerPaths": { - "message": "Switch Ledger paths" - }, - "switchLedgerPathsText": { - "message": "Select the Ledger path to view other accounts" - }, "switchNetwork": { "message": "Switch network" }, diff --git a/app/_locales/es/messages.json b/app/_locales/es/messages.json index 12de76b70..1b86785f9 100644 --- a/app/_locales/es/messages.json +++ b/app/_locales/es/messages.json @@ -1619,13 +1619,6 @@ "selectAnAccountAlreadyConnected": { "message": "Esta cuenta ya se conectó a MetaMask." }, - "selectAnAccountHelp": { - "message": "Seleccione una cuenta para verla en MetaMask." - }, - "selectAnAccountHelpDirections": { - "message": "¿No ve su cuenta? $1", - "description": "$1 represents the `hardwareWalletSupportLinkConversion` localization key" - }, "selectEachPhrase": { "message": "Seleccione cada frase para garantizar que sea correcta." }, @@ -2106,12 +2099,6 @@ "switchEthereumChainConfirmationTitle": { "message": "¿Le permite a este sitio cambiar la red?" }, - "switchLedgerPaths": { - "message": "Cambiar rutas de acceso al Ledger" - }, - "switchLedgerPathsText": { - "message": "Seleccione la ruta de acceso al Ledger para ver otras cuentas" - }, "switchNetwork": { "message": "Cambiar red" }, diff --git a/app/_locales/es_419/messages.json b/app/_locales/es_419/messages.json index 12de76b70..1b86785f9 100644 --- a/app/_locales/es_419/messages.json +++ b/app/_locales/es_419/messages.json @@ -1619,13 +1619,6 @@ "selectAnAccountAlreadyConnected": { "message": "Esta cuenta ya se conectó a MetaMask." }, - "selectAnAccountHelp": { - "message": "Seleccione una cuenta para verla en MetaMask." - }, - "selectAnAccountHelpDirections": { - "message": "¿No ve su cuenta? $1", - "description": "$1 represents the `hardwareWalletSupportLinkConversion` localization key" - }, "selectEachPhrase": { "message": "Seleccione cada frase para garantizar que sea correcta." }, @@ -2106,12 +2099,6 @@ "switchEthereumChainConfirmationTitle": { "message": "¿Le permite a este sitio cambiar la red?" }, - "switchLedgerPaths": { - "message": "Cambiar rutas de acceso al Ledger" - }, - "switchLedgerPathsText": { - "message": "Seleccione la ruta de acceso al Ledger para ver otras cuentas" - }, "switchNetwork": { "message": "Cambiar red" }, diff --git a/app/_locales/et/messages.json b/app/_locales/et/messages.json index f7159d6f1..9201b35d8 100644 --- a/app/_locales/et/messages.json +++ b/app/_locales/et/messages.json @@ -837,9 +837,6 @@ "selectAnAccount": { "message": "Valige konto" }, - "selectAnAccountHelp": { - "message": "Valige konto, mida MetaMaskis vaadata" - }, "selectEachPhrase": { "message": "Valige iga fraas, veendumaks, et see on õige." }, diff --git a/app/_locales/fa/messages.json b/app/_locales/fa/messages.json index c4c6fc786..28563b100 100644 --- a/app/_locales/fa/messages.json +++ b/app/_locales/fa/messages.json @@ -847,9 +847,6 @@ "selectAnAccount": { "message": "یک حساب را انتخاب کنید" }, - "selectAnAccountHelp": { - "message": "برای مشاهده MetaMask حساب را انتخاب نمایید" - }, "selectEachPhrase": { "message": "لطفًا جهت اطمینان از درستی، هر عبارت را انتخاب کنید." }, diff --git a/app/_locales/fi/messages.json b/app/_locales/fi/messages.json index bb7b53c72..a702aa641 100644 --- a/app/_locales/fi/messages.json +++ b/app/_locales/fi/messages.json @@ -844,9 +844,6 @@ "selectAnAccount": { "message": "Valitse tili" }, - "selectAnAccountHelp": { - "message": "Valitse MetaMaskissa näytettävä tili" - }, "selectEachPhrase": { "message": "Ole hyvä ja valitse jokainen teksti järjestyksessä varmistaaksesi, että se on oikein." }, diff --git a/app/_locales/fil/messages.json b/app/_locales/fil/messages.json index f6f51b82d..ed799f2c9 100644 --- a/app/_locales/fil/messages.json +++ b/app/_locales/fil/messages.json @@ -768,9 +768,6 @@ "selectAnAccount": { "message": "Pumili ng Account" }, - "selectAnAccountHelp": { - "message": "Piliin ang account na titingnan sa MetaMask" - }, "selectEachPhrase": { "message": "Pakipili ang bawat parirala para tiyaking tama ito." }, diff --git a/app/_locales/fr/messages.json b/app/_locales/fr/messages.json index 4cac23cb8..3e8cf75db 100644 --- a/app/_locales/fr/messages.json +++ b/app/_locales/fr/messages.json @@ -829,9 +829,6 @@ "selectAnAccount": { "message": "Selectionner un compte" }, - "selectAnAccountHelp": { - "message": "Selectionner le compte à afficher dans MetaMask" - }, "selectEachPhrase": { "message": "Veuillez sélectionner chaque phrase afin de vous assurer qu'elle est correcte." }, diff --git a/app/_locales/he/messages.json b/app/_locales/he/messages.json index 8a6fd5d6d..97db0dcbc 100644 --- a/app/_locales/he/messages.json +++ b/app/_locales/he/messages.json @@ -841,9 +841,6 @@ "selectAnAccount": { "message": "בחר חשבון" }, - "selectAnAccountHelp": { - "message": "בחר את החשבון לצפייה ב- MetaMask" - }, "selectEachPhrase": { "message": "נא לבחור כל צירוף מילים כדי להבטיח שהוא נכון." }, diff --git a/app/_locales/hi/messages.json b/app/_locales/hi/messages.json index 08b76a2c9..c6d1f5883 100644 --- a/app/_locales/hi/messages.json +++ b/app/_locales/hi/messages.json @@ -1619,13 +1619,6 @@ "selectAnAccountAlreadyConnected": { "message": "यह खाता पहले ही MetaMask से जुड़ा हुआ है" }, - "selectAnAccountHelp": { - "message": "MetaMask में देखने के लिए खाते का चयन करें।" - }, - "selectAnAccountHelpDirections": { - "message": "अपना खाता नहीं देख पा रहे हैं? $1", - "description": "$1 represents the `hardwareWalletSupportLinkConversion` localization key" - }, "selectEachPhrase": { "message": "कृपया प्रत्येक वाक्यांश का चयन करें, ताकि यह सुनिश्चित हो सके कि यह सही है।" }, @@ -2106,12 +2099,6 @@ "switchEthereumChainConfirmationTitle": { "message": "इस साइट को नेटवर्क स्विच करने की अनुमति दें?" }, - "switchLedgerPaths": { - "message": "Ledger पथ स्विच करें" - }, - "switchLedgerPathsText": { - "message": "अन्य खाते देखने के लिए Ledger पथ का चयन करें" - }, "switchNetwork": { "message": "नेटवर्क स्विच करें" }, diff --git a/app/_locales/hr/messages.json b/app/_locales/hr/messages.json index 570e642d2..ea8631342 100644 --- a/app/_locales/hr/messages.json +++ b/app/_locales/hr/messages.json @@ -840,9 +840,6 @@ "selectAnAccount": { "message": "Odaberi račun" }, - "selectAnAccountHelp": { - "message": "Odaberi račun za prikaz u usluzi MetaMask" - }, "selectEachPhrase": { "message": "Odaberite svaku rečenicu kako biste provjerili je li točna." }, diff --git a/app/_locales/ht/messages.json b/app/_locales/ht/messages.json index d37b2913a..db29eb579 100644 --- a/app/_locales/ht/messages.json +++ b/app/_locales/ht/messages.json @@ -528,9 +528,6 @@ "selectAnAccount": { "message": "Chwazi yon kont" }, - "selectAnAccountHelp": { - "message": "Chwazi kont pou wè nan MetaMask" - }, "selectHdPath": { "message": "Chwazi chemen HD" }, diff --git a/app/_locales/hu/messages.json b/app/_locales/hu/messages.json index f1b0a0456..9de326c18 100644 --- a/app/_locales/hu/messages.json +++ b/app/_locales/hu/messages.json @@ -840,9 +840,6 @@ "selectAnAccount": { "message": "Válasszon fiókot" }, - "selectAnAccountHelp": { - "message": "Válássza ki a MetaMask-ban megtekinteni kívánt fiókot" - }, "selectEachPhrase": { "message": "Kérjük, válassza ki az egyes mondatokat, hogy meggyőződjön azok helyességéről. " }, diff --git a/app/_locales/id/messages.json b/app/_locales/id/messages.json index 3496aca1d..c5ab406b9 100644 --- a/app/_locales/id/messages.json +++ b/app/_locales/id/messages.json @@ -1619,13 +1619,6 @@ "selectAnAccountAlreadyConnected": { "message": "Akun ini sudah terhubung ke MetaMask." }, - "selectAnAccountHelp": { - "message": "Pilih akun untuk dilihat di MetaMask." - }, - "selectAnAccountHelpDirections": { - "message": "Tidak melihat akun Anda? $1", - "description": "$1 represents the `hardwareWalletSupportLinkConversion` localization key" - }, "selectEachPhrase": { "message": "Pilih masing-masing frasa untuk memastikan kebenarannya." }, @@ -2106,12 +2099,6 @@ "switchEthereumChainConfirmationTitle": { "message": "Izinkan situs ini untuk beralih jaringan?" }, - "switchLedgerPaths": { - "message": "Beralih jalur Ledger" - }, - "switchLedgerPathsText": { - "message": "Pilih jalur Ledger untuk melihat akun lain" - }, "switchNetwork": { "message": "Beralih jaringan" }, diff --git a/app/_locales/it/messages.json b/app/_locales/it/messages.json index b8830425b..5e5015007 100644 --- a/app/_locales/it/messages.json +++ b/app/_locales/it/messages.json @@ -1309,9 +1309,6 @@ "selectAnAccount": { "message": "Seleziona un Account" }, - "selectAnAccountHelp": { - "message": "Selezione l'account da visualizzare in MetaMask" - }, "selectEachPhrase": { "message": "Per favore seleziona ogni frase in ordine per assicurarti che sia corretta." }, diff --git a/app/_locales/ja/messages.json b/app/_locales/ja/messages.json index 6cb26cfc7..2135f0dc0 100644 --- a/app/_locales/ja/messages.json +++ b/app/_locales/ja/messages.json @@ -1619,13 +1619,6 @@ "selectAnAccountAlreadyConnected": { "message": "このアカウントはすでに MetaMask に接続されています" }, - "selectAnAccountHelp": { - "message": "MetaMask で表示するアカウントを選択します。" - }, - "selectAnAccountHelpDirections": { - "message": "アカウントが表示されません。$1", - "description": "$1 represents the `hardwareWalletSupportLinkConversion` localization key" - }, "selectEachPhrase": { "message": "各フレーズを選択して、各フレーズが正しいことを確認してください。" }, @@ -2106,12 +2099,6 @@ "switchEthereumChainConfirmationTitle": { "message": "このサイトのネットワーク変更を許可しますか?" }, - "switchLedgerPaths": { - "message": "レジャー パスの切り替え" - }, - "switchLedgerPathsText": { - "message": "レジャー パスを選択して他のアカウントを表示します" - }, "switchNetwork": { "message": "ネットワークの切り替え" }, diff --git a/app/_locales/kn/messages.json b/app/_locales/kn/messages.json index 8ead6e999..80c171ece 100644 --- a/app/_locales/kn/messages.json +++ b/app/_locales/kn/messages.json @@ -847,9 +847,6 @@ "selectAnAccount": { "message": "ಖಾತೆಯನ್ನು ಆಯ್ಕೆಮಾಡಿ" }, - "selectAnAccountHelp": { - "message": "MetaMask ನಲ್ಲಿ ವೀಕ್ಷಿಸಲು ಖಾತೆಯನ್ನು ಆಯ್ಕೆಮಾಡಿ" - }, "selectEachPhrase": { "message": "ಅದು ಸರಿಯಾಗಿದೆಯೆ ಎಂಬುದನ್ನು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಲು ದಯವಿಟ್ಟು ಪ್ರತಿ ಫ್ರೇಸ್ ಅನ್ನು ಆಯ್ಕೆಮಾಡಿ." }, diff --git a/app/_locales/ko/messages.json b/app/_locales/ko/messages.json index cc2cf9d4a..6228d5088 100644 --- a/app/_locales/ko/messages.json +++ b/app/_locales/ko/messages.json @@ -1619,13 +1619,6 @@ "selectAnAccountAlreadyConnected": { "message": "이 계정은 이미 MetaMask와 연결되어 있습니다." }, - "selectAnAccountHelp": { - "message": "MetaMask에서 확인할 계정을 선택하십시오." - }, - "selectAnAccountHelpDirections": { - "message": "계정을 찾을 수 없습니까? $1", - "description": "$1 represents the `hardwareWalletSupportLinkConversion` localization key" - }, "selectEachPhrase": { "message": "각 구문을 선택하여 구문이 올바른지 확인하세요." }, @@ -2106,12 +2099,6 @@ "switchEthereumChainConfirmationTitle": { "message": "이 사이트가 네트워크를 전환하도록 허용하시겠어요?" }, - "switchLedgerPaths": { - "message": "Ledger 경로 전환" - }, - "switchLedgerPathsText": { - "message": "다른 계정을 보려면 Ledger 경로를 선택하세요." - }, "switchNetwork": { "message": "네트워크 전환" }, diff --git a/app/_locales/lt/messages.json b/app/_locales/lt/messages.json index de0fd2500..2e35d171a 100644 --- a/app/_locales/lt/messages.json +++ b/app/_locales/lt/messages.json @@ -847,9 +847,6 @@ "selectAnAccount": { "message": "Pasirinkite paskyrą" }, - "selectAnAccountHelp": { - "message": "Pasirinkite paskyrą peržiūrėti „MetaMask“" - }, "selectEachPhrase": { "message": "Pasirinkite kiekvieną frazę, kad patikrintumėte, ar ji tinkama" }, diff --git a/app/_locales/lv/messages.json b/app/_locales/lv/messages.json index fe1ecb510..bbee7c62a 100644 --- a/app/_locales/lv/messages.json +++ b/app/_locales/lv/messages.json @@ -843,9 +843,6 @@ "selectAnAccount": { "message": "Atlasiet kontu" }, - "selectAnAccountHelp": { - "message": "Atlasiet kontu, ko skatīt MetaMask" - }, "selectEachPhrase": { "message": "Lūdzu, atlasiet katru frāzi, lai pārliecinātos par tās pareizību." }, diff --git a/app/_locales/ms/messages.json b/app/_locales/ms/messages.json index 526db5f84..196f3a16f 100644 --- a/app/_locales/ms/messages.json +++ b/app/_locales/ms/messages.json @@ -824,9 +824,6 @@ "selectAnAccount": { "message": "Pilih Akaun" }, - "selectAnAccountHelp": { - "message": "Pilih akaun untuk dilihat dalam MetaMask" - }, "selectEachPhrase": { "message": "Sila pilih setiap ungkapan untuk memastikan ia betul." }, diff --git a/app/_locales/no/messages.json b/app/_locales/no/messages.json index 8b2fc2b2d..3c00c6fb3 100644 --- a/app/_locales/no/messages.json +++ b/app/_locales/no/messages.json @@ -831,9 +831,6 @@ "selectAnAccount": { "message": "Velg en konto" }, - "selectAnAccountHelp": { - "message": "Velg konto for å vise i MetaMask" - }, "selectEachPhrase": { "message": "Velg hver frase for å kontrollere at den er riktig." }, diff --git a/app/_locales/ph/messages.json b/app/_locales/ph/messages.json index 516fa983f..767b6815c 100644 --- a/app/_locales/ph/messages.json +++ b/app/_locales/ph/messages.json @@ -1619,13 +1619,6 @@ "selectAnAccountAlreadyConnected": { "message": "Nakakonekta na ang account na ito sa MetaMask" }, - "selectAnAccountHelp": { - "message": "Pumili ng account na titingnan sa MetaMask." - }, - "selectAnAccountHelpDirections": { - "message": "Hindi makita ang iyong account? $1", - "description": "$1 represents the `hardwareWalletSupportLinkConversion` localization key" - }, "selectEachPhrase": { "message": "Pakipili ang bawat phrase para matiyak na tama ito." }, @@ -2106,12 +2099,6 @@ "switchEthereumChainConfirmationTitle": { "message": "Payagang palitan ng site na ito ang network?" }, - "switchLedgerPaths": { - "message": "Magpalit ng path ng Ledger" - }, - "switchLedgerPathsText": { - "message": "Piliin ang path ng Ledger para tingnan ang iba pang account" - }, "switchNetwork": { "message": "Lumipat ng network" }, diff --git a/app/_locales/pl/messages.json b/app/_locales/pl/messages.json index 08614b20a..cd955c838 100644 --- a/app/_locales/pl/messages.json +++ b/app/_locales/pl/messages.json @@ -841,9 +841,6 @@ "selectAnAccount": { "message": "Wybierz konto" }, - "selectAnAccountHelp": { - "message": "Wybierz konto do przeglądania w MetaMask" - }, "selectEachPhrase": { "message": "Wybierz każdą frazę, aby upewnić się, że jest poprawna." }, diff --git a/app/_locales/pt_BR/messages.json b/app/_locales/pt_BR/messages.json index d852678f1..be2683be2 100644 --- a/app/_locales/pt_BR/messages.json +++ b/app/_locales/pt_BR/messages.json @@ -1619,13 +1619,6 @@ "selectAnAccountAlreadyConnected": { "message": "Esta conta já foi conectada ao MetaMask" }, - "selectAnAccountHelp": { - "message": "Selecione uma conta a ser exibida no MetaMask." - }, - "selectAnAccountHelpDirections": { - "message": "Não está vendo sua conta? $1", - "description": "$1 represents the `hardwareWalletSupportLinkConversion` localization key" - }, "selectEachPhrase": { "message": "Selecione cada frase para garantir que esteja correta." }, @@ -2106,12 +2099,6 @@ "switchEthereumChainConfirmationTitle": { "message": "Permitir que este site mude a rede?" }, - "switchLedgerPaths": { - "message": "Mudar caminhos do Ledger" - }, - "switchLedgerPathsText": { - "message": "Selecione o caminho do Ledger para ver outras contas" - }, "switchNetwork": { "message": "Trocar de rede" }, diff --git a/app/_locales/ro/messages.json b/app/_locales/ro/messages.json index 6325adc51..06cafb9b3 100644 --- a/app/_locales/ro/messages.json +++ b/app/_locales/ro/messages.json @@ -834,9 +834,6 @@ "selectAnAccount": { "message": "Selectați un cont" }, - "selectAnAccountHelp": { - "message": "Selectați contul de vizualizat în MetaMask" - }, "selectEachPhrase": { "message": "Vă rugăm să selectați fiecare expresie pentru a vă asigura că este corectă." }, diff --git a/app/_locales/ru/messages.json b/app/_locales/ru/messages.json index 8b180409d..4246ecf35 100644 --- a/app/_locales/ru/messages.json +++ b/app/_locales/ru/messages.json @@ -1619,13 +1619,6 @@ "selectAnAccountAlreadyConnected": { "message": "Этот счет уже подключен к MetaMask" }, - "selectAnAccountHelp": { - "message": "Выберите счет для просмотра в MetaMask." - }, - "selectAnAccountHelpDirections": { - "message": "Не видите свой счет? $1", - "description": "$1 represents the `hardwareWalletSupportLinkConversion` localization key" - }, "selectEachPhrase": { "message": "Выберите каждую фразу, чтобы убедиться, что она верна." }, @@ -2106,12 +2099,6 @@ "switchEthereumChainConfirmationTitle": { "message": "Разрешить этому сайту переключить сеть?" }, - "switchLedgerPaths": { - "message": "Переключить пути Ledger" - }, - "switchLedgerPathsText": { - "message": "Выберите путь Ledger для просмотра других счетов" - }, "switchNetwork": { "message": "Переключить сеть" }, diff --git a/app/_locales/sk/messages.json b/app/_locales/sk/messages.json index e632b1bb4..65026b424 100644 --- a/app/_locales/sk/messages.json +++ b/app/_locales/sk/messages.json @@ -810,9 +810,6 @@ "selectAnAccount": { "message": "Vybrať účet" }, - "selectAnAccountHelp": { - "message": "Vyberte účet, ktorý chcete zobraziť v MetaMask" - }, "selectEachPhrase": { "message": "Vyberte každú frázu, aby ste sa uistili, že je správna." }, diff --git a/app/_locales/sl/messages.json b/app/_locales/sl/messages.json index 73b6f0d14..7b0363c17 100644 --- a/app/_locales/sl/messages.json +++ b/app/_locales/sl/messages.json @@ -835,9 +835,6 @@ "selectAnAccount": { "message": "Izberi račun" }, - "selectAnAccountHelp": { - "message": "Izberi račun za prikaz v MetaMask" - }, "selectEachPhrase": { "message": "Izberite vsako geslo ter se prepričajte, da je pravilno." }, diff --git a/app/_locales/sr/messages.json b/app/_locales/sr/messages.json index 3f04839a9..f991c8580 100644 --- a/app/_locales/sr/messages.json +++ b/app/_locales/sr/messages.json @@ -838,9 +838,6 @@ "selectAnAccount": { "message": "Izaberite nalog" }, - "selectAnAccountHelp": { - "message": "Izaberite nalog za prikaz u MetaMask-u" - }, "selectEachPhrase": { "message": "Molimo vas izaberite svaki izraz kako biste proverili da je tačan." }, diff --git a/app/_locales/sv/messages.json b/app/_locales/sv/messages.json index 32a4b6f46..5e7e0fe5c 100644 --- a/app/_locales/sv/messages.json +++ b/app/_locales/sv/messages.json @@ -831,9 +831,6 @@ "selectAnAccount": { "message": "Välj ett konto" }, - "selectAnAccountHelp": { - "message": "Välj konto att visa i MetaMask" - }, "selectEachPhrase": { "message": "Välj varje fras för att säkerställa att den är korrekt." }, diff --git a/app/_locales/sw/messages.json b/app/_locales/sw/messages.json index fe20d1ca5..84db61de5 100644 --- a/app/_locales/sw/messages.json +++ b/app/_locales/sw/messages.json @@ -825,9 +825,6 @@ "selectAnAccount": { "message": "Chagua Akaunti" }, - "selectAnAccountHelp": { - "message": "Chagua akaunti kuangalia kwenye MetaMask" - }, "selectEachPhrase": { "message": "Tafadhali chagua kila kirai ili kuhakikisha kuwa hii ni sahihi." }, diff --git a/app/_locales/tl/messages.json b/app/_locales/tl/messages.json index 1ba4dd9aa..ae5632d42 100644 --- a/app/_locales/tl/messages.json +++ b/app/_locales/tl/messages.json @@ -1300,9 +1300,6 @@ "selectAnAccount": { "message": "Pumili ng Account" }, - "selectAnAccountHelp": { - "message": "Piliin ang account na titingnan sa MetaMask" - }, "selectEachPhrase": { "message": "Pakipili ang bawat phrase para matiyak na tama ito." }, diff --git a/app/_locales/uk/messages.json b/app/_locales/uk/messages.json index 198532739..3aaa3b09b 100644 --- a/app/_locales/uk/messages.json +++ b/app/_locales/uk/messages.json @@ -847,9 +847,6 @@ "selectAnAccount": { "message": "Виберіть обліковий запис" }, - "selectAnAccountHelp": { - "message": "Оберіть обліковий запис для перегляду в MetaMask" - }, "selectEachPhrase": { "message": "Виберіть кожну фразу, щоб переконатися, що вона правильна." }, diff --git a/app/_locales/vi/messages.json b/app/_locales/vi/messages.json index 6e1753d7a..9eac3134e 100644 --- a/app/_locales/vi/messages.json +++ b/app/_locales/vi/messages.json @@ -1619,13 +1619,6 @@ "selectAnAccountAlreadyConnected": { "message": "Tài khoản này đã được kết nối với MetaMask" }, - "selectAnAccountHelp": { - "message": "Chọn một tài khoản để xem trong MetaMask." - }, - "selectAnAccountHelpDirections": { - "message": "Bạn không thấy tài khoản của mình? $1", - "description": "$1 represents the `hardwareWalletSupportLinkConversion` localization key" - }, "selectEachPhrase": { "message": "Vui lòng chọn từng cụm mật khẩu theo thứ tự để đảm bảo sự chính xác." }, @@ -2106,12 +2099,6 @@ "switchEthereumChainConfirmationTitle": { "message": "Cho phép trang web này chuyển mạng?" }, - "switchLedgerPaths": { - "message": "Chuyển đường dẫn Ledger" - }, - "switchLedgerPathsText": { - "message": "Chọn đường dẫn Ledger để xem các tài khoản khác" - }, "switchNetwork": { "message": "Chuyển mạng" }, diff --git a/app/_locales/zh_CN/messages.json b/app/_locales/zh_CN/messages.json index 3dca7499c..22b102426 100644 --- a/app/_locales/zh_CN/messages.json +++ b/app/_locales/zh_CN/messages.json @@ -1303,9 +1303,6 @@ "selectAnAccount": { "message": "选择一个账户" }, - "selectAnAccountHelp": { - "message": "选择在 MetaMask 中查看的账户" - }, "selectEachPhrase": { "message": "请选择每个单词,以确保其正确性。" }, diff --git a/app/images/connect-lattice.svg b/app/images/connect-lattice.svg new file mode 100644 index 000000000..b58f5845a --- /dev/null +++ b/app/images/connect-lattice.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/app/images/lattice-logo.png b/app/images/lattice-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..0100aba0f5e5f81f89e9bbfc6f4fd3748d35c19e GIT binary patch literal 27102 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 B=X(GE literal 0 HcmV?d00001 diff --git a/app/manifest/_base.json b/app/manifest/_base.json index e4f55da26..bc63ce27d 100644 --- a/app/manifest/_base.json +++ b/app/manifest/_base.json @@ -66,6 +66,7 @@ "clipboardWrite", "http://localhost:8545/", "https://*.infura.io/", + "https://wallet.gridplus.io/*", "activeTab", "webRequest", "*://*.eth/", diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js index 106317bdd..9ac44bee4 100644 --- a/app/scripts/metamask-controller.js +++ b/app/scripts/metamask-controller.js @@ -14,6 +14,7 @@ import { stripHexPrefix } from 'ethereumjs-util'; import log from 'loglevel'; import TrezorKeyring from 'eth-trezor-keyring'; import LedgerBridgeKeyring from '@metamask/eth-ledger-bridge-keyring'; +import LatticeKeyring from 'eth-lattice-keyring'; import EthQuery from 'eth-query'; import nanoid from 'nanoid'; import { @@ -370,7 +371,11 @@ export default class MetamaskController extends EventEmitter { await opts.openPopup(); }); - const additionalKeyrings = [TrezorKeyring, LedgerBridgeKeyring]; + const additionalKeyrings = [ + TrezorKeyring, + LedgerBridgeKeyring, + LatticeKeyring, + ]; this.keyringController = new KeyringController({ keyringTypes: additionalKeyrings, initState: initState.KeyringController, @@ -1445,6 +1450,7 @@ export default class MetamaskController extends EventEmitter { .map((address) => toChecksumHexAddress(address)), ledger: [], trezor: [], + lattice: [], }; // transactions @@ -1545,6 +1551,9 @@ export default class MetamaskController extends EventEmitter { case 'ledger': keyringName = LedgerBridgeKeyring.type; break; + case 'lattice': + keyringName = LatticeKeyring.type; + break; default: throw new Error( 'MetamaskController:getKeyringForDevice - Unknown device', @@ -1559,7 +1568,9 @@ export default class MetamaskController extends EventEmitter { if (hdPath && keyring.setHdPath) { keyring.setHdPath(hdPath); } - + if (deviceName === 'lattice') { + keyring.appName = 'MetaMask'; + } keyring.network = this.networkController.getProviderConfig().type; return keyring; @@ -2047,6 +2058,14 @@ export default class MetamaskController extends EventEmitter { }); } + case KEYRING_TYPES.LATTICE: { + return new Promise((_, reject) => { + reject( + new Error('Lattice does not support eth_getEncryptionPublicKey.'), + ); + }); + } + default: { const promise = this.encryptionPublicKeyManager.addUnapprovedMessageAsync( msgParams, diff --git a/development/states/navigate-txs.json b/development/states/navigate-txs.json new file mode 100644 index 000000000..18281fd35 --- /dev/null +++ b/development/states/navigate-txs.json @@ -0,0 +1,320 @@ +{ + "appState": { + "shouldClose": false, + "menuOpen": false, + "modal": { + "open": false, + "modalState": { + "name": null, + "props": {} + }, + "previousModalState": { + "name": null + } + }, + "sidebar": { + "isOpen": false, + "transitionName": "", + "type": "" + }, + "alertOpen": false, + "alertMessage": null, + "qrCodeData": null, + "networkDropdownOpen": false, + "currentView": { + "name": "confTx", + "context": 0 + }, + "accountDetail": { + "subview": "transactions" + }, + "transForward": false, + "isLoading": false, + "warning": null, + "buyView": {}, + "isMouseUser": true, + "gasIsLoading": false, + "networkNonce": "0x92", + "defaultHdPaths": { + "trezor": "m/44'/60'/0'/0", + "ledger": "m/44'/60'/0'/0/0", + "lattice": "m/44'/60'/0'/0" + } + }, + "confirmTransaction": { + "txData": { + "estimatedGas": "0x38f53", + "gasLimitSpecified": true, + "gasPriceSpecified": false, + "history": [], + "id": 2389644572638774, + "loadingDefaults": false, + "metamaskNetworkId": "4", + "origin": "remix.ethereum.org", + "status": "unapproved", + "time": 1538844223352, + "txParams": { + "data": "0x608060405234801561001057600080fd5b506102a7806100206000396000f30060806040526004361061004b5763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663d13319c48114610050578063dfb29935146100da575b600080fd5b34801561005c57600080fd5b50610065610135565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561009f578181015183820152602001610087565b50505050905090810190601f1680156100cc5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156100e657600080fd5b506040805160206004803580820135601f81018490048402850184019095528484526101339436949293602493928401919081908401838280828437509497506101cc9650505050505050565b005b60008054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156101c15780601f10610196576101008083540402835291602001916101c1565b820191906000526020600020905b8154815290600101906020018083116101a457829003601f168201915b505050505090505b90565b80516101df9060009060208401906101e3565b5050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061022457805160ff1916838001178555610251565b82800160010185558215610251579182015b82811115610251578251825591602001919060010190610236565b5061025d929150610261565b5090565b6101c991905b8082111561025d57600081556001016102675600a165627a7a72305820cf4282c534b8f2faad947d592afa109b907e4e6b2f52335b361b69c24fedb9580029", + "from": "0xe2f12a09ba1098312a7d1cad7581ed253ca5f4b2", + "gas": "0x38f53", + "gasPrice": "0x3b9aca00", + "value": "0x0" + }, + "type": "standard" + }, + "tokenData": {}, + "methodData": {}, + "tokenProps": { + "tokenDecimals": "", + "tokenSymbol": "" + }, + "fiatTransactionAmount": "0", + "fiatTransactionFee": "0.05", + "fiatTransactionTotal": "0.05", + "ethTransactionAmount": "0", + "ethTransactionFee": "0.000233", + "ethTransactionTotal": "0.000233", + "hexGasTotal": "0xd42f28057e00", + "nonce": "", + "toSmartContract": false, + "fetchingData": false + }, + "localeMessages": {}, + "metamask": { + "isInitialized": true, + "isUnlocked": true, + "isAccountMenuOpen": false, + "isPopup": false, + "rpcTarget": "https://rawtestrpc.metamask.io/", + "identities": { + "0x8cf82b5aa41ff2282427be151dd328568684007a": { + "address": "0x8cf82b5aa41ff2282427be151dd328568684007a", + "name": "Account 3" + }, + "0xbe1a00e10ec68b154adb84e8119167146a71c9a2": { + "address": "0xbe1a00e10ec68b154adb84e8119167146a71c9a2", + "name": "Account 2" + }, + "0xe2f12a09ba1098312a7d1cad7581ed253ca5f4b2": { + "address": "0xe2f12a09ba1098312a7d1cad7581ed253ca5f4b2", + "name": "Account 1" + } + }, + "unapprovedTxs": { + "2389644572638771": { + "estimatedGas": "0x8544", + "gasLimitSpecified": true, + "gasPriceSpecified": true, + "history": [], + "id": 2389644572638771, + "loadingDefaults": false, + "metamaskNetworkId": "4", + "origin": "MetaMask", + "status": "unapproved", + "time": 1538844175144, + "txParams": { + "data": "0xa9059cbb000000000000000000000000be1a00e10ec68b154adb84e8119167146a71c9a20000000000000000000000000000000000000000000000000000000000000000", + "from": "0xe2f12a09ba1098312a7d1cad7581ed253ca5f4b2", + "gas": "0x8544", + "gasPrice": "0x3b9aca00", + "to": "0xe0b7927c4af23765cb51314a0e0521a9645f0e2a", + "value": "0x0" + }, + "type": "standard" + }, + "2389644572638772": { + "estimatedGas": "0x5208", + "gasLimitSpecified": true, + "gasPriceSpecified": true, + "history": [], + "id": 2389644572638772, + "loadingDefaults": false, + "metamaskNetworkId": "4", + "origin": "MetaMask", + "status": "unapproved", + "time": 1538844178492, + "txParams": { + "from": "0xe2f12a09ba1098312a7d1cad7581ed253ca5f4b2", + "gas": "0x5208", + "gasPrice": "0x3b9aca00", + "to": "0xbe1a00e10ec68b154adb84e8119167146a71c9a2", + "value": "0x0" + }, + "type": "standard" + }, + "2389644572638773": { + "estimatedGas": { + "length": 1, + "negative": 0, + "red": null, + "words": [34061, null] + }, + "gasLimitSpecified": false, + "gasPriceSpecified": true, + "history": [], + "id": 2389644572638773, + "loadingDefaults": false, + "metamaskNetworkId": "4", + "origin": "localhost", + "status": "unapproved", + "time": 1538844204724, + "txParams": { + "data": "0xdfb29935000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000155468697320697320746865206970667320686173680000000000000000000000", + "from": "0xe2f12a09ba1098312a7d1cad7581ed253ca5f4b2", + "gas": "0xc793", + "gasPrice": "0x3b9aca00", + "to": "0xb7ec370c889b3b48ec537e0b2c887faedceb254a", + "value": "0x0" + }, + "type": "standard" + }, + "2389644572638774": { + "estimatedGas": "0x38f53", + "gasLimitSpecified": true, + "gasPriceSpecified": false, + "history": [], + "id": 2389644572638774, + "loadingDefaults": false, + "metamaskNetworkId": "4", + "origin": "remix.ethereum.org", + "status": "unapproved", + "time": 1538844223352, + "txParams": { + "data": "0x608060405234801561001057600080fd5b506102a7806100206000396000f30060806040526004361061004b5763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663d13319c48114610050578063dfb29935146100da575b600080fd5b34801561005c57600080fd5b50610065610135565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561009f578181015183820152602001610087565b50505050905090810190601f1680156100cc5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156100e657600080fd5b506040805160206004803580820135601f81018490048402850184019095528484526101339436949293602493928401919081908401838280828437509497506101cc9650505050505050565b005b60008054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156101c15780601f10610196576101008083540402835291602001916101c1565b820191906000526020600020905b8154815290600101906020018083116101a457829003601f168201915b505050505090505b90565b80516101df9060009060208401906101e3565b5050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061022457805160ff1916838001178555610251565b82800160010185558215610251579182015b82811115610251578251825591602001919060010190610236565b5061025d929150610261565b5090565b6101c991905b8082111561025d57600081556001016102675600a165627a7a72305820cf4282c534b8f2faad947d592afa109b907e4e6b2f52335b361b69c24fedb9580029", + "from": "0xe2f12a09ba1098312a7d1cad7581ed253ca5f4b2", + "gas": "0x38f53", + "gasPrice": "0x3b9aca00", + "value": "0x0" + }, + "type": "standard" + } + }, + "noActiveNotices": true, + "frequentRpcList": [], + "addressBook": [], + "selectedTokenAddress": null, + "contractExchangeRates": {}, + "tokenExchangeRates": {}, + "tokens": [ + { + "address": "0xe0b7927c4af23765cb51314a0e0521a9645f0e2a", + "decimals": 9, + "symbol": "DGD" + } + ], + "pendingTokens": {}, + "send": { + "gasLimit": null, + "gasPrice": null, + "gasTotal": null, + "tokenBalance": null, + "from": "", + "to": "", + "amount": "0x0", + "memo": "", + "errors": {}, + "editingTransactionId": null, + "forceGasMin": null + }, + "coinOptions": {}, + "useBlockie": false, + "featureFlags": { + "betaUI": true, + "skipAnnounceBetaUI": true + }, + "isRevealingSeedWords": false, + "welcomeScreenSeen": false, + "currentLocale": "en", + "preferences": { + "useETHAsPrimaryCurrency": true + }, + "provider": { + "type": "rinkeby" + }, + "network": "4", + "accounts": { + "0xe2f12a09ba1098312a7d1cad7581ed253ca5f4b2": { + "address": "0xe2f12a09ba1098312a7d1cad7581ed253ca5f4b2", + "balance": "0x36aabfb2a0190c00" + }, + "0xbe1a00e10ec68b154adb84e8119167146a71c9a2": { + "address": "0xbe1a00e10ec68b154adb84e8119167146a71c9a2", + "balance": "0x7b3ef08c294a000" + }, + "0x8cf82b5aa41ff2282427be151dd328568684007a": { + "address": "0x8cf82b5aa41ff2282427be151dd328568684007a", + "balance": "0x0" + } + }, + "currentBlockGasLimit": "0x731e25", + "selectedAddressTxList": [], + "unapprovedMsgs": {}, + "unapprovedMsgCount": 0, + "unapprovedPersonalMsgs": {}, + "unapprovedPersonalMsgCount": 0, + "unapprovedTypedMessages": {}, + "unapprovedTypedMessagesCount": 0, + "keyringTypes": [ + "Simple Key Pair", + "HD Key Tree", + "Trezor Hardware", + "Ledger Hardware", + "Lattice Hardware" + ], + "keyrings": [ + { + "type": "HD Key Tree", + "accounts": [ + "0xe2f12a09ba1098312a7d1cad7581ed253ca5f4b2", + "0xbe1a00e10ec68b154adb84e8119167146a71c9a2", + "0x8cf82b5aa41ff2282427be151dd328568684007a" + ] + } + ], + "currentAccountTab": "history", + "accountTokens": { + "0x8cf82b5aa41ff2282427be151dd328568684007a": {}, + "0xbe1a00e10ec68b154adb84e8119167146a71c9a2": {}, + "0xe2f12a09ba1098312a7d1cad7581ed253ca5f4b2": { + "rinkeby": [ + { + "address": "0xe0b7927c4af23765cb51314a0e0521a9645f0e2a", + "decimals": 9, + "symbol": "DGD" + }, + { + "address": "0x89d24a6b4ccb1b6faa2625fe562bdd9a23260359", + "decimals": 18, + "symbol": "DAI" + } + ] + } + }, + "assetImages": { + "0x89d24a6b4ccb1b6faa2625fe562bdd9a23260359": null, + "0xe0b7927c4af23765cb51314a0e0521a9645f0e2a": null + }, + "suggestedTokens": {}, + "lostIdentities": {}, + "seedWords": null, + "forgottenPassword": false, + "selectedAddress": "0xe2f12a09ba1098312a7d1cad7581ed253ca5f4b2", + "recentBlocks": [], + "currentCurrency": "usd", + "conversionRate": 225.23, + "conversionDate": 1538859376, + "shapeShiftTxList": [], + "infuraNetworkStatus": { + "kovan": "ok", + "mainnet": "ok", + "rinkeby": "ok", + "ropsten": "ok", + "goerli": "ok" + } + }, + "send": { + "toDropdownOpen": false, + "errors": {}, + "warnings": {} + } +} diff --git a/package.json b/package.json index 557c2c0c4..b84c39af4 100644 --- a/package.json +++ b/package.json @@ -137,6 +137,7 @@ "eth-json-rpc-middleware": "^6.0.0", "eth-keyring-controller": "^6.2.0", "eth-method-registry": "^2.0.0", + "eth-lattice-keyring": "^0.3.0", "eth-query": "^2.1.2", "eth-rpc-errors": "^4.0.2", "eth-sig-util": "^3.0.0", @@ -347,6 +348,7 @@ }, "lavamoat": { "allowScripts": { + "gridplus-sdk": false, "chromedriver": true, "geckodriver": true, "@sentry/cli": true, diff --git a/shared/constants/hardware-wallets.js b/shared/constants/hardware-wallets.js index 705754fe7..f32306472 100644 --- a/shared/constants/hardware-wallets.js +++ b/shared/constants/hardware-wallets.js @@ -6,6 +6,7 @@ export const KEYRING_TYPES = { LEDGER: 'Ledger Hardware', TREZOR: 'Trezor Hardware', + LATTICE: 'Lattice Hardware', }; /** diff --git a/ui/components/app/account-menu/account-menu.component.js b/ui/components/app/account-menu/account-menu.component.js index 19188fbc2..f72077777 100644 --- a/ui/components/app/account-menu/account-menu.component.js +++ b/ui/components/app/account-menu/account-menu.component.js @@ -238,6 +238,7 @@ export default class AccountMenu extends Component { switch (type) { case KEYRING_TYPES.TREZOR: case KEYRING_TYPES.LEDGER: + case KEYRING_TYPES.LATTICE: label = t('hardware'); break; case 'Simple Key Pair': diff --git a/ui/ducks/app/app.js b/ui/ducks/app/app.js index ab5621299..2baa2f53d 100644 --- a/ui/ducks/app/app.js +++ b/ui/ducks/app/app.js @@ -38,6 +38,7 @@ export default function reduceApp(state = {}, action) { defaultHdPaths: { trezor: `m/44'/60'/0'/0`, ledger: `m/44'/60'/0'/0/0`, + lattice: `m/44'/60'/0'/0`, }, networksTabSelectedRpcUrl: '', loadingMethodData: false, diff --git a/ui/ducks/app/app.test.js b/ui/ducks/app/app.test.js index e88ac1b9b..c71a539e0 100644 --- a/ui/ducks/app/app.test.js +++ b/ui/ducks/app/app.test.js @@ -255,6 +255,7 @@ describe('App State', () => { const hdPaths = { trezor: "m/44'/60'/0'/0", ledger: "m/44'/60'/0'", + lattice: "m/44'/60'/0'/0", }; const state = reduceApp(metamaskState, { type: actions.SET_HARDWARE_WALLET_DEFAULT_HD_PATH, diff --git a/ui/pages/create-account/connect-hardware/account-list.js b/ui/pages/create-account/connect-hardware/account-list.js index f0b8d14d9..caf7ff580 100644 --- a/ui/pages/create-account/connect-hardware/account-list.js +++ b/ui/pages/create-account/connect-hardware/account-list.js @@ -5,13 +5,11 @@ import { getAccountLink } from '@metamask/etherscan-link'; import Button from '../../../components/ui/button'; import Checkbox from '../../../components/ui/check-box'; import Dropdown from '../../../components/ui/dropdown'; -import Popover from '../../../components/ui/popover'; import { getURLHostName } from '../../../helpers/utils/util'; class AccountList extends Component { state = { - showPopover: false, pathValue: null, }; @@ -33,7 +31,7 @@ class AccountList extends Component { } renderHdPathSelector() { - const { selectedPath, hdPaths } = this.props; + const { device, selectedPath, hdPaths, onPathChange } = this.props; const { pathValue } = this.state; return ( @@ -45,10 +43,11 @@ class AccountList extends Component {
{ this.setPath(value); + onPathChange(value); }} />
@@ -61,26 +60,18 @@ class AccountList extends Component { } renderHeader() { + const { device } = this.props; + const shouldShowHDPaths = + device.toLowerCase() === 'ledger' || device.toLowerCase() === 'lattice'; return (

{this.context.t('selectAnAccount')}

+ {shouldShowHDPaths ? this.renderHdPathSelector() : null}

{this.context.t('selectAnAccount')}

-

- {this.context.t('selectAnAccountHelp')} - {this.context.t('selectAnAccountHelpDirections', [ - , - ])} -

); } @@ -228,44 +219,7 @@ class AccountList extends Component { ); } - renderSelectPathPopover() { - const { pathValue } = this.state; - const { onPathChange } = this.props; - - const footer = ( -
- - -
- ); - - return ( - - {this.renderHdPathSelector()} - - ); - } - render() { - const { showPopover } = this.state; return (
{this.renderHeader()} @@ -273,7 +227,6 @@ class AccountList extends Component { {this.renderPagination()} {this.renderButtons()} {this.renderForgetDevice()} - {showPopover ? this.renderSelectPathPopover() : null}
); } diff --git a/ui/pages/create-account/connect-hardware/index.js b/ui/pages/create-account/connect-hardware/index.js index 66082de07..6b6c3bab5 100644 --- a/ui/pages/create-account/connect-hardware/index.js +++ b/ui/pages/create-account/connect-hardware/index.js @@ -20,12 +20,32 @@ const U2F_ERROR = 'U2F'; const LEDGER_LIVE_PATH = `m/44'/60'/0'/0/0`; const MEW_PATH = `m/44'/60'/0'`; const BIP44_PATH = `m/44'/60'/0'/0`; -const HD_PATHS = [ +const LEDGER_HD_PATHS = [ { name: 'Ledger Live', value: LEDGER_LIVE_PATH }, { name: 'Legacy (MEW / MyCrypto)', value: MEW_PATH }, { name: `BIP44 Standard (e.g. MetaMask, Trezor)`, value: BIP44_PATH }, ]; +const LATTICE_STANDARD_BIP44_PATH = `m/44'/60'/0'/0/x`; +const LATTICE_LEDGER_LIVE_PATH = `m/44'/60'/x'/0/0`; +const LATTICE_MEW_PATH = `m/44'/60'/0'/x`; +const LATTICE_HD_PATHS = [ + { + name: `Standard (${LATTICE_STANDARD_BIP44_PATH})`, + value: LATTICE_STANDARD_BIP44_PATH, + }, + { + name: `Ledger Live (${LATTICE_LEDGER_LIVE_PATH})`, + value: LATTICE_LEDGER_LIVE_PATH, + }, + { name: `Ledger Legacy (${LATTICE_MEW_PATH})`, value: LATTICE_MEW_PATH }, +]; + +const HD_PATHS = { + ledger: LEDGER_HD_PATHS, + lattice: LATTICE_HD_PATHS, +}; + class ConnectHardwareForm extends Component { static contextTypes = { t: PropTypes.func, @@ -56,7 +76,7 @@ class ConnectHardwareForm extends Component { } async checkIfUnlocked() { - for (const device of ['trezor', 'ledger']) { + for (const device of ['trezor', 'ledger', 'lattice']) { const path = this.props.defaultHdPaths[device]; const unlocked = await this.props.checkHardwareStatus(device, path); if (unlocked) { diff --git a/ui/pages/create-account/connect-hardware/select-hardware.js b/ui/pages/create-account/connect-hardware/select-hardware.js index 6b711b176..3f7e6cbe8 100644 --- a/ui/pages/create-account/connect-hardware/select-hardware.js +++ b/ui/pages/create-account/connect-hardware/select-hardware.js @@ -43,6 +43,23 @@ export default class SelectHardware extends Component { ); } + renderConnectToLatticeButton() { + return ( + + ); + } + renderConnectToLedgerButton() { return (