From c462fb89958593cff2f2748ebbcab12774aa8e43 Mon Sep 17 00:00:00 2001 From: Prithpal Sooriya Date: Tue, 17 Sep 2024 20:17:38 +0100 Subject: [PATCH 01/61] feat: upgrade notification controllers (#27224) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## **Description** Bumps: - `@metamask/profile-sync-controller` from `^0.7.0` to `^0.8.0` - `@metamask/notification-services-controller` from `^0.6.0` to `^0.7.0` This fixes a critical issue where we were not using the same UserStorage hashed entry. See release library changelog https://github.com/MetaMask/core/blob/main/packages/profile-sync-controller/CHANGELOG.md#fixed [![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/27224?quickstart=1) ## **Related issues** Fixes: https://consensyssoftware.atlassian.net/browse/NOTIFY-1118 ## **Manual testing steps** Test notifications flow: - Enable/Disable Notifications ## **Screenshots/Recordings** ### **Before** ### **After** ## **Pre-merge author checklist** - [x] I've followed [MetaMask Contributor Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Extension Coding Standards](https://github.com/MetaMask/metamask-extension/blob/develop/.github/guidelines/CODING_GUIDELINES.md). - [x] I've completed the PR template to the best of my ability - [x] I’ve included tests if applicable - [x] I’ve documented my code using [JSDoc](https://jsdoc.app/) format if applicable - [x] I’ve applied the right labels on the PR (see [labeling guidelines](https://github.com/MetaMask/metamask-extension/blob/develop/.github/guidelines/LABELING_GUIDELINES.md)). Not required for external contributors. ## **Pre-merge reviewer checklist** - [ ] I've manually tested the PR (e.g. pull and build branch, run the app, test code being changed). - [ ] I confirm that this PR addresses all acceptance criteria described in the ticket it closes and includes the necessary testing evidence such as recordings and or screenshots. --- package.json | 4 ++-- yarn.lock | 54 ++++++++++++++++++++++++++-------------------------- 2 files changed, 29 insertions(+), 29 deletions(-) diff --git a/package.json b/package.json index b3b5b22f7e86..70195f5ae650 100644 --- a/package.json +++ b/package.json @@ -336,7 +336,7 @@ "@metamask/name-controller": "^8.0.0", "@metamask/network-controller": "patch:@metamask/network-controller@npm%3A20.2.0#~/.yarn/patches/@metamask-network-controller-npm-20.2.0-98b1a5ae59.patch", "@metamask/notification-controller": "^6.0.0", - "@metamask/notification-services-controller": "^0.5.0", + "@metamask/notification-services-controller": "^0.7.0", "@metamask/object-multiplex": "^2.0.0", "@metamask/obs-store": "^9.0.0", "@metamask/permission-controller": "^10.0.0", @@ -344,7 +344,7 @@ "@metamask/phishing-controller": "^12.0.1", "@metamask/post-message-stream": "^8.0.0", "@metamask/ppom-validator": "0.34.0", - "@metamask/profile-sync-controller": "^0.5.0", + "@metamask/profile-sync-controller": "^0.8.0", "@metamask/providers": "^14.0.2", "@metamask/queued-request-controller": "^2.0.0", "@metamask/rate-limit-controller": "^6.0.0", diff --git a/yarn.lock b/yarn.lock index e6bf174ada48..2149a6bd2404 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5784,21 +5784,21 @@ __metadata: languageName: node linkType: hard -"@metamask/notification-services-controller@npm:^0.5.0": - version: 0.5.0 - resolution: "@metamask/notification-services-controller@npm:0.5.0" +"@metamask/notification-services-controller@npm:^0.7.0": + version: 0.7.0 + resolution: "@metamask/notification-services-controller@npm:0.7.0" dependencies: "@contentful/rich-text-html-renderer": "npm:^16.5.2" - "@metamask/base-controller": "npm:^7.0.0" - "@metamask/controller-utils": "npm:^11.2.0" + "@metamask/base-controller": "npm:^7.0.1" + "@metamask/controller-utils": "npm:^11.3.0" bignumber.js: "npm:^4.1.0" firebase: "npm:^10.11.0" loglevel: "npm:^1.8.1" uuid: "npm:^8.3.2" peerDependencies: "@metamask/keyring-controller": ^17.0.0 - "@metamask/profile-sync-controller": ^0.5.0 - checksum: 10/e945cbf0b7138d22f1078844575dc89c990ddc6669724d1ce0db5ad43c74a86da1c5e1ab12614afbcc5c49125b09365689de2a2c9548af426932f4c1397a66bd + "@metamask/profile-sync-controller": ^0.0.0 + checksum: 10/1fc72086686aeef4c72d9eb7726d086a147a4079c178a6de23269fa39a3d861c54fe6dfe79bd9b5c8bf9afa278371408092bd37f3e8f814e65c7aca3573655f5 languageName: node linkType: hard @@ -6010,13 +6010,13 @@ __metadata: languageName: node linkType: hard -"@metamask/profile-sync-controller@npm:^0.5.0": - version: 0.5.0 - resolution: "@metamask/profile-sync-controller@npm:0.5.0" +"@metamask/profile-sync-controller@npm:^0.8.0": + version: 0.8.0 + resolution: "@metamask/profile-sync-controller@npm:0.8.0" dependencies: - "@metamask/base-controller": "npm:^7.0.0" - "@metamask/snaps-sdk": "npm:^6.1.1" - "@metamask/snaps-utils": "npm:^7.8.1" + "@metamask/base-controller": "npm:^7.0.1" + "@metamask/snaps-sdk": "npm:^6.5.0" + "@metamask/snaps-utils": "npm:^8.1.1" "@noble/ciphers": "npm:^0.5.2" "@noble/hashes": "npm:^1.4.0" immer: "npm:^9.0.6" @@ -6025,8 +6025,8 @@ __metadata: peerDependencies: "@metamask/accounts-controller": ^18.1.1 "@metamask/keyring-controller": ^17.2.0 - "@metamask/snaps-controllers": ^9.3.0 - checksum: 10/96a31ca2692af85100bd690aa290d6c954378aa14be0dd507afda46c37d761c5e398da4e93ed0f6f7f97267a82def7f4b12b45805cd7673381a6404f810511ff + "@metamask/snaps-controllers": ^9.7.0 + checksum: 10/613e2e87615f1db4a1a4559895a74c2b89c15720e831440eec0916aa96305f3db9b3e0926ac4a5d7532c462baaa18a117e2b9aa107949777163488c203cfea05 languageName: node linkType: hard @@ -6389,9 +6389,9 @@ __metadata: languageName: node linkType: hard -"@metamask/snaps-utils@npm:^8.0.0, @metamask/snaps-utils@npm:^8.0.1": - version: 8.0.1 - resolution: "@metamask/snaps-utils@npm:8.0.1" +"@metamask/snaps-utils@npm:^8.0.0, @metamask/snaps-utils@npm:^8.0.1, @metamask/snaps-utils@npm:^8.1.1": + version: 8.1.1 + resolution: "@metamask/snaps-utils@npm:8.1.1" dependencies: "@babel/core": "npm:^7.23.2" "@babel/types": "npm:^7.23.0" @@ -6401,9 +6401,9 @@ __metadata: "@metamask/rpc-errors": "npm:^6.3.1" "@metamask/slip44": "npm:^4.0.0" "@metamask/snaps-registry": "npm:^3.2.1" - "@metamask/snaps-sdk": "npm:^6.2.1" + "@metamask/snaps-sdk": "npm:^6.5.0" "@metamask/superstruct": "npm:^3.1.0" - "@metamask/utils": "npm:^9.1.0" + "@metamask/utils": "npm:^9.2.1" "@noble/hashes": "npm:^1.3.1" "@scure/base": "npm:^1.1.1" chalk: "npm:^4.1.2" @@ -6416,7 +6416,7 @@ __metadata: semver: "npm:^7.5.4" ses: "npm:^1.1.0" validate-npm-package-name: "npm:^5.0.0" - checksum: 10/4c0d58ad04f1e4c625dd01aaf171de0f538afc2003ac928159deee5ebed6d490ccd50575ad585b4f6846aa8d00bccd8f1ea4b32f124e6427873fb985cae8513f + checksum: 10/f4ceb52a1f9578993c88c82a67f4f041309af51c83ff5caa3fed080f36b54d14ea7da807ce1cf19a13600dd0e77c51af70398e8c7bb78f0ba99a037f4d22610f languageName: node linkType: hard @@ -6581,9 +6581,9 @@ __metadata: languageName: node linkType: hard -"@metamask/utils@npm:^9.0.0, @metamask/utils@npm:^9.1.0": - version: 9.1.0 - resolution: "@metamask/utils@npm:9.1.0" +"@metamask/utils@npm:^9.0.0, @metamask/utils@npm:^9.1.0, @metamask/utils@npm:^9.2.1": + version: 9.2.1 + resolution: "@metamask/utils@npm:9.2.1" dependencies: "@ethereumjs/tx": "npm:^4.2.0" "@metamask/superstruct": "npm:^3.1.0" @@ -6594,7 +6594,7 @@ __metadata: pony-cause: "npm:^2.1.10" semver: "npm:^7.5.4" uuid: "npm:^9.0.1" - checksum: 10/7335e151a51be92e86868dc48b3ee78c376d4edd5d758d334176027247637ab22839d8f663bd02542c0a19b05ecec456bedab5f36436689cf3d953ca36d91781 + checksum: 10/2192797afd91af19898e107afeaf63e89b61dc7285e0a75d0cc814b5b288e4cdfc856781b01904034c4d2c1efd9bdab512af24c7e4dfe7b77a03f1f3d9dec7e8 languageName: node linkType: hard @@ -26036,7 +26036,7 @@ __metadata: "@metamask/name-controller": "npm:^8.0.0" "@metamask/network-controller": "patch:@metamask/network-controller@npm%3A20.2.0#~/.yarn/patches/@metamask-network-controller-npm-20.2.0-98b1a5ae59.patch" "@metamask/notification-controller": "npm:^6.0.0" - "@metamask/notification-services-controller": "npm:^0.5.0" + "@metamask/notification-services-controller": "npm:^0.7.0" "@metamask/object-multiplex": "npm:^2.0.0" "@metamask/obs-store": "npm:^9.0.0" "@metamask/permission-controller": "npm:^10.0.0" @@ -26045,7 +26045,7 @@ __metadata: "@metamask/phishing-warning": "npm:^4.0.0" "@metamask/post-message-stream": "npm:^8.0.0" "@metamask/ppom-validator": "npm:0.34.0" - "@metamask/profile-sync-controller": "npm:^0.5.0" + "@metamask/profile-sync-controller": "npm:^0.8.0" "@metamask/providers": "npm:^14.0.2" "@metamask/queued-request-controller": "npm:^2.0.0" "@metamask/rate-limit-controller": "npm:^6.0.0" From bc7929b1c96f09e5ae3c3b76d4ef2c649b0dd78a Mon Sep 17 00:00:00 2001 From: Nick Gambino <35090461+gambinish@users.noreply.github.com> Date: Tue, 17 Sep 2024 15:09:17 -0700 Subject: [PATCH 02/61] chore: Add currency conversion telemetry (#26876) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## **Description** In order to figure out which currencies we should support 24hr % change, we need to know which currencies are the most popular. Adds currency change dropdown event to telemetry events. [![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/26876?quickstart=1) ## **Related issues** Fixes: https://consensyssoftware.atlassian.net/browse/MMASSETS-344 ## **Screenshots/Recordings** ## **Pre-merge author checklist** - [x] I've followed [MetaMask Contributor Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Extension Coding Standards](https://github.com/MetaMask/metamask-extension/blob/develop/.github/guidelines/CODING_GUIDELINES.md). - [x] I've completed the PR template to the best of my ability - [x] I’ve included tests if applicable - [x] I’ve documented my code using [JSDoc](https://jsdoc.app/) format if applicable - [x] I’ve applied the right labels on the PR (see [labeling guidelines](https://github.com/MetaMask/metamask-extension/blob/develop/.github/guidelines/LABELING_GUIDELINES.md)). Not required for external contributors. ## **Pre-merge reviewer checklist** - [ ] I've manually tested the PR (e.g. pull and build branch, run the app, test code being changed). - [ ] I confirm that this PR addresses all acceptance criteria described in the ticket it closes and includes the necessary testing evidence such as recordings and or screenshots. --- app/scripts/controllers/metametrics.js | 1 + shared/constants/metametrics.ts | 5 +++++ .../settings/settings-tab/settings-tab.component.js | 11 ++++++++++- 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/app/scripts/controllers/metametrics.js b/app/scripts/controllers/metametrics.js index d815607d27e8..d799249bb71b 100644 --- a/app/scripts/controllers/metametrics.js +++ b/app/scripts/controllers/metametrics.js @@ -837,6 +837,7 @@ export default class MetaMetricsController { metamaskState.useTokenDetection, [MetaMetricsUserTrait.UseNativeCurrencyAsPrimaryCurrency]: metamaskState.useNativeCurrencyAsPrimaryCurrency, + [MetaMetricsUserTrait.CurrentCurrency]: metamaskState.currentCurrency, ///: BEGIN:ONLY_INCLUDE_IF(build-mmi) [MetaMetricsUserTrait.MmiExtensionId]: this.extension?.runtime?.id, [MetaMetricsUserTrait.MmiAccountAddress]: mmiAccountAddress, diff --git a/shared/constants/metametrics.ts b/shared/constants/metametrics.ts index daec305bfb11..0ad1bc9e1deb 100644 --- a/shared/constants/metametrics.ts +++ b/shared/constants/metametrics.ts @@ -468,6 +468,10 @@ export enum MetaMetricsUserTrait { MmiIsCustodian = 'mmi_is_custodian', ///: END:ONLY_INCLUDE_IF PetnameAddressCount = 'petname_addresses_count', + /** + * Identified when the user selects a currency from settings + */ + CurrentCurrency = 'current_currency', } /** @@ -514,6 +518,7 @@ export enum MetaMetricsEventName { BridgeLinkClicked = 'Bridge Link Clicked', BitcoinSupportToggled = 'Bitcoin Support Toggled', BitcoinTestnetSupportToggled = 'Bitcoin Testnet Support Toggled', + CurrentCurrency = 'Current Currency', DappViewed = 'Dapp Viewed', DecryptionApproved = 'Decryption Approved', DecryptionRejected = 'Decryption Rejected', diff --git a/ui/pages/settings/settings-tab/settings-tab.component.js b/ui/pages/settings/settings-tab/settings-tab.component.js index 45407ece008d..d798b62f77ba 100644 --- a/ui/pages/settings/settings-tab/settings-tab.component.js +++ b/ui/pages/settings/settings-tab/settings-tab.component.js @@ -119,7 +119,16 @@ export default class SettingsTab extends PureComponent { id="select-currency" options={currencyOptions} selectedOption={currentCurrency} - onChange={(newCurrency) => setCurrentCurrency(newCurrency)} + onChange={(newCurrency) => { + setCurrentCurrency(newCurrency); + this.context.trackEvent({ + category: MetaMetricsEventCategory.Settings, + event: MetaMetricsEventName.CurrentCurrency, + properties: { + current_currency: newCurrency, + }, + }); + }} /> From eadc7075731ad95662b9a4f07b0cddd0328d9695 Mon Sep 17 00:00:00 2001 From: Matteo Scurati Date: Wed, 18 Sep 2024 08:37:17 +0200 Subject: [PATCH 03/61] fix: :pencil2: fix event property typo (#27228) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## **Description** This PR fixes a typo for a property used by the event emitted by the toggle to turn basic functionality on or off. [![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/27228?quickstart=1) ## **Related issues** N/A ## **Manual testing steps** N/A ## **Screenshots/Recordings** N/A ### **Before** N/A ### **After** N/A ## **Pre-merge author checklist** - [x] I've followed [MetaMask Contributor Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Extension Coding Standards](https://github.com/MetaMask/metamask-extension/blob/develop/.github/guidelines/CODING_GUIDELINES.md). - [x] I've completed the PR template to the best of my ability - [x] I’ve included tests if applicable - [x] I’ve documented my code using [JSDoc](https://jsdoc.app/) format if applicable - [x] I’ve applied the right labels on the PR (see [labeling guidelines](https://github.com/MetaMask/metamask-extension/blob/develop/.github/guidelines/LABELING_GUIDELINES.md)). Not required for external contributors. ## **Pre-merge reviewer checklist** - [x] I've manually tested the PR (e.g. pull and build branch, run the app, test code being changed). - [x] I confirm that this PR addresses all acceptance criteria described in the ticket it closes and includes the necessary testing evidence such as recordings and or screenshots. --- .../basic-configuration-modal/basic-configuration-modal.tsx | 2 +- ui/pages/onboarding-flow/privacy-settings/privacy-settings.js | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/ui/components/app/basic-configuration-modal/basic-configuration-modal.tsx b/ui/components/app/basic-configuration-modal/basic-configuration-modal.tsx index d9699c9ebc8a..a6b083eccc16 100644 --- a/ui/components/app/basic-configuration-modal/basic-configuration-modal.tsx +++ b/ui/components/app/basic-configuration-modal/basic-configuration-modal.tsx @@ -150,7 +150,7 @@ export function BasicConfigurationModal() { category: MetaMetricsEventCategory.Onboarding, event: MetaMetricsEventName.SettingsUpdated, properties: { - settings_group: 'advanced', + settings_group: 'onboarding_advanced_configuration', settings_type: 'basic_functionality', old_value: true, new_value: false, diff --git a/ui/pages/onboarding-flow/privacy-settings/privacy-settings.js b/ui/pages/onboarding-flow/privacy-settings/privacy-settings.js index 3012fe9808f2..9f1bb0dcf8c3 100644 --- a/ui/pages/onboarding-flow/privacy-settings/privacy-settings.js +++ b/ui/pages/onboarding-flow/privacy-settings/privacy-settings.js @@ -277,10 +277,11 @@ export default function PrivacySettings() { category: MetaMetricsEventCategory.Onboarding, event: MetaMetricsEventName.SettingsUpdated, properties: { - settings_group: 'advanced', + settings_group: 'onboarding_advanced_configuration', settings_type: 'basic_functionality', old_value: false, new_value: true, + was_profile_syncing_on: false, }, }); } From 8d3e6ad21258bd98fe72fe0b78972352f7b1cc41 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Tavares?= Date: Wed, 18 Sep 2024 10:48:43 +0100 Subject: [PATCH 04/61] fix: UI transaction integration tests (#27130) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## **Description** * Fixes warnings to redesigned transactions existing UI integration tests. * Adds new UI integration tests to erc20 approve confirmation. ** Some of those tests required interaction with tooltips, so added a way to automatically include a tooltip data-testid whenever the Confirm row has a data-testid set (in case there is a tooltip obviously). [![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/27130?quickstart=1) ## **Related issues** Fixes: None ## **Screenshots/Recordings** No visual changes. This is PR mainly adds/updates tests. ## **Pre-merge author checklist** - [x] I've followed [MetaMask Contributor Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Extension Coding Standards](https://github.com/MetaMask/metamask-extension/blob/develop/.github/guidelines/CODING_GUIDELINES.md). - [x] I've completed the PR template to the best of my ability - [x] I’ve included tests if applicable - [x] I’ve documented my code using [JSDoc](https://jsdoc.app/) format if applicable - [x] I’ve applied the right labels on the PR (see [labeling guidelines](https://github.com/MetaMask/metamask-extension/blob/develop/.github/guidelines/LABELING_GUIDELINES.md)). Not required for external contributors. ## **Pre-merge reviewer checklist** - [ ] I've manually tested the PR (e.g. pull and build branch, run the app, test code being changed). - [ ] I confirm that this PR addresses all acceptance criteria described in the ticket it closes and includes the necessary testing evidence such as recordings and or screenshots. --- shared/lib/four-byte.ts | 1 - .../confirmations/signatures/permit.test.tsx | 4 +- .../signatures/personalSign.test.tsx | 4 +- .../transactions/alerts.test.tsx | 148 +++++---- .../contract-interaction.test.tsx | 125 +++++--- .../transactions/erc20-approve.test.tsx | 300 +++++++++++++++--- .../transactions/erc721-approve.test.tsx | 63 ++-- .../transactions/transactionDataHelpers.tsx | 2 +- .../data/integration-init-state.json | 94 +++--- test/integration/helpers.tsx | 4 +- ui/components/app/confirm/info/row/row.tsx | 3 + .../__snapshots__/approve.test.tsx.snap | 12 + .../approve-details.test.tsx.snap | 1 + .../approve-details/approve-details.tsx | 8 +- .../__snapshots__/spending-cap.test.tsx.snap | 3 + .../approve/spending-cap/spending-cap.tsx | 3 +- .../base-transaction-info.test.tsx.snap | 9 + .../edit-gas-fees-row.test.tsx.snap | 1 + .../gas-fees-details.test.tsx.snap | 1 + .../gas-fees-section.test.tsx.snap | 1 + .../transaction-data.test.tsx.snap | 38 +++ .../transaction-details.test.tsx.snap | 2 + 22 files changed, 596 insertions(+), 231 deletions(-) diff --git a/shared/lib/four-byte.ts b/shared/lib/four-byte.ts index 167dfc563b73..c8d67af7b1f4 100644 --- a/shared/lib/four-byte.ts +++ b/shared/lib/four-byte.ts @@ -57,7 +57,6 @@ export async function getMethodDataAsync( console.error(e); return null; }); - console.log('fourByteSig = ', fourByteSig); } if (!registry) { diff --git a/test/integration/confirmations/signatures/permit.test.tsx b/test/integration/confirmations/signatures/permit.test.tsx index 3670b654502d..809ac988962f 100644 --- a/test/integration/confirmations/signatures/permit.test.tsx +++ b/test/integration/confirmations/signatures/permit.test.tsx @@ -105,7 +105,7 @@ describe('Permit Confirmation', () => { accountName, ); expect(screen.getByTestId('header-network-display-name')).toHaveTextContent( - 'Chain 5', + 'Sepolia', ); fireEvent.click(screen.getByTestId('header-info__account-details-button')); @@ -120,7 +120,7 @@ describe('Permit Confirmation', () => { ); expect( screen.getByTestId('confirmation-account-details-modal__account-balance'), - ).toHaveTextContent('1.58271596ETH'); + ).toHaveTextContent('1.582717SepoliaETH'); let confirmAccountDetailsModalMetricsEvent; diff --git a/test/integration/confirmations/signatures/personalSign.test.tsx b/test/integration/confirmations/signatures/personalSign.test.tsx index 528655924dbe..9737a3e30ad9 100644 --- a/test/integration/confirmations/signatures/personalSign.test.tsx +++ b/test/integration/confirmations/signatures/personalSign.test.tsx @@ -87,7 +87,7 @@ describe('PersonalSign Confirmation', () => { expect(getByTestId('header-account-name')).toHaveTextContent(accountName); expect(getByTestId('header-network-display-name')).toHaveTextContent( - 'Chain 5', + 'Sepolia', ); fireEvent.click(getByTestId('header-info__account-details-button')); @@ -106,7 +106,7 @@ describe('PersonalSign Confirmation', () => { ); expect( getByTestId('confirmation-account-details-modal__account-balance'), - ).toHaveTextContent('1.58271596ETH'); + ).toHaveTextContent('1.582717SepoliaETH'); let confirmAccountDetailsModalMetricsEvent; diff --git a/test/integration/confirmations/transactions/alerts.test.tsx b/test/integration/confirmations/transactions/alerts.test.tsx index 1e07ddcdd68d..74d37c858b0f 100644 --- a/test/integration/confirmations/transactions/alerts.test.tsx +++ b/test/integration/confirmations/transactions/alerts.test.tsx @@ -6,6 +6,7 @@ import mockMetaMaskState from '../../data/integration-init-state.json'; import { integrationTestRender } from '../../../lib/render-helpers'; import * as backgroundConnection from '../../../../ui/store/background-connection'; import { createMockImplementation, mock4byte } from '../../helpers'; +import { createTestProviderTools } from '../../../stub/provider'; import { getUnapprovedApproveTransaction } from './transactionDataHelpers'; jest.mock('../../../../ui/store/background-connection', () => ({ @@ -75,7 +76,17 @@ const setupSubmitRequestToBackgroundMocks = ( ); }; -describe('Contract Interaction Confirmation', () => { +describe('Contract Interaction Confirmation Alerts', () => { + beforeAll(() => { + const { provider } = createTestProviderTools({ + networkId: 'sepolia', + chainId: '0xaa36a7', + }); + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + global.ethereumProvider = provider as any; + }); + beforeEach(() => { jest.resetAllMocks(); setupSubmitRequestToBackgroundMocks(); @@ -87,6 +98,11 @@ describe('Contract Interaction Confirmation', () => { nock.cleanAll(); }); + afterAll(() => { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + delete (global as any).ethereumProvider; + }); + it('displays the alert when network is busy', async () => { const account = mockMetaMaskState.internalAccounts.accounts[ @@ -97,12 +113,12 @@ describe('Contract Interaction Confirmation', () => { const mockedMetaMaskState = getMetaMaskStateWithUnapprovedApproveTransaction(account.address); - const { findByTestId, getByTestId, queryByTestId } = + await act(async () => { await integrationTestRender({ preloadedState: { ...mockedMetaMaskState, gasFeeEstimatesByChainId: { - '0x5': { + '0xaa36a7': { gasFeeEstimates: { networkCongestion: 1.0005, }, @@ -111,29 +127,28 @@ describe('Contract Interaction Confirmation', () => { }, backgroundConnection: backgroundConnectionMocked, }); - - act(() => { - fireEvent.click(getByTestId('inline-alert')); }); - expect(await findByTestId('alert-modal')).toBeInTheDocument(); + fireEvent.click(screen.getByTestId('inline-alert')); + + expect(await screen.findByTestId('alert-modal')).toBeInTheDocument(); expect( - await findByTestId('alert-modal__selected-alert'), + await screen.findByTestId('alert-modal__selected-alert'), ).toBeInTheDocument(); - expect(await findByTestId('alert-modal__selected-alert')).toHaveTextContent( - 'Gas prices are high and estimates are less accurate.', - ); + expect( + await screen.findByTestId('alert-modal__selected-alert'), + ).toHaveTextContent('Gas prices are high and estimates are less accurate.'); - expect(await findByTestId('alert-modal-button')).toBeInTheDocument(); - const alertModalConfirmButton = await findByTestId('alert-modal-button'); + expect(await screen.findByTestId('alert-modal-button')).toBeInTheDocument(); + const alertModalConfirmButton = await screen.findByTestId( + 'alert-modal-button', + ); - act(() => { - fireEvent.click(alertModalConfirmButton); - }); + fireEvent.click(alertModalConfirmButton); - expect(queryByTestId('alert-modal')).not.toBeInTheDocument(); + expect(screen.queryByTestId('alert-modal')).not.toBeInTheDocument(); }); it('displays the alert when gas estimate fails', async () => { @@ -157,7 +172,7 @@ describe('Contract Interaction Confirmation', () => { }, }; - const { findByTestId, getByTestId, queryByTestId } = + await act(async () => { await integrationTestRender({ preloadedState: { ...mockedMetaMaskState, @@ -165,29 +180,30 @@ describe('Contract Interaction Confirmation', () => { }, backgroundConnection: backgroundConnectionMocked, }); - - act(() => { - fireEvent.click(getByTestId('inline-alert')); }); - expect(await findByTestId('alert-modal')).toBeInTheDocument(); + fireEvent.click(screen.getByTestId('inline-alert')); + + expect(await screen.findByTestId('alert-modal')).toBeInTheDocument(); expect( - await findByTestId('alert-modal__selected-alert'), + await screen.findByTestId('alert-modal__selected-alert'), ).toBeInTheDocument(); - expect(await findByTestId('alert-modal__selected-alert')).toHaveTextContent( + expect( + await screen.findByTestId('alert-modal__selected-alert'), + ).toHaveTextContent( 'We’re unable to provide an accurate fee and this estimate might be high. We suggest you to input a custom gas limit, but there’s a risk the transaction will still fail.', ); - expect(await findByTestId('alert-modal-button')).toBeInTheDocument(); - const alertModalConfirmButton = await findByTestId('alert-modal-button'); + expect(await screen.findByTestId('alert-modal-button')).toBeInTheDocument(); + const alertModalConfirmButton = await screen.findByTestId( + 'alert-modal-button', + ); - act(() => { - fireEvent.click(alertModalConfirmButton); - }); + fireEvent.click(alertModalConfirmButton); - expect(queryByTestId('alert-modal')).not.toBeInTheDocument(); + expect(screen.queryByTestId('alert-modal')).not.toBeInTheDocument(); }); it('displays the alert for insufficient gas', async () => { @@ -202,33 +218,35 @@ describe('Contract Interaction Confirmation', () => { const transaction = mockedMetaMaskState.transactions[0]; transaction.txParams.gas = '0x0'; - const { findByTestId, getByTestId } = await integrationTestRender({ - preloadedState: { - ...mockedMetaMaskState, - transactions: [transaction], - }, - backgroundConnection: backgroundConnectionMocked, + await act(async () => { + await integrationTestRender({ + preloadedState: { + ...mockedMetaMaskState, + transactions: [transaction], + }, + backgroundConnection: backgroundConnectionMocked, + }); }); - act(() => { - fireEvent.click(getByTestId('inline-alert')); - }); + fireEvent.click(screen.getByTestId('inline-alert')); - expect(await findByTestId('alert-modal')).toBeInTheDocument(); + expect(await screen.findByTestId('alert-modal')).toBeInTheDocument(); expect( - await findByTestId('alert-modal__selected-alert'), + await screen.findByTestId('alert-modal__selected-alert'), ).toBeInTheDocument(); - expect(await findByTestId('alert-modal__selected-alert')).toHaveTextContent( + expect( + await screen.findByTestId('alert-modal__selected-alert'), + ).toHaveTextContent( 'To continue with this transaction, you’ll need to increase the gas limit to 21000 or higher.', ); expect( - await findByTestId('alert-modal-action-showAdvancedGasModal'), + await screen.findByTestId('alert-modal-action-showAdvancedGasModal'), ).toBeInTheDocument(); expect( - await findByTestId('alert-modal-action-showAdvancedGasModal'), + await screen.findByTestId('alert-modal-action-showAdvancedGasModal'), ).toHaveTextContent('Update gas limit'); }); @@ -245,34 +263,36 @@ describe('Contract Interaction Confirmation', () => { const transaction = mockedMetaMaskState.transactions[0]; transaction.gasFeeEstimates.type = 'none'; - const { findByTestId, getByTestId } = await integrationTestRender({ - preloadedState: { - ...mockedMetaMaskState, - gasEstimateType: 'none', - transactions: [transaction], - }, - backgroundConnection: backgroundConnectionMocked, + await act(async () => { + await integrationTestRender({ + preloadedState: { + ...mockedMetaMaskState, + gasEstimateType: 'none', + transactions: [transaction], + }, + backgroundConnection: backgroundConnectionMocked, + }); }); - act(() => { - fireEvent.click(getByTestId('inline-alert')); - }); + fireEvent.click(screen.getByTestId('inline-alert')); - expect(await findByTestId('alert-modal')).toBeInTheDocument(); + expect(await screen.findByTestId('alert-modal')).toBeInTheDocument(); expect( - await findByTestId('alert-modal__selected-alert'), + await screen.findByTestId('alert-modal__selected-alert'), ).toBeInTheDocument(); - expect(await findByTestId('alert-modal__selected-alert')).toHaveTextContent( + expect( + await screen.findByTestId('alert-modal__selected-alert'), + ).toHaveTextContent( 'We can’t move forward with this transaction until you manually update the fee.', ); expect( - await findByTestId('alert-modal-action-showAdvancedGasModal'), + await screen.findByTestId('alert-modal-action-showAdvancedGasModal'), ).toBeInTheDocument(); expect( - await findByTestId('alert-modal-action-showAdvancedGasModal'), + await screen.findByTestId('alert-modal-action-showAdvancedGasModal'), ).toHaveTextContent('Update fee'); }); @@ -331,9 +351,7 @@ describe('Contract Interaction Confirmation', () => { expect(await screen.getByTestId('inline-alert')).toBeInTheDocument(); - act(() => { - fireEvent.click(screen.getByTestId('inline-alert')); - }); + fireEvent.click(screen.getByTestId('inline-alert')); expect(await screen.findByTestId('alert-modal')).toBeInTheDocument(); @@ -348,7 +366,7 @@ describe('Contract Interaction Confirmation', () => { ); }); - it('displays the alert for gas fees too', async () => { + it('displays the alert for gas fees too low', async () => { const account = mockMetaMaskState.internalAccounts.accounts[ mockMetaMaskState.internalAccounts @@ -372,9 +390,7 @@ describe('Contract Interaction Confirmation', () => { }); }); - act(() => { - fireEvent.click(screen.getByTestId('inline-alert')); - }); + fireEvent.click(screen.getByTestId('inline-alert')); expect(await screen.findByTestId('alert-modal')).toBeInTheDocument(); diff --git a/test/integration/confirmations/transactions/contract-interaction.test.tsx b/test/integration/confirmations/transactions/contract-interaction.test.tsx index 7d07dc31e7db..cea1ed6f54bc 100644 --- a/test/integration/confirmations/transactions/contract-interaction.test.tsx +++ b/test/integration/confirmations/transactions/contract-interaction.test.tsx @@ -1,4 +1,10 @@ -import { fireEvent, waitFor, within } from '@testing-library/react'; +import { + fireEvent, + waitFor, + within, + screen, + act, +} from '@testing-library/react'; import { ApprovalType } from '@metamask/controller-utils'; import nock from 'nock'; import { TransactionType } from '@metamask/transaction-controller'; @@ -46,12 +52,12 @@ const getMetaMaskStateWithUnapprovedContractInteraction = ({ }, nextNonce: '8', currencyRates: { - ETH: { + SepoliaETH: { conversionDate: 1721392020.645, conversionRate: 3404.13, usdConversionRate: 3404.13, }, - SepoliaETH: { + ETH: { conversionDate: 1721393858.083, conversionRate: 3414.67, usdConversionRate: 3414.67, @@ -166,36 +172,44 @@ describe('Contract Interaction Confirmation', () => { accountAddress: account.address, }); - const { getByTestId, queryByTestId, findByTestId } = + await act(async () => { await integrationTestRender({ preloadedState: mockedMetaMaskState, backgroundConnection: backgroundConnectionMocked, }); + }); - expect(getByTestId('header-account-name')).toHaveTextContent(accountName); - expect(getByTestId('header-network-display-name')).toHaveTextContent( - 'Chain 5', + expect(screen.getByTestId('header-account-name')).toHaveTextContent( + accountName, + ); + expect(screen.getByTestId('header-network-display-name')).toHaveTextContent( + 'Sepolia', ); - fireEvent.click(getByTestId('header-info__account-details-button')); + fireEvent.click(screen.getByTestId('header-info__account-details-button')); expect( - await findByTestId('confirmation-account-details-modal__account-name'), + await screen.findByTestId( + 'confirmation-account-details-modal__account-name', + ), ).toHaveTextContent(accountName); - expect(getByTestId('address-copy-button-text')).toHaveTextContent( + expect(screen.getByTestId('address-copy-button-text')).toHaveTextContent( '0x0DCD5...3E7bc', ); expect( - getByTestId('confirmation-account-details-modal__account-balance'), - ).toHaveTextContent('1.5827157ETH'); + screen.getByTestId('confirmation-account-details-modal__account-balance'), + ).toHaveTextContent('1.582717SepoliaETH'); let confirmAccountDetailsModalMetricsEvent; await waitFor(() => { confirmAccountDetailsModalMetricsEvent = mockedBackgroundConnection.submitRequestToBackground.mock.calls?.find( - (call) => call[0] === 'trackMetaMetricsEvent', + (call) => + call[0] === 'trackMetaMetricsEvent' && + call[1]?.[0].category === MetaMetricsEventCategory.Confirmations, ); + expect(confirmAccountDetailsModalMetricsEvent?.[0]).toBe( 'trackMetaMetricsEvent', ); @@ -216,12 +230,14 @@ describe('Contract Interaction Confirmation', () => { ); fireEvent.click( - getByTestId('confirmation-account-details-modal__close-button'), + screen.getByTestId('confirmation-account-details-modal__close-button'), ); await waitFor(() => { expect( - queryByTestId('confirmation-account-details-modal__account-name'), + screen.queryByTestId( + 'confirmation-account-details-modal__account-name', + ), ).not.toBeInTheDocument(); }); }); @@ -238,35 +254,38 @@ describe('Contract Interaction Confirmation', () => { accountAddress: account.address, }); - const { getByTestId, getByText, findByTestId } = + await act(async () => { await integrationTestRender({ preloadedState: mockedMetaMaskState, backgroundConnection: backgroundConnectionMocked, }); + }); - expect(getByText('Transaction request')).toBeInTheDocument(); + expect(screen.getByText('Transaction request')).toBeInTheDocument(); - const simulationSection = getByTestId('simulation-details-layout'); + const simulationSection = screen.getByTestId('simulation-details-layout'); expect(simulationSection).toBeInTheDocument(); expect(simulationSection).toHaveTextContent('Estimated changes'); - const simulationDetailsRow = await findByTestId('simulation-rows-incoming'); + const simulationDetailsRow = await screen.findByTestId( + 'simulation-rows-incoming', + ); expect(simulationSection).toContainElement(simulationDetailsRow); expect(simulationDetailsRow).toHaveTextContent('You receive'); expect(simulationDetailsRow).toContainElement( - getByTestId('simulation-details-asset-pill'), + screen.getByTestId('simulation-details-asset-pill'), ); expect(simulationDetailsRow).toContainElement( - getByTestId('simulation-details-amount-pill'), + screen.getByTestId('simulation-details-amount-pill'), ); - const transactionDetailsSection = getByTestId( + const transactionDetailsSection = screen.getByTestId( 'transaction-details-section', ); expect(transactionDetailsSection).toBeInTheDocument(); expect(transactionDetailsSection).toHaveTextContent('Request from'); expect(transactionDetailsSection).toHaveTextContent('Interacting with'); - const gasFeesSection = getByTestId('gas-fee-section'); + const gasFeesSection = screen.getByTestId('gas-fee-section'); expect(gasFeesSection).toBeInTheDocument(); const editGasFeesRow = @@ -278,7 +297,9 @@ describe('Contract Interaction Confirmation', () => { const editGasFeeNativeCurrency = within(editGasFeesRow).getByTestId('native-currency'); expect(editGasFeeNativeCurrency).toHaveTextContent('$28.50'); - expect(editGasFeesRow).toContainElement(getByTestId('edit-gas-fee-icon')); + expect(editGasFeesRow).toContainElement( + screen.getByTestId('edit-gas-fee-icon'), + ); const gasFeeSpeed = within(gasFeesSection).getByTestId( 'gas-fee-details-speed', @@ -306,12 +327,14 @@ describe('Contract Interaction Confirmation', () => { showConfirmationAdvancedDetails: false, }); - const { getByTestId } = await integrationTestRender({ - preloadedState: mockedMetaMaskState, - backgroundConnection: backgroundConnectionMocked, + await act(async () => { + await integrationTestRender({ + preloadedState: mockedMetaMaskState, + backgroundConnection: backgroundConnectionMocked, + }); }); - fireEvent.click(getByTestId('header-advanced-details-button')); + fireEvent.click(screen.getByTestId('header-advanced-details-button')); await waitFor(() => { expect( @@ -341,9 +364,11 @@ describe('Contract Interaction Confirmation', () => { showConfirmationAdvancedDetails: true, }); - const { getByTestId } = await integrationTestRender({ - preloadedState: mockedMetaMaskState, - backgroundConnection: backgroundConnectionMocked, + await act(async () => { + await integrationTestRender({ + preloadedState: mockedMetaMaskState, + backgroundConnection: backgroundConnectionMocked, + }); }); await waitFor(() => { @@ -360,37 +385,41 @@ describe('Contract Interaction Confirmation', () => { transactionData: '0x3b4b13810000000000000000000000000000000000000000000000000000000000000001', contractAddress: '0x076146c765189d51be3160a2140cf80bfc73ad68', - chainId: '0x5', + chainId: '0xaa36a7', }, ]); }); - const gasFeesSection = getByTestId('gas-fee-section'); - const maxFee = getByTestId('gas-fee-details-max-fee'); + const gasFeesSection = screen.getByTestId('gas-fee-section'); + const maxFee = screen.getByTestId('gas-fee-details-max-fee'); expect(gasFeesSection).toContainElement(maxFee); expect(maxFee).toHaveTextContent('Max fee'); expect(maxFee).toHaveTextContent('0.2313 ETH'); expect(maxFee).toHaveTextContent('$787.37'); - const nonceSection = getByTestId('advanced-details-nonce-section'); + const nonceSection = screen.getByTestId('advanced-details-nonce-section'); expect(nonceSection).toBeInTheDocument(); expect(nonceSection).toHaveTextContent('Nonce'); expect(nonceSection).toContainElement( - getByTestId('advanced-details-displayed-nonce'), - ); - expect(getByTestId('advanced-details-displayed-nonce')).toHaveTextContent( - '9', + screen.getByTestId('advanced-details-displayed-nonce'), ); + expect( + screen.getByTestId('advanced-details-displayed-nonce'), + ).toHaveTextContent('9'); - const dataSection = getByTestId('advanced-details-data-section'); + const dataSection = screen.getByTestId('advanced-details-data-section'); expect(dataSection).toBeInTheDocument(); - const dataSectionFunction = getByTestId('advanced-details-data-function'); + const dataSectionFunction = screen.getByTestId( + 'advanced-details-data-function', + ); expect(dataSection).toContainElement(dataSectionFunction); expect(dataSectionFunction).toHaveTextContent('Function'); expect(dataSectionFunction).toHaveTextContent('mintNFTs'); - const transactionDataParams = getByTestId('advanced-details-data-param-0'); + const transactionDataParams = screen.getByTestId( + 'advanced-details-data-param-0', + ); expect(dataSection).toContainElement(transactionDataParams); expect(transactionDataParams).toHaveTextContent('Number Of Tokens'); expect(transactionDataParams).toHaveTextContent('1'); @@ -408,15 +437,17 @@ describe('Contract Interaction Confirmation', () => { account.address, ); - const { getByText } = await integrationTestRender({ - preloadedState: mockedMetaMaskState, - backgroundConnection: backgroundConnectionMocked, + await act(async () => { + await integrationTestRender({ + preloadedState: mockedMetaMaskState, + backgroundConnection: backgroundConnectionMocked, + }); }); const headingText = 'This is a deceptive request'; const bodyText = 'If you approve this request, a third party known for scams will take all your assets.'; - expect(getByText(headingText)).toBeInTheDocument(); - expect(getByText(bodyText)).toBeInTheDocument(); + expect(screen.getByText(headingText)).toBeInTheDocument(); + expect(screen.getByText(bodyText)).toBeInTheDocument(); }); }); diff --git a/test/integration/confirmations/transactions/erc20-approve.test.tsx b/test/integration/confirmations/transactions/erc20-approve.test.tsx index 824ca80e0b84..e2466ad8f596 100644 --- a/test/integration/confirmations/transactions/erc20-approve.test.tsx +++ b/test/integration/confirmations/transactions/erc20-approve.test.tsx @@ -1,28 +1,21 @@ import { ApprovalType } from '@metamask/controller-utils'; -import { waitFor } from '@testing-library/react'; +import { act, screen } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; import nock from 'nock'; -import { useIsNFT } from '../../../../ui/pages/confirmations/components/confirm/info/approve/hooks/use-is-nft'; import * as backgroundConnection from '../../../../ui/store/background-connection'; import { integrationTestRender } from '../../../lib/render-helpers'; import mockMetaMaskState from '../../data/integration-init-state.json'; import { createMockImplementation, mock4byte } from '../../helpers'; +import { TokenStandard } from '../../../../shared/constants/transaction'; +import { createTestProviderTools } from '../../../stub/provider'; import { getUnapprovedApproveTransaction } from './transactionDataHelpers'; jest.mock('../../../../ui/store/background-connection', () => ({ ...jest.requireActual('../../../../ui/store/background-connection'), submitRequestToBackground: jest.fn(), + callBackgroundMethod: jest.fn(), })); -jest.mock( - '../../../../ui/pages/confirmations/components/confirm/info/approve/hooks/use-is-nft', - () => ({ - ...jest.requireActual( - '../../../../ui/pages/confirmations/components/confirm/info/approve/hooks/use-is-nft', - ), - useIsNFT: jest.fn(), - }), -); - const mockedBackgroundConnection = jest.mocked(backgroundConnection); const backgroundConnectionMocked = { @@ -31,14 +24,21 @@ const backgroundConnectionMocked = { export const pendingTransactionId = '48a75190-45ca-11ef-9001-f3886ec2397c'; export const pendingTransactionTime = new Date().getTime(); -const getMetaMaskStateWithUnapprovedApproveTransaction = ( - accountAddress: string, -) => { +const getMetaMaskStateWithUnapprovedApproveTransaction = (opts?: { + showAdvanceDetails: boolean; +}) => { + const account = + mockMetaMaskState.internalAccounts.accounts[ + mockMetaMaskState.internalAccounts + .selectedAccount as keyof typeof mockMetaMaskState.internalAccounts.accounts + ]; + return { ...mockMetaMaskState, preferences: { ...mockMetaMaskState.preferences, redesignedConfirmationsEnabled: true, + showConfirmationAdvancedDetails: opts?.showAdvanceDetails ?? false, }, pendingApprovals: { [pendingTransactionId]: { @@ -55,9 +55,12 @@ const getMetaMaskStateWithUnapprovedApproveTransaction = ( }, pendingApprovalCount: 1, knownMethodData: { - '0x3b4b1381': { - name: 'Mint NFTs', + '0x095ea7b3': { + name: 'Approve', params: [ + { + type: 'address', + }, { type: 'uint256', }, @@ -66,7 +69,7 @@ const getMetaMaskStateWithUnapprovedApproveTransaction = ( }, transactions: [ getUnapprovedApproveTransaction( - accountAddress, + account.address, pendingTransactionId, pendingTransactionTime, ), @@ -83,7 +86,7 @@ const advancedDetailsMockedRequests = { decodeTransactionData: { data: [ { - name: 'approve', + name: 'Approve', params: [ { type: 'address', @@ -109,46 +112,261 @@ const setupSubmitRequestToBackgroundMocks = ( ...(mockRequests ?? {}), }), ); + + mockedBackgroundConnection.callBackgroundMethod.mockImplementation( + createMockImplementation({ addKnownMethodData: {} }), + ); }; -describe('ERC721 Approve Confirmation', () => { - let useIsNFTMock; +describe('ERC20 Approve Confirmation', () => { + beforeAll(() => { + const { provider } = createTestProviderTools({ + networkId: 'sepolia', + chainId: '0xaa36a7', + }); + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + global.ethereumProvider = provider as any; + }); + beforeEach(() => { jest.resetAllMocks(); - setupSubmitRequestToBackgroundMocks(); - const APPROVE_NFT_HEX_SIG = '0x095ea7b3'; - mock4byte(APPROVE_NFT_HEX_SIG); - useIsNFTMock = jest - .fn() - .mockImplementation(() => ({ isNFT: false, decimals: '18' })); - (useIsNFT as jest.Mock).mockImplementation(useIsNFTMock); + setupSubmitRequestToBackgroundMocks({ + getTokenStandardAndDetails: { + standard: TokenStandard.ERC20, + }, + }); + const APPROVE_ERC20_HEX_SIG = '0x095ea7b3'; + const APPROVE_ERC20_TEXT_SIG = 'approve(address,uint256)'; + mock4byte(APPROVE_ERC20_HEX_SIG, APPROVE_ERC20_TEXT_SIG); }); afterEach(() => { nock.cleanAll(); }); + afterAll(() => { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + delete (global as any).ethereumProvider; + }); + + it('displays spending cap request title', async () => { + const mockedMetaMaskState = + getMetaMaskStateWithUnapprovedApproveTransaction(); + + await act(async () => { + await integrationTestRender({ + preloadedState: mockedMetaMaskState, + backgroundConnection: backgroundConnectionMocked, + }); + }); + + expect(screen.getByText('Spending cap request')).toBeInTheDocument(); + expect( + screen.getByText('This site wants permission to withdraw your tokens'), + ).toBeInTheDocument(); + }); + + it('displays approve simulation section', async () => { + const mockedMetaMaskState = + getMetaMaskStateWithUnapprovedApproveTransaction(); + + await act(async () => { + await integrationTestRender({ + preloadedState: mockedMetaMaskState, + backgroundConnection: backgroundConnectionMocked, + }); + }); + + const simulationSection = screen.getByTestId( + 'confirmation__simulation_section', + ); + expect(simulationSection).toBeInTheDocument(); + + // TODO - fix this copy + expect(simulationSection).toHaveTextContent( + "You're giving someone else permission to withdraw NFTs from your account", + ); + expect(simulationSection).toHaveTextContent('Spending cap'); + const spendingCapValue = screen.getByTestId('simulation-token-value'); + expect(simulationSection).toContainElement(spendingCapValue); + expect(spendingCapValue).toHaveTextContent('1'); + expect(simulationSection).toHaveTextContent('0x07614...3ad68'); + }); + it('displays approve details with correct data', async () => { - const account = - mockMetaMaskState.internalAccounts.accounts[ - mockMetaMaskState.internalAccounts - .selectedAccount as keyof typeof mockMetaMaskState.internalAccounts.accounts - ]; + const testUser = userEvent.setup(); const mockedMetaMaskState = - getMetaMaskStateWithUnapprovedApproveTransaction(account.address); + getMetaMaskStateWithUnapprovedApproveTransaction(); - const { getByText } = await integrationTestRender({ - preloadedState: mockedMetaMaskState, - backgroundConnection: backgroundConnectionMocked, + await act(async () => { + await integrationTestRender({ + preloadedState: mockedMetaMaskState, + backgroundConnection: backgroundConnectionMocked, + }); }); - await waitFor(() => { - expect(getByText('Spending cap request')).toBeInTheDocument(); + const approveDetails = screen.getByTestId('confirmation__approve-details'); + expect(approveDetails).toBeInTheDocument(); + const approveDetailsSpender = screen.getByTestId( + 'confirmation__approve-spender', + ); + + expect(approveDetails).toContainElement(approveDetailsSpender); + expect(approveDetailsSpender).toHaveTextContent('Spender'); + expect(approveDetailsSpender).toHaveTextContent('0x2e0D7...5d09B'); + const spenderTooltip = screen.getByTestId( + 'confirmation__approve-spender-tooltip', + ); + expect(approveDetailsSpender).toContainElement(spenderTooltip); + await testUser.hover(spenderTooltip); + // TODO - fix this copy + const spenderTooltipContent = await screen.findByText( + 'This is the address that will be able to withdraw your NFTs.', + ); + expect(spenderTooltipContent).toBeInTheDocument(); + + const approveDetailsRequestFrom = screen.getByTestId( + 'transaction-details-origin-row', + ); + expect(approveDetails).toContainElement(approveDetailsRequestFrom); + expect(approveDetailsRequestFrom).toHaveTextContent('Request from'); + expect(approveDetailsRequestFrom).toHaveTextContent( + 'http://localhost:8086/', + ); + + const approveDetailsRequestFromTooltip = screen.getByTestId( + 'transaction-details-origin-row-tooltip', + ); + expect(approveDetailsRequestFrom).toContainElement( + approveDetailsRequestFromTooltip, + ); + await testUser.hover(approveDetailsRequestFromTooltip); + const requestFromTooltipContent = await screen.findByText( + 'This is the site asking for your confirmation.', + ); + expect(requestFromTooltipContent).toBeInTheDocument(); + }); + + it('displays spending cap section with correct data', async () => { + const testUser = userEvent.setup(); + + const mockedMetaMaskState = + getMetaMaskStateWithUnapprovedApproveTransaction(); + + await act(async () => { + await integrationTestRender({ + preloadedState: mockedMetaMaskState, + backgroundConnection: backgroundConnectionMocked, + }); }); - await waitFor(() => { - expect(getByText('Request from')).toBeInTheDocument(); + const spendingCapSection = screen.getByTestId( + 'confirmation__approve-spending-cap-section', + ); + expect(spendingCapSection).toBeInTheDocument(); + + expect(spendingCapSection).toHaveTextContent('Account balance'); + expect(spendingCapSection).toHaveTextContent('0'); + const spendingCapGroup = screen.getByTestId( + 'confirmation__approve-spending-cap-group', + ); + expect(spendingCapSection).toContainElement(spendingCapGroup); + expect(spendingCapGroup).toHaveTextContent('Spending cap'); + expect(spendingCapGroup).toHaveTextContent('1'); + + const spendingCapGroupTooltip = screen.getByTestId( + 'confirmation__approve-spending-cap-group-tooltip', + ); + expect(spendingCapGroup).toContainElement(spendingCapGroupTooltip); + await testUser.hover(spendingCapGroupTooltip); + const requestFromTooltipContent = await screen.findByText( + 'This is the amount of tokens the spender will be able to access on your behalf.', + ); + expect(requestFromTooltipContent).toBeInTheDocument(); + }); + + it('displays the advanced transaction details section', async () => { + const testUser = userEvent.setup(); + + const mockedMetaMaskState = + getMetaMaskStateWithUnapprovedApproveTransaction({ + showAdvanceDetails: true, + }); + + await act(async () => { + await integrationTestRender({ + preloadedState: mockedMetaMaskState, + backgroundConnection: backgroundConnectionMocked, + }); }); + + const approveDetails = screen.getByTestId('confirmation__approve-details'); + expect(approveDetails).toBeInTheDocument(); + + const approveDetailsRecipient = screen.getByTestId( + 'transaction-details-recipient-row', + ); + expect(approveDetails).toContainElement(approveDetailsRecipient); + expect(approveDetailsRecipient).toHaveTextContent('Interacting with'); + expect(approveDetailsRecipient).toHaveTextContent('0x07614...3ad68'); + + const approveDetailsRecipientTooltip = screen.getByTestId( + 'transaction-details-recipient-row-tooltip', + ); + expect(approveDetailsRecipient).toContainElement( + approveDetailsRecipientTooltip, + ); + await testUser.hover(approveDetailsRecipientTooltip); + const recipientTooltipContent = await screen.findByText( + "This is the contract you're interacting with. Protect yourself from scammers by verifying the details.", + ); + expect(recipientTooltipContent).toBeInTheDocument(); + + const approveMethodData = await screen.findByTestId( + 'transaction-details-method-data-row', + ); + expect(approveDetails).toContainElement(approveMethodData); + expect(approveMethodData).toHaveTextContent('Method'); + expect(approveMethodData).toHaveTextContent('Approve'); + const approveMethodDataTooltip = screen.getByTestId( + 'transaction-details-method-data-row-tooltip', + ); + expect(approveMethodData).toContainElement(approveMethodDataTooltip); + await testUser.hover(approveMethodDataTooltip); + const approveMethodDataTooltipContent = await screen.findByText( + 'Function executed based on decoded input data.', + ); + expect(approveMethodDataTooltipContent).toBeInTheDocument(); + + const approveDetailsNonce = screen.getByTestId( + 'advanced-details-nonce-section', + ); + expect(approveDetailsNonce).toBeInTheDocument(); + + const dataSection = screen.getByTestId('advanced-details-data-section'); + expect(dataSection).toBeInTheDocument(); + + const dataSectionFunction = screen.getByTestId( + 'advanced-details-data-function', + ); + expect(dataSection).toContainElement(dataSectionFunction); + expect(dataSectionFunction).toHaveTextContent('Function'); + expect(dataSectionFunction).toHaveTextContent('Approve'); + + const approveDataParams1 = screen.getByTestId( + 'advanced-details-data-param-0', + ); + expect(dataSection).toContainElement(approveDataParams1); + expect(approveDataParams1).toHaveTextContent('Param #1'); + expect(approveDataParams1).toHaveTextContent('0x2e0D7...5d09B'); + + const approveDataParams2 = screen.getByTestId( + 'advanced-details-data-param-1', + ); + expect(dataSection).toContainElement(approveDataParams2); + expect(approveDataParams2).toHaveTextContent('Param #2'); + expect(approveDataParams2).toHaveTextContent('1'); }); }); diff --git a/test/integration/confirmations/transactions/erc721-approve.test.tsx b/test/integration/confirmations/transactions/erc721-approve.test.tsx index 47f0e2121eb8..8a836dbd7568 100644 --- a/test/integration/confirmations/transactions/erc721-approve.test.tsx +++ b/test/integration/confirmations/transactions/erc721-approve.test.tsx @@ -1,28 +1,20 @@ import { ApprovalType } from '@metamask/controller-utils'; -import { waitFor } from '@testing-library/react'; +import { act, screen, waitFor } from '@testing-library/react'; import nock from 'nock'; -import { useIsNFT } from '../../../../ui/pages/confirmations/components/confirm/info/approve/hooks/use-is-nft'; import * as backgroundConnection from '../../../../ui/store/background-connection'; import { integrationTestRender } from '../../../lib/render-helpers'; import mockMetaMaskState from '../../data/integration-init-state.json'; import { createMockImplementation, mock4byte } from '../../helpers'; +import { TokenStandard } from '../../../../shared/constants/transaction'; +import { createTestProviderTools } from '../../../stub/provider'; import { getUnapprovedApproveTransaction } from './transactionDataHelpers'; jest.mock('../../../../ui/store/background-connection', () => ({ ...jest.requireActual('../../../../ui/store/background-connection'), submitRequestToBackground: jest.fn(), + callBackgroundMethod: jest.fn(), })); -jest.mock( - '../../../../ui/pages/confirmations/components/confirm/info/approve/hooks/use-is-nft', - () => ({ - ...jest.requireActual( - '../../../../ui/pages/confirmations/components/confirm/info/approve/hooks/use-is-nft', - ), - useIsNFT: jest.fn(), - }), -); - const mockedBackgroundConnection = jest.mocked(backgroundConnection); const backgroundConnectionMocked = { @@ -55,9 +47,12 @@ const getMetaMaskStateWithUnapprovedApproveTransaction = ( }, pendingApprovalCount: 1, knownMethodData: { - '0x3b4b1381': { - name: 'Mint NFTs', + '0x095ea7b3': { + name: 'Approve', params: [ + { + type: 'address', + }, { type: 'uint256', }, @@ -109,23 +104,43 @@ const setupSubmitRequestToBackgroundMocks = ( ...(mockRequests ?? {}), }), ); + + mockedBackgroundConnection.callBackgroundMethod.mockImplementation( + createMockImplementation({ addKnownMethodData: {} }), + ); }; describe('ERC721 Approve Confirmation', () => { - let useIsNFTMock; + beforeAll(() => { + const { provider } = createTestProviderTools({ + networkId: 'sepolia', + chainId: '0xaa36a7', + }); + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + global.ethereumProvider = provider as any; + }); + beforeEach(() => { jest.resetAllMocks(); - setupSubmitRequestToBackgroundMocks(); + setupSubmitRequestToBackgroundMocks({ + getTokenStandardAndDetails: { + standard: TokenStandard.ERC721, + }, + }); const APPROVE_NFT_HEX_SIG = '0x095ea7b3'; mock4byte(APPROVE_NFT_HEX_SIG); - useIsNFTMock = jest.fn().mockImplementation(() => ({ isNFT: true })); - (useIsNFT as jest.Mock).mockImplementation(useIsNFTMock); }); afterEach(() => { nock.cleanAll(); }); + afterAll(() => { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + delete (global as any).ethereumProvider; + }); + it('displays approve details with correct data', async () => { const account = mockMetaMaskState.internalAccounts.accounts[ @@ -136,17 +151,19 @@ describe('ERC721 Approve Confirmation', () => { const mockedMetaMaskState = getMetaMaskStateWithUnapprovedApproveTransaction(account.address); - const { getByText } = await integrationTestRender({ - preloadedState: mockedMetaMaskState, - backgroundConnection: backgroundConnectionMocked, + await act(async () => { + await integrationTestRender({ + preloadedState: mockedMetaMaskState, + backgroundConnection: backgroundConnectionMocked, + }); }); await waitFor(() => { - expect(getByText('Allowance request')).toBeInTheDocument(); + expect(screen.getByText('Allowance request')).toBeInTheDocument(); }); await waitFor(() => { - expect(getByText('Request from')).toBeInTheDocument(); + expect(screen.getByText('Request from')).toBeInTheDocument(); }); }); }); diff --git a/test/integration/confirmations/transactions/transactionDataHelpers.tsx b/test/integration/confirmations/transactions/transactionDataHelpers.tsx index 72fc0d2289f3..12550ea5e563 100644 --- a/test/integration/confirmations/transactions/transactionDataHelpers.tsx +++ b/test/integration/confirmations/transactions/transactionDataHelpers.tsx @@ -7,7 +7,7 @@ export const getUnapprovedTransaction = ( ) => { return { actionId: 4256525906, - chainId: '0x5', + chainId: '0xaa36a7', dappSuggestedGasFees: { gas: '0x16a92', }, diff --git a/test/integration/data/integration-init-state.json b/test/integration/data/integration-init-state.json index 27cd1dcfd83a..212ea5702868 100644 --- a/test/integration/data/integration-init-state.json +++ b/test/integration/data/integration-init-state.json @@ -26,18 +26,19 @@ } }, "accountsByChainId": { - "0x5": { + "0xaa36a7": { "0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc": { + "address": "0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc", "balance": "0x15f6f0b9d4f8d000" } } }, "addSnapAccountEnabled": false, "addressBook": { - "0x5": { + "0xaa36a7": { "0xc42edfcc21ed14dda456aa0756c153f7985d8813": { "address": "0xc42edfcc21ed14dda456aa0756c153f7985d8813", - "chainId": "0x5", + "chainId": "0xaa36a7", "isEns": false, "memo": "", "name": "Address Book Account 1" @@ -45,7 +46,7 @@ } }, "advancedGasFee": { - "0x5": { + "0xaa36a7": { "maxBaseFee": "75", "priorityFee": "2" } @@ -92,6 +93,17 @@ "createdDate": null, "schemaName": "ERC721", "externalLink": null + }, + { + "address": "0x495f947276749Ce646f68AC8c248420045cb7b5e", + "description": null, + "name": "Punk Generator", + "logo": null, + "symbol": "PUNK", + "assetContractType": "non-fungible", + "createdDate": null, + "schemaName": "ERC1155", + "externalLink": null } ], "0x5": [ @@ -105,17 +117,6 @@ "createdDate": null, "schemaName": "ERC721", "externalLink": null - }, - { - "address": "0x495f947276749Ce646f68AC8c248420045cb7b5e", - "description": null, - "name": "Punk Generator", - "logo": null, - "symbol": "PUNK", - "assetContractType": "non-fungible", - "createdDate": null, - "schemaName": "ERC1155", - "externalLink": null } ], "0x99": [ @@ -155,7 +156,7 @@ "standard": "ERC721" } ], - "0xaa36a7": [ + "0x5": [ { "address": "0xDc7382Eb0Bc9C352A4CbA23c909bDA01e0206414", "tokenId": "1", @@ -165,7 +166,7 @@ "standard": "ERC721" } ], - "0x5": [ + "0xaa36a7": [ { "address": "0x495f947276749Ce646f68AC8c248420045cb7b5e", "tokenId": "58076532811975507823669075598676816378162417803895263482849101575514658701313", @@ -395,7 +396,7 @@ "networkCongestion": 0.10625 }, "gasFeeEstimatesByChainId": { - "0x5": { + "0xaa36a7": { "estimatedGasFeeTimeBounds": { "lowerTimeBound": 15000, "upperTimeBound": 60000 @@ -462,7 +463,7 @@ "0xe708": false, "0xfa": true, "0x5": false, - "0xaa36a7": true, + "0xaa36a7": false, "0xe704": true }, "internalAccounts": { @@ -669,6 +670,13 @@ "nickname": "Chain 5", "ticker": "ETH", "type": "rpc" + }, + "sepolia": { + "type": "rpc", + "chainId": "0xaa36a7", + "ticker": "ETH", + "nickname": "Sepolia", + "id": "sepolia" } }, "networksMetadata": { @@ -693,7 +701,7 @@ }, "nftsDropdownState": { "0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc": { - "0x5": { + "0xaa36a7": { "0x495f947276749Ce646f68AC8c248420045cb7b5e": false } } @@ -756,16 +764,16 @@ "previousAppVersion": "11.14.4", "previousMigrationVersion": 112, "providerConfig": { - "type": "rpc", - "nickname": "goerli", - "chainId": "0x5", + "type": "sepolia", + "nickname": "sepolia", + "chainId": "0xaa36a7", "ticker": "ETH", - "id": "chain5" + "id": "sepolia" }, "securityAlertsEnabled": true, "seedPhraseBackedUp": true, "selectedAddress": "0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc", - "selectedNetworkClientId": "goerli-network-id", + "selectedNetworkClientId": "sepolia", "showAccountBanner": false, "showBetaHeader": false, "showNetworkBanner": true, @@ -778,7 +786,7 @@ "liveness": true, "smartTransactions": { "0x1": [], - "0x5": [] + "0xaa36a7": [] }, "userOptInV2": true }, @@ -1271,7 +1279,7 @@ "id": 3387511061307736, "time": 1528133130531, "status": "confirmed", - "chainId": "0x5", + "chainId": "0xaa36a7", "loadingDefaults": false, "txParams": { "from": "0x3b222de3aaba8ec9771ca9e9af5d8ed757fb7f62", @@ -1286,7 +1294,7 @@ "id": 3387511061307736, "time": 1528133130531, "status": "unapproved", - "chainId": "0x5", + "chainId": "0xaa36a7", "loadingDefaults": true, "txParams": { "from": "0x3b222de3aaba8ec9771ca9e9af5d8ed757fb7f62", @@ -1403,7 +1411,7 @@ "id": 3387511061307737, "time": 1528133149983, "status": "confirmed", - "chainId": "0x5", + "chainId": "0xaa36a7", "loadingDefaults": false, "txParams": { "from": "0x3b222de3aaba8ec9771ca9e9af5d8ed757fb7f62", @@ -1418,7 +1426,7 @@ "id": 3387511061307737, "time": 1528133149983, "status": "unapproved", - "chainId": "0x5", + "chainId": "0xaa36a7", "loadingDefaults": true, "txParams": { "from": "0x3b222de3aaba8ec9771ca9e9af5d8ed757fb7f62", @@ -1535,7 +1543,7 @@ "id": 3387511061307738, "time": 1528133180635, "status": "confirmed", - "chainId": "0x5", + "chainId": "0xaa36a7", "loadingDefaults": false, "txParams": { "from": "0x3b222de3aaba8ec9771ca9e9af5d8ed757fb7f62", @@ -1550,7 +1558,7 @@ "id": 3387511061307738, "time": 1528133180635, "status": "unapproved", - "chainId": "0x5", + "chainId": "0xaa36a7", "loadingDefaults": true, "txParams": { "from": "0x3b222de3aaba8ec9771ca9e9af5d8ed757fb7f62", @@ -1667,7 +1675,7 @@ "id": 3387511061307739, "time": 1528133223918, "status": "confirmed", - "chainId": "0x5", + "chainId": "0xaa36a7", "loadingDefaults": false, "txParams": { "from": "0x3b222de3aaba8ec9771ca9e9af5d8ed757fb7f62", @@ -1683,7 +1691,7 @@ "id": 3387511061307739, "time": 1528133223918, "status": "unapproved", - "chainId": "0x5", + "chainId": "0xaa36a7", "loadingDefaults": true, "txParams": { "from": "0x3b222de3aaba8ec9771ca9e9af5d8ed757fb7f62", @@ -1804,7 +1812,7 @@ "id": 3387511061307740, "time": 1528133291381, "status": "confirmed", - "chainId": "0x5", + "chainId": "0xaa36a7", "loadingDefaults": false, "txParams": { "from": "0x3b222de3aaba8ec9771ca9e9af5d8ed757fb7f62", @@ -1820,7 +1828,7 @@ "id": 3387511061307740, "time": 1528133291381, "status": "unapproved", - "chainId": "0x5", + "chainId": "0xaa36a7", "loadingDefaults": true, "txParams": { "from": "0x3b222de3aaba8ec9771ca9e9af5d8ed757fb7f62", @@ -1938,7 +1946,7 @@ "id": 3387511061307741, "time": 1528133318440, "status": "rejected", - "chainId": "0x5", + "chainId": "0xaa36a7", "loadingDefaults": false, "txParams": { "from": "0x3b222de3aaba8ec9771ca9e9af5d8ed757fb7f62", @@ -1952,7 +1960,7 @@ "id": 3387511061307741, "time": 1528133318440, "status": "unapproved", - "chainId": "0x5", + "chainId": "0xaa36a7", "loadingDefaults": true, "txParams": { "from": "0x3b222de3aaba8ec9771ca9e9af5d8ed757fb7f62", @@ -2029,12 +2037,12 @@ "useTokenDetection": false, "useTransactionSimulations": true, "usedNetworks": { - "0x5": { - "rpcUrl": "https://goerli.infura.io/v3/8f8f7f9f6f4c4f3e8f8f7f9f6f4c4f3e", - "chainId": "0x5", - "nickname": "Goerli Test Network", + "0xaa36a7": { + "rpcUrl": "https://sepolia.infura.io/v3/8f8f7f9f6f4c4f3e8f8f7f9f6f4c4f3e", + "chainId": "0xaa36a7", + "nickname": "Sepolia Test Network", "ticker": "ETH", - "blockExplorerUrl": "https://goerli.etherscan.io" + "blockExplorerUrl": "https://sepolia.etherscan.io" } }, "userOperations": {}, diff --git a/test/integration/helpers.tsx b/test/integration/helpers.tsx index d975c5adc594..2576d282a341 100644 --- a/test/integration/helpers.tsx +++ b/test/integration/helpers.tsx @@ -9,7 +9,7 @@ export const createMockImplementation = (requests: Record) => { }; }; -export function mock4byte(hexSignature: string) { +export function mock4byte(hexSignature: string, textSignature?: string) { const mockEndpoint = nock('https://www.4byte.directory:443', { encodedQueryParams: true, }) @@ -21,7 +21,7 @@ export function mock4byte(hexSignature: string) { { id: 235447, created_at: '2021-09-14T02:07:09.805000Z', - text_signature: 'mintNFTs(uint256)', + text_signature: textSignature ?? 'mintNFTs(uint256)', hex_signature: hexSignature, bytes_signature: ';K\u0013 ', }, diff --git a/ui/components/app/confirm/info/row/row.tsx b/ui/components/app/confirm/info/row/row.tsx index 6b6470c98017..0dd0b9b110b8 100644 --- a/ui/components/app/confirm/info/row/row.tsx +++ b/ui/components/app/confirm/info/row/row.tsx @@ -128,6 +128,9 @@ export const ConfirmInfoRow: React.FC = ({ marginLeft={1} color={TOOLTIP_ICON_COLORS[variant] as unknown as IconColor} size={IconSize.Sm} + {...(dataTestId + ? { 'data-testid': `${dataTestId}-tooltip` } + : {})} /> )} diff --git a/ui/pages/confirmations/components/confirm/info/approve/__snapshots__/approve.test.tsx.snap b/ui/pages/confirmations/components/confirm/info/approve/__snapshots__/approve.test.tsx.snap index 6f09eea933f4..ee8bff7a53dd 100644 --- a/ui/pages/confirmations/components/confirm/info/approve/__snapshots__/approve.test.tsx.snap +++ b/ui/pages/confirmations/components/confirm/info/approve/__snapshots__/approve.test.tsx.snap @@ -98,9 +98,11 @@ exports[` renders component for approve request 1`] = `
renders component for approve request 1`] = ` >
@@ -214,6 +217,7 @@ exports[` renders component for approve request 1`] = ` >
@@ -254,6 +258,7 @@ exports[` renders component for approve request 1`] = ` >
@@ -320,6 +325,7 @@ exports[` renders component for approve request 1`] = `
renders component for approve request 1`] = ` />
renders component for approve request 1`] = ` >
@@ -430,6 +438,7 @@ exports[` renders component for approve request 1`] = ` >
@@ -529,6 +538,7 @@ exports[` renders component for approve request 1`] = ` >
@@ -674,6 +684,7 @@ exports[` renders component for approve request 1`] = ` >
@@ -762,6 +773,7 @@ exports[` renders component for approve request 1`] = ` > diff --git a/ui/pages/confirmations/components/confirm/info/approve/approve-details/__snapshots__/approve-details.test.tsx.snap b/ui/pages/confirmations/components/confirm/info/approve/approve-details/__snapshots__/approve-details.test.tsx.snap index c31eb7dcfbd0..5491908cdffd 100644 --- a/ui/pages/confirmations/components/confirm/info/approve/approve-details/__snapshots__/approve-details.test.tsx.snap +++ b/ui/pages/confirmations/components/confirm/info/approve/approve-details/__snapshots__/approve-details.test.tsx.snap @@ -4,6 +4,7 @@ exports[` renders component for approve details 1`] = `
{ return ( <> - + @@ -50,7 +54,7 @@ export const ApproveDetails = () => { ); return ( - + {showAdvancedDetails && ( diff --git a/ui/pages/confirmations/components/confirm/info/approve/spending-cap/__snapshots__/spending-cap.test.tsx.snap b/ui/pages/confirmations/components/confirm/info/approve/spending-cap/__snapshots__/spending-cap.test.tsx.snap index d249b4ba843b..dafe44df8e70 100644 --- a/ui/pages/confirmations/components/confirm/info/approve/spending-cap/__snapshots__/spending-cap.test.tsx.snap +++ b/ui/pages/confirmations/components/confirm/info/approve/spending-cap/__snapshots__/spending-cap.test.tsx.snap @@ -4,6 +4,7 @@ exports[` renders component 1`] = `
renders component 1`] = ` />
renders component 1`] = ` >
diff --git a/ui/pages/confirmations/components/confirm/info/approve/spending-cap/spending-cap.tsx b/ui/pages/confirmations/components/confirm/info/approve/spending-cap/spending-cap.tsx index 73f0ef773fa0..2ebd9d8e7e4e 100644 --- a/ui/pages/confirmations/components/confirm/info/approve/spending-cap/spending-cap.tsx +++ b/ui/pages/confirmations/components/confirm/info/approve/spending-cap/spending-cap.tsx @@ -62,6 +62,7 @@ const SpendingCapGroup = ({ {spendingCap === SPENDING_CAP_UNLIMITED_MSG ? ( {SpendingCapElement} @@ -105,7 +106,7 @@ export const SpendingCap = ({ } return ( - + diff --git a/ui/pages/confirmations/components/confirm/info/base-transaction-info/__snapshots__/base-transaction-info.test.tsx.snap b/ui/pages/confirmations/components/confirm/info/base-transaction-info/__snapshots__/base-transaction-info.test.tsx.snap index de72d2c1cfac..5a5e4583cf3d 100644 --- a/ui/pages/confirmations/components/confirm/info/base-transaction-info/__snapshots__/base-transaction-info.test.tsx.snap +++ b/ui/pages/confirmations/components/confirm/info/base-transaction-info/__snapshots__/base-transaction-info.test.tsx.snap @@ -113,6 +113,7 @@ exports[` renders component for contract interaction requ >
@@ -153,6 +154,7 @@ exports[` renders component for contract interaction requ >
@@ -246,6 +248,7 @@ exports[` renders component for contract interaction requ >
@@ -473,6 +476,7 @@ exports[` renders component for contract interaction requ >
@@ -513,6 +517,7 @@ exports[` renders component for contract interaction requ >
@@ -606,6 +611,7 @@ exports[` renders component for contract interaction requ >
@@ -830,6 +836,7 @@ exports[` renders component for contract interaction requ >
@@ -870,6 +877,7 @@ exports[` renders component for contract interaction requ > @@ -963,6 +971,7 @@ exports[` renders component for contract interaction requ > diff --git a/ui/pages/confirmations/components/confirm/info/shared/edit-gas-fees-row/__snapshots__/edit-gas-fees-row.test.tsx.snap b/ui/pages/confirmations/components/confirm/info/shared/edit-gas-fees-row/__snapshots__/edit-gas-fees-row.test.tsx.snap index f0702978aa6c..0508381f9fbb 100644 --- a/ui/pages/confirmations/components/confirm/info/shared/edit-gas-fees-row/__snapshots__/edit-gas-fees-row.test.tsx.snap +++ b/ui/pages/confirmations/components/confirm/info/shared/edit-gas-fees-row/__snapshots__/edit-gas-fees-row.test.tsx.snap @@ -27,6 +27,7 @@ exports[` renders component 1`] = ` > diff --git a/ui/pages/confirmations/components/confirm/info/shared/gas-fees-details/__snapshots__/gas-fees-details.test.tsx.snap b/ui/pages/confirmations/components/confirm/info/shared/gas-fees-details/__snapshots__/gas-fees-details.test.tsx.snap index f797ffdb66c8..9b01388f94f3 100644 --- a/ui/pages/confirmations/components/confirm/info/shared/gas-fees-details/__snapshots__/gas-fees-details.test.tsx.snap +++ b/ui/pages/confirmations/components/confirm/info/shared/gas-fees-details/__snapshots__/gas-fees-details.test.tsx.snap @@ -27,6 +27,7 @@ exports[` renders component for gas fees section 1`] = ` > diff --git a/ui/pages/confirmations/components/confirm/info/shared/gas-fees-section/__snapshots__/gas-fees-section.test.tsx.snap b/ui/pages/confirmations/components/confirm/info/shared/gas-fees-section/__snapshots__/gas-fees-section.test.tsx.snap index 42bb2073ffcf..6a3e7cb058d9 100644 --- a/ui/pages/confirmations/components/confirm/info/shared/gas-fees-section/__snapshots__/gas-fees-section.test.tsx.snap +++ b/ui/pages/confirmations/components/confirm/info/shared/gas-fees-section/__snapshots__/gas-fees-section.test.tsx.snap @@ -33,6 +33,7 @@ exports[` renders component for gas fees section 1`] = ` > diff --git a/ui/pages/confirmations/components/confirm/info/shared/transaction-data/__snapshots__/transaction-data.test.tsx.snap b/ui/pages/confirmations/components/confirm/info/shared/transaction-data/__snapshots__/transaction-data.test.tsx.snap index 02da6945d64a..22bd56481f11 100644 --- a/ui/pages/confirmations/components/confirm/info/shared/transaction-data/__snapshots__/transaction-data.test.tsx.snap +++ b/ui/pages/confirmations/components/confirm/info/shared/transaction-data/__snapshots__/transaction-data.test.tsx.snap @@ -102,6 +102,7 @@ exports[`TransactionData renders decoded data with names and descriptions 1`] = > @@ -154,6 +155,7 @@ exports[`TransactionData renders decoded data with names and descriptions 1`] = > @@ -250,6 +252,7 @@ exports[`TransactionData renders decoded data with names and descriptions 1`] = > @@ -302,6 +305,7 @@ exports[`TransactionData renders decoded data with names and descriptions 1`] = > @@ -343,6 +347,7 @@ exports[`TransactionData renders decoded data with names and descriptions 1`] = > @@ -384,6 +389,7 @@ exports[`TransactionData renders decoded data with names and descriptions 1`] = > @@ -502,6 +508,7 @@ exports[`TransactionData renders decoded data with names and descriptions 1`] = > @@ -598,6 +605,7 @@ exports[`TransactionData renders decoded data with names and descriptions 1`] = > @@ -650,6 +658,7 @@ exports[`TransactionData renders decoded data with names and descriptions 1`] = > @@ -702,6 +711,7 @@ exports[`TransactionData renders decoded data with names and descriptions 1`] = > @@ -798,6 +808,7 @@ exports[`TransactionData renders decoded data with names and descriptions 1`] = > @@ -850,6 +861,7 @@ exports[`TransactionData renders decoded data with names and descriptions 1`] = > @@ -902,6 +914,7 @@ exports[`TransactionData renders decoded data with names and descriptions 1`] = > @@ -1007,6 +1020,7 @@ exports[`TransactionData renders decoded data with no names 1`] = ` > @@ -1048,6 +1062,7 @@ exports[`TransactionData renders decoded data with no names 1`] = ` > @@ -1100,6 +1115,7 @@ exports[`TransactionData renders decoded data with no names 1`] = ` > @@ -1174,6 +1190,7 @@ exports[`TransactionData renders decoded data with tuples and arrays 1`] = ` > @@ -1218,6 +1235,7 @@ exports[`TransactionData renders decoded data with tuples and arrays 1`] = ` > @@ -1270,6 +1288,7 @@ exports[`TransactionData renders decoded data with tuples and arrays 1`] = ` > @@ -1304,6 +1323,7 @@ exports[`TransactionData renders decoded data with tuples and arrays 1`] = ` > @@ -1338,6 +1358,7 @@ exports[`TransactionData renders decoded data with tuples and arrays 1`] = ` > @@ -1372,6 +1393,7 @@ exports[`TransactionData renders decoded data with tuples and arrays 1`] = ` > @@ -1424,6 +1446,7 @@ exports[`TransactionData renders decoded data with tuples and arrays 1`] = ` > @@ -1465,6 +1488,7 @@ exports[`TransactionData renders decoded data with tuples and arrays 1`] = ` > @@ -1506,6 +1530,7 @@ exports[`TransactionData renders decoded data with tuples and arrays 1`] = ` > @@ -1548,6 +1573,7 @@ exports[`TransactionData renders decoded data with tuples and arrays 1`] = ` > @@ -1582,6 +1608,7 @@ exports[`TransactionData renders decoded data with tuples and arrays 1`] = ` > @@ -1634,6 +1661,7 @@ exports[`TransactionData renders decoded data with tuples and arrays 1`] = ` > @@ -1675,6 +1703,7 @@ exports[`TransactionData renders decoded data with tuples and arrays 1`] = ` > @@ -1716,6 +1745,7 @@ exports[`TransactionData renders decoded data with tuples and arrays 1`] = ` > @@ -1758,6 +1788,7 @@ exports[`TransactionData renders decoded data with tuples and arrays 1`] = ` > @@ -1792,6 +1823,7 @@ exports[`TransactionData renders decoded data with tuples and arrays 1`] = ` > @@ -1844,6 +1876,7 @@ exports[`TransactionData renders decoded data with tuples and arrays 1`] = ` > @@ -1885,6 +1918,7 @@ exports[`TransactionData renders decoded data with tuples and arrays 1`] = ` > @@ -1926,6 +1960,7 @@ exports[`TransactionData renders decoded data with tuples and arrays 1`] = ` > @@ -1969,6 +2004,7 @@ exports[`TransactionData renders decoded data with tuples and arrays 1`] = ` > @@ -2021,6 +2057,7 @@ exports[`TransactionData renders decoded data with tuples and arrays 1`] = ` > @@ -2063,6 +2100,7 @@ exports[`TransactionData renders decoded data with tuples and arrays 1`] = ` > diff --git a/ui/pages/confirmations/components/confirm/info/shared/transaction-details/__snapshots__/transaction-details.test.tsx.snap b/ui/pages/confirmations/components/confirm/info/shared/transaction-details/__snapshots__/transaction-details.test.tsx.snap index b65f3e74f8b8..8652c8f67128 100644 --- a/ui/pages/confirmations/components/confirm/info/shared/transaction-details/__snapshots__/transaction-details.test.tsx.snap +++ b/ui/pages/confirmations/components/confirm/info/shared/transaction-details/__snapshots__/transaction-details.test.tsx.snap @@ -40,6 +40,7 @@ exports[` renders component for transaction details 1`] = > @@ -80,6 +81,7 @@ exports[` renders component for transaction details 1`] = > From 1a6f212e57203438f0daff970e03a42483ecfdb6 Mon Sep 17 00:00:00 2001 From: Derek Brans Date: Wed, 18 Sep 2024 08:39:05 -0400 Subject: [PATCH 05/61] chore: smart-transactions code domain (#26948) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## **Description** This PR establishes the `ui/pages/smart-transactions` code domain, following the guidance in [this proposal](https://docs.google.com/document/d/1dzgWc1LCkYz2lZZ6X8SOaj23iaGYVQ2zJ1FVpOxsU-o/edit). Moved | To ui/pages/smart-transactions/ -- | -- ui/components/app/smart-transactions/smart-transactions-opt-in-modal.tsx | components/smart-transactions-opt-in-modal.tsx The following files will be left in place. | Left in place | Reason | |---------------------------------------------------------------------------------------|-------------------------------------------------------------------------------| app/scripts/lib/transaction/smart-transactions.ts | background code shared/constants/smartTransactions.ts | shared with background | `ui/components/app/transaction-list-item/smart-transaction-list-item.component.js` | Specific to the transaction list. | | `ui/pages/confirmations/confirmation/templates/smart-transaction-status-page.js` | Belongs with other confirmation templates. | | `ui/pages/swaps/smart-transaction-status/smart-transaction-status.js` | Swaps-focused. Will be replaced by regular STX status screen once swaps moves to regular STX. | ### STX-related code in other files The following files contain stx-related code, which may be extracted and moved into the smart-transactions code domain at a later time. | Path | STX-Related Code | |------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------| | `app/scripts/metamask-controller.js` | We use the STX controller there `new SmartTransactionsController`. `*// Smart Transactions` section* | | `ui/ducks/swaps/swaps.js` | A few functions related to STX: `fetchSmartTransactionsLiveness`, `signAndSendSmartTransaction`, `setSmartTransactionsRefreshInterval`, etc. | | `ui/store/actions.ts` | `fetchSmartTransactionsLiveness` and other STX functions | | `ui/pages/confirmations/confirm-transaction-base/confirm-transaction-base.container.js` | STX is used from this component | | `ui/pages/settings/advanced-tab/advanced-tab.component.js` | Advanced Settings that include STX option | | `ui/pages/swaps/swaps.util.ts` | `getFeeForSmartTransaction` | | `ui/pages/swaps/prepare-swap-page/review-quote.js` | Uses STX in Swaps | | `ui/selectors/transactions.js` | `allowedSwapsSmartTransactionStatusesForActivityList` | [![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/26948?quickstart=1) ## **Related issues** Fixes: ## **Manual testing steps** 1. Installed extension 2. Added account with crypto 3. Verify STX opt-in-modal 4. Send a smart transaction ## **Screenshots/Recordings** ### **Before** ### **After** ![image](https://github.com/user-attachments/assets/6d610e0d-48b8-43e5-9dff-774481966e77) ![image](https://github.com/user-attachments/assets/4a8f5c17-4e2e-402b-84ca-61c95ed08948) ![image](https://github.com/user-attachments/assets/0eae012c-4cfe-4272-94c2-12b7519af1cb) ![image](https://github.com/user-attachments/assets/2cd232e6-d279-4894-b2df-5fcee0a8a0c9) ## **Pre-merge author checklist** - [ ] I've followed [MetaMask Contributor Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Extension Coding Standards](https://github.com/MetaMask/metamask-extension/blob/develop/.github/guidelines/CODING_GUIDELINES.md). - [ ] I've completed the PR template to the best of my ability - [ ] I’ve included tests if applicable - [ ] I’ve documented my code using [JSDoc](https://jsdoc.app/) format if applicable - [ ] I’ve applied the right labels on the PR (see [labeling guidelines](https://github.com/MetaMask/metamask-extension/blob/develop/.github/guidelines/LABELING_GUIDELINES.md)). Not required for external contributors. ## **Pre-merge reviewer checklist** - [ ] I've manually tested the PR (e.g. pull and build branch, run the app, test code being changed). - [ ] I confirm that this PR addresses all acceptance criteria described in the ticket it closes and includes the necessary testing evidence such as recordings and or screenshots. --- ui/components/app/app-components.scss | 1 - ui/pages/home/home.component.js | 2 +- ui/pages/pages.scss | 2 +- .../__snapshots__/smart-transactions-opt-in-modal.test.tsx.snap | 0 .../smart-transactions/components}/index.scss | 0 .../components}/smart-transactions-opt-in-modal.test.tsx | 0 .../components}/smart-transactions-opt-in-modal.tsx | 2 +- ui/pages/smart-transactions/index.scss | 2 ++ 8 files changed, 5 insertions(+), 4 deletions(-) rename ui/{components/app/smart-transactions => pages/smart-transactions/components}/__snapshots__/smart-transactions-opt-in-modal.test.tsx.snap (100%) rename ui/{components/app/smart-transactions => pages/smart-transactions/components}/index.scss (100%) rename ui/{components/app/smart-transactions => pages/smart-transactions/components}/smart-transactions-opt-in-modal.test.tsx (100%) rename ui/{components/app/smart-transactions => pages/smart-transactions/components}/smart-transactions-opt-in-modal.tsx (99%) create mode 100644 ui/pages/smart-transactions/index.scss diff --git a/ui/components/app/app-components.scss b/ui/components/app/app-components.scss index cc9a08a53f1d..c5083af45104 100644 --- a/ui/components/app/app-components.scss +++ b/ui/components/app/app-components.scss @@ -51,7 +51,6 @@ @import 'recovery-phrase-reminder/index'; @import 'step-progress-bar/index.scss'; @import 'selected-account/index'; -@import 'smart-transactions/index'; @import 'srp-input/srp-input'; @import 'snaps/snap-privacy-warning/index'; @import 'tab-bar/index'; diff --git a/ui/pages/home/home.component.js b/ui/pages/home/home.component.js index 1c746869ad10..19b76a881c6c 100644 --- a/ui/pages/home/home.component.js +++ b/ui/pages/home/home.component.js @@ -13,7 +13,7 @@ import TermsOfUsePopup from '../../components/app/terms-of-use-popup'; import RecoveryPhraseReminder from '../../components/app/recovery-phrase-reminder'; import WhatsNewPopup from '../../components/app/whats-new-popup'; import { FirstTimeFlowType } from '../../../shared/constants/onboarding'; -import SmartTransactionsOptInModal from '../../components/app/smart-transactions/smart-transactions-opt-in-modal'; +import SmartTransactionsOptInModal from '../smart-transactions/components/smart-transactions-opt-in-modal'; ///: END:ONLY_INCLUDE_IF import HomeNotification from '../../components/app/home-notification'; import MultipleNotifications from '../../components/app/multiple-notifications'; diff --git a/ui/pages/pages.scss b/ui/pages/pages.scss index 01641f29774a..2578286032d2 100644 --- a/ui/pages/pages.scss +++ b/ui/pages/pages.scss @@ -22,10 +22,10 @@ @import 'onboarding-flow/index'; @import 'permissions-connect/index'; @import 'settings/index'; +@import 'smart-transactions/index'; @import 'snaps/snaps-list/index'; @import 'snaps/snap-view/index'; @import 'create-snap-account/index'; -@import 'smart-transactions/smart-transaction-status-page/index'; @import 'remove-snap-account/index'; @import 'swaps/index'; @import 'token-details/index'; diff --git a/ui/components/app/smart-transactions/__snapshots__/smart-transactions-opt-in-modal.test.tsx.snap b/ui/pages/smart-transactions/components/__snapshots__/smart-transactions-opt-in-modal.test.tsx.snap similarity index 100% rename from ui/components/app/smart-transactions/__snapshots__/smart-transactions-opt-in-modal.test.tsx.snap rename to ui/pages/smart-transactions/components/__snapshots__/smart-transactions-opt-in-modal.test.tsx.snap diff --git a/ui/components/app/smart-transactions/index.scss b/ui/pages/smart-transactions/components/index.scss similarity index 100% rename from ui/components/app/smart-transactions/index.scss rename to ui/pages/smart-transactions/components/index.scss diff --git a/ui/components/app/smart-transactions/smart-transactions-opt-in-modal.test.tsx b/ui/pages/smart-transactions/components/smart-transactions-opt-in-modal.test.tsx similarity index 100% rename from ui/components/app/smart-transactions/smart-transactions-opt-in-modal.test.tsx rename to ui/pages/smart-transactions/components/smart-transactions-opt-in-modal.test.tsx diff --git a/ui/components/app/smart-transactions/smart-transactions-opt-in-modal.tsx b/ui/pages/smart-transactions/components/smart-transactions-opt-in-modal.tsx similarity index 99% rename from ui/components/app/smart-transactions/smart-transactions-opt-in-modal.tsx rename to ui/pages/smart-transactions/components/smart-transactions-opt-in-modal.tsx index 5b8ff09f9237..78055de42831 100644 --- a/ui/components/app/smart-transactions/smart-transactions-opt-in-modal.tsx +++ b/ui/pages/smart-transactions/components/smart-transactions-opt-in-modal.tsx @@ -27,7 +27,7 @@ import { ButtonLinkSize, Icon, IconName, -} from '../../component-library'; +} from '../../../components/component-library'; import { setSmartTransactionsOptInStatus } from '../../../store/actions'; import { SMART_TRANSACTIONS_LEARN_MORE_URL } from '../../../../shared/constants/smartTransactions'; diff --git a/ui/pages/smart-transactions/index.scss b/ui/pages/smart-transactions/index.scss new file mode 100644 index 000000000000..8ef1b35cd611 --- /dev/null +++ b/ui/pages/smart-transactions/index.scss @@ -0,0 +1,2 @@ +@import './smart-transaction-status-page/index'; +@import './components/index'; From 313adea121a00259203d22e19f9d5b7a6efde8b8 Mon Sep 17 00:00:00 2001 From: Pedro Figueiredo Date: Wed, 18 Sep 2024 14:56:23 +0100 Subject: [PATCH 06/61] fix: Estimated fee in redesigned screens (#27247) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## **Description** `maxFeePerGas`, `maxPriorityFeePerGas` and `estimatedBaseFee` are decimal values that should be converted before being used inside `multiplyHexes` and `addHexes`. `estimatedBaseFee` also needs to be converted to wei. [![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/27247?quickstart=1) ## **Related issues** Fixes: ## **Manual testing steps** 1. Go to this page... 2. 3. ## **Screenshots/Recordings** ### **Before** #### Old Flow Screenshot 2024-09-18 at 13 40 13 #### Redesigned Flow Screenshot 2024-09-18 at 13 39 49 ### **After** #### Redesigned Flow Screenshot 2024-09-18 at 13 37 13 ## **Pre-merge author checklist** - [ ] I've followed [MetaMask Contributor Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Extension Coding Standards](https://github.com/MetaMask/metamask-extension/blob/develop/.github/guidelines/CODING_GUIDELINES.md). - [ ] I've completed the PR template to the best of my ability - [ ] I’ve included tests if applicable - [ ] I’ve documented my code using [JSDoc](https://jsdoc.app/) format if applicable - [ ] I’ve applied the right labels on the PR (see [labeling guidelines](https://github.com/MetaMask/metamask-extension/blob/develop/.github/guidelines/LABELING_GUIDELINES.md)). Not required for external contributors. ## **Pre-merge reviewer checklist** - [ ] I've manually tested the PR (e.g. pull and build branch, run the app, test code being changed). - [ ] I confirm that this PR addresses all acceptance criteria described in the ticket it closes and includes the necessary testing evidence such as recordings and or screenshots. --- shared/modules/conversion.utils.ts | 2 +- .../transactions/contract-interaction.test.tsx | 8 ++++---- .../info/approve/__snapshots__/approve.test.tsx.snap | 8 ++++---- .../base-transaction-info.test.tsx.snap | 12 ++++++------ .../confirm/info/hooks/useFeeCalculations.test.ts | 12 ++++++------ .../confirm/info/hooks/useFeeCalculations.ts | 10 ++++++---- .../__snapshots__/gas-fees-details.test.tsx.snap | 4 ++-- .../__snapshots__/gas-fees-section.test.tsx.snap | 4 ++-- 8 files changed, 31 insertions(+), 29 deletions(-) diff --git a/shared/modules/conversion.utils.ts b/shared/modules/conversion.utils.ts index d9fd2262f843..75da336eb8e6 100644 --- a/shared/modules/conversion.utils.ts +++ b/shared/modules/conversion.utils.ts @@ -4,7 +4,7 @@ import { addHexPrefix, BN } from 'ethereumjs-util'; import { EtherDenomination } from '../constants/common'; import { Numeric, NumericValue } from './Numeric'; -export function decGWEIToHexWEI(decGWEI: number) { +export function decGWEIToHexWEI(decGWEI: NumericValue) { return new Numeric(decGWEI, 10, EtherDenomination.GWEI) .toBase(16) .toDenomination(EtherDenomination.WEI) diff --git a/test/integration/confirmations/transactions/contract-interaction.test.tsx b/test/integration/confirmations/transactions/contract-interaction.test.tsx index cea1ed6f54bc..cd5953db50b8 100644 --- a/test/integration/confirmations/transactions/contract-interaction.test.tsx +++ b/test/integration/confirmations/transactions/contract-interaction.test.tsx @@ -293,10 +293,10 @@ describe('Contract Interaction Confirmation', () => { expect(editGasFeesRow).toHaveTextContent('Network fee'); const firstGasField = within(editGasFeesRow).getByTestId('first-gas-field'); - expect(firstGasField).toHaveTextContent('0.0084 ETH'); + expect(firstGasField).toHaveTextContent('0.0001 ETH'); const editGasFeeNativeCurrency = within(editGasFeesRow).getByTestId('native-currency'); - expect(editGasFeeNativeCurrency).toHaveTextContent('$28.50'); + expect(editGasFeeNativeCurrency).toHaveTextContent('$0.47'); expect(editGasFeesRow).toContainElement( screen.getByTestId('edit-gas-fee-icon'), ); @@ -394,8 +394,8 @@ describe('Contract Interaction Confirmation', () => { const maxFee = screen.getByTestId('gas-fee-details-max-fee'); expect(gasFeesSection).toContainElement(maxFee); expect(maxFee).toHaveTextContent('Max fee'); - expect(maxFee).toHaveTextContent('0.2313 ETH'); - expect(maxFee).toHaveTextContent('$787.37'); + expect(maxFee).toHaveTextContent('0.0023 ETH'); + expect(maxFee).toHaveTextContent('$7.72'); const nonceSection = screen.getByTestId('advanced-details-nonce-section'); expect(nonceSection).toBeInTheDocument(); diff --git a/ui/pages/confirmations/components/confirm/info/approve/__snapshots__/approve.test.tsx.snap b/ui/pages/confirmations/components/confirm/info/approve/__snapshots__/approve.test.tsx.snap index ee8bff7a53dd..34fd469e0571 100644 --- a/ui/pages/confirmations/components/confirm/info/approve/__snapshots__/approve.test.tsx.snap +++ b/ui/pages/confirmations/components/confirm/info/approve/__snapshots__/approve.test.tsx.snap @@ -451,13 +451,13 @@ exports[` renders component for approve request 1`] = ` class="mm-box mm-text mm-text--body-md mm-box--margin-right-1 mm-box--color-text-default" data-testid="first-gas-field" > - 0.004 ETH + 0.0001 ETH

- $2.20 + $0.04

+
+ +
+ +
+
+ +
+
+
+ C +
+
+
+ + + +
+
+

+ MUNK #1 +

+
+
+

+

+
+
+

+ Contract address +

+
+ + +
+
+
+

+ Token ID +

+

+ 1 +

+
+
+

+ Token standard +

+

+ ERC721 +

+
+
+ +
+
+
+ Disclaimer: MetaMask pulls the media file from the source url. This url sometimes gets changed by the marketplace on which the NFT was minted. +
+
+
+
+ + + +`; + +exports[`NFT Details should match minimal props and state snapshot 2`] = `
`; + +exports[`NFT Details should match minimal props and state snapshot 3`] = `
`; diff --git a/ui/components/app/assets/nfts/nft-details/__snapshots__/nft-full-image.test.js.snap b/ui/components/app/assets/nfts/nft-details/__snapshots__/nft-full-image.test.js.snap new file mode 100644 index 000000000000..dfedee737c93 --- /dev/null +++ b/ui/components/app/assets/nfts/nft-details/__snapshots__/nft-full-image.test.js.snap @@ -0,0 +1,84 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`NFT full image should match snapshot 1`] = ` +
+
+
+
+
+
+

+

+
+ +
+
+
+
+
+ +
+
+
+
+
+
+
+`; + +exports[`NFT full image should match snapshot 2`] = `
`; diff --git a/ui/components/app/assets/nfts/nft-details/nft-details.test.js b/ui/components/app/assets/nfts/nft-details/nft-details.test.js index 65c3ba339e5f..350dc4813c6a 100644 --- a/ui/components/app/assets/nfts/nft-details/nft-details.test.js +++ b/ui/components/app/assets/nfts/nft-details/nft-details.test.js @@ -19,8 +19,17 @@ import { } from '../../../../../store/actions'; import { CHAIN_IDS } from '../../../../../../shared/constants/network'; import { mockNetworkState } from '../../../../../../test/stub/networks'; +import { + getAssetImageURL, + shortenAddress, +} from '../../../../../helpers/utils/util'; import NftDetails from './nft-details'; +jest.mock('../../../../../helpers/utils/util', () => ({ + getAssetImageURL: jest.fn(), + shortenAddress: jest.fn(), +})); + jest.mock('copy-to-clipboard'); const mockHistoryPush = jest.fn(); @@ -62,13 +71,20 @@ describe('NFT Details', () => { jest.clearAllMocks(); }); - it('should match minimal props and state snapshot', () => { + it('should match minimal props and state snapshot', async () => { + getAssetImageURL.mockResolvedValue( + 'https://bafybeiclzx7zfjvuiuwobn5ip3ogc236bjqfjzoblumf4pau4ep6dqramu.ipfs.dweb.link', + ); + shortenAddress.mockReturnValue('0xDc738...06414'); + const { container } = renderWithProvider( , mockStore, ); - expect(container).toMatchSnapshot(); + await waitFor(() => { + expect(container).toMatchSnapshot(); + }); }); it(`should route to '/' route when the back button is clicked`, () => { diff --git a/ui/components/app/assets/nfts/nft-details/nft-details.tsx b/ui/components/app/assets/nfts/nft-details/nft-details.tsx index 0064dc38976c..8a857da43989 100644 --- a/ui/components/app/assets/nfts/nft-details/nft-details.tsx +++ b/ui/components/app/assets/nfts/nft-details/nft-details.tsx @@ -18,10 +18,7 @@ import { AlignItems, } from '../../../../../helpers/constants/design-system'; import { useI18nContext } from '../../../../../hooks/useI18nContext'; -import { - getAssetImageURL, - shortenAddress, -} from '../../../../../helpers/utils/util'; +import { shortenAddress } from '../../../../../helpers/utils/util'; import { getNftImageAlt } from '../../../../../helpers/utils/nfts'; import { getCurrentChainId, @@ -73,6 +70,7 @@ import { SWAPS_CHAINID_DEFAULT_BLOCK_EXPLORER_URL_MAP } from '../../../../../../ import { getConversionRate } from '../../../../../ducks/metamask/metamask'; import { Numeric } from '../../../../../../shared/modules/Numeric'; import { addUrlProtocolPrefix } from '../../../../../../app/scripts/lib/util'; +import useGetAssetImageUrl from '../../../../../hooks/useGetAssetImageUrl'; import NftDetailInformationRow from './nft-detail-information-row'; import NftDetailInformationFrame from './nft-detail-information-frame'; import NftDetailDescription from './nft-detail-description'; @@ -110,9 +108,10 @@ export default function NftDetails({ nft }: { nft: Nft }) { const nftImageAlt = getNftImageAlt(nft); const nftSrcUrl = imageOriginal ?? image; - const nftImageURL = getAssetImageURL(imageOriginal ?? image, ipfsGateway); const isIpfsURL = nftSrcUrl?.startsWith('ipfs:'); - const isImageHosted = image?.startsWith('https:'); + const isImageHosted = + image?.startsWith('https:') || image?.startsWith('http:'); + const nftImageURL = useGetAssetImageUrl(imageOriginal ?? image, ipfsGateway); const hasFloorAskPrice = Boolean( collection?.floorAsk?.price?.amount?.usd && @@ -165,6 +164,7 @@ export default function NftDetails({ nft }: { nft: Nft }) { }; const { chainId } = currentChain; + useEffect(() => { trackEvent({ event: MetaMetricsEventName.NftDetailsOpened, diff --git a/ui/components/app/assets/nfts/nft-details/nft-full-image.test.js b/ui/components/app/assets/nfts/nft-details/nft-full-image.test.js new file mode 100644 index 000000000000..193025a402ac --- /dev/null +++ b/ui/components/app/assets/nfts/nft-details/nft-full-image.test.js @@ -0,0 +1,45 @@ +import { waitFor } from '@testing-library/react'; +import React from 'react'; +import configureMockStore from 'redux-mock-store'; +import thunk from 'redux-thunk'; +import { toHex } from '@metamask/controller-utils'; +import { renderWithProvider } from '../../../../../../test/lib/render-helpers'; +import mockState from '../../../../../../test/data/mock-state.json'; +import NftFullImage from './nft-full-image'; + +const selectedAddress = + mockState.metamask.internalAccounts.accounts[ + mockState.metamask.internalAccounts.selectedAccount + ].address; +const nfts = mockState.metamask.allNfts[selectedAddress][toHex(5)]; +const mockAsset = nfts[0].address; +const mockId = nfts[0].tokenId; +jest.mock('react-router-dom', () => { + const original = jest.requireActual('react-router-dom'); + return { + ...original, + useHistory: () => ({ + push: jest.fn(), + }), + useParams: () => ({ + asset: mockAsset, + id: mockId, + }), + }; +}); + +describe('NFT full image', () => { + const mockStore = configureMockStore([thunk])(mockState); + + beforeEach(() => { + jest.clearAllMocks(); + }); + + it('should match snapshot', async () => { + const { container } = renderWithProvider(, mockStore); + + await waitFor(() => { + expect(container).toMatchSnapshot(); + }); + }); +}); diff --git a/ui/components/app/assets/nfts/nft-details/nft-full-image.tsx b/ui/components/app/assets/nfts/nft-details/nft-full-image.tsx index 3d09cba1ddc4..64e2a3191c0e 100644 --- a/ui/components/app/assets/nfts/nft-details/nft-full-image.tsx +++ b/ui/components/app/assets/nfts/nft-details/nft-full-image.tsx @@ -1,7 +1,6 @@ import React, { useEffect, useState } from 'react'; import { useSelector } from 'react-redux'; import { useHistory, useParams } from 'react-router-dom'; -import { getAssetImageURL } from '../../../../../helpers/utils/util'; import { getNftImageAlt } from '../../../../../helpers/utils/nfts'; import { getCurrentNetwork, getIpfsGateway } from '../../../../../selectors'; @@ -23,6 +22,7 @@ import { } from '../../../../../helpers/constants/design-system'; import { useI18nContext } from '../../../../../hooks/useI18nContext'; import { ASSET_ROUTE } from '../../../../../helpers/constants/routes'; +import useGetAssetImageUrl from '../../../../../hooks/useGetAssetImageUrl'; export default function NftFullImage() { const t = useI18nContext(); @@ -37,10 +37,10 @@ export default function NftFullImage() { const ipfsGateway = useSelector(getIpfsGateway); const currentChain = useSelector(getCurrentNetwork); + const nftImageURL = useGetAssetImageUrl(imageOriginal ?? image, ipfsGateway); const nftImageAlt = getNftImageAlt(nft); const nftSrcUrl = imageOriginal ?? image; - const nftImageURL = getAssetImageURL(imageOriginal ?? image, ipfsGateway); const isIpfsURL = nftSrcUrl?.startsWith('ipfs:'); const isImageHosted = image?.startsWith('https:'); const history = useHistory(); diff --git a/ui/components/app/assets/nfts/nfts-items/collection-image.component.test.tsx b/ui/components/app/assets/nfts/nfts-items/collection-image.component.test.tsx new file mode 100644 index 000000000000..726ca26508b9 --- /dev/null +++ b/ui/components/app/assets/nfts/nfts-items/collection-image.component.test.tsx @@ -0,0 +1,86 @@ +import React from 'react'; +import { useSelector } from 'react-redux'; +import configureMockStore from 'redux-mock-store'; +import thunk from 'redux-thunk'; +import { screen } from '@testing-library/react'; +import mockState from '../../../../../../test/data/mock-state.json'; +import { renderWithProvider } from '../../../../../../test/lib/render-helpers'; +import { getIpfsGateway, getOpenSeaEnabled } from '../../../../../selectors'; +import { CollectionImageComponent } from './collection-image.component'; + +jest.mock('react-redux', () => ({ + ...jest.requireActual('react-redux'), + useSelector: jest.fn(), +})); + +jest.mock('../../../../../selectors', () => ({ + ...jest.requireActual('../../../../../selectors'), + getIpfsGateway: jest.fn(), + getOpenSeaEnabled: jest.fn(), +})); +const mockStore = configureMockStore([thunk])(mockState); +describe('CollectionImageComponent', () => { + const useSelectorMock = useSelector as jest.Mock; + beforeEach(() => { + jest.resetAllMocks(); + }); + it('should show collection first letter when ipfs is not enabled', async () => { + useSelectorMock.mockImplementation((selector) => { + if (selector === getIpfsGateway) { + return undefined; + } + return undefined; + }); + + const props = { + collectionName: 'NFT Collection', + collectionImage: 'ipfs://', + }; + + const { getByText } = renderWithProvider( + , + mockStore, + ); + + expect(getByText('N')).toBeInTheDocument(); + }); + + it('should show collection first letter when opensea is not enabled', async () => { + useSelectorMock.mockImplementation((selector) => { + if (selector === getOpenSeaEnabled) { + return false; + } + return undefined; + }); + + const props = { + collectionName: 'Test NFT Collection', + collectionImage: 'https://image.png', + }; + + const { getByText } = renderWithProvider( + , + mockStore, + ); + + expect(getByText('T')).toBeInTheDocument(); + }); + + it('should show collection image', async () => { + useSelectorMock.mockImplementation((selector) => { + if (selector === getOpenSeaEnabled) { + return true; + } + return undefined; + }); + + const props = { + collectionName: 'Test NFT Collection', + collectionImage: 'https://image.png', + }; + + renderWithProvider(, mockStore); + + expect(screen.getAllByRole('img')).toHaveLength(1); + }); +}); diff --git a/ui/components/app/assets/nfts/nfts-items/collection-image.component.tsx b/ui/components/app/assets/nfts/nfts-items/collection-image.component.tsx new file mode 100644 index 000000000000..24f34714dd95 --- /dev/null +++ b/ui/components/app/assets/nfts/nfts-items/collection-image.component.tsx @@ -0,0 +1,53 @@ +import React from 'react'; + +import { useSelector } from 'react-redux'; + +import { getIpfsGateway, getOpenSeaEnabled } from '../../../../../selectors'; +import useGetAssetImageUrl from '../../../../../hooks/useGetAssetImageUrl'; +import { Box } from '../../../../component-library'; + +export const CollectionImageComponent = ({ + collectionImage, + collectionName, +}: { + collectionImage: string; + collectionName: string; +}) => { + const ipfsGateway = useSelector(getIpfsGateway); + const openSeaEnabled = useSelector(getOpenSeaEnabled); + const nftImageURL = useGetAssetImageUrl(collectionImage, ipfsGateway); + + const renderCollectionImage = () => { + if (collectionImage?.startsWith('ipfs') && !ipfsGateway) { + return ( +
+ {collectionName?.[0]?.toUpperCase() ?? null} +
+ ); + } + if (!openSeaEnabled && !collectionImage?.startsWith('ipfs')) { + return ( +
+ {collectionName?.[0]?.toUpperCase() ?? null} +
+ ); + } + + if (collectionImage) { + return ( + {collectionName} + ); + } + return ( +
+ {collectionName?.[0]?.toUpperCase() ?? null} +
+ ); + }; + + return {renderCollectionImage()}; +}; diff --git a/ui/components/app/assets/nfts/nfts-items/nfts-items.js b/ui/components/app/assets/nfts/nfts-items/nfts-items.js index 9e8196669b0e..c44de72b261b 100644 --- a/ui/components/app/assets/nfts/nfts-items/nfts-items.js +++ b/ui/components/app/assets/nfts/nfts-items/nfts-items.js @@ -1,4 +1,4 @@ -import React, { useContext, useEffect } from 'react'; +import React, { useContext, useEffect, useState } from 'react'; import PropTypes from 'prop-types'; import { useDispatch, useSelector } from 'react-redux'; import { useHistory } from 'react-router-dom'; @@ -22,7 +22,6 @@ import { getIpfsGateway, getSelectedInternalAccount, getCurrentNetwork, - getOpenSeaEnabled, } from '../../../../../selectors'; import { ASSET_ROUTE, @@ -46,6 +45,8 @@ import { MetaMetricsEventCategory, MetaMetricsEventName, } from '../../../../../../shared/constants/metametrics'; +import { isEqualCaseInsensitive } from '../../../../../../shared/modules/string-utils'; +import { CollectionImageComponent } from './collection-image.component'; const width = (isModal) => { const env = getEnvironmentType() === ENVIRONMENT_TYPE_POPUP; @@ -78,7 +79,8 @@ export default function NftsItems({ const currentChain = useSelector(getCurrentNetwork); const t = useI18nContext(); const ipfsGateway = useSelector(getIpfsGateway); - const openSeaEnabled = useSelector(getOpenSeaEnabled); + + const [updatedNfts, setUpdatedNfts] = useState([]); const trackEvent = useContext(MetaMetricsContext); const sendAnalytics = useSelector(getSendAnalyticProperties); @@ -116,39 +118,40 @@ export default function NftsItems({ dispatch, ]); - const history = useHistory(); + const getAssetImageUrlAndUpdate = async (image, nft) => { + const nftImage = await getAssetImageURL(image, ipfsGateway); + const updatedNFt = { + ...nft, + ipfsImageUpdated: nftImage, + }; + return updatedNFt; + }; - const renderCollectionImage = (collectionImage, collectionName) => { - if (collectionImage?.startsWith('ipfs') && !ipfsGateway) { - return ( -
- {collectionName?.[0]?.toUpperCase() ?? null} -
- ); - } - if (!openSeaEnabled && !collectionImage?.startsWith('ipfs')) { - return ( -
- {collectionName?.[0]?.toUpperCase() ?? null} -
- ); - } + useEffect(() => { + const promisesArr = []; + const modifyItems = async () => { + for (const key of collectionsKeys) { + const { nfts } = collections[key]; + for (const singleNft of nfts) { + const { image, imageOriginal } = singleNft; - if (collectionImage) { - return ( - {collectionName} - ); - } - return ( -
- {collectionName?.[0]?.toUpperCase() ?? null} -
- ); - }; + const isImageHosted = + image?.startsWith('https:') || image?.startsWith('http:'); + if (!isImageHosted) { + promisesArr.push( + getAssetImageUrlAndUpdate(imageOriginal ?? image, singleNft), + ); + } + } + } + const settled = await Promise.all(promisesArr); + setUpdatedNfts(settled); + }; + + modifyItems(); + }, []); + + const history = useHistory(); const updateNftDropDownStateKey = (key, isExpanded) => { const newCurrentAccountState = { @@ -198,6 +201,19 @@ export default function NftsItems({ if (!nfts.length) { return null; } + const getSource = (isImageHosted, nft) => { + if (!isImageHosted) { + const found = updatedNfts.find( + (elm) => + elm.tokenId === nft.tokenId && + isEqualCaseInsensitive(elm.address, nft.address), + ); + if (found) { + return found.ipfsImageUpdated; + } + } + return nft.image; + }; const isExpanded = nftsDropdownState[selectedAddress]?.[chainId]?.[key]; return ( @@ -220,7 +236,10 @@ export default function NftsItems({ alignItems={AlignItems.center} className="nfts-items__collection-header" > - {renderCollectionImage(collectionImage, collectionName)} + { const { image, address, tokenId, name, imageOriginal, tokenURI } = nft; - const nftImage = getAssetImageURL( - imageOriginal ?? image, - ipfsGateway, - ); const nftImageAlt = getNftImageAlt(nft); - const isImageHosted = image?.startsWith('https:'); - const nftImageURL = imageOriginal?.startsWith('ipfs') - ? nftImage - : image; + const isImageHosted = + image?.startsWith('https:') || image?.startsWith('http:'); + + const source = getSource(isImageHosted, nft); + const isIpfsURL = ( imageOriginal ?? image ?? @@ -271,9 +287,8 @@ export default function NftsItems({ className="nfts-items__item-wrapper" > { @@ -168,7 +172,7 @@ export const AssetPickerAmount = ({ standardizedAsset = { type: asset.type, image: - getAssetImageURL(asset.details.image, ipfsGateway) || + nftImageURL || (tokenList && asset.details?.address && tokenList[asset.details.address.toLowerCase()]?.iconUrl), diff --git a/ui/components/multichain/pages/send/components/recipient-content.tsx b/ui/components/multichain/pages/send/components/recipient-content.tsx index d6c8f00b446c..5c32bb5f3b66 100644 --- a/ui/components/multichain/pages/send/components/recipient-content.tsx +++ b/ui/components/multichain/pages/send/components/recipient-content.tsx @@ -45,13 +45,13 @@ import { getTokenList, getUseExternalServices, } from '../../../../../selectors'; +import useGetAssetImageUrl from '../../../../../hooks/useGetAssetImageUrl'; ///: END:ONLY_INCLUDE_IF import type { Quote } from '../../../../../ducks/send/swap-and-send-utils'; import { isEqualCaseInsensitive } from '../../../../../../shared/modules/string-utils'; import { AssetPicker } from '../../../asset-picker-amount/asset-picker'; import { TabName } from '../../../asset-picker-amount/asset-picker-modal/asset-picker-modal-tabs'; -import { getAssetImageURL } from '../../../../../helpers/utils/util'; import { SendHexData, SendPageRow, QuoteCard } from '.'; export const SendPageRecipientContent = ({ @@ -94,6 +94,11 @@ export const SendPageRecipientContent = ({ const tokenList = useSelector(getTokenList) as TokenListMap; const ipfsGateway = useSelector(getIpfsGateway); + const nftImageURL = useGetAssetImageUrl( + sendAsset.details?.image ?? null, + ipfsGateway, + ); + isSwapAllowed = isSwapsChain && !isSwapAndSendDisabledForNetwork && @@ -169,7 +174,7 @@ export const SendPageRecipientContent = ({ ? nativeCurrencyImageUrl : tokenList && sendAsset.details && - (getAssetImageURL(sendAsset.details?.image, ipfsGateway) || + (nftImageURL || tokenList[sendAsset.details.address?.toLowerCase()] ?.iconUrl), symbol: sendAsset?.details?.symbol || nativeCurrencySymbol, diff --git a/ui/components/ui/identicon/identicon.component.js b/ui/components/ui/identicon/identicon.component.js index 50b9075acb8c..0eb05822d292 100644 --- a/ui/components/ui/identicon/identicon.component.js +++ b/ui/components/ui/identicon/identicon.component.js @@ -12,6 +12,9 @@ const getStyles = (diameter) => ({ width: diameter, borderRadius: diameter / 2, }); +const getImage = async (image, ipfsGateway) => { + return await getAssetImageURL(image, ipfsGateway); +}; export default class Identicon extends Component { static propTypes = { @@ -65,6 +68,7 @@ export default class Identicon extends Component { state = { imageLoadingError: false, + imageUrl: '', }; static defaultProps = { @@ -79,9 +83,25 @@ export default class Identicon extends Component { watchedNftContracts: {}, }; + loadImage = async () => { + const result = await getImage(this.props.image, this.props.ipfsGateway); + this.setState({ imageUrl: result }); + }; + + async componentDidMount() { + this.loadImage(); + } + + async componentDidUpdate(prevProps) { + if (prevProps.image !== this.props.image) { + this.loadImage(); + } + } + renderImage() { - const { className, diameter, alt, imageBorder, ipfsGateway } = this.props; + const { className, diameter, alt, imageBorder } = this.props; let { image } = this.props; + const { imageUrl } = this.state; if (Array.isArray(image) && image.length) { image = image[0]; @@ -91,7 +111,7 @@ export default class Identicon extends Component { typeof image === 'string' && image.toLowerCase().startsWith('ipfs://') ) { - image = getAssetImageURL(image, ipfsGateway); + image = imageUrl; } return ( diff --git a/ui/helpers/utils/util.js b/ui/helpers/utils/util.js index 7eeab828a750..051dec05d1f9 100644 --- a/ui/helpers/utils/util.js +++ b/ui/helpers/utils/util.js @@ -562,7 +562,7 @@ export const sanitizeMessage = (msg, primaryType, types) => { return { value: sanitizedStruct, type: primaryType }; }; -export function getAssetImageURL(image, ipfsGateway) { +export async function getAssetImageURL(image, ipfsGateway) { if (!image || typeof image !== 'string') { return ''; } @@ -593,7 +593,7 @@ export function getAssetImageURL(image, ipfsGateway) { // In the future, we can look into solving the root cause, which might require // no longer using multiform's CID.parse() method within the assets-controller try { - return getFormattedIpfsUrl(ipfsGateway, image, true); + return await getFormattedIpfsUrl(ipfsGateway, image, true); } catch (e) { logErrorWithMessage(e); return ''; diff --git a/ui/hooks/useGetAssetImageUrl.test.ts b/ui/hooks/useGetAssetImageUrl.test.ts new file mode 100644 index 000000000000..a6fe1bdc68a3 --- /dev/null +++ b/ui/hooks/useGetAssetImageUrl.test.ts @@ -0,0 +1,47 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +import { renderHook } from '@testing-library/react-hooks'; +import { act } from 'react-dom/test-utils'; +import { getAssetImageURL } from '../helpers/utils/util'; +import useGetAssetImageUrl from './useGetAssetImageUrl'; + +jest.mock('../helpers/utils/util', () => ({ + getAssetImageURL: jest.fn(), +})); + +const mockGetAssetImageURL = getAssetImageURL as jest.Mock; +const testIpfsGateway = 'dweb.link'; +describe('useGetAssetImageUrl', () => { + it('should return data successfully', async () => { + const testIpfsImg = + 'ipfs://bafybeieazx4q4ofby24w6n6ftmpad65k4u3vkavv6qnmsazwoe6gaced7m/728.png'; + const expectedRes = + 'https://bafybeieazx4q4ofby24w6n6ftmpad65k4u3vkavv6qnmsazwoe6gaced7m.ipfs.dweb.link/728.png'; + + mockGetAssetImageURL.mockResolvedValueOnce(expectedRes); + let result; + + await act(async () => { + result = renderHook(() => + useGetAssetImageUrl(testIpfsImg, testIpfsGateway), + ); + }); + + expect((result as unknown as Record).result.current).toEqual( + expectedRes, + ); + }); + + it('should return data successfully when image is null', async () => { + mockGetAssetImageURL.mockResolvedValueOnce(''); + const testImage = null; + let result; + await act(async () => { + result = renderHook(() => + useGetAssetImageUrl(testImage, testIpfsGateway), + ); + }); + expect((result as unknown as Record).result.current).toEqual( + '', + ); + }); +}); diff --git a/ui/hooks/useGetAssetImageUrl.ts b/ui/hooks/useGetAssetImageUrl.ts new file mode 100644 index 000000000000..b84a588ff68d --- /dev/null +++ b/ui/hooks/useGetAssetImageUrl.ts @@ -0,0 +1,19 @@ +import { useState, useEffect } from 'react'; +import { getAssetImageURL } from '../helpers/utils/util'; + +const useGetAssetImageUrl = (image: string | null, ipfsGateway: string) => { + const [imageUrl, setImageUrl] = useState(''); + + useEffect(() => { + const getAssetImgUrl = async () => { + const assetImageUrl = await getAssetImageURL(image, ipfsGateway); + setImageUrl(assetImageUrl); + }; + + getAssetImgUrl(); + }, [image, ipfsGateway]); + + return imageUrl; +}; + +export default useGetAssetImageUrl; diff --git a/ui/pages/confirm-add-suggested-nft/confirm-add-suggested-nft.js b/ui/pages/confirm-add-suggested-nft/confirm-add-suggested-nft.js index c5be9de7c9f8..822db143d29a 100644 --- a/ui/pages/confirm-add-suggested-nft/confirm-add-suggested-nft.js +++ b/ui/pages/confirm-add-suggested-nft/confirm-add-suggested-nft.js @@ -1,4 +1,4 @@ -import React, { useCallback, useContext, useEffect } from 'react'; +import React, { useCallback, useContext, useEffect, useState } from 'react'; import { useDispatch, useSelector } from 'react-redux'; import { useHistory } from 'react-router-dom'; import { ethErrors, serializeError } from 'eth-rpc-errors'; @@ -59,6 +59,7 @@ import { PRIMARY } from '../../helpers/constants/common'; import { useUserPreferencedCurrency } from '../../hooks/useUserPreferencedCurrency'; import { useCurrencyDisplay } from '../../hooks/useCurrencyDisplay'; import { useOriginMetadata } from '../../hooks/useOriginMetadata'; +import { isEqualCaseInsensitive } from '../../../shared/modules/string-utils'; const ConfirmAddSuggestedNFT = () => { const t = useContext(I18nContext); @@ -80,6 +81,7 @@ const ConfirmAddSuggestedNFT = () => { const accountName = useSelector((state) => getAddressBookEntryOrAccountName(state, selectedAddress), ); + const [suggestedNftsWithImages, setSuggestedNftsWithImages] = useState([]); const networkName = NETWORK_TO_NAME_MAP[chainId] || networkIdentifier; @@ -152,6 +154,32 @@ const ConfirmAddSuggestedNFT = () => { } } + useEffect(() => { + const addImageUrlToSuggestedNFTs = async () => { + const suggestedNftWithImages = await Promise.all( + suggestedNfts.map(async (item) => { + const imgUrl = await getAssetImageURL( + item.requestData.asset.image, + ipfsGateway, + ); + return { + ...item, + requestData: { + ...item.requestData, + asset: { + ...item.requestData.asset, + assetImageUrl: imgUrl, + }, + }, + }; + }), + ); + setSuggestedNftsWithImages(suggestedNftWithImages); + }; + + addImageUrlToSuggestedNFTs(); + }, []); // Empty dependency array to run only on mount + return ( { ({ id, requestData: { - asset: { address, tokenId, symbol, image, name }, + asset: { address, tokenId, symbol, name }, }, }) => { - const nftImageURL = getAssetImageURL(image, ipfsGateway); + const found = suggestedNftsWithImages.find( + (elm) => + elm.requestData.asset.tokenId === tokenId && + isEqualCaseInsensitive( + elm.requestData.asset.address, + address, + ), + ); + + const nftImageURL = found + ? found.requestData.asset.assetImageUrl + : ''; + const blockExplorerLink = getTokenTrackerLink( address, chainId, diff --git a/ui/pages/confirm-add-suggested-nft/confirm-add-suggested-nft.test.js b/ui/pages/confirm-add-suggested-nft/confirm-add-suggested-nft.test.js index 177bffb7d3bd..003e88f16351 100644 --- a/ui/pages/confirm-add-suggested-nft/confirm-add-suggested-nft.test.js +++ b/ui/pages/confirm-add-suggested-nft/confirm-add-suggested-nft.test.js @@ -11,6 +11,7 @@ import mockState from '../../../test/data/mock-state.json'; import { renderWithProvider } from '../../../test/jest/rendering'; import { CHAIN_IDS } from '../../../shared/constants/network'; import { mockNetworkState } from '../../../test/stub/networks'; +import * as util from '../../helpers/utils/util'; import ConfirmAddSuggestedNFT from '.'; const PENDING_NFT_APPROVALS = { @@ -87,23 +88,25 @@ describe('ConfirmAddSuggestedNFT Component', () => { jest.clearAllMocks(); }); - it('should render one suggested NFT', () => { - renderComponent({ - 1: { - id: '1', - origin: 'https://www.opensea.io', - time: 1, - type: ApprovalType.WatchAsset, - requestData: { - asset: { - address: '0x8b175474e89094c44da98b954eedeac495271d0a', - name: 'CryptoKitty', - tokenId: '15', - standard: 'ERC721', + it('should render one suggested NFT', async () => { + await act(async () => + renderComponent({ + 1: { + id: '1', + origin: 'https://www.opensea.io', + time: 1, + type: ApprovalType.WatchAsset, + requestData: { + asset: { + address: '0x8b175474e89094c44da98b954eedeac495271d0a', + name: 'CryptoKitty', + tokenId: '15', + standard: 'ERC721', + }, }, }, - }, - }); + }), + ); expect(screen.getByText('Add suggested NFTs')).toBeInTheDocument(); expect(screen.getByText('https://www.opensea.io')).toBeInTheDocument(); @@ -118,29 +121,35 @@ describe('ConfirmAddSuggestedNFT Component', () => { expect(screen.getByRole('button', { name: 'Add NFT' })).toBeInTheDocument(); }); - it('should match snapshot', () => { - const container = renderComponent({ - 1: { - id: '1', - origin: 'https://www.opensea.io', - time: 1, - type: ApprovalType.WatchAsset, - requestData: { - asset: { - address: '0x8b175474e89094c44da98b954eedeac495271d0a', - name: 'CryptoKitty', - tokenId: '15', - standard: 'ERC721', + it('should match snapshot', async () => { + let container; + await act( + async () => + (container = renderComponent({ + 1: { + id: '1', + origin: 'https://www.opensea.io', + time: 1, + type: ApprovalType.WatchAsset, + requestData: { + asset: { + address: '0x8b175474e89094c44da98b954eedeac495271d0a', + name: 'CryptoKitty', + tokenId: '15', + standard: 'ERC721', + }, + }, }, - }, - }, - }); + })), + ); expect(container).toMatchSnapshot(); }); - it('should render a list of suggested NFTs', () => { - renderComponent({ ...PENDING_NFT_APPROVALS, ...PENDING_TOKEN_APPROVALS }); + it('should render a list of suggested NFTs', async () => { + await act(async () => + renderComponent({ ...PENDING_NFT_APPROVALS, ...PENDING_TOKEN_APPROVALS }), + ); for (const { requestData: { asset }, @@ -215,4 +224,60 @@ describe('ConfirmAddSuggestedNFT Component', () => { }), ); }); + + it('should show suggested NFTs with default image', async () => { + await act(async () => + renderComponent({ + 1: { + id: '1', + origin: 'https://www.opensea.io', + time: 1, + type: ApprovalType.WatchAsset, + requestData: { + asset: { + address: '0x8b175474e89094c44da98b954eedeac495271d0a', + name: 'CryptoKitty', + tokenId: '15', + standard: 'ERC721', + }, + }, + }, + }), + ); + + expect(screen.getByText('CryptoKitty')).toBeInTheDocument(); + expect(screen.getByText(`#15`)).toBeInTheDocument(); + expect(screen.getAllByRole('img')).toHaveLength(1); + const defaultImg = screen.getByTestId(`nft-default-image`); + expect(defaultImg).toBeInTheDocument(); + }); + + it('should show suggested NFTs with image', async () => { + const expectedRes = + 'https://bafybeieazx4q4ofby24w6n6ftmpad65k4u3vkavv6qnmsazwoe6gaced7m.ipfs.dweb.link/728.png'; + + jest.spyOn(util, 'getAssetImageURL').mockResolvedValue(expectedRes); + await act(async () => + renderComponent({ + 1: { + id: '1', + origin: 'https://www.opensea.io', + time: 1, + type: ApprovalType.WatchAsset, + requestData: { + asset: { + address: '0x8b175474e89094c44da98b954eedeac495271d0a', + name: 'CryptoKitty', + tokenId: '15', + standard: 'ERC721', + }, + }, + }, + }), + ); + + expect(screen.getByText('CryptoKitty')).toBeInTheDocument(); + expect(screen.getByText(`#15`)).toBeInTheDocument(); + expect(screen.getAllByRole('img')).toHaveLength(2); + }); }); diff --git a/ui/pages/confirmations/components/confirm-page-container/confirm-page-container-content/confirm-page-container-summary/confirm-page-container-summary.component.js b/ui/pages/confirmations/components/confirm-page-container/confirm-page-container-content/confirm-page-container-summary/confirm-page-container-summary.component.js index 6df86587abce..4d5a83763213 100644 --- a/ui/pages/confirmations/components/confirm-page-container/confirm-page-container-content/confirm-page-container-summary/confirm-page-container-summary.component.js +++ b/ui/pages/confirmations/components/confirm-page-container/confirm-page-container-content/confirm-page-container-summary/confirm-page-container-summary.component.js @@ -16,7 +16,7 @@ import InfoTooltip from '../../../../../../components/ui/info-tooltip'; import NicknamePopovers from '../../../../../../components/app/modals/nickname-popovers'; import { ORIGIN_METAMASK } from '../../../../../../../shared/constants/app'; import SiteOrigin from '../../../../../../components/ui/site-origin'; -import { getAssetImageURL } from '../../../../../../helpers/utils/util'; +import useGetAssetImageUrl from '../../../../../../hooks/useGetAssetImageUrl'; const ConfirmPageContainerSummary = (props) => { const { @@ -36,6 +36,7 @@ const ConfirmPageContainerSummary = (props) => { const ipfsGateway = useSelector(getIpfsGateway); const txData = useSelector(txDataSelector); + const nftImageURL = useGetAssetImageUrl(image, ipfsGateway); const { txParams = {} } = txData; const { to: txParamsToAddress } = txParams; @@ -66,14 +67,12 @@ const ConfirmPageContainerSummary = (props) => { const checksummedAddress = toChecksumHexAddress(contractAddress); const renderImage = () => { - const imagePath = getAssetImageURL(image, ipfsGateway); - if (image) { return ( ); } else if (contractAddress) { diff --git a/yarn.lock b/yarn.lock index adc43681e805..5fd8f17c33a1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4752,7 +4752,7 @@ __metadata: languageName: node linkType: hard -"@metamask/abi-utils@npm:^2.0.2, @metamask/abi-utils@npm:^2.0.4": +"@metamask/abi-utils@npm:^2.0.2, @metamask/abi-utils@npm:^2.0.3, @metamask/abi-utils@npm:^2.0.4": version: 2.0.4 resolution: "@metamask/abi-utils@npm:2.0.4" dependencies: @@ -4849,7 +4849,7 @@ __metadata: languageName: node linkType: hard -"@metamask/approval-controller@npm:^7.0.0, @metamask/approval-controller@npm:^7.0.1, @metamask/approval-controller@npm:^7.0.2": +"@metamask/approval-controller@npm:^7.0.0, @metamask/approval-controller@npm:^7.0.2": version: 7.0.2 resolution: "@metamask/approval-controller@npm:7.0.2" dependencies: @@ -4861,45 +4861,41 @@ __metadata: languageName: node linkType: hard -"@metamask/assets-controllers@npm:^36.0.0": - version: 36.0.0 - resolution: "@metamask/assets-controllers@npm:36.0.0" +"@metamask/assets-controllers@npm:^37.0.0": + version: 37.0.0 + resolution: "@metamask/assets-controllers@npm:37.0.0" dependencies: "@ethereumjs/util": "npm:^8.1.0" "@ethersproject/address": "npm:^5.7.0" "@ethersproject/bignumber": "npm:^5.7.0" "@ethersproject/contracts": "npm:^5.7.0" "@ethersproject/providers": "npm:^5.7.0" - "@metamask/abi-utils": "npm:^2.0.2" - "@metamask/accounts-controller": "npm:^17.2.0" - "@metamask/approval-controller": "npm:^7.0.1" - "@metamask/base-controller": "npm:^6.0.1" + "@metamask/abi-utils": "npm:^2.0.3" + "@metamask/base-controller": "npm:^6.0.2" "@metamask/contract-metadata": "npm:^2.4.0" - "@metamask/controller-utils": "npm:^11.0.1" + "@metamask/controller-utils": "npm:^11.0.2" "@metamask/eth-query": "npm:^4.0.0" - "@metamask/keyring-controller": "npm:^17.1.0" "@metamask/metamask-eth-abis": "npm:^3.1.1" - "@metamask/network-controller": "npm:^20.0.0" - "@metamask/polling-controller": "npm:^9.0.0" - "@metamask/preferences-controller": "npm:^13.0.0" + "@metamask/polling-controller": "npm:^9.0.1" "@metamask/rpc-errors": "npm:^6.3.1" - "@metamask/utils": "npm:^9.0.0" + "@metamask/utils": "npm:^9.1.0" "@types/bn.js": "npm:^5.1.5" "@types/uuid": "npm:^8.3.0" async-mutex: "npm:^0.5.0" bn.js: "npm:^5.2.1" cockatiel: "npm:^3.1.2" + immer: "npm:^9.0.6" lodash: "npm:^4.17.21" - multiformats: "npm:^9.5.2" + multiformats: "npm:^13.1.0" single-call-balance-checker-abi: "npm:^1.0.0" uuid: "npm:^8.3.2" peerDependencies: - "@metamask/accounts-controller": ^17.0.0 + "@metamask/accounts-controller": ^18.0.0 "@metamask/approval-controller": ^7.0.0 "@metamask/keyring-controller": ^17.0.0 "@metamask/network-controller": ^20.0.0 "@metamask/preferences-controller": ^13.0.0 - checksum: 10/7855bf544e77c4a1dc233748941981b9f09f1633cc1f7aac06cdc6555e7ee2690cff0866d55ae5ea012c6d05bf61511b39f886ae9b1c498a9154bf9520cdf199 + checksum: 10/89798930cb80a134263ce82db736feebd064fe6c999ddcf41ca86fad81cfadbb9e37d1919a6384aaf6d3aa0cb520684e7b8228da3b9bc1e70e7aea174a69c4ac languageName: node linkType: hard @@ -4980,7 +4976,7 @@ __metadata: languageName: node linkType: hard -"@metamask/controller-utils@npm:^11.0.0, @metamask/controller-utils@npm:^11.0.1, @metamask/controller-utils@npm:^11.0.2, @metamask/controller-utils@npm:^11.1.0, @metamask/controller-utils@npm:^11.2.0, @metamask/controller-utils@npm:^11.3.0": +"@metamask/controller-utils@npm:^11.0.0, @metamask/controller-utils@npm:^11.0.2, @metamask/controller-utils@npm:^11.1.0, @metamask/controller-utils@npm:^11.2.0, @metamask/controller-utils@npm:^11.3.0": version: 11.3.0 resolution: "@metamask/controller-utils@npm:11.3.0" dependencies: @@ -6020,20 +6016,19 @@ __metadata: languageName: node linkType: hard -"@metamask/polling-controller@npm:^9.0.0": - version: 9.0.0 - resolution: "@metamask/polling-controller@npm:9.0.0" +"@metamask/polling-controller@npm:^9.0.1": + version: 9.0.1 + resolution: "@metamask/polling-controller@npm:9.0.1" dependencies: - "@metamask/base-controller": "npm:^6.0.0" - "@metamask/controller-utils": "npm:^11.0.0" - "@metamask/network-controller": "npm:^20.0.0" - "@metamask/utils": "npm:^8.3.0" + "@metamask/base-controller": "npm:^6.0.2" + "@metamask/controller-utils": "npm:^11.0.2" + "@metamask/utils": "npm:^9.1.0" "@types/uuid": "npm:^8.3.0" fast-json-stable-stringify: "npm:^2.1.0" uuid: "npm:^8.3.2" peerDependencies: "@metamask/network-controller": ^20.0.0 - checksum: 10/5e3abd84dcb3fb128add949bbda78a34d509f56b71d27f60f8ff3fd5de116424dc9e202c812c5f3c233d1489740c376b9de47f28faa387e64a198d246f962baf + checksum: 10/e9e8c51013290a2e4b2817ba1e0915783474f6a55fe614e20acf92bf707e300bec1fa612c8019ae9afe9635d018fb5d5b106c8027446ba12767220db91cf1ee5 languageName: node linkType: hard @@ -6065,18 +6060,6 @@ __metadata: languageName: node linkType: hard -"@metamask/preferences-controller@npm:^13.0.0": - version: 13.0.0 - resolution: "@metamask/preferences-controller@npm:13.0.0" - dependencies: - "@metamask/base-controller": "npm:^6.0.0" - "@metamask/controller-utils": "npm:^11.0.0" - peerDependencies: - "@metamask/keyring-controller": ^17.0.0 - checksum: 10/99d39de8adb9a43bbb5972d70feabfba6bac0c1d71d1567838e506e661f7fd293205e2c83361f7166ce72b38437d79cd0da8a7a14dd584f59b5f583dcb4d769b - languageName: node - linkType: hard - "@metamask/profile-sync-controller@npm:^0.8.0": version: 0.8.0 resolution: "@metamask/profile-sync-controller@npm:0.8.0" @@ -26138,7 +26121,7 @@ __metadata: "@metamask/announcement-controller": "npm:^7.0.0" "@metamask/api-specs": "npm:^0.9.3" "@metamask/approval-controller": "npm:^7.0.0" - "@metamask/assets-controllers": "npm:^36.0.0" + "@metamask/assets-controllers": "npm:^37.0.0" "@metamask/auto-changelog": "npm:^2.1.0" "@metamask/base-controller": "npm:^7.0.0" "@metamask/bitcoin-wallet-snap": "npm:^0.6.0" @@ -27471,7 +27454,14 @@ __metadata: languageName: node linkType: hard -"multiformats@npm:^9.4.2, multiformats@npm:^9.5.2": +"multiformats@npm:^13.1.0": + version: 13.2.2 + resolution: "multiformats@npm:13.2.2" + checksum: 10/6e673320e9b06d5fdbbf2bde0d3132f13fac94fb40f36d646265b5c38eba4a28c40a2c76b4efa0c1a23517fe87320e540e9ef7f28d71c1cc3239c91bf6770ce6 + languageName: node + linkType: hard + +"multiformats@npm:^9.4.2": version: 9.9.0 resolution: "multiformats@npm:9.9.0" checksum: 10/ad55c7d480d22f4258a68fd88aa2aab744fe0cb1e68d732fc886f67d858b37e3aa6c2cec12b2960ead7730d43be690931485238569952d8a3d7f90fdc726c652 From 978ed66f063720b166800ee54c11d3974b1728c6 Mon Sep 17 00:00:00 2001 From: seaona <54408225+seaona@users.noreply.github.com> Date: Wed, 18 Sep 2024 18:19:34 +0200 Subject: [PATCH 11/61] chore: add wallet state injection and `yarn start:with-state` script (#26222) ## **Description** With this PR, we add a new script that you can use to build the wallet in dev mode with a preloaded state. ### Default Fixtures: - Run `yarn start:with-state` - should load a wallet with the SRP and password set in the metamaskrc file, with several controllers data (contacts, transactions, notifications...) defined in the fixtures-flags file. ### Terminal Help: - Run `yarn start:with-state --help` to see the available fixture flags to customize ![Screenshot from 2024-09-03 09-30-20](https://github.com/user-attachments/assets/f81c78fc-de3a-490f-a7e0-91b30673f778) ### Custom Fixtures: - Pass any available fixture flag with your own value to customize the fixtures that will be injected into state. Ie `yarn start:with-state --withAccounts=12 --withContacts=13` https://github.com/user-attachments/assets/342ff1b4-2bbe-41da-935b-37ca5f3bbc05 ### Future Work: This sets the base for adding and customizing more wallet state. We can expand this as much as we want. Here are the listed possible future tasks: - [ ] Add unapproved transactions - [ ] Add different kind of transactions (Send Token, Send NFT, Send Legacy etc) - [ ] Add unapproved signatures - [ ] Add read notifications - [ ] Add different kind of notifications (send, received..) ## **Related issues** Fixes: ## **Manual testing steps** Check main functionality: 1. Add a `PASSWORD` and a `TEST_SRP` to your metamaskrc file 2. Run `yarn start:with-state` 3. Upload a fresh MM -- see all the fixtures data is loaded =============================== Check flags validation: 1. Run `yarn start:with-state --help` 2. See available fixtures 3. Run with a non-existing flag -- should see an error 4. Run with an invalid flag value type -- should see an error =============================== Check custom fixtures: 1. Apply your customized fixtures `yarn start:with-state --withErc20Tokens=false --withXYZ=123 ...` 2. Upload a fresh MM -- see your wallet json state is applied Co-authored-by: Howard Braham --- README.md | 7 +- app/scripts/background.js | 10 +- app/scripts/fixtures/generate-wallet-state.js | 318 ++++++++++++++++++ app/scripts/fixtures/with-address-book.js | 45 +++ app/scripts/fixtures/with-app-state.js | 3 + .../fixtures/with-confirmed-transactions.js | 99 ++++++ app/scripts/fixtures/with-erc20-tokens.js | 87 +++++ app/scripts/fixtures/with-networks.js | 130 +++++++ app/scripts/fixtures/with-preferences.js | 40 +++ .../fixtures/with-unread-notifications.js | 57 ++++ app/scripts/skip-onboarding.js | 142 -------- app/scripts/start-with-wallet-state.mjs | 122 +++++++ builds.yml | 2 +- package.json | 2 +- test/e2e/constants.ts | 5 + test/e2e/fixture-builder.js | 24 +- 16 files changed, 940 insertions(+), 153 deletions(-) create mode 100644 app/scripts/fixtures/generate-wallet-state.js create mode 100644 app/scripts/fixtures/with-address-book.js create mode 100644 app/scripts/fixtures/with-app-state.js create mode 100644 app/scripts/fixtures/with-confirmed-transactions.js create mode 100644 app/scripts/fixtures/with-erc20-tokens.js create mode 100644 app/scripts/fixtures/with-networks.js create mode 100644 app/scripts/fixtures/with-preferences.js create mode 100644 app/scripts/fixtures/with-unread-notifications.js delete mode 100644 app/scripts/skip-onboarding.js create mode 100644 app/scripts/start-with-wallet-state.mjs diff --git a/README.md b/README.md index 531a1e4fc3b6..d70eb03a32b2 100644 --- a/README.md +++ b/README.md @@ -83,8 +83,13 @@ If you are using VS Code and are unable to make commits from the source control To start a development build (e.g. with logging and file watching) run `yarn start`. -Alternatively, one can skip wallet onboarding and preload the vault state with a specific SRP by adding `TEST_SRP=''` and `PASSWORD=''` to the `.metamaskrc` file and running `yarn start:skip-onboarding`. +#### Development build with wallet state +You can start a development build with a preloaded wallet state, by adding `TEST_SRP=''` and `PASSWORD=''` to the `.metamaskrc` file. Then you have the following options: +1. Start the wallet with the default fixture flags, by running `yarn start:with-state`. +2. Check the list of available fixture flags, by running `yarn start:with-state --help`. +3. Start the wallet with custom fixture flags, by running `yarn start:with-state --FIXTURE_NAME=VALUE` for example `yarn start:with-state --withAccounts=100`. You can pass as many flags as you want. The rest of the fixtures will take the default values. +#### Development build with Webpack You can also start a development build using the `yarn webpack` command, or `yarn webpack --watch`. This uses an alternative build system that is much faster, but not yet production ready. See the [Webpack README](./development/webpack/README.md) for more information. #### React and Redux DevTools diff --git a/app/scripts/background.js b/app/scripts/background.js index 2a29de9af601..3f513e142729 100644 --- a/app/scripts/background.js +++ b/app/scripts/background.js @@ -77,7 +77,7 @@ import { getPlatform, shouldEmitDappViewedEvent, } from './lib/util'; -import { generateSkipOnboardingState } from './skip-onboarding'; +import { generateWalletState } from './fixtures/generate-wallet-state'; import { createOffscreen } from './offscreen'; /* eslint-enable import/first */ @@ -559,15 +559,15 @@ export async function loadStateFromPersistence() { // migrations const migrator = new Migrator({ migrations, - defaultVersion: process.env.SKIP_ONBOARDING + defaultVersion: process.env.WITH_STATE ? FIXTURE_STATE_METADATA_VERSION : null, }); migrator.on('error', console.warn); - if (process.env.SKIP_ONBOARDING) { - const skipOnboardingStateOverrides = await generateSkipOnboardingState(); - firstTimeState = { ...firstTimeState, ...skipOnboardingStateOverrides }; + if (process.env.WITH_STATE) { + const stateOverrides = await generateWalletState(); + firstTimeState = { ...firstTimeState, ...stateOverrides }; } // read from disk diff --git a/app/scripts/fixtures/generate-wallet-state.js b/app/scripts/fixtures/generate-wallet-state.js new file mode 100644 index 000000000000..43d8010bcea8 --- /dev/null +++ b/app/scripts/fixtures/generate-wallet-state.js @@ -0,0 +1,318 @@ +import { ControllerMessenger } from '@metamask/base-controller'; +import { KeyringController } from '@metamask/keyring-controller'; +import { wordlist } from '@metamask/scure-bip39/dist/wordlists/english'; +import { UI_NOTIFICATIONS } from '../../../shared/notifications'; +import { E2E_SRP, defaultFixture } from '../../../test/e2e/default-fixture'; +import FixtureBuilder from '../../../test/e2e/fixture-builder'; +import { encryptorFactory } from '../lib/encryptor-factory'; +import { FIXTURES_APP_STATE } from './with-app-state'; +import { FIXTURES_NETWORKS } from './with-networks'; +import { FIXTURES_PREFERENCES } from './with-preferences'; +import { FIXTURES_ERC20_TOKENS } from './with-erc20-tokens'; +import { withAddressBook } from './with-address-book'; +import { withConfirmedTransactions } from './with-confirmed-transactions'; +import { withUnreadNotifications } from './with-unread-notifications'; + +const FIXTURES_CONFIG = process.env.WITH_STATE + ? JSON.parse(process.env.WITH_STATE) + : {}; + +/** + * Generates the wallet state based on the fixtures set in the environment variable. + * + * @returns {Promise} The generated wallet state. + */ +export async function generateWalletState() { + const fixtureBuilder = new FixtureBuilder({ inputChainId: '0xaa36a7' }); + + const { vault, accounts } = await generateVaultAndAccount( + process.env.TEST_SRP || E2E_SRP, + process.env.PASSWORD, + ); + + fixtureBuilder + .withAccountsController(generateAccountsControllerState(accounts)) + .withAddressBookController(generateAddressBookControllerState()) + .withAnnouncementController(generateAnnouncementControllerState()) + .withAppStateController(FIXTURES_APP_STATE) + .withKeyringController(generateKeyringControllerState(vault)) + .withNetworkController(generateNetworkControllerState()) + .withNotificationServicesController( + generateNotificationControllerState(accounts[0]), + ) + .withPreferencesController(generatePreferencesControllerState(accounts)) + .withTokensController(generateTokensControllerState(accounts[0])) + .withTransactionController(generateTransactionControllerState(accounts[0])); + + return fixtureBuilder.fixture.data; +} + +/** + * Generates a new vault and account based on the provided seed phrase and password. + * + * @param {string} encodedSeedPhrase - The encoded seed phrase. + * @param {string} password - The password for the vault. + * @returns {Promise<{vault: object, account: string}>} The generated vault and account. + */ +async function generateVaultAndAccount(encodedSeedPhrase, password) { + const controllerMessenger = new ControllerMessenger(); + const keyringControllerMessenger = controllerMessenger.getRestricted({ + name: 'KeyringController', + }); + const krCtrl = new KeyringController({ + encryptor: encryptorFactory(600_000), + messenger: keyringControllerMessenger, + }); + + const seedPhraseAsBuffer = Buffer.from(encodedSeedPhrase); + const _convertMnemonicToWordlistIndices = (mnemonic) => { + const indices = mnemonic + .toString() + .split(' ') + .map((word) => wordlist.indexOf(word)); + return new Uint8Array(new Uint16Array(indices).buffer); + }; + + await krCtrl.createNewVaultAndRestore( + password, + _convertMnemonicToWordlistIndices(seedPhraseAsBuffer), + ); + + const accounts = []; + const account = krCtrl.state.keyrings[0].accounts[0]; + accounts.push(account); + + for (let i = 1; i < FIXTURES_CONFIG.withAccounts; i++) { + const newAccount = await krCtrl.addNewAccount(i); + accounts.push(newAccount); + } + const { vault } = krCtrl.state; + + return { vault, accounts }; +} + +/** + * Generates the state for the KeyringController. + * + * @param {object} vault - The vault object. + * @returns {object} The generated KeyringController state. + */ +function generateKeyringControllerState(vault) { + console.log('Generating KeyringController state'); + + return { + ...defaultFixture().data.KeyringController, + vault, + }; +} + +/** + * Generates the state for the AccountsController. + * + * @param {string} accounts - The account addresses. + * @returns {object} The generated AccountsController state. + */ +function generateAccountsControllerState(accounts) { + console.log('Generating AccountsController state'); + const internalAccounts = { + selectedAccount: 'account-id', + accounts: {}, + }; + + accounts.forEach((account, index) => { + internalAccounts.accounts[`acount-id-${index}`] = { + selectedAccount: 'account-id', + id: 'account-id', + address: account, + metadata: { + name: `Account ${index + 1}`, + lastSelected: 1665507600000, + keyring: { + type: 'HD Key Tree', + }, + }, + options: {}, + methods: [ + 'personal_sign', + 'eth_signTransaction', + 'eth_signTypedData_v1', + 'eth_signTypedData_v3', + 'eth_signTypedData_v4', + ], + type: 'eip155:eoa', + }; + }); + return { + internalAccounts, + }; +} + +/** + * Generates the state for the AddressBookController. + * + * @returns {object} The generated AddressBookController state. + */ +function generateAddressBookControllerState() { + console.log('Generating AddressBookController state'); + + const numEntries = FIXTURES_CONFIG.withContacts; + if (numEntries > 0) { + return withAddressBook(numEntries); + } + + return {}; +} + +/** + * Generates the state for the AnnouncementController. + * All the what's new modals are dismissed for convenience. + * + * @returns {object} The generated AnnouncementController state. + */ +function generateAnnouncementControllerState() { + console.log('Generating AnnouncementController state'); + + const allAnnouncementsAlreadyShown = Object.keys(UI_NOTIFICATIONS).reduce( + (acc, val) => { + acc[val] = { + ...UI_NOTIFICATIONS[val], + isShown: true, + }; + return acc; + }, + {}, + ); + return allAnnouncementsAlreadyShown; +} + +/** + * Generates the state for the NotificationController. + * + * @param {string} account - The account address to add the notifications to. + * @returns {object} The generated NotificationController state. + */ +function generateNotificationControllerState(account) { + console.log('Generating NotificationController state'); + + let notifications = {}; + + if (FIXTURES_CONFIG.withUnreadNotifications > 0) { + notifications = withUnreadNotifications( + account, + FIXTURES_CONFIG.withUnreadNotifications, + ); + } + return notifications; +} + +/** + * Generates the state for the NetworkController. + * Sepolia is always pre-loaded and set as the active provider. + * + * @returns {object} The generated NetworkController state. + */ +function generateNetworkControllerState() { + console.log('Generating NetworkController state'); + + const defaultNetworkState = { + ...defaultFixture().data.NetworkController, + networkConfigurations: {}, + networksMetadata: { + sepolia: { + EIPS: { + 1559: true, + }, + status: 'available', + }, + }, + selectedNetworkClientId: 'sepolia', + }; + + if (FIXTURES_CONFIG.withNetworks) { + return { + ...defaultNetworkState, + ...FIXTURES_NETWORKS, + }; + } + return defaultNetworkState; +} + +/** + * Generates the state for the PreferencesController. + * + * @param {string} accounts - The account addresses. + * @returns {object} The generated PreferencesController state. + */ +function generatePreferencesControllerState(accounts) { + console.log('Generating PreferencesController state'); + let preferencesControllerState = {}; + + if (FIXTURES_CONFIG.withPreferences) { + preferencesControllerState = FIXTURES_PREFERENCES; + } + + // Add account identities + preferencesControllerState.identities = Object.assign( + ...accounts.map((address, index) => ({ + [address]: { + address, + lastSelected: 1725363500048, + name: `Account ${index + 1}`, + }, + })), + ); + + preferencesControllerState.lostIdentities = Object.assign( + ...accounts.map((address, index) => ({ + [address]: { + address, + lastSelected: 1725363500048, + name: `Account ${index + 1}`, + }, + })), + ); + + return preferencesControllerState; +} + +/** + * Generates the state for the TokensController. + * + * @param {string} account - The account address to add the transactions to. + * @returns {object} The generated TokensController state. + */ +function generateTokensControllerState(account) { + console.log('Generating TokensController state'); + + const tokens = FIXTURES_ERC20_TOKENS; + if (FIXTURES_CONFIG.withErc20Tokens) { + // Update `myAccount` key for the account address + for (const network of Object.values(tokens.allTokens)) { + network[account] = network.myAccount; + delete network.myAccount; + } + return tokens; + } + return {}; +} + +/** + * Generates the state for the TransactionController. + * + * @param {string} account - The account address to add the transactions to. + * @returns {object} The generated TransactionController state. + */ +function generateTransactionControllerState(account) { + console.log('Generating TransactionController state'); + + let transactions = {}; + + if (FIXTURES_CONFIG.withConfirmedTransactions > 0) { + transactions = withConfirmedTransactions( + account, + FIXTURES_CONFIG.withConfirmedTransactions, + ); + } + + return transactions; +} diff --git a/app/scripts/fixtures/with-address-book.js b/app/scripts/fixtures/with-address-book.js new file mode 100644 index 000000000000..f8b72ceae17a --- /dev/null +++ b/app/scripts/fixtures/with-address-book.js @@ -0,0 +1,45 @@ +import { CHAIN_IDS } from '../../../shared/constants/network'; + +/** + * Generates a random Ethereum address. + * + * @returns {string} A randomly generated Ethereum address. + */ +const generateRandomAddress = () => { + const hexChars = '0123456789abcdef'; + let address = '0x'; + for (let i = 0; i < 40; i++) { + address += hexChars[Math.floor(Math.random() * 16)]; + } + + return address; +}; + +/** + * Generates an address book with a specified number of entries, for the supported networks. + * + * @param {number} numEntries - The number of address book entries to generate for each network. + * @returns {object} The generated address book object. + */ +export const withAddressBook = (numEntries) => { + const networks = [CHAIN_IDS.MAINNET, CHAIN_IDS.SEPOLIA]; + + const addressBook = {}; + + networks.forEach((network) => { + addressBook[network] = {}; + + for (let i = 1; i <= numEntries; i++) { + const address = generateRandomAddress(); + addressBook[network][address] = { + address, + chainId: network, + isEns: false, + memo: '', + name: `Contact ${i}`, + }; + } + }); + + return { addressBook }; +}; diff --git a/app/scripts/fixtures/with-app-state.js b/app/scripts/fixtures/with-app-state.js new file mode 100644 index 000000000000..eff071079c81 --- /dev/null +++ b/app/scripts/fixtures/with-app-state.js @@ -0,0 +1,3 @@ +export const FIXTURES_APP_STATE = { + showProductTour: false, +}; diff --git a/app/scripts/fixtures/with-confirmed-transactions.js b/app/scripts/fixtures/with-confirmed-transactions.js new file mode 100644 index 000000000000..29a40b8185f7 --- /dev/null +++ b/app/scripts/fixtures/with-confirmed-transactions.js @@ -0,0 +1,99 @@ +import { v4 as uuidv4 } from 'uuid'; +import { CHAIN_IDS } from '../../../shared/constants/network'; + +/** + * Generates a specified number of confirmed transactions for each network. + * + * @param {string} from - The address from which the transactions are sent. + * @param {number} numEntries - The number of transactions to generate for each network. + * @returns {object} The generated transactions object. + */ +export const withConfirmedTransactions = (from, numEntries) => { + const networks = [CHAIN_IDS.MAINNET, CHAIN_IDS.SEPOLIA]; + const transactions = {}; + + networks.forEach((network) => { + for (let i = 0; i < numEntries; i++) { + const id = uuidv4(); + const transaction = { + chainId: network, + dappSuggestedGasFees: { + gas: '0x5208', + maxFeePerGas: '0x59682f0c', + maxPriorityFeePerGas: '0x59682f00', + }, + history: [ + { + chainId: network, + dappSuggestedGasFees: { + gas: '0x5208', + maxFeePerGas: '0x59682f0c', + maxPriorityFeePerGas: '0x59682f00', + }, + id, + loadingDefaults: true, + origin: 'https://metamask.github.io', + status: 'confirmed', + time: Date.now(), + txParams: { + from, + gas: '0x5208', + maxFeePerGas: '0x59682f0c', + maxPriorityFeePerGas: '0x59682f00', + to: '0x2f318c334780961fb129d2a6c30d0763d9a5c970', + value: '0x29a2241af62c0000', + }, + type: 'simpleSend', + }, + [ + { + note: 'Added new confirmed transaction.', + op: 'replace', + path: '/loadingDefaults', + timestamp: Date.now(), + value: false, + }, + { + op: 'add', + path: '/simulationData', + value: { + error: { + code: 'disabled', + message: 'Simulation disabled', + }, + tokenBalanceChanges: [], + }, + note: 'TransactionController#updateSimulationData - Update simulation data', + timestamp: Date.now(), + }, + ], + ], + simulationData: { + error: { + code: 'disabled', + message: 'Simulation disabled', + }, + tokenBalanceChanges: [], + }, + id, + loadingDefaults: false, + origin: 'https://metamask.github.io', + status: 'confirmed', + time: Date.now(), + txParams: { + from, + gas: '0x5208', + maxFeePerGas: '0x59682f0c', + maxPriorityFeePerGas: '0x59682f00', + to: '0x2f318c334780961fb129d2a6c30d0763d9a5c970', + value: '0x29a2241af62c0000', + }, + type: 'simpleSend', + }; + + transactions[id] = transaction; + } + }); + + return { transactions }; +}; diff --git a/app/scripts/fixtures/with-erc20-tokens.js b/app/scripts/fixtures/with-erc20-tokens.js new file mode 100644 index 000000000000..8088aef9e4c4 --- /dev/null +++ b/app/scripts/fixtures/with-erc20-tokens.js @@ -0,0 +1,87 @@ +const _TOKENS = [ + { + address: '0x6B175474E89094C44Da98b954EedeAC495271d0F', + symbol: 'DAI', + decimals: 18, + image: + 'https://static.metafi.codefi.network/api/v1/tokenIcons/1/0x6b175474e89094c44da98b954eedeac495271d0f.png', + isERC721: false, + aggregators: [], + }, + { + address: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48', + symbol: 'USDC', + decimals: 6, + image: + 'https://static.metafi.codefi.network/api/v1/tokenIcons/1/0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48.png', + isERC721: false, + aggregators: [], + }, + { + address: '0xdAC17F958D2ee523a2206206994597C13D831ec7', + symbol: 'USDT', + decimals: 6, + image: + 'https://static.metafi.codefi.network/api/v1/tokenIcons/1/0xdAC17F958D2ee523a2206206994597C13D831ec7.png', + isERC721: false, + aggregators: [], + }, + { + address: '0xC011a73ee8576Fb46F5E1c5751cA3B9Fe0af2a6F', + symbol: 'SNX', + decimals: 18, + image: + 'https://static.metafi.codefi.network/api/v1/tokenIcons/1/0xC011a73ee8576Fb46F5E1c5751cA3B9Fe0af2a6F.png', + isERC721: false, + aggregators: [], + }, + { + address: '0x111111111117dC0aa78b770fA6A738034120C302', + symbol: '1INCH', + decimals: 18, + image: + 'https://static.metafi.codefi.network/api/v1/tokenIcons/1/0x111111111117dC0aa78b770fA6A738034120C302.png', + isERC721: false, + aggregators: [], + }, + { + address: '0x7D1AfA7B718fb893dB30A3aBc0Cfc608AaCfeBB0', + symbol: 'MATIC', + decimals: 18, + image: + 'https://static.metafi.codefi.network/api/v1/tokenIcons/1/0x7D1AfA7B718fb893dB30A3aBc0Cfc608AaCfeBB0.png', + isERC721: false, + aggregators: [], + }, + { + address: '0x95aD61b0a150d79219dCF64E1E6Cc01f0B64C4cE', + symbol: 'SHIB', + decimals: 18, + image: + 'https://static.metafi.codefi.network/api/v1/tokenIcons/1/0x95aD61b0a150d79219dCF64E1E6Cc01f0B64C4cE.png', + isERC721: false, + aggregators: [], + }, + { + address: '0xFd09911130e6930Bf87F2B0554c44F400bD80D3e', + symbol: 'ETHIX', + decimals: 18, + image: + 'https://static.metafi.codefi.network/api/v1/tokenIcons/1/0xFd09911130e6930Bf87F2B0554c44F400bD80D3e.png', + isERC721: false, + aggregators: [], + }, +]; + +export const FIXTURES_ERC20_TOKENS = { + tokens: _TOKENS, + ignoredTokens: [], + detectedTokens: [], + allTokens: { + '0x1': { + myAccount: _TOKENS, + }, + }, + allIgnoredTokens: {}, + allDetectedTokens: {}, +}; diff --git a/app/scripts/fixtures/with-networks.js b/app/scripts/fixtures/with-networks.js new file mode 100644 index 000000000000..1efb15e25f3c --- /dev/null +++ b/app/scripts/fixtures/with-networks.js @@ -0,0 +1,130 @@ +export const FIXTURES_NETWORKS = { + providerConfig: { + chainId: '0xaa36a7', + rpcPrefs: { + blockExplorerUrl: 'https://sepolia.etherscan.io', + }, + ticker: 'SepoliaETH', + type: 'sepolia', + }, + networkConfigurations: { + networkConfigurationId: { + chainId: '0xaa36a7', + nickname: 'Sepolia', + rpcPrefs: {}, + rpcUrl: 'https://sepolia.infura.io/v3/', + ticker: 'SepoliaETH', + networkConfigurationId: 'networkConfigurationId', + }, + optimism: { + chainId: '0xa', + id: 'optimism', + nickname: 'OP Mainnet', + rpcPrefs: { + blockExplorerUrl: 'https://optimistic.etherscan.io/', + imageUrl: './images/optimism.svg', + }, + rpcUrl: 'https://optimism-mainnet.infura.io/v3/', + ticker: 'ETH', + }, + base: { + chainId: '0x2105', + id: 'base', + nickname: 'Base Mainnet', + rpcPrefs: { + blockExplorerUrl: 'https://basescan.org', + imageUrl: './images/base.svg', + }, + rpcUrl: 'https://mainnet.base.org', + ticker: 'ETH', + }, + polygon: { + chainId: '0x89', + id: 'polygon', + nickname: 'Polygon Mainnet', + rpcPrefs: { + blockExplorerUrl: 'https://polygonscan.com/', + imageUrl: './images/matic-token.svg', + }, + rpcUrl: 'https://polygon-mainnet.infura.io/v3/', + ticker: 'MATIC', + }, + binance: { + chainId: '0x38', + id: 'binance', + nickname: 'BNB Chain', + rpcPrefs: { + blockExplorerUrl: 'https://bscscan.com/', + imageUrl: './images/bnb.svg', + }, + rpcUrl: 'https://bsc-dataseed.binance.org/', + ticker: 'BNB', + }, + gnosis: { + id: 'gnosis', + rpcUrl: 'https://rpc.gnosischain.com', + chainId: '0x64', + ticker: 'XDAI', + nickname: 'Gnosis', + rpcPrefs: { + blockExplorerUrl: 'https://gnosisscan.io', + imageUrl: './images/gnosis.svg', + }, + }, + arbitrum: { + id: 'arbitrum', + rpcUrl: 'https://arbitrum-mainnet.infura.io/v3/', + chainId: '0xa4b1', + ticker: 'ETH', + nickname: 'Arbitrum One', + rpcPrefs: { + blockExplorerUrl: 'https://explorer.arbitrum.io', + imageUrl: './images/arbitrum.svg', + }, + }, + avalanche: { + id: 'avalanche', + rpcUrl: 'https://avalanche-mainnet.infura.io/v3/', + chainId: '0xa86a', + ticker: 'AVAX', + nickname: 'Avalanche Network C-Chain', + rpcPrefs: { + blockExplorerUrl: 'https://snowtrace.io/', + imageUrl: './images/avax-token.svg', + }, + }, + celo: { + id: 'celo', + rpcUrl: 'https://celo-mainnet.infura.io/v3/', + chainId: '0xa4ec', + ticker: 'CELO', + nickname: 'Celo Mainnet', + rpcPrefs: { + blockExplorerUrl: 'https://celoscan.io', + imageUrl: './images/celo.svg', + }, + }, + zkSync: { + id: 'zkSync', + rpcUrl: 'https://mainnet.era.zksync.io', + chainId: '0x144', + ticker: 'ETH', + nickname: 'zkSync Era Mainnet', + rpcPrefs: { + blockExplorerUrl: 'https://explorer.zksync.io/', + imageUrl: './images/zk-sync.svg', + }, + }, + localhost: { + id: 'localhost', + rpcUrl: 'http://localhost:8545', + chainId: '0x539', + ticker: 'ETH', + nickname: 'Localhost 8545', + rpcPrefs: { + blockExplorerUrl: '', + imageUrl: '', + }, + }, + }, +}; diff --git a/app/scripts/fixtures/with-preferences.js b/app/scripts/fixtures/with-preferences.js new file mode 100644 index 000000000000..8d1e4293e8a4 --- /dev/null +++ b/app/scripts/fixtures/with-preferences.js @@ -0,0 +1,40 @@ +export const FIXTURES_PREFERENCES = { + preferences: { + hideZeroBalanceTokens: false, + showExtensionInFullSizeView: false, + showFiatInTestnets: true, + showTestNetworks: true, + smartTransactionsOptInStatus: true, + useNativeCurrencyAsPrimaryCurrency: true, + petnamesEnabled: true, + redesignedConfirmationsEnabled: true, + featureNotificationsEnabled: true, + showTokenAutodetectModal: false, + showNftAutodetectModal: false, + isRedesignedConfirmationsDeveloperEnabled: false, + showConfirmationAdvancedDetails: false, + }, + featureFlags: { + sendHexData: true, + }, + firstTimeFlowType: 'import', + completedOnboarding: true, + currentLocale: 'en', + knownMethodData: {}, + use4ByteResolution: true, + participateInMetaMetrics: true, + dataCollectionForMarketing: true, + useNftDetection: true, + useNonceField: true, + usePhishDetect: true, + useTokenDetection: true, + useCurrencyRateCheck: true, + useMultiAccountBalanceChecker: true, + useRequestQueue: true, + theme: 'light', + useExternalNameSources: true, + useTransactionSimulations: true, + enableMV3TimestampSave: true, + useExternalServices: true, + isProfileSyncingEnabled: true, +}; diff --git a/app/scripts/fixtures/with-unread-notifications.js b/app/scripts/fixtures/with-unread-notifications.js new file mode 100644 index 000000000000..e99cefe43778 --- /dev/null +++ b/app/scripts/fixtures/with-unread-notifications.js @@ -0,0 +1,57 @@ +import { v4 as uuidv4 } from 'uuid'; + +/** + * Generates a specified number of unread notifications for the given account. + * + * @param {string} account - The account address to use in the notifications. + * @param {number} numNotifications - The number of unread notifications to generate. + * @returns {object} The generated unread notifications object. + */ +export const withUnreadNotifications = (account, numNotifications) => { + const notifications = []; + + for (let i = 0; i < numNotifications; i++) { + const id = uuidv4(); + const triggerId = uuidv4(); + const txHash = `0x${uuidv4().replace(/-/gu, '').padEnd(64, '0')}`; + + const notification = { + address: account, + block_number: 59796924, + block_timestamp: '1721922504', + chain_id: 1, + created_at: new Date().toISOString(), + data: { + to: account, + from: account, + kind: 'eth_received', + amount: { + eth: '0.000100000000000000', + usd: '0.27', + }, + network_fee: { + gas_price: '30000000078', + native_token_price_in_usd: '0.497927', + }, + }, + id, + trigger_id: triggerId, + tx_hash: txHash, + unread: true, + type: 'eth_received', + createdAt: new Date().toISOString(), + isRead: false, + }; + + notifications.push(notification); + } + + const notificationServicesController = { + isFeatureAnnouncementsEnabled: true, + isMetamaskNotificationsFeatureSeen: true, + isNotificationServicesEnabled: true, + metamaskNotificationsReadList: [], + metamaskNotificationsList: notifications, + }; + return notificationServicesController; +}; diff --git a/app/scripts/skip-onboarding.js b/app/scripts/skip-onboarding.js deleted file mode 100644 index 17ce107927ec..000000000000 --- a/app/scripts/skip-onboarding.js +++ /dev/null @@ -1,142 +0,0 @@ -import { ControllerMessenger } from '@metamask/base-controller'; -import { KeyringController } from '@metamask/keyring-controller'; -import { wordlist } from '@metamask/scure-bip39/dist/wordlists/english'; -import { UI_NOTIFICATIONS } from '../../shared/notifications'; -import { E2E_SRP, defaultFixture } from '../../test/e2e/default-fixture'; -import { encryptorFactory } from './lib/encryptor-factory'; - -export async function generateSkipOnboardingState() { - const state = defaultFixture('0xaa36a7').data; - - state.AppStateController = generateAppStateControllerState(); - state.AnnouncementController = generateAnnouncementControllerState(); - state.NetworkController = generateNetworkControllerState(); - - if (process.env.PASSWORD) { - const { vault, account } = await generateVaultAndAccount( - process.env.TEST_SRP || E2E_SRP, - process.env.PASSWORD, - ); - - state.KeyringController = generateKeyringControllerState(vault); - state.AccountsController = generateAccountsControllerState(account); - } - - return state; -} - -// dismiss product tour -function generateAppStateControllerState() { - return { - ...defaultFixture().data.AppStateController, - showProductTour: false, - }; -} - -// dismiss 'what's new' modals -function generateAnnouncementControllerState() { - const allAnnouncementsAlreadyShown = Object.keys(UI_NOTIFICATIONS).reduce( - (acc, val) => { - acc[val] = { - ...UI_NOTIFICATIONS[val], - isShown: true, - }; - return acc; - }, - {}, - ); - - return { - ...defaultFixture().data.AnnouncementController, - announcements: { - ...defaultFixture().data.AnnouncementController.announcements, - ...allAnnouncementsAlreadyShown, - }, - }; -} - -// configure 'Sepolia' network -// TODO: Support for local node -function generateNetworkControllerState() { - return { - ...defaultFixture().data.NetworkController, - networkConfigurations: { - networkConfigurationId: { - chainId: '0xaa36a7', - nickname: 'Sepolia', - rpcPrefs: {}, - rpcUrl: 'https://sepolia.infura.io/v3/6c21df2a8dcb4a77b9bbcc1b65ee9ded', - ticker: 'SepoliaETH', - networkConfigurationId: 'networkConfigurationId', - }, - }, - }; -} - -async function generateVaultAndAccount(encodedSeedPhrase, password) { - const controllerMessenger = new ControllerMessenger(); - const keyringControllerMessenger = controllerMessenger.getRestricted({ - name: 'KeyringController', - }); - const krCtrl = new KeyringController({ - encryptor: encryptorFactory(600_000), - messenger: keyringControllerMessenger, - }); - - const seedPhraseAsBuffer = Buffer.from(encodedSeedPhrase); - const _convertMnemonicToWordlistIndices = (mnemonic) => { - const indices = mnemonic - .toString() - .split(' ') - .map((word) => wordlist.indexOf(word)); - return new Uint8Array(new Uint16Array(indices).buffer); - }; - - await krCtrl.createNewVaultAndRestore( - password, - _convertMnemonicToWordlistIndices(seedPhraseAsBuffer), - ); - - const { vault } = krCtrl.state; - const account = krCtrl.state.keyrings[0].accounts[0]; - - return { vault, account }; -} - -function generateKeyringControllerState(vault) { - return { - ...defaultFixture().data.KeyringController, - vault, - }; -} - -function generateAccountsControllerState(account) { - return { - ...defaultFixture().data.AccountsController, - internalAccounts: { - selectedAccount: 'account-id', - accounts: { - 'account-id': { - id: 'account-id', - address: account, - metadata: { - name: 'Account 1', - lastSelected: 1665507600000, - keyring: { - type: 'HD Key Tree', - }, - }, - options: {}, - methods: [ - 'personal_sign', - 'eth_signTransaction', - 'eth_signTypedData_v1', - 'eth_signTypedData_v3', - 'eth_signTypedData_v4', - ], - type: 'eip155:eoa', - }, - }, - }, - }; -} diff --git a/app/scripts/start-with-wallet-state.mjs b/app/scripts/start-with-wallet-state.mjs new file mode 100644 index 000000000000..2464b7b87097 --- /dev/null +++ b/app/scripts/start-with-wallet-state.mjs @@ -0,0 +1,122 @@ +import childProcess from 'child_process'; + +// Default fixtures and flags +const FIXTURES_FLAGS = { + '--withAccounts': { + type: 'number', + defaultValue: 30, + explanation: 'Specify the number of wallet accounts to generate.', + }, + '--withConfirmedTransactions': { + type: 'number', + defaultValue: 30, + explanation: 'Specify the number of confirmed transactions to generate.', + }, + '--withContacts': { + type: 'number', + defaultValue: 30, + explanation: + 'Specify the number of contacts to generate in the address book.', + }, + '--withErc20Tokens': { + type: 'boolean', + defaultValue: true, + explanation: 'Specify whether to import ERC20 tokens in Mainnet.', + }, + '--withNetworks': { + type: 'boolean', + defaultValue: true, + explanation: 'Specify whether to load suggested networks.', + }, + '--withPreferences': { + type: 'boolean', + defaultValue: true, + explanation: 'Specify whether to activate all preferences.', + }, + '--withUnreadNotifications': { + type: 'number', + defaultValue: 30, + explanation: 'Specify the number of unread notifications to load.', + }, + '--withStartCommand': { + type: 'string', + defaultValue: 'start', + explanation: + 'Specify the start command for the wallet (put double quotes around a multi-word command like --withStartCommand="webpack --watch").', + }, +}; + +function startWithWalletState() { + const args = process.argv.slice(2); + + if (args.includes('--help')) { + console.log('Available fixture flags:'); + Object.keys(FIXTURES_FLAGS).forEach((key) => { + console.log( + ` \x1b[36m${key}\x1b[0m ${FIXTURES_FLAGS[key].explanation} (default: \x1b[33m${FIXTURES_FLAGS[key].defaultValue}\x1b[0m)`, + ); + }); + return; + } + + const FIXTURES_CONFIG = {}; + + Object.keys(FIXTURES_FLAGS).forEach((key) => { + FIXTURES_CONFIG[key.replace(/^--/u, '')] = FIXTURES_FLAGS[key].defaultValue; + }); + + let invalidArguments = false; + + // Arguments parsing and validation + args.forEach((arg) => { + const [key, value] = arg.split('='); + if (Object.prototype.hasOwnProperty.call(FIXTURES_FLAGS, key)) { + let valueType; + switch (FIXTURES_FLAGS[key].type) { + case 'number': + valueType = !isNaN(parseFloat(value)) && isFinite(value); + break; + case 'boolean': + valueType = value === 'true' || value === 'false'; + break; + case 'string': + valueType = typeof value === 'string'; + break; + default: + throw new Error(`Unknown type for argument ${key}`); + } + if (valueType) { + const configKey = key.replace(/^--/u, ''); + if (FIXTURES_FLAGS[key].type === 'number') { + FIXTURES_CONFIG[configKey] = parseFloat(value); + } else if (FIXTURES_FLAGS[key].type === 'boolean') { + FIXTURES_CONFIG[configKey] = value === 'true'; + } else { + FIXTURES_CONFIG[configKey] = value; + } + } else { + console.error(`Invalid value for argument ${key}: ${value}`); + invalidArguments = true; + } + } else { + console.error(`Invalid argument: ${key}`); + invalidArguments = true; + } + }); + + console.log('Fixture flags:', FIXTURES_CONFIG); + if (invalidArguments) { + throw new Error('Invalid arguments'); + } + + const fixturesConfig = JSON.stringify(FIXTURES_CONFIG); + + // Start the wallet with state + process.env.WITH_STATE = fixturesConfig; + childProcess.spawn('yarn', [FIXTURES_CONFIG['withStartCommand']], { + stdio: 'inherit', + shell: true, + }); +} + +startWithWalletState(); diff --git a/builds.yml b/builds.yml index 573b0633b78c..62989545775f 100644 --- a/builds.yml +++ b/builds.yml @@ -145,7 +145,7 @@ env: # The unlock password - PASSWORD: null - TEST_SRP: null - - SKIP_ONBOARDING: null + - WITH_STATE: null # Also see METAMASK_DEBUG and NODE_DEBUG - DEBUG: null - SUPPORT_LINK: https://support.metamask.io diff --git a/package.json b/package.json index 99ed1e060cf5..51d5ac234bbc 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,7 @@ "postinstall": "yarn webpack:clearcache", "env:e2e": "SEGMENT_HOST='https://api.segment.io' SEGMENT_WRITE_KEY='FAKE' yarn", "start": "yarn build:dev dev --apply-lavamoat=false --snow=false", - "start:skip-onboarding": "SKIP_ONBOARDING=true yarn start", + "start:with-state": "node ./app/scripts/start-with-wallet-state.mjs", "start:mv2": "ENABLE_MV3=false yarn build:dev dev --apply-lavamoat=false --snow=false", "start:flask": "yarn start --build-type flask", "start:mmi": "yarn start --build-type mmi", diff --git a/test/e2e/constants.ts b/test/e2e/constants.ts index 4dee1053aaee..e7fef587f533 100644 --- a/test/e2e/constants.ts +++ b/test/e2e/constants.ts @@ -39,5 +39,10 @@ export const VERIFYING_PAYMASTER = '0xbdbDEc38ed168331b1F7004cc9e5392A2272C1D7'; /* Default ganache ETH balance in decimal when first login */ export const DEFAULT_GANACHE_ETH_BALANCE_DEC = '25'; +/* Dapp host addresses and URL*/ +export const DAPP_HOST_ADDRESS = '127.0.0.1:8080'; +export const DAPP_URL = `http://${DAPP_HOST_ADDRESS}`; +export const DAPP_ONE_URL = 'http://127.0.0.1:8081'; + /* Default BTC address created using test SRP */ export const DEFAULT_BTC_ACCOUNT = 'bc1qg6whd6pc0cguh6gpp3ewujm53hv32ta9hdp252'; diff --git a/test/e2e/fixture-builder.js b/test/e2e/fixture-builder.js index 1a4014bcc30a..1d9401bf227f 100644 --- a/test/e2e/fixture-builder.js +++ b/test/e2e/fixture-builder.js @@ -2,14 +2,18 @@ const { WALLET_SNAP_PERMISSION_KEY, SnapCaveatType, } = require('@metamask/snaps-utils'); -const { merge } = require('lodash'); +const { merge, mergeWith } = require('lodash'); const { toHex } = require('@metamask/controller-utils'); const { mockNetworkState } = require('../stub/networks'); const { CHAIN_IDS } = require('../../shared/constants/network'); const { SMART_CONTRACTS } = require('./seeder/smart-contracts'); -const { DAPP_URL, DAPP_ONE_URL } = require('./helpers'); -const { DEFAULT_FIXTURE_ACCOUNT, ERC_4337_ACCOUNT } = require('./constants'); +const { + DAPP_URL, + DAPP_ONE_URL, + DEFAULT_FIXTURE_ACCOUNT, + ERC_4337_ACCOUNT, +} = require('./constants'); const { defaultFixture, FIXTURE_STATE_METADATA_VERSION, @@ -361,6 +365,20 @@ class FixtureBuilder { }); } + withNotificationServicesController(data) { + mergeWith( + this.fixture.data.NotificationServicesController, + data, + (objValue, srcValue) => { + if (Array.isArray(objValue)) { + objValue.concat(srcValue); + } + return undefined; + }, + ); + return this; + } + withOnboardingController(data) { merge(this.fixture.data.OnboardingController, data); return this; From 832e6fcbaed9fc0645820ddf0c8d8010394d6087 Mon Sep 17 00:00:00 2001 From: George Marshall Date: Wed, 18 Sep 2024 09:41:17 -0700 Subject: [PATCH 12/61] fix: updating close icon svg (#27235) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## **Description** This pull request updates the close icon SVG to match the design specifications. The existing SVG used in the code was inconsistent with the design provided by the design team, so this change replaces it with the correct version to ensure visual consistency across the application. [![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/27235?quickstart=1) ## **Related issues** Fixes: https://github.com/MetaMask/metamask-extension/issues/27234 ## **Manual Testing Steps** 1. Navigate to any part of the application where the close icon is displayed. 2. Verify that the close icon matches the design specification. 3. Test the icon in various browsers (Chrome, Firefox, etc.) to ensure it displays correctly. 4. Test on both light and dark modes (if applicable). 5. Verify the close icon’s appearance in different screen sizes (desktop, tablet, mobile). ## **Screenshots/Recordings** ### **Before** Screenshot 2024-09-17 at 7 45 29 PM Screenshot 2024-09-17 at 7 39 56 PM ### **After** Screenshot 2024-09-17 at 7 45 48 PM Screenshot 2024-09-17 at 7 40 13 PM ## **Pre-merge author checklist** - [x] I've followed [MetaMask Contributor Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Extension Coding Standards](https://github.com/MetaMask/metamask-extension/blob/develop/.github/guidelines/CODING_GUIDELINES.md). - [x] I've completed the PR template to the best of my ability - [x] I’ve included tests if applicable - [x] I’ve documented my code using [JSDoc](https://jsdoc.app/) format if applicable - [x] I’ve applied the right labels on the PR (see [labeling guidelines](https://github.com/MetaMask/metamask-extension/blob/develop/.github/guidelines/LABELING_GUIDELINES.md)). Not required for external contributors. ## **Pre-merge reviewer checklist** - [ ] I've manually tested the PR (e.g. pull and build branch, run the app, test code being changed). - [ ] I confirm that this PR addresses all acceptance criteria described in the ticket it closes and includes the necessary testing evidence such as recordings and or screenshots. --- app/images/icons/close.svg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/images/icons/close.svg b/app/images/icons/close.svg index 7b75bbb61aad..a31907c8fd62 100644 --- a/app/images/icons/close.svg +++ b/app/images/icons/close.svg @@ -1 +1 @@ - + From 107f8dad213867b6e3a54272555ba672ee8174e2 Mon Sep 17 00:00:00 2001 From: Norbert Elter <72046715+itsyoboieltr@users.noreply.github.com> Date: Wed, 18 Sep 2024 20:50:15 +0400 Subject: [PATCH 13/61] feat: Create a quality gate for unit test coverage (#27123) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## **Description** [![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/27123?quickstart=1) This PR: 1. Refactors the current testing pipeline in one workflow (run-tests) 2. Removes codecov 3. Adds SonarCloud ## **Related issues** Fixes: https://github.com/MetaMask/MetaMask-planning/issues/2962 ## **Manual testing steps** 1. Quality gate works for test coverage ## **Screenshots/Recordings** Not applicable ## **Pre-merge author checklist** - [x] I've followed [MetaMask Contributor Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Extension Coding Standards](https://github.com/MetaMask/metamask-extension/blob/develop/.github/guidelines/CODING_GUIDELINES.md). - [x] I've completed the PR template to the best of my ability - [x] I’ve included tests if applicable - [x] I’ve documented my code using [JSDoc](https://jsdoc.app/) format if applicable - [x] I’ve applied the right labels on the PR (see [labeling guidelines](https://github.com/MetaMask/metamask-extension/blob/develop/.github/guidelines/LABELING_GUIDELINES.md)). Not required for external contributors. ## **Pre-merge reviewer checklist** - [ ] I've manually tested the PR (e.g. pull and build branch, run the app, test code being changed). - [ ] I confirm that this PR addresses all acceptance criteria described in the ticket it closes and includes the necessary testing evidence such as recordings and or screenshots. --- .github/workflows/run-integration-tests.yml | 20 --- .github/workflows/run-tests.yml | 142 ++++++++++++++++++++ .github/workflows/run-unit-tests.yml | 72 ---------- .github/workflows/sonar.yml | 22 --- jest.config.js | 4 +- package.json | 2 +- sonar-project.properties | 9 +- 7 files changed, 150 insertions(+), 121 deletions(-) delete mode 100644 .github/workflows/run-integration-tests.yml create mode 100644 .github/workflows/run-tests.yml delete mode 100644 .github/workflows/run-unit-tests.yml delete mode 100644 .github/workflows/sonar.yml diff --git a/.github/workflows/run-integration-tests.yml b/.github/workflows/run-integration-tests.yml deleted file mode 100644 index 8de1899e0dfa..000000000000 --- a/.github/workflows/run-integration-tests.yml +++ /dev/null @@ -1,20 +0,0 @@ -name: Run integration tests - -on: - push: - branches: [develop, master] - pull_request: - types: [opened,reopened,synchronize] - -jobs: - test-integration: - runs-on: ubuntu-latest - steps: - - name: Checkout repository - uses: actions/checkout@v4 - - - name: Setup environment - uses: metamask/github-tools/.github/actions/setup-environment@main - - - name: test:integration:coverage - run: yarn test:integration:coverage diff --git a/.github/workflows/run-tests.yml b/.github/workflows/run-tests.yml new file mode 100644 index 000000000000..a0240346af64 --- /dev/null +++ b/.github/workflows/run-tests.yml @@ -0,0 +1,142 @@ +name: Run tests + +on: + push: + branches: + - develop + - master + pull_request: + types: + - opened + - reopened + - synchronize + +jobs: + test-unit: + name: Unit tests + runs-on: ubuntu-latest + strategy: + matrix: + shard: [1, 2, 3, 4, 5, 6] + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Setup environment + uses: metamask/github-tools/.github/actions/setup-environment@main + + - name: test:unit:coverage + run: yarn test:unit:coverage --shard=${{ matrix.shard }}/${{ strategy.job-total }} + + - name: Rename coverage + run: mv coverage/unit/coverage-final.json coverage/unit/coverage-unit-${{matrix.shard}}.json + + - uses: actions/upload-artifact@v4 + with: + name: coverage-unit-${{matrix.shard}} + path: coverage/unit/coverage-unit-${{matrix.shard}}.json + + test-webpack: + name: Webpack tests + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Setup environment + uses: metamask/github-tools/.github/actions/setup-environment@main + + - name: test:unit:webpack:coverage + run: yarn test:unit:webpack:coverage + + - name: Rename coverage + run: mv coverage/webpack/coverage-final.json coverage/webpack/coverage-webpack.json + + - uses: actions/upload-artifact@v4 + with: + name: coverage-webpack + path: coverage/webpack/coverage-webpack.json + + test-integration: + name: Integration tests + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Setup environment + uses: metamask/github-tools/.github/actions/setup-environment@main + + - name: test:integration:coverage + run: yarn test:integration:coverage + + - name: Rename coverage + run: mv coverage/integration/coverage-final.json coverage/integration/coverage-integration.json + + - uses: actions/upload-artifact@v4 + with: + name: coverage-integration + path: coverage/integration/coverage-integration.json + + sonarcloud: + name: SonarCloud + runs-on: ubuntu-latest + needs: + - test-unit + - test-webpack + - test-integration + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + fetch-depth: 0 # Shallow clones should be disabled for better relevancy of analysis + + - name: Setup environment + uses: metamask/github-tools/.github/actions/setup-environment@main + + - name: Download artifacts + uses: actions/download-artifact@v4 + with: + path: coverage + merge-multiple: true + + - name: Merge coverage reports + run: yarn nyc merge coverage .nyc_output/coverage-final.json && yarn nyc report --reporter lcov + + - uses: actions/upload-artifact@v4 + with: + name: lcov.info + path: coverage/lcov.info + + - name: Get Sonar coverage + id: get-sonar-coverage + env: + SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} + run: | + projectKey=$(grep 'sonar.projectKey=' sonar-project.properties | cut -d'=' -f2) + sonar_coverage=$(curl --silent --header "Authorization: Bearer $SONAR_TOKEN" "https://sonarcloud.io/api/measures/component?component=$projectKey&metricKeys=coverage" | jq -r '.component.measures[0].value // 0') + echo "The Sonar coverage of $projectKey is $sonar_coverage%." + echo 'SONAR_COVERAGE='"$sonar_coverage" >> "$GITHUB_OUTPUT" + + - name: Validate test coverage + env: + SONAR_COVERAGE: ${{ steps.get-sonar-coverage.outputs.SONAR_COVERAGE }} + run: | + coverage=$(yarn nyc report --reporter=text-summary | grep 'Lines' | awk '{gsub(/%/, ""); print $3}') + if [ -z "$coverage" ]; then + echo "::error::Could not retrieve test coverage." + exit 1 + fi + if (( $(echo "$coverage < $SONAR_COVERAGE" | bc -l) )); then + echo "::error::Quality gate failed for test coverage. Current test coverage is $coverage%, please increase coverage to at least $SONAR_COVERAGE%." + exit 1 + else + echo "Test coverage is $coverage%. Quality gate passed." + fi + + - name: SonarCloud Scan + # This is SonarSource/sonarcloud-github-action@v2.0.0 + uses: SonarSource/sonarcloud-github-action@4b4d7634dab97dcee0b75763a54a6dc92a9e6bc1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} diff --git a/.github/workflows/run-unit-tests.yml b/.github/workflows/run-unit-tests.yml deleted file mode 100644 index 6765352f5d7d..000000000000 --- a/.github/workflows/run-unit-tests.yml +++ /dev/null @@ -1,72 +0,0 @@ -name: Run unit tests - -on: - push: - branches: [develop, master] - pull_request: - types: [opened,reopened,synchronize] - -jobs: - test-unit: - runs-on: ubuntu-latest - strategy: - matrix: - shard: [1, 2, 3, 4, 5, 6] - steps: - - name: Checkout repository - uses: actions/checkout@v4 - - - name: Setup environment - uses: metamask/github-tools/.github/actions/setup-environment@main - - - name: test:unit:coverage - run: yarn test:unit:coverage --shard=${{ matrix.shard }}/${{ strategy.job-total }} - - - name: Rename coverage to shard coverage - run: mv coverage/coverage-final.json coverage/coverage-${{matrix.shard}}.json - - - uses: actions/upload-artifact@v4 - with: - name: coverage-${{matrix.shard}} - path: coverage/coverage-${{matrix.shard}}.json - - test-webpack: - runs-on: ubuntu-latest - steps: - - name: Checkout repository - uses: actions/checkout@v4 - - - name: Setup environment - uses: metamask/github-tools/.github/actions/setup-environment@main - - - name: test:unit:webpack:coverage - run: yarn test:unit:webpack:coverage - - - name: Rename coverage - run: mv coverage/coverage-final.json coverage/coverage-webpack.json - - - uses: actions/upload-artifact@v4 - with: - name: coverage-webpack - path: coverage/coverage-webpack.json - - report-coverage: - runs-on: ubuntu-latest - needs: - - test-unit - steps: - - name: Checkout repository - uses: actions/checkout@v4 - - - name: Download coverage from shards - uses: actions/download-artifact@v4 - with: - path: coverage - pattern: coverage-* - merge-multiple: true - - - name: Upload coverage to Codecov - uses: codecov/codecov-action@e28ff129e5465c2c0dcc6f003fc735cb6ae0c673 - with: - token: ${{ secrets.CODECOV_TOKEN }} - fail_ci_if_error: true diff --git a/.github/workflows/sonar.yml b/.github/workflows/sonar.yml deleted file mode 100644 index f5e1a0552dd1..000000000000 --- a/.github/workflows/sonar.yml +++ /dev/null @@ -1,22 +0,0 @@ -name: Sonar -on: - push: - branches: - - develop - pull_request: - branches: - - develop - -jobs: - sonarcloud: - name: SonarCloud - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - with: - fetch-depth: 0 # Shallow clones should be disabled for better relevancy of analysis - - name: SonarCloud Scan - # This is SonarSource/sonarcloud-github-action@v2.0.0 - uses: SonarSource/sonarcloud-github-action@4b4d7634dab97dcee0b75763a54a6dc92a9e6bc1 - env: - SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} diff --git a/jest.config.js b/jest.config.js index 605848626405..dbfb0522cff7 100644 --- a/jest.config.js +++ b/jest.config.js @@ -6,9 +6,9 @@ module.exports = { '/development/build/transforms/**/*.js', '/test/unit-global/**/*.test.(js|ts|tsx)', ], - coverageDirectory: './coverage', + coverageDirectory: './coverage/unit', coveragePathIgnorePatterns: ['.stories.*', '.snap'], - coverageReporters: process.env.CI ? ['json'] : ['html', 'json'], + coverageReporters: ['html', 'json'], reporters: [ 'default', [ diff --git a/package.json b/package.json index 51d5ac234bbc..4cee6dcdd7b0 100644 --- a/package.json +++ b/package.json @@ -47,7 +47,7 @@ "test:unit:watch": "jest --watch", "test:unit:coverage": "jest --coverage", "test:unit:webpack": "tsx --test development/webpack/test/*.test.ts", - "test:unit:webpack:coverage": "nyc --reporter=html --reporter=json --reporter=text tsx --test development/webpack/test/*.test.ts", + "test:unit:webpack:coverage": "nyc --reporter=html --reporter=json --reporter=text --report-dir=./coverage/webpack tsx --test development/webpack/test/*.test.ts", "test:integration": "jest --config jest.integration.config.js", "test:integration:coverage": "jest --config jest.integration.config.js --coverage", "test:e2e:chrome": "SELENIUM_BROWSER=chrome node test/e2e/run-all.js", diff --git a/sonar-project.properties b/sonar-project.properties index 0455fa9634e2..3b8ff8dfba9f 100644 --- a/sonar-project.properties +++ b/sonar-project.properties @@ -1,5 +1,5 @@ -sonar.projectKey=metamask-extension-private -sonar.organization=metamask +sonar.projectKey=metamask-extension +sonar.organization=consensys # Source sonar.sources=app,development,offscreen,shared,types,ui @@ -8,7 +8,8 @@ sonar.exclusions=**/*.test.**,**/*.spec.**,app/images # Tests sonar.tests=app,test,development,offscreen,shared,types,ui sonar.test.inclusions=**/*.test.**,**/*.spec.** -sonar.javascript.lcov.reportPaths=tests/coverage/lcov.info + +sonar.javascript.lcov.reportPaths=coverage/lcov.info # Fail CI job if quality gate failures -sonar.qualitygate.wait=false \ No newline at end of file +sonar.qualitygate.wait=true From f06b7a0e75166f4341cc78d5f0dc942a0d6de4f7 Mon Sep 17 00:00:00 2001 From: David Murdoch <187813+davidmurdoch@users.noreply.github.com> Date: Wed, 18 Sep 2024 17:54:44 -0400 Subject: [PATCH 14/61] perf: preload `_locales/en/messages.json` so we don't have to wait as long for our JS to dynamically load it (#26556) We always load the English version of `messages.json`. This PR makes use of link `rel=preload` so that the browser will get the file ready for use immediately -- well before our JavaScript file that will eventually need it asks for it. This reduces the amount of waiting due to Network Waterfall (even if the network is the local file system). --- app/home.html | 1 + app/notification.html | 1 + app/popup.html | 1 + 3 files changed, 3 insertions(+) diff --git a/app/home.html b/app/home.html index 7308064505b0..9c4ec38b448a 100644 --- a/app/home.html +++ b/app/home.html @@ -8,6 +8,7 @@ <% } else { %> MetaMask <% } %> + diff --git a/app/notification.html b/app/notification.html index 3a19128baa1f..c5bfd8358730 100644 --- a/app/notification.html +++ b/app/notification.html @@ -32,6 +32,7 @@ margin-top: 1rem; } + diff --git a/app/popup.html b/app/popup.html index 92806e42047a..760ec6683203 100644 --- a/app/popup.html +++ b/app/popup.html @@ -4,6 +4,7 @@ MetaMask + From 88664bbbe9a3f0d583ac0cb07619fb662a558e09 Mon Sep 17 00:00:00 2001 From: Ariella Vu <20778143+digiwand@users.noreply.github.com> Date: Thu, 19 Sep 2024 15:55:07 +0800 Subject: [PATCH 15/61] refactor: memoize fetchErc20Decimals, relocate to utils/token, and apply to other instances (#27088) --- .../value-display/value-display.tsx | 29 +++++++---- .../components/confirm/row/dataTree.tsx | 14 +++--- .../useBalanceChanges.test.ts | 6 +++ .../simulation-details/useBalanceChanges.ts | 24 +-------- .../confirmations/confirm/confirm.test.tsx | 4 ++ ui/pages/confirmations/constants/token.ts | 1 + ui/pages/confirmations/utils/token.test.ts | 50 +++++++++++++++++++ ui/pages/confirmations/utils/token.ts | 32 ++++++++++++ 8 files changed, 119 insertions(+), 41 deletions(-) create mode 100644 ui/pages/confirmations/constants/token.ts create mode 100644 ui/pages/confirmations/utils/token.test.ts create mode 100644 ui/pages/confirmations/utils/token.ts diff --git a/ui/pages/confirmations/components/confirm/info/typed-sign/permit-simulation/value-display/value-display.tsx b/ui/pages/confirmations/components/confirm/info/typed-sign/permit-simulation/value-display/value-display.tsx index d0cd9c529d0e..25fad3020103 100644 --- a/ui/pages/confirmations/components/confirm/info/typed-sign/permit-simulation/value-display/value-display.tsx +++ b/ui/pages/confirmations/components/confirm/info/typed-sign/permit-simulation/value-display/value-display.tsx @@ -1,7 +1,7 @@ import React, { useMemo } from 'react'; import { NameType } from '@metamask/name-controller'; +import { Hex } from '@metamask/utils'; import { captureException } from '@sentry/browser'; -import { getTokenStandardAndDetails } from '../../../../../../../../store/actions'; import { shortenString } from '../../../../../../../../helpers/utils/util'; import { calcTokenAmount } from '../../../../../../../../../shared/lib/transactions-controller-utils'; @@ -27,23 +27,30 @@ import { TextAlign, } from '../../../../../../../../helpers/constants/design-system'; import Name from '../../../../../../../../components/app/name/name'; +import { fetchErc20Decimals } from '../../../../../../utils/token'; -const getTokenDecimals = async (tokenContract: string) => { - const tokenDetails = await getTokenStandardAndDetails(tokenContract); - const tokenDecimals = tokenDetails?.decimals; +type PermitSimulationValueDisplayParams = { + /** The primaryType of the typed sign message */ + primaryType?: string; - return parseInt(tokenDecimals ?? '0', 10); -}; + /** + * The ethereum token contract address. It is expected to be in hex format. + * We currently accept strings since we have a patch that accepts a custom string + * {@see .yarn/patches/@metamask-eth-json-rpc-middleware-npm-14.0.1-b6c2ccbe8c.patch} + */ + tokenContract: Hex | string; -const PermitSimulationValueDisplay: React.FC<{ - primaryType?: string; - tokenContract: string; + /** The token amount */ value: number | string; -}> = ({ primaryType, tokenContract, value }) => { +}; + +const PermitSimulationValueDisplay: React.FC< + PermitSimulationValueDisplayParams +> = ({ primaryType, tokenContract, value }) => { const exchangeRate = useTokenExchangeRate(tokenContract); const { value: tokenDecimals } = useAsyncResult( - async () => await getTokenDecimals(tokenContract), + async () => await fetchErc20Decimals(tokenContract), [tokenContract], ); diff --git a/ui/pages/confirmations/components/confirm/row/dataTree.tsx b/ui/pages/confirmations/components/confirm/row/dataTree.tsx index f728b9d5dfa9..aebd1c702aa6 100644 --- a/ui/pages/confirmations/components/confirm/row/dataTree.tsx +++ b/ui/pages/confirmations/components/confirm/row/dataTree.tsx @@ -1,3 +1,4 @@ +import { Hex } from '@metamask/utils'; import React, { memo } from 'react'; import { @@ -6,9 +7,8 @@ import { PRIMARY_TYPES_PERMIT, } from '../../../../../../shared/constants/signatures'; import { isValidHexAddress } from '../../../../../../shared/modules/hexstring-utils'; -import { sanitizeString } from '../../../../../helpers/utils/util'; -import { getTokenStandardAndDetails } from '../../../../../store/actions'; +import { sanitizeString } from '../../../../../helpers/utils/util'; import { Box } from '../../../../../components/component-library'; import { BlockSize } from '../../../../../helpers/constants/design-system'; import { useAsyncResult } from '../../../../../hooks/useAsyncResult'; @@ -19,6 +19,7 @@ import { ConfirmInfoRowText, ConfirmInfoRowTextTokenUnits, } from '../../../../../components/app/confirm/info/row'; +import { fetchErc20Decimals } from '../../../utils/token'; type ValueType = string | Record | TreeData[]; @@ -68,15 +69,12 @@ const getTokenDecimalsOfDataTree = async ( } const tokenContract = (dataTreeData as Record).token - ?.value as string; - if (!tokenContract) { + ?.value as Hex; + if (!tokenContract || !isValidHexAddress(tokenContract)) { return undefined; } - const tokenDetails = await getTokenStandardAndDetails(tokenContract); - const tokenDecimals = tokenDetails?.decimals; - - return parseInt(tokenDecimals ?? '0', 10); + return await fetchErc20Decimals(tokenContract); }; export const DataTree = ({ diff --git a/ui/pages/confirmations/components/simulation-details/useBalanceChanges.test.ts b/ui/pages/confirmations/components/simulation-details/useBalanceChanges.test.ts index 64d9632c75a7..10e4cca518b7 100644 --- a/ui/pages/confirmations/components/simulation-details/useBalanceChanges.test.ts +++ b/ui/pages/confirmations/components/simulation-details/useBalanceChanges.test.ts @@ -9,6 +9,7 @@ import { TokenStandard } from '../../../../../shared/constants/transaction'; import { getConversionRate } from '../../../../ducks/metamask/metamask'; import { getTokenStandardAndDetails } from '../../../../store/actions'; import { fetchTokenExchangeRates } from '../../../../helpers/utils/util'; +import { fetchErc20Decimals } from '../../utils/token'; import { useBalanceChanges } from './useBalanceChanges'; import { FIAT_UNAVAILABLE } from './types'; @@ -89,6 +90,11 @@ describe('useBalanceChanges', () => { }); }); + afterEach(() => { + /** Reset memoized function for each test */ + fetchErc20Decimals?.cache?.clear?.(); + }); + describe('pending states', () => { it('returns pending=true if no simulation data', async () => { const { result, waitForNextUpdate } = renderHook(() => diff --git a/ui/pages/confirmations/components/simulation-details/useBalanceChanges.ts b/ui/pages/confirmations/components/simulation-details/useBalanceChanges.ts index 6f2a033cc567..2a198d76ea36 100644 --- a/ui/pages/confirmations/components/simulation-details/useBalanceChanges.ts +++ b/ui/pages/confirmations/components/simulation-details/useBalanceChanges.ts @@ -9,11 +9,12 @@ import { import { BigNumber } from 'bignumber.js'; import { ContractExchangeRates } from '@metamask/assets-controllers'; import { useAsyncResultOrThrow } from '../../../../hooks/useAsyncResult'; -import { getTokenStandardAndDetails } from '../../../../store/actions'; import { TokenStandard } from '../../../../../shared/constants/transaction'; import { getConversionRate } from '../../../../ducks/metamask/metamask'; import { getCurrentChainId, getCurrentCurrency } from '../../../../selectors'; import { fetchTokenExchangeRates } from '../../../../helpers/utils/util'; +import { ERC20_DEFAULT_DECIMALS, fetchErc20Decimals } from '../../utils/token'; + import { BalanceChange, FIAT_UNAVAILABLE, @@ -23,8 +24,6 @@ import { const NATIVE_DECIMALS = 18; -const ERC20_DEFAULT_DECIMALS = 18; - // See https://github.com/MikeMcl/bignumber.js/issues/11#issuecomment-23053776 function convertNumberToStringWithPrecisionWarning(value: number): string { return String(value); @@ -57,25 +56,6 @@ function getAssetAmount( ); } -// Fetches the decimals for the given token address. -async function fetchErc20Decimals(address: Hex): Promise { - try { - const { decimals: decStr } = await getTokenStandardAndDetails(address); - if (!decStr) { - return ERC20_DEFAULT_DECIMALS; - } - for (const radix of [10, 16]) { - const parsedDec = parseInt(decStr, radix); - if (isFinite(parsedDec)) { - return parsedDec; - } - } - return ERC20_DEFAULT_DECIMALS; - } catch { - return ERC20_DEFAULT_DECIMALS; - } -} - // Fetches token details for all the token addresses in the SimulationTokenBalanceChanges async function fetchAllErc20Decimals( addresses: Hex[], diff --git a/ui/pages/confirmations/confirm/confirm.test.tsx b/ui/pages/confirmations/confirm/confirm.test.tsx index 0b10976ab48c..dbf4dab7dfaf 100644 --- a/ui/pages/confirmations/confirm/confirm.test.tsx +++ b/ui/pages/confirmations/confirm/confirm.test.tsx @@ -18,6 +18,7 @@ import { import { renderWithConfirmContextProvider } from '../../../../test/lib/confirmations/render-helpers'; import * as actions from '../../../store/actions'; import { SignatureRequestType } from '../types/confirm'; +import { fetchErc20Decimals } from '../utils/token'; import Confirm from './confirm'; jest.mock('react-router-dom', () => ({ @@ -32,6 +33,9 @@ const middleware = [thunk]; describe('Confirm', () => { afterEach(() => { jest.resetAllMocks(); + + /** Reset memoized function using getTokenStandardAndDetails for each test */ + fetchErc20Decimals?.cache?.clear?.(); }); it('should render', () => { diff --git a/ui/pages/confirmations/constants/token.ts b/ui/pages/confirmations/constants/token.ts new file mode 100644 index 000000000000..4520a77d3585 --- /dev/null +++ b/ui/pages/confirmations/constants/token.ts @@ -0,0 +1 @@ +export const ERC20_DEFAULT_DECIMALS = 18; diff --git a/ui/pages/confirmations/utils/token.test.ts b/ui/pages/confirmations/utils/token.test.ts new file mode 100644 index 000000000000..e71813713d79 --- /dev/null +++ b/ui/pages/confirmations/utils/token.test.ts @@ -0,0 +1,50 @@ +import { getTokenStandardAndDetails } from '../../../store/actions'; +import { ERC20_DEFAULT_DECIMALS } from '../constants/token'; +import { fetchErc20Decimals } from './token'; + +const MOCK_ADDRESS = '0x514910771af9ca656af840dff83e8264ecf986ca'; +const MOCK_DECIMALS = 36; + +jest.mock('../../../store/actions', () => ({ + getTokenStandardAndDetails: jest.fn(), +})); + +describe('fetchErc20Decimals', () => { + afterEach(() => { + jest.clearAllMocks(); + + /** Reset memoized function using getTokenStandardAndDetails for each test */ + fetchErc20Decimals?.cache?.clear?.(); + }); + + it(`should return the default number, ${ERC20_DEFAULT_DECIMALS}, if no decimals were found from details`, async () => { + (getTokenStandardAndDetails as jest.Mock).mockResolvedValue({}); + const decimals = await fetchErc20Decimals(MOCK_ADDRESS); + + expect(decimals).toBe(ERC20_DEFAULT_DECIMALS); + }); + + it('should return the decimals for a given token address', async () => { + (getTokenStandardAndDetails as jest.Mock).mockResolvedValue({ + decimals: MOCK_DECIMALS, + }); + const decimals = await fetchErc20Decimals(MOCK_ADDRESS); + + expect(decimals).toBe(MOCK_DECIMALS); + }); + + it('should memoize the result for the same token addresses', async () => { + (getTokenStandardAndDetails as jest.Mock).mockResolvedValue({ + decimals: MOCK_DECIMALS, + }); + + const firstCallResult = await fetchErc20Decimals(MOCK_ADDRESS); + const secondCallResult = await fetchErc20Decimals(MOCK_ADDRESS); + + expect(firstCallResult).toBe(secondCallResult); + expect(getTokenStandardAndDetails).toHaveBeenCalledTimes(1); + + await fetchErc20Decimals('0xDifferentAddress'); + expect(getTokenStandardAndDetails).toHaveBeenCalledTimes(2); + }); +}); diff --git a/ui/pages/confirmations/utils/token.ts b/ui/pages/confirmations/utils/token.ts new file mode 100644 index 000000000000..1f94280129a9 --- /dev/null +++ b/ui/pages/confirmations/utils/token.ts @@ -0,0 +1,32 @@ +import { memoize } from 'lodash'; +import { Hex } from '@metamask/utils'; +import { getTokenStandardAndDetails } from '../../../store/actions'; + +export const ERC20_DEFAULT_DECIMALS = 18; + +/** + * Fetches the decimals for the given token address. + * + * @param {Hex | string} address - The ethereum token contract address. It is expected to be in hex format. + * We currently accept strings since we have a patch that accepts a custom string + * {@see .yarn/patches/@metamask-eth-json-rpc-middleware-npm-14.0.1-b6c2ccbe8c.patch} + */ +export const fetchErc20Decimals = memoize( + async (address: Hex | string): Promise => { + try { + const { decimals: decStr } = await getTokenStandardAndDetails(address); + if (!decStr) { + return ERC20_DEFAULT_DECIMALS; + } + for (const radix of [10, 16]) { + const parsedDec = parseInt(decStr, radix); + if (isFinite(parsedDec)) { + return parsedDec; + } + } + return ERC20_DEFAULT_DECIMALS; + } catch { + return ERC20_DEFAULT_DECIMALS; + } + }, +); From 0c3e3914aa3f125e6414ad97f465bd637a6bb053 Mon Sep 17 00:00:00 2001 From: Ariella Vu <20778143+digiwand@users.noreply.github.com> Date: Thu, 19 Sep 2024 15:55:58 +0800 Subject: [PATCH 16/61] feat: create useSignatureEvent fragment hook and fix expected updateEventFragment type (#27043) --- app/scripts/controllers/metametrics.js | 22 +++--- .../lib/createRPCMethodTrackingMiddleware.js | 48 ++++++++----- shared/constants/metametrics.ts | 4 +- test/data/confirmations/typed_sign.ts | 22 ++++-- .../hooks/useConfirmationAlertMetrics.ts | 12 +--- .../hooks/useSignatureEventFragment.test.tsx | 67 +++++++++++++++++++ .../hooks/useSignatureEventFragment.ts | 36 ++++++++++ ui/store/actions.ts | 3 +- 8 files changed, 169 insertions(+), 45 deletions(-) create mode 100644 ui/pages/confirmations/hooks/useSignatureEventFragment.test.tsx create mode 100644 ui/pages/confirmations/hooks/useSignatureEventFragment.ts diff --git a/app/scripts/controllers/metametrics.js b/app/scripts/controllers/metametrics.js index d799249bb71b..e7618decb3ba 100644 --- a/app/scripts/controllers/metametrics.js +++ b/app/scripts/controllers/metametrics.js @@ -333,7 +333,7 @@ export default class MetaMetricsController { * Updates an event fragment in state * * @param {string} id - The fragment id to update - * @param {MetaMetricsEventFragment} payload - Fragment settings and + * @param {Partial} payload - Fragment settings and * properties to initiate the fragment with. */ updateEventFragment(id, payload) { @@ -356,19 +356,23 @@ export default class MetaMetricsController { }); } + /** + * @typedef {object} MetaMetricsFinalizeEventFragmentOptions + * @property {boolean} [abandoned = false] - if true track the failure + * event instead of the success event + * @property {MetaMetricsContext.page} [page] - page the final event + * occurred on. This will override whatever is set on the fragment + * @property {MetaMetricsContext.referrer} [referrer] - Dapp that + * originated the fragment. This is for fallback only, the fragment referrer + * property will take precedence. + */ + /** * Finalizes a fragment, tracking either a success event or failure Event * and then removes the fragment from state. * * @param {string} id - UUID of the event fragment to be closed - * @param {object} options - * @param {boolean} [options.abandoned] - if true track the failure - * event instead of the success event - * @param {MetaMetricsContext.page} [options.page] - page the final event - * occurred on. This will override whatever is set on the fragment - * @param {MetaMetricsContext.referrer} [options.referrer] - Dapp that - * originated the fragment. This is for fallback only, the fragment referrer - * property will take precedence. + * @param {MetaMetricsFinalizeEventFragmentOptions} options */ finalizeEventFragment(id, { abandoned = false, page, referrer } = {}) { const fragment = this.store.getState().fragments[id]; diff --git a/app/scripts/lib/createRPCMethodTrackingMiddleware.js b/app/scripts/lib/createRPCMethodTrackingMiddleware.js index 40b619f4f847..092b95943c2d 100644 --- a/app/scripts/lib/createRPCMethodTrackingMiddleware.js +++ b/app/scripts/lib/createRPCMethodTrackingMiddleware.js @@ -131,9 +131,9 @@ let globalRateLimitCount = 0; * * @param {MetaMetricsController} metaMetricsController * @param {OriginalRequest} req - * @param {object} properties + * @param {Partial} fragmentPayload */ -function createSignatureFragment(metaMetricsController, req, properties) { +function createSignatureFragment(metaMetricsController, req, fragmentPayload) { metaMetricsController.createEventFragment({ category: MetaMetricsEventCategory.InpageProvider, initialEvent: MetaMetricsEventName.SignatureRequested, @@ -144,7 +144,7 @@ function createSignatureFragment(metaMetricsController, req, properties) { referrer: { url: req.origin, }, - properties, + ...fragmentPayload, }); } @@ -153,23 +153,28 @@ function createSignatureFragment(metaMetricsController, req, properties) { * * @param {MetaMetricsController} metaMetricsController * @param {OriginalRequest} req - * @param {object} options - * @param {boolean} options.abandoned - * @param {object} options.properties + * @param {MetaMetricsFinalizeEventFragmentOptions} finalizeEventOptions + * @param {Partial} fragmentPayload */ function finalizeSignatureFragment( metaMetricsController, req, - { abandoned, properties }, + finalizeEventOptions, + fragmentPayload, ) { const signatureUniqueId = generateSignatureUniqueId(req.id); - metaMetricsController.updateEventFragment(signatureUniqueId, { - properties, - }); - metaMetricsController.finalizeEventFragment(signatureUniqueId, { - abandoned, - }); + if (fragmentPayload) { + metaMetricsController.updateEventFragment( + signatureUniqueId, + fragmentPayload, + ); + } + + metaMetricsController.finalizeEventFragment( + signatureUniqueId, + finalizeEventOptions, + ); } /** @@ -368,7 +373,9 @@ export default function createRPCMethodTrackingMiddleware({ } if (event === MetaMetricsEventName.SignatureRequested) { - createSignatureFragment(metaMetricsController, req, eventProperties); + createSignatureFragment(metaMetricsController, req, { + properties: eventProperties, + }); } else { metaMetricsController.trackEvent({ event, @@ -430,10 +437,19 @@ export default function createRPCMethodTrackingMiddleware({ }; if (signatureUniqueId) { - finalizeSignatureFragment(metaMetricsController, req, { + const finalizeOptions = { abandoned: event === eventType.REJECTED, + }; + const fragmentPayload = { properties, - }); + }; + + finalizeSignatureFragment( + metaMetricsController, + req, + finalizeOptions, + fragmentPayload, + ); } else { metaMetricsController.trackEvent({ event, diff --git a/shared/constants/metametrics.ts b/shared/constants/metametrics.ts index 0ad1bc9e1deb..85a374125685 100644 --- a/shared/constants/metametrics.ts +++ b/shared/constants/metametrics.ts @@ -156,7 +156,7 @@ export type MetaMetricsEventFragment = { /** * The event name to fire when the fragment is closed in an affirmative action. */ - successEvent?: string; + successEvent: string; /** * The event name to fire when the fragment is closed with a rejection. */ @@ -169,7 +169,7 @@ export type MetaMetricsEventFragment = { /** * The event category to use for both the success and failure events. */ - category?: string; + category: string; /** * Should this fragment be persisted in state and progressed after the * extension is locked and unlocked. diff --git a/test/data/confirmations/typed_sign.ts b/test/data/confirmations/typed_sign.ts index 88985e1a52a7..8766fac9184c 100644 --- a/test/data/confirmations/typed_sign.ts +++ b/test/data/confirmations/typed_sign.ts @@ -1,3 +1,4 @@ +import { TransactionType } from '@metamask/transaction-controller'; import { MESSAGE_TYPE } from '../../../shared/constants/app'; import { SignatureRequestType } from '../../../ui/pages/confirmations/types/confirm'; @@ -10,7 +11,7 @@ export const unapprovedTypedSignMsgV1 = { }, status: 'unapproved', time: 1710505271872, - type: 'eth_signTypedData', + type: TransactionType.signTypedData, securityProviderResponse: null, msgParams: { from: '0x935e73edb9ff52e23bac7f7e043a1ecd06d05477', @@ -18,6 +19,7 @@ export const unapprovedTypedSignMsgV1 = { { type: 'string', name: 'Message', value: 'Hi, Alice!' }, { type: 'uint32', name: 'A number', value: '1337' }, ], + requestId: 11, signatureMethod: 'eth_signTypedData', version: 'V1', origin: 'https://metamask.github.io', @@ -65,12 +67,13 @@ export const unapprovedTypedSignMsgV3 = { }, status: 'unapproved', time: 1710249542175, - type: 'eth_signTypedData', + type: TransactionType.signTypedData, securityProviderResponse: null, msgParams: { data: JSON.stringify(rawMessageV3), from: '0x935e73edb9ff52e23bac7f7e043a1ecd06d05477', version: 'V3', + requestId: 12, signatureMethod: 'eth_signTypedData_v3', origin: 'https://metamask.github.io', }, @@ -129,12 +132,13 @@ export const unapprovedTypedSignMsgV4 = { status: 'unapproved', time: new Date().getTime(), chainid: '0x5', - type: 'eth_signTypedData', + type: TransactionType.signTypedData, securityProviderResponse: null, msgParams: { from: '0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc', data: JSON.stringify(rawMessageV4), origin: 'https://metamask.github.io', + requestId: 123456789, signatureMethod: MESSAGE_TYPE.ETH_SIGN_TYPED_DATA_V4, }, } as SignatureRequestType; @@ -148,11 +152,12 @@ export const orderSignatureMsg = { }, status: 'unapproved', time: 1722011224974, - type: 'eth_signTypedData', + type: TransactionType.signTypedData, msgParams: { data: '{"types":{"Order":[{"type":"uint8","name":"direction"},{"type":"address","name":"maker"},{"type":"address","name":"taker"},{"type":"uint256","name":"expiry"},{"type":"uint256","name":"nonce"},{"type":"address","name":"erc20Token"},{"type":"uint256","name":"erc20TokenAmount"},{"type":"Fee[]","name":"fees"},{"type":"address","name":"erc721Token"},{"type":"uint256","name":"erc721TokenId"},{"type":"Property[]","name":"erc721TokenProperties"}],"Fee":[{"type":"address","name":"recipient"},{"type":"uint256","name":"amount"},{"type":"bytes","name":"feeData"}],"Property":[{"type":"address","name":"propertyValidator"},{"type":"bytes","name":"propertyData"}],"EIP712Domain":[{"name":"name","type":"string"},{"name":"version","type":"string"},{"name":"chainId","type":"uint256"},{"name":"verifyingContract","type":"address"}]},"domain":{"name":"ZeroEx","version":"1.0.0","chainId":"0x1","verifyingContract":"0xdef1c0ded9bec7f1a1670819833240f027b25eff"},"primaryType":"Order","message":{"direction":"0","maker":"0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc","taker":"0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826","expiry":"2524604400","nonce":"100131415900000000000000000000000000000083840314483690155566137712510085002484","erc20Token":"0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2","erc20TokenAmount":"42000000000000","fees":[],"erc721Token":"0x8a90CAb2b38dba80c64b7734e58Ee1dB38B8992e","erc721TokenId":"2516","erc721TokenProperties":[]}}', from: '0x935e73edb9ff52e23bac7f7e043a1ecd06d05477', version: 'V4', + requestId: 13, signatureMethod: 'eth_signTypedData_v4', origin: 'https://metamask.github.io', }, @@ -167,11 +172,12 @@ export const permitSignatureMsg = { }, status: 'unapproved', time: 1716826404122, - type: 'eth_signTypedData', + type: TransactionType.signTypedData, msgParams: { data: '{"types":{"EIP712Domain":[{"name":"name","type":"string"},{"name":"version","type":"string"},{"name":"chainId","type":"uint256"},{"name":"verifyingContract","type":"address"}],"Permit":[{"name":"owner","type":"address"},{"name":"spender","type":"address"},{"name":"value","type":"uint256"},{"name":"nonce","type":"uint256"},{"name":"deadline","type":"uint256"}]},"primaryType":"Permit","domain":{"name":"MyToken","version":"1","verifyingContract":"0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC","chainId":1},"message":{"owner":"0x935e73edb9ff52e23bac7f7e043a1ecd06d05477","spender":"0x5B38Da6a701c568545dCfcB03FcB875f56beddC4","value":3000,"nonce":0,"deadline":50000000000}}', from: '0x935e73edb9ff52e23bac7f7e043a1ecd06d05477', version: 'V4', + requestId: 14, signatureMethod: 'eth_signTypedData_v4', origin: 'https://metamask.github.io', }, @@ -186,11 +192,12 @@ export const permitBatchSignatureMsg = { }, status: 'unapproved', time: 1716826404122, - type: 'eth_signTypedData', + type: TransactionType.signTypedData, msgParams: { data: '{"types":{"PermitBatch":[{"name":"details","type":"PermitDetails[]"},{"name":"spender","type":"address"},{"name":"sigDeadline","type":"uint256"}],"PermitDetails":[{"name":"token","type":"address"},{"name":"amount","type":"uint160"},{"name":"expiration","type":"uint48"},{"name":"nonce","type":"uint48"}],"EIP712Domain":[{"name":"name","type":"string"},{"name":"chainId","type":"uint256"},{"name":"verifyingContract","type":"address"}]},"domain":{"name":"Permit2","chainId":"1","verifyingContract":"0x000000000022d473030f116ddee9f6b43ac78ba3"},"primaryType":"PermitBatch","message":{"details":[{"token":"0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48","amount":"1461501637330902918203684832716283019655932542975","expiration":"1722887542","nonce":"5"},{"token":"0xb0b86991c6218b36c1d19d4a2e9eb0ce3606eb48","amount":"2461501637330902918203684832716283019655932542975","expiration":"1722887642","nonce":"6"}],"spender":"0x3fc91a3afd70395cd496c647d5a6cc9d4b2b7fad","sigDeadline":"1720297342"}}', from: '0x935e73edb9ff52e23bac7f7e043a1ecd06d05477', version: 'V4', + requestId: 15, signatureMethod: 'eth_signTypedData_v4', origin: 'https://metamask.github.io', }, @@ -205,11 +212,12 @@ export const permitSingleSignatureMsg = { }, status: 'unapproved', time: 1716826404122, - type: 'eth_signTypedData', + type: TransactionType.signTypedData, msgParams: { data: '{"types":{"PermitSingle":[{"name":"details","type":"PermitDetails"},{"name":"spender","type":"address"},{"name":"sigDeadline","type":"uint256"}],"PermitDetails":[{"name":"token","type":"address"},{"name":"amount","type":"uint160"},{"name":"expiration","type":"uint48"},{"name":"nonce","type":"uint48"}],"EIP712Domain":[{"name":"name","type":"string"},{"name":"chainId","type":"uint256"},{"name":"verifyingContract","type":"address"}]},"domain":{"name":"Permit2","chainId":"1","verifyingContract":"0x000000000022d473030f116ddee9f6b43ac78ba3"},"primaryType":"PermitSingle","message":{"details":{"token":"0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48","amount":"1461501637330902918203684832716283019655932542975","expiration":"1722887542","nonce":"5"},"spender":"0x3fc91a3afd70395cd496c647d5a6cc9d4b2b7fad","sigDeadline":"1720297342"}}', from: '0x935e73edb9ff52e23bac7f7e043a1ecd06d05477', version: 'V4', + requestId: 16, signatureMethod: 'eth_signTypedData_v4', origin: 'https://metamask.github.io', }, diff --git a/ui/pages/confirmations/hooks/useConfirmationAlertMetrics.ts b/ui/pages/confirmations/hooks/useConfirmationAlertMetrics.ts index 9bb3238b0232..c9af8a9d03ad 100644 --- a/ui/pages/confirmations/hooks/useConfirmationAlertMetrics.ts +++ b/ui/pages/confirmations/hooks/useConfirmationAlertMetrics.ts @@ -2,13 +2,11 @@ import { useCallback, useEffect, useState } from 'react'; import { validate as isUuid } from 'uuid'; import useAlerts from '../../../hooks/useAlerts'; -import { updateEventFragment } from '../../../store/actions'; -import { SignatureRequestType } from '../types/confirm'; import { isSignatureTransactionType } from '../utils'; import { Alert } from '../../../ducks/confirm-alerts/confirm-alerts'; import { useConfirmContext } from '../context/confirm'; -import { generateSignatureUniqueId } from '../../../helpers/utils/metrics'; import { AlertsName } from './alerts/constants'; +import { useSignatureEventFragment } from './useSignatureEventFragment'; import { useTransactionEventFragment } from './useTransactionEventFragment'; export type AlertMetricsProperties = { @@ -48,6 +46,7 @@ export function useConfirmationAlertMetrics() { const { currentConfirmation } = useConfirmContext(); const ownerId = currentConfirmation?.id ?? ''; const { alerts, isAlertConfirmed } = useAlerts(ownerId); + const { updateSignatureEventFragment } = useSignatureEventFragment(); const { updateTransactionEventFragment } = useTransactionEventFragment(); const [metricsProperties, setMetricsProperties] = @@ -116,12 +115,7 @@ export function useConfirmationAlertMetrics() { } if (isSignatureTransactionType(currentConfirmation)) { - const requestId = (currentConfirmation as SignatureRequestType).msgParams - ?.requestId as number; - const fragmentUniqueId = generateSignatureUniqueId(requestId); - updateEventFragment(fragmentUniqueId, { - properties, - }); + updateSignatureEventFragment({ properties }); } else { updateTransactionEventFragment({ properties }, ownerId); } diff --git a/ui/pages/confirmations/hooks/useSignatureEventFragment.test.tsx b/ui/pages/confirmations/hooks/useSignatureEventFragment.test.tsx new file mode 100644 index 000000000000..4da597c72937 --- /dev/null +++ b/ui/pages/confirmations/hooks/useSignatureEventFragment.test.tsx @@ -0,0 +1,67 @@ +import { getMockTypedSignConfirmStateForRequest } from '../../../../test/data/confirmations/helper'; +import { renderHookWithConfirmContextProvider } from '../../../../test/lib/confirmations/render-helpers'; +import { orderSignatureMsg } from '../../../../test/data/confirmations/typed_sign'; +import { generateSignatureUniqueId } from '../../../helpers/utils/metrics'; +import { updateEventFragment } from '../../../store/actions'; +import { SignatureRequestType } from '../types/confirm'; +import { useSignatureEventFragment } from './useSignatureEventFragment'; + +const renderUseSignatureEventFragment = (signature: SignatureRequestType) => { + const mockState = getMockTypedSignConfirmStateForRequest(signature); + + return renderHookWithConfirmContextProvider( + () => useSignatureEventFragment(), + mockState, + ); +}; + +jest.mock('../../../store/actions', () => ({ + updateEventFragment: jest.fn(), +})); + +describe('useSignatureEventFragment', () => { + afterEach(jest.clearAllMocks); + + describe('updateSignatureEventFragment', () => { + it('should call updateEventFragment to update the signature event fragment', () => { + const mockUpdateProps = { + event_name1: 'test_event 1', + event_name2: 'test_event 2', + }; + const expectedFragmentId = generateSignatureUniqueId( + orderSignatureMsg.msgParams.requestId, + ); + + const { result } = renderUseSignatureEventFragment(orderSignatureMsg); + const { updateSignatureEventFragment } = result.current; + + updateSignatureEventFragment(mockUpdateProps); + + expect(updateEventFragment).toHaveBeenCalledWith( + expectedFragmentId, + mockUpdateProps, + ); + }); + + it('should not call updateEventFragment if no signature requestId was found', () => { + const mockSignatureWithoutRequestId = { + ...orderSignatureMsg, + msgParams: { + data: orderSignatureMsg.msgParams.data, + from: orderSignatureMsg.msgParams.from, + version: orderSignatureMsg.msgParams.version, + signatureMethod: orderSignatureMsg.msgParams.signatureMethod, + origin: orderSignatureMsg.msgParams.origin, + }, + }; + const { result } = renderUseSignatureEventFragment( + mockSignatureWithoutRequestId, + ); + const { updateSignatureEventFragment } = result.current; + + updateSignatureEventFragment(); + + expect(updateEventFragment).not.toHaveBeenCalled(); + }); + }); +}); diff --git a/ui/pages/confirmations/hooks/useSignatureEventFragment.ts b/ui/pages/confirmations/hooks/useSignatureEventFragment.ts new file mode 100644 index 000000000000..82fa8f452641 --- /dev/null +++ b/ui/pages/confirmations/hooks/useSignatureEventFragment.ts @@ -0,0 +1,36 @@ +import { useCallback } from 'react'; +import { generateSignatureUniqueId } from '../../../helpers/utils/metrics'; +import { updateEventFragment } from '../../../store/actions'; +import { useConfirmContext } from '../context/confirm'; +import { SignatureRequestType } from '../types/confirm'; +import { isSignatureTransactionType } from '../utils'; + +import type { MetaMetricsEventFragment } from '../../../../shared/constants/metametrics'; + +/** + * When a signature has been requested, there should be an event fragment created for it in + * {@see {@link app/scripts/lib/createRPCMethodTrackingMiddleware.js}. + * This hook method is used to update an existing signature event fragment for a signature confirmation. + */ +export const useSignatureEventFragment = () => { + const { currentConfirmation } = useConfirmContext(); + + const requestId = + isSignatureTransactionType(currentConfirmation) && + ((currentConfirmation as SignatureRequestType)?.msgParams + ?.requestId as number); + const fragmentId = requestId ? generateSignatureUniqueId(requestId) : null; + + const updateSignatureEventFragment = useCallback( + async (fragmentPayload: Partial) => { + if (!fragmentId) { + return; + } + + updateEventFragment(fragmentId, fragmentPayload); + }, + [fragmentId], + ); + + return { updateSignatureEventFragment }; +}; diff --git a/ui/store/actions.ts b/ui/store/actions.ts index 499acba711bd..ccceba2e4048 100644 --- a/ui/store/actions.ts +++ b/ui/store/actions.ts @@ -1014,7 +1014,6 @@ export function addTransactionAndRouteToConfirmationPage( dispatch(displayWarning(error)); throw error; } - return null; }; } @@ -4570,7 +4569,7 @@ export function createTransactionEventFragment( export function updateEventFragment( id: string, - payload: MetaMetricsEventFragment, + payload: Partial, ) { return submitRequestToBackground('updateEventFragment', [id, payload]); } From 9c77f61500ea812aeebd4f5638b9e842d1237ce8 Mon Sep 17 00:00:00 2001 From: Matthew Walsh Date: Thu, 19 Sep 2024 09:42:40 +0100 Subject: [PATCH 17/61] fix: custom tracing in production builds (#27124) Update trace utilities to use Sentry functions via `globalThis`. Add trace E2E tests. --- .../lib/createTracingMiddleware.test.ts | 4 +- app/scripts/lib/createTracingMiddleware.ts | 2 +- app/scripts/lib/ppom/ppom-middleware.test.ts | 8 ++ app/scripts/metamask-controller.test.js | 4 + shared/lib/trace.test.ts | 6 + shared/lib/trace.ts | 6 +- test/e2e/tests/metrics/traces.spec.ts | 129 ++++++++++++++++++ 7 files changed, 153 insertions(+), 6 deletions(-) create mode 100644 test/e2e/tests/metrics/traces.spec.ts diff --git a/app/scripts/lib/createTracingMiddleware.test.ts b/app/scripts/lib/createTracingMiddleware.test.ts index ceb87e0f3ac5..cafe97b71181 100644 --- a/app/scripts/lib/createTracingMiddleware.test.ts +++ b/app/scripts/lib/createTracingMiddleware.test.ts @@ -19,8 +19,8 @@ describe('createTracingMiddleware', () => { request = { ...REQUEST_MOCK }; - global.sentry = { - getMetaMetricsEnabled: () => Promise.resolve(true), + globalThis.sentry = { + withIsolationScope: jest.fn().mockReturnValue({}), }; }); diff --git a/app/scripts/lib/createTracingMiddleware.ts b/app/scripts/lib/createTracingMiddleware.ts index 99e0a73795b1..27e928a95199 100644 --- a/app/scripts/lib/createTracingMiddleware.ts +++ b/app/scripts/lib/createTracingMiddleware.ts @@ -1,4 +1,4 @@ -// Request and repsones are currently untyped. +// Request and responses are currently untyped. /* eslint-disable @typescript-eslint/no-explicit-any */ import { MESSAGE_TYPE } from '../../../shared/constants/app'; diff --git a/app/scripts/lib/ppom/ppom-middleware.test.ts b/app/scripts/lib/ppom/ppom-middleware.test.ts index cbd3674f65c8..a0188a96ae8a 100644 --- a/app/scripts/lib/ppom/ppom-middleware.test.ts +++ b/app/scripts/lib/ppom/ppom-middleware.test.ts @@ -111,6 +111,14 @@ describe('PPOMMiddleware', () => { generateSecurityAlertIdMock.mockReturnValue(SECURITY_ALERT_ID_MOCK); handlePPOMErrorMock.mockReturnValue(SECURITY_ALERT_RESPONSE_MOCK); isChainSupportedMock.mockResolvedValue(true); + + globalThis.sentry = { + withIsolationScope: jest + .fn() + .mockImplementation((fn) => fn({ setTags: jest.fn() })), + startSpan: jest.fn().mockImplementation((_, fn) => fn({})), + startSpanManual: jest.fn().mockImplementation((_, fn) => fn({})), + }; }); it('updates alert response after validating request', async () => { diff --git a/app/scripts/metamask-controller.test.js b/app/scripts/metamask-controller.test.js index 8cd77b920d1e..401f95a21990 100644 --- a/app/scripts/metamask-controller.test.js +++ b/app/scripts/metamask-controller.test.js @@ -336,6 +336,10 @@ describe('MetaMaskController', () => { }, ]), ); + + globalThis.sentry = { + withIsolationScope: jest.fn(), + }; }); afterEach(() => { diff --git a/shared/lib/trace.test.ts b/shared/lib/trace.test.ts index fc3294924698..5154a930b7f9 100644 --- a/shared/lib/trace.test.ts +++ b/shared/lib/trace.test.ts @@ -37,6 +37,12 @@ describe('Trace', () => { beforeEach(() => { jest.resetAllMocks(); + globalThis.sentry = { + startSpan: startSpanMock, + startSpanManual: startSpanManualMock, + withIsolationScope: withIsolationScopeMock, + }; + startSpanMock.mockImplementation((_, fn) => fn({} as Span)); // eslint-disable-next-line @typescript-eslint/no-explicit-any diff --git a/shared/lib/trace.ts b/shared/lib/trace.ts index b9f59a2f2353..f5919bae74e0 100644 --- a/shared/lib/trace.ts +++ b/shared/lib/trace.ts @@ -114,7 +114,7 @@ function traceCallback(request: TraceRequest, fn: TraceCallback): T { }; return startSpan(request, (spanOptions) => - Sentry.startSpan(spanOptions, callback), + globalThis.sentry.startSpan(spanOptions, callback), ); } @@ -138,7 +138,7 @@ function startTrace(request: TraceRequest): TraceContext { }; return startSpan(request, (spanOptions) => - Sentry.startSpanManual(spanOptions, callback), + globalThis.sentry.startSpanManual(spanOptions, callback), ); } @@ -157,7 +157,7 @@ function startSpan( startTime, }; - return Sentry.withIsolationScope((scope) => { + return globalThis.sentry.withIsolationScope((scope: Sentry.Scope) => { scope.setTags(tags as Record); return callback(spanOptions); diff --git a/test/e2e/tests/metrics/traces.spec.ts b/test/e2e/tests/metrics/traces.spec.ts new file mode 100644 index 000000000000..62c4d7da9219 --- /dev/null +++ b/test/e2e/tests/metrics/traces.spec.ts @@ -0,0 +1,129 @@ +import { MockttpServer } from 'mockttp'; +import FixtureBuilder from '../../fixture-builder'; +import { + defaultGanacheOptions, + unlockWallet, + withFixtures, +} from '../../helpers'; +import { + expectMockRequest, + expectNoMockRequest, +} from '../../helpers/mock-server'; + +async function mockSentryCustomTrace(mockServer: MockttpServer) { + return [ + await mockServer + .forPost(/sentry/u) + .withBodyIncluding('"transaction":"UI Startup"') + .thenCallback(() => { + return { + statusCode: 200, + json: {}, + }; + }), + ]; +} + +async function mockSentryAutomatedTrace(mockServer: MockttpServer) { + return [ + await mockServer + .forPost(/sentry/u) + .withBodyIncluding('"transaction":"/home.html"') + .thenCallback(() => { + return { + statusCode: 200, + json: {}, + }; + }), + ]; +} + +describe('Traces', function () { + it('sends custom trace when opening UI if metrics enabled', async function () { + await withFixtures( + { + fixtures: new FixtureBuilder() + .withMetaMetricsController({ + participateInMetaMetrics: true, + }) + .build(), + ganacheOptions: defaultGanacheOptions, + title: this.test?.fullTitle(), + testSpecificMock: mockSentryCustomTrace, + manifestFlags: { + doNotForceSentryForThisTest: true, + }, + }, + async ({ driver, mockedEndpoint }) => { + await unlockWallet(driver); + await expectMockRequest(driver, mockedEndpoint[0], { timeout: 3000 }); + }, + ); + }); + + it('does not send custom trace when opening UI if metrics disabled @no-mmi', async function () { + await withFixtures( + { + fixtures: new FixtureBuilder() + .withMetaMetricsController({ + participateInMetaMetrics: false, + }) + .build(), + ganacheOptions: defaultGanacheOptions, + title: this.test?.fullTitle(), + testSpecificMock: mockSentryCustomTrace, + manifestFlags: { + doNotForceSentryForThisTest: true, + }, + }, + async ({ driver, mockedEndpoint }) => { + await unlockWallet(driver); + await expectNoMockRequest(driver, mockedEndpoint[0], { timeout: 3000 }); + }, + ); + }); + + it('sends automated trace when opening UI if metrics enabled', async function () { + await withFixtures( + { + fixtures: new FixtureBuilder() + .withMetaMetricsController({ + participateInMetaMetrics: true, + }) + .build(), + ganacheOptions: defaultGanacheOptions, + title: this.test?.fullTitle(), + testSpecificMock: mockSentryAutomatedTrace, + manifestFlags: { + doNotForceSentryForThisTest: true, + }, + }, + async ({ driver, mockedEndpoint }) => { + await unlockWallet(driver); + await expectMockRequest(driver, mockedEndpoint[0], { timeout: 3000 }); + }, + ); + }); + + it('does not send automated trace when opening UI if metrics disabled @no-mmi', async function () { + await withFixtures( + { + fixtures: new FixtureBuilder() + .withMetaMetricsController({ + participateInMetaMetrics: false, + }) + .build(), + ganacheOptions: defaultGanacheOptions, + title: this.test?.fullTitle(), + testSpecificMock: mockSentryAutomatedTrace, + manifestFlags: { + doNotForceSentryForThisTest: true, + }, + }, + async ({ driver, mockedEndpoint }) => { + await unlockWallet(driver); + await expectNoMockRequest(driver, mockedEndpoint[0], { timeout: 3000 }); + }, + ); + }); +}); From 82b0321eae52e2f3280e342d7db3e97bec96044f Mon Sep 17 00:00:00 2001 From: Maarten Zuidhoorn Date: Thu, 19 Sep 2024 11:09:10 +0200 Subject: [PATCH 18/61] chore: Bump Snaps packages (#27057) ## **Description** This bumps Snaps packages to the latest version. [![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/27057?quickstart=1) --------- Co-authored-by: Hassan Malik <41640681+hmalik88@users.noreply.github.com> Co-authored-by: MetaMask Bot Co-authored-by: Guillaume Roux Co-authored-by: David Drazic Co-authored-by: Frederik Bolding Co-authored-by: Olaf Tomalka --- ...aps-controllers-npm-9.5.0-8b21e3c072.patch | 13 - builds.yml | 8 +- .../webpack/utils/loaders/swcLoader.ts | 10 + lavamoat/browserify/beta/policy.json | 101 +--- lavamoat/browserify/flask/policy.json | 101 +--- lavamoat/browserify/main/policy.json | 101 +--- lavamoat/browserify/mmi/policy.json | 101 +--- package.json | 16 +- test/e2e/snaps/enums.js | 2 +- test/e2e/snaps/test-snap-metrics.spec.js | 4 +- .../app/confirm/info/row/value-double.tsx | 2 +- .../safe-component-list.js | 2 + .../snap-footer-button/snap-footer-button.tsx | 32 +- .../snap-ui-address.test.tsx.snap | 498 ++++++++++++++++++ .../app/snaps/snap-ui-address/index.ts | 1 + .../snap-ui-address.stories.tsx | 70 +++ .../snap-ui-address/snap-ui-address.test.tsx | 134 +++++ .../snaps/snap-ui-address/snap-ui-address.tsx | 67 +++ .../app/snaps/snap-ui-button/index.scss | 4 +- .../snaps/snap-ui-button/snap-ui-button.tsx | 4 +- .../app/snaps/snap-ui-form/snap-ui-form.tsx | 2 +- .../app/snaps/snap-ui-input/index.scss | 18 +- .../snap-ui-renderer/components/address.ts | 4 +- .../snaps/snap-ui-renderer/components/box.ts | 13 +- .../snap-ui-renderer/components/button.ts | 1 + .../snap-ui-renderer/components/container.ts | 2 +- .../snap-ui-renderer/components/divider.ts | 2 +- .../snap-ui-renderer/components/field.ts | 55 +- .../snap-ui-renderer/components/footer.ts | 2 +- .../snap-ui-renderer/components/index.ts | 2 + .../snap-ui-renderer/components/section.ts | 29 + .../app/snaps/snap-ui-renderer/index.scss | 19 +- .../app/snaps/snap-ui-renderer/utils.ts | 22 + .../snap-ui-selector/snap-ui-selector.tsx | 11 +- .../ui/jazzicon/jazzicon.component.tsx | 31 +- ui/components/ui/jazzicon/jazzicon.d.ts | 2 +- ui/helpers/utils/icon-factory.ts | 18 +- .../confirmation/confirmation.js | 11 +- ui/pages/snaps/snap-view/snap-view.js | 28 +- ui/selectors/selectors.js | 10 + yarn.lock | 184 +++---- 41 files changed, 1140 insertions(+), 597 deletions(-) delete mode 100644 .yarn/patches/@metamask-snaps-controllers-npm-9.5.0-8b21e3c072.patch create mode 100644 ui/components/app/snaps/snap-ui-address/__snapshots__/snap-ui-address.test.tsx.snap create mode 100644 ui/components/app/snaps/snap-ui-address/index.ts create mode 100644 ui/components/app/snaps/snap-ui-address/snap-ui-address.stories.tsx create mode 100644 ui/components/app/snaps/snap-ui-address/snap-ui-address.test.tsx create mode 100644 ui/components/app/snaps/snap-ui-address/snap-ui-address.tsx create mode 100644 ui/components/app/snaps/snap-ui-renderer/components/section.ts diff --git a/.yarn/patches/@metamask-snaps-controllers-npm-9.5.0-8b21e3c072.patch b/.yarn/patches/@metamask-snaps-controllers-npm-9.5.0-8b21e3c072.patch deleted file mode 100644 index 314a33b9f881..000000000000 --- a/.yarn/patches/@metamask-snaps-controllers-npm-9.5.0-8b21e3c072.patch +++ /dev/null @@ -1,13 +0,0 @@ -diff --git a/package.json b/package.json -index e738c058c38f8bc5c14bab9644ecced32eefa075..9aba0d03fc642572fcbdc2c791e335df72d70f35 100644 ---- a/package.json -+++ b/package.json -@@ -9,7 +9,7 @@ - "sideEffects": false, - "exports": { - ".": { -- "import": "./dist/index.mjs", -+ "import": "./dist/index.js", - "require": "./dist/index.js", - "types": "./dist/types/index.d.ts" - }, diff --git a/builds.yml b/builds.yml index 62989545775f..89d41923540c 100644 --- a/builds.yml +++ b/builds.yml @@ -26,7 +26,7 @@ buildTypes: - SEGMENT_WRITE_KEY_REF: SEGMENT_PROD_WRITE_KEY - ALLOW_LOCAL_SNAPS: false - REQUIRE_SNAPS_ALLOWLIST: true - - IFRAME_EXECUTION_ENVIRONMENT_URL: https://execution.metamask.io/iframe/6.6.2/index.html + - IFRAME_EXECUTION_ENVIRONMENT_URL: https://execution.metamask.io/iframe/6.7.0/index.html - ACCOUNT_SNAPS_DIRECTORY_URL: https://snaps.metamask.io/account-management # Main build uses the default browser manifest manifestOverrides: false @@ -46,7 +46,7 @@ buildTypes: - SEGMENT_WRITE_KEY_REF: SEGMENT_BETA_WRITE_KEY - ALLOW_LOCAL_SNAPS: false - REQUIRE_SNAPS_ALLOWLIST: true - - IFRAME_EXECUTION_ENVIRONMENT_URL: https://execution.metamask.io/iframe/6.6.2/index.html + - IFRAME_EXECUTION_ENVIRONMENT_URL: https://execution.metamask.io/iframe/6.7.0/index.html - ACCOUNT_SNAPS_DIRECTORY_URL: https://snaps.metamask.io/account-management # Modifies how the version is displayed. # eg. instead of 10.25.0 -> 10.25.0-beta.2 @@ -67,7 +67,7 @@ buildTypes: - SEGMENT_FLASK_WRITE_KEY - ALLOW_LOCAL_SNAPS: true - REQUIRE_SNAPS_ALLOWLIST: false - - IFRAME_EXECUTION_ENVIRONMENT_URL: https://execution.metamask.io/iframe/6.6.2/index.html + - IFRAME_EXECUTION_ENVIRONMENT_URL: https://execution.metamask.io/iframe/6.7.0/index.html - SUPPORT_LINK: https://support.metamask.io/ - SUPPORT_REQUEST_LINK: https://support.metamask.io/ - INFURA_ENV_KEY_REF: INFURA_FLASK_PROJECT_ID @@ -90,7 +90,7 @@ buildTypes: - SEGMENT_WRITE_KEY_REF: SEGMENT_MMI_WRITE_KEY - ALLOW_LOCAL_SNAPS: false - REQUIRE_SNAPS_ALLOWLIST: true - - IFRAME_EXECUTION_ENVIRONMENT_URL: https://execution.metamask.io/iframe/6.6.2/index.html + - IFRAME_EXECUTION_ENVIRONMENT_URL: https://execution.metamask.io/iframe/6.7.0/index.html - MMI_CONFIGURATION_SERVICE_URL: https://configuration.metamask-institutional.io/v2/configuration/default - SUPPORT_LINK: https://support.metamask-institutional.io - SUPPORT_REQUEST_LINK: https://support.metamask-institutional.io diff --git a/development/webpack/utils/loaders/swcLoader.ts b/development/webpack/utils/loaders/swcLoader.ts index b2511a809a27..524aca4e31ab 100644 --- a/development/webpack/utils/loaders/swcLoader.ts +++ b/development/webpack/utils/loaders/swcLoader.ts @@ -29,6 +29,16 @@ const schema = { type: 'boolean', default: false, }, + experimental: { + type: 'object', + properties: { + keepImportAttributes: { + type: 'boolean', + default: false, + }, + }, + additionalProperties: false, + }, transform: { type: 'object', properties: { diff --git a/lavamoat/browserify/beta/policy.json b/lavamoat/browserify/beta/policy.json index e9711e5467ab..9f5281aa4f25 100644 --- a/lavamoat/browserify/beta/policy.json +++ b/lavamoat/browserify/beta/policy.json @@ -964,26 +964,11 @@ "packages": { "@ethereumjs/tx": true, "@metamask/eth-sig-util": true, - "@metamask/eth-snap-keyring>@metamask/utils": true, "@metamask/eth-snap-keyring>uuid": true, "@metamask/keyring-api": true, - "superstruct": true, - "webpack>events": true - } - }, - "@metamask/eth-snap-keyring>@metamask/utils": { - "globals": { - "TextDecoder": true, - "TextEncoder": true - }, - "packages": { + "@metamask/utils": true, "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@metamask/utils>pony-cause": true, - "@noble/hashes": true, - "browserify>buffer": true, - "nock>debug": true, - "semver": true + "webpack>events": true } }, "@metamask/eth-snap-keyring>uuid": { @@ -1970,25 +1955,10 @@ "removeEventListener": true }, "packages": { - "@metamask/post-message-stream>@metamask/utils": true, + "@metamask/utils": true, "readable-stream": true } }, - "@metamask/post-message-stream>@metamask/utils": { - "globals": { - "TextDecoder": true, - "TextEncoder": true - }, - "packages": { - "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@metamask/utils>pony-cause": true, - "@noble/hashes": true, - "browserify>buffer": true, - "nock>debug": true, - "semver": true - } - }, "@metamask/ppom-validator": { "globals": { "URL": true, @@ -2527,6 +2497,7 @@ "@metamask/utils": true, "browserify>browserify-zlib": true, "eslint>fast-deep-equal": true, + "immer": true, "readable-stream": true } }, @@ -2627,74 +2598,10 @@ }, "packages": { "@metamask/post-message-stream": true, - "@metamask/snaps-execution-environments>@metamask/snaps-utils": true, "@metamask/snaps-utils": true, "@metamask/utils": true } }, - "@metamask/snaps-execution-environments>@metamask/snaps-utils": { - "globals": { - "File": true, - "FileReader": true, - "TextDecoder": true, - "TextEncoder": true, - "URL": true, - "console.error": true, - "console.log": true, - "console.warn": true, - "crypto": true, - "document.body.appendChild": true, - "document.createElement": true, - "fetch": true - }, - "packages": { - "@metamask/eth-snap-keyring>@metamask/snaps-utils>@metamask/slip44": true, - "@metamask/rpc-errors": true, - "@metamask/snaps-execution-environments>@metamask/snaps-utils>@metamask/permission-controller": true, - "@metamask/snaps-sdk": true, - "@metamask/snaps-sdk>@metamask/key-tree": true, - "@metamask/snaps-utils>cron-parser": true, - "@metamask/snaps-utils>fast-json-stable-stringify": true, - "@metamask/snaps-utils>fast-xml-parser": true, - "@metamask/snaps-utils>marked": true, - "@metamask/snaps-utils>rfdc": true, - "@metamask/snaps-utils>validate-npm-package-name": true, - "@metamask/utils": true, - "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@noble/hashes": true, - "chalk": true, - "semver": true - } - }, - "@metamask/snaps-execution-environments>@metamask/snaps-utils>@metamask/base-controller": { - "globals": { - "setTimeout": true - }, - "packages": { - "immer": true - } - }, - "@metamask/snaps-execution-environments>@metamask/snaps-utils>@metamask/permission-controller": { - "globals": { - "console.error": true - }, - "packages": { - "@metamask/controller-utils": true, - "@metamask/rpc-errors": true, - "@metamask/snaps-controllers>@metamask/json-rpc-engine": true, - "@metamask/snaps-execution-environments>@metamask/snaps-utils>@metamask/base-controller": true, - "@metamask/snaps-execution-environments>nanoid": true, - "@metamask/utils": true, - "deep-freeze-strict": true, - "immer": true - } - }, - "@metamask/snaps-execution-environments>nanoid": { - "globals": { - "crypto.getRandomValues": true - } - }, "@metamask/snaps-rpc-methods": { "packages": { "@metamask/rpc-errors": true, diff --git a/lavamoat/browserify/flask/policy.json b/lavamoat/browserify/flask/policy.json index e9711e5467ab..9f5281aa4f25 100644 --- a/lavamoat/browserify/flask/policy.json +++ b/lavamoat/browserify/flask/policy.json @@ -964,26 +964,11 @@ "packages": { "@ethereumjs/tx": true, "@metamask/eth-sig-util": true, - "@metamask/eth-snap-keyring>@metamask/utils": true, "@metamask/eth-snap-keyring>uuid": true, "@metamask/keyring-api": true, - "superstruct": true, - "webpack>events": true - } - }, - "@metamask/eth-snap-keyring>@metamask/utils": { - "globals": { - "TextDecoder": true, - "TextEncoder": true - }, - "packages": { + "@metamask/utils": true, "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@metamask/utils>pony-cause": true, - "@noble/hashes": true, - "browserify>buffer": true, - "nock>debug": true, - "semver": true + "webpack>events": true } }, "@metamask/eth-snap-keyring>uuid": { @@ -1970,25 +1955,10 @@ "removeEventListener": true }, "packages": { - "@metamask/post-message-stream>@metamask/utils": true, + "@metamask/utils": true, "readable-stream": true } }, - "@metamask/post-message-stream>@metamask/utils": { - "globals": { - "TextDecoder": true, - "TextEncoder": true - }, - "packages": { - "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@metamask/utils>pony-cause": true, - "@noble/hashes": true, - "browserify>buffer": true, - "nock>debug": true, - "semver": true - } - }, "@metamask/ppom-validator": { "globals": { "URL": true, @@ -2527,6 +2497,7 @@ "@metamask/utils": true, "browserify>browserify-zlib": true, "eslint>fast-deep-equal": true, + "immer": true, "readable-stream": true } }, @@ -2627,74 +2598,10 @@ }, "packages": { "@metamask/post-message-stream": true, - "@metamask/snaps-execution-environments>@metamask/snaps-utils": true, "@metamask/snaps-utils": true, "@metamask/utils": true } }, - "@metamask/snaps-execution-environments>@metamask/snaps-utils": { - "globals": { - "File": true, - "FileReader": true, - "TextDecoder": true, - "TextEncoder": true, - "URL": true, - "console.error": true, - "console.log": true, - "console.warn": true, - "crypto": true, - "document.body.appendChild": true, - "document.createElement": true, - "fetch": true - }, - "packages": { - "@metamask/eth-snap-keyring>@metamask/snaps-utils>@metamask/slip44": true, - "@metamask/rpc-errors": true, - "@metamask/snaps-execution-environments>@metamask/snaps-utils>@metamask/permission-controller": true, - "@metamask/snaps-sdk": true, - "@metamask/snaps-sdk>@metamask/key-tree": true, - "@metamask/snaps-utils>cron-parser": true, - "@metamask/snaps-utils>fast-json-stable-stringify": true, - "@metamask/snaps-utils>fast-xml-parser": true, - "@metamask/snaps-utils>marked": true, - "@metamask/snaps-utils>rfdc": true, - "@metamask/snaps-utils>validate-npm-package-name": true, - "@metamask/utils": true, - "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@noble/hashes": true, - "chalk": true, - "semver": true - } - }, - "@metamask/snaps-execution-environments>@metamask/snaps-utils>@metamask/base-controller": { - "globals": { - "setTimeout": true - }, - "packages": { - "immer": true - } - }, - "@metamask/snaps-execution-environments>@metamask/snaps-utils>@metamask/permission-controller": { - "globals": { - "console.error": true - }, - "packages": { - "@metamask/controller-utils": true, - "@metamask/rpc-errors": true, - "@metamask/snaps-controllers>@metamask/json-rpc-engine": true, - "@metamask/snaps-execution-environments>@metamask/snaps-utils>@metamask/base-controller": true, - "@metamask/snaps-execution-environments>nanoid": true, - "@metamask/utils": true, - "deep-freeze-strict": true, - "immer": true - } - }, - "@metamask/snaps-execution-environments>nanoid": { - "globals": { - "crypto.getRandomValues": true - } - }, "@metamask/snaps-rpc-methods": { "packages": { "@metamask/rpc-errors": true, diff --git a/lavamoat/browserify/main/policy.json b/lavamoat/browserify/main/policy.json index e9711e5467ab..9f5281aa4f25 100644 --- a/lavamoat/browserify/main/policy.json +++ b/lavamoat/browserify/main/policy.json @@ -964,26 +964,11 @@ "packages": { "@ethereumjs/tx": true, "@metamask/eth-sig-util": true, - "@metamask/eth-snap-keyring>@metamask/utils": true, "@metamask/eth-snap-keyring>uuid": true, "@metamask/keyring-api": true, - "superstruct": true, - "webpack>events": true - } - }, - "@metamask/eth-snap-keyring>@metamask/utils": { - "globals": { - "TextDecoder": true, - "TextEncoder": true - }, - "packages": { + "@metamask/utils": true, "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@metamask/utils>pony-cause": true, - "@noble/hashes": true, - "browserify>buffer": true, - "nock>debug": true, - "semver": true + "webpack>events": true } }, "@metamask/eth-snap-keyring>uuid": { @@ -1970,25 +1955,10 @@ "removeEventListener": true }, "packages": { - "@metamask/post-message-stream>@metamask/utils": true, + "@metamask/utils": true, "readable-stream": true } }, - "@metamask/post-message-stream>@metamask/utils": { - "globals": { - "TextDecoder": true, - "TextEncoder": true - }, - "packages": { - "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@metamask/utils>pony-cause": true, - "@noble/hashes": true, - "browserify>buffer": true, - "nock>debug": true, - "semver": true - } - }, "@metamask/ppom-validator": { "globals": { "URL": true, @@ -2527,6 +2497,7 @@ "@metamask/utils": true, "browserify>browserify-zlib": true, "eslint>fast-deep-equal": true, + "immer": true, "readable-stream": true } }, @@ -2627,74 +2598,10 @@ }, "packages": { "@metamask/post-message-stream": true, - "@metamask/snaps-execution-environments>@metamask/snaps-utils": true, "@metamask/snaps-utils": true, "@metamask/utils": true } }, - "@metamask/snaps-execution-environments>@metamask/snaps-utils": { - "globals": { - "File": true, - "FileReader": true, - "TextDecoder": true, - "TextEncoder": true, - "URL": true, - "console.error": true, - "console.log": true, - "console.warn": true, - "crypto": true, - "document.body.appendChild": true, - "document.createElement": true, - "fetch": true - }, - "packages": { - "@metamask/eth-snap-keyring>@metamask/snaps-utils>@metamask/slip44": true, - "@metamask/rpc-errors": true, - "@metamask/snaps-execution-environments>@metamask/snaps-utils>@metamask/permission-controller": true, - "@metamask/snaps-sdk": true, - "@metamask/snaps-sdk>@metamask/key-tree": true, - "@metamask/snaps-utils>cron-parser": true, - "@metamask/snaps-utils>fast-json-stable-stringify": true, - "@metamask/snaps-utils>fast-xml-parser": true, - "@metamask/snaps-utils>marked": true, - "@metamask/snaps-utils>rfdc": true, - "@metamask/snaps-utils>validate-npm-package-name": true, - "@metamask/utils": true, - "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@noble/hashes": true, - "chalk": true, - "semver": true - } - }, - "@metamask/snaps-execution-environments>@metamask/snaps-utils>@metamask/base-controller": { - "globals": { - "setTimeout": true - }, - "packages": { - "immer": true - } - }, - "@metamask/snaps-execution-environments>@metamask/snaps-utils>@metamask/permission-controller": { - "globals": { - "console.error": true - }, - "packages": { - "@metamask/controller-utils": true, - "@metamask/rpc-errors": true, - "@metamask/snaps-controllers>@metamask/json-rpc-engine": true, - "@metamask/snaps-execution-environments>@metamask/snaps-utils>@metamask/base-controller": true, - "@metamask/snaps-execution-environments>nanoid": true, - "@metamask/utils": true, - "deep-freeze-strict": true, - "immer": true - } - }, - "@metamask/snaps-execution-environments>nanoid": { - "globals": { - "crypto.getRandomValues": true - } - }, "@metamask/snaps-rpc-methods": { "packages": { "@metamask/rpc-errors": true, diff --git a/lavamoat/browserify/mmi/policy.json b/lavamoat/browserify/mmi/policy.json index ba37c2883157..6d8c4c43bcb8 100644 --- a/lavamoat/browserify/mmi/policy.json +++ b/lavamoat/browserify/mmi/policy.json @@ -1056,26 +1056,11 @@ "packages": { "@ethereumjs/tx": true, "@metamask/eth-sig-util": true, - "@metamask/eth-snap-keyring>@metamask/utils": true, "@metamask/eth-snap-keyring>uuid": true, "@metamask/keyring-api": true, - "superstruct": true, - "webpack>events": true - } - }, - "@metamask/eth-snap-keyring>@metamask/utils": { - "globals": { - "TextDecoder": true, - "TextEncoder": true - }, - "packages": { + "@metamask/utils": true, "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@metamask/utils>pony-cause": true, - "@noble/hashes": true, - "browserify>buffer": true, - "nock>debug": true, - "semver": true + "webpack>events": true } }, "@metamask/eth-snap-keyring>uuid": { @@ -2062,25 +2047,10 @@ "removeEventListener": true }, "packages": { - "@metamask/post-message-stream>@metamask/utils": true, + "@metamask/utils": true, "readable-stream": true } }, - "@metamask/post-message-stream>@metamask/utils": { - "globals": { - "TextDecoder": true, - "TextEncoder": true - }, - "packages": { - "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@metamask/utils>pony-cause": true, - "@noble/hashes": true, - "browserify>buffer": true, - "nock>debug": true, - "semver": true - } - }, "@metamask/ppom-validator": { "globals": { "URL": true, @@ -2619,6 +2589,7 @@ "@metamask/utils": true, "browserify>browserify-zlib": true, "eslint>fast-deep-equal": true, + "immer": true, "readable-stream": true } }, @@ -2719,74 +2690,10 @@ }, "packages": { "@metamask/post-message-stream": true, - "@metamask/snaps-execution-environments>@metamask/snaps-utils": true, "@metamask/snaps-utils": true, "@metamask/utils": true } }, - "@metamask/snaps-execution-environments>@metamask/snaps-utils": { - "globals": { - "File": true, - "FileReader": true, - "TextDecoder": true, - "TextEncoder": true, - "URL": true, - "console.error": true, - "console.log": true, - "console.warn": true, - "crypto": true, - "document.body.appendChild": true, - "document.createElement": true, - "fetch": true - }, - "packages": { - "@metamask/eth-snap-keyring>@metamask/snaps-utils>@metamask/slip44": true, - "@metamask/rpc-errors": true, - "@metamask/snaps-execution-environments>@metamask/snaps-utils>@metamask/permission-controller": true, - "@metamask/snaps-sdk": true, - "@metamask/snaps-sdk>@metamask/key-tree": true, - "@metamask/snaps-utils>cron-parser": true, - "@metamask/snaps-utils>fast-json-stable-stringify": true, - "@metamask/snaps-utils>fast-xml-parser": true, - "@metamask/snaps-utils>marked": true, - "@metamask/snaps-utils>rfdc": true, - "@metamask/snaps-utils>validate-npm-package-name": true, - "@metamask/utils": true, - "@metamask/utils>@metamask/superstruct": true, - "@metamask/utils>@scure/base": true, - "@noble/hashes": true, - "chalk": true, - "semver": true - } - }, - "@metamask/snaps-execution-environments>@metamask/snaps-utils>@metamask/base-controller": { - "globals": { - "setTimeout": true - }, - "packages": { - "immer": true - } - }, - "@metamask/snaps-execution-environments>@metamask/snaps-utils>@metamask/permission-controller": { - "globals": { - "console.error": true - }, - "packages": { - "@metamask/controller-utils": true, - "@metamask/rpc-errors": true, - "@metamask/snaps-controllers>@metamask/json-rpc-engine": true, - "@metamask/snaps-execution-environments>@metamask/snaps-utils>@metamask/base-controller": true, - "@metamask/snaps-execution-environments>nanoid": true, - "@metamask/utils": true, - "deep-freeze-strict": true, - "immer": true - } - }, - "@metamask/snaps-execution-environments>nanoid": { - "globals": { - "crypto.getRandomValues": true - } - }, "@metamask/snaps-rpc-methods": { "packages": { "@metamask/rpc-errors": true, diff --git a/package.json b/package.json index 4cee6dcdd7b0..ee89fac5f874 100644 --- a/package.json +++ b/package.json @@ -228,7 +228,7 @@ "semver@7.3.8": "^7.5.4", "@trezor/schema-utils@npm:1.0.2": "patch:@trezor/schema-utils@npm%3A1.0.2#~/.yarn/patches/@trezor-schema-utils-npm-1.0.2-7dd48689b2.patch", "lavamoat-core@npm:^15.1.1": "patch:lavamoat-core@npm%3A15.1.1#~/.yarn/patches/lavamoat-core-npm-15.1.1-51fbe39988.patch", - "@metamask/snaps-sdk": "^6.3.0", + "@metamask/snaps-sdk": "^6.5.1", "@swc/types@0.1.5": "^0.1.6", "@babel/runtime@npm:^7.7.6": "patch:@babel/runtime@npm%3A7.24.0#~/.yarn/patches/@babel-runtime-npm-7.24.0-7eb1dd11a2.patch", "@babel/runtime@npm:^7.9.2": "patch:@babel/runtime@npm%3A7.24.0#~/.yarn/patches/@babel-runtime-npm-7.24.0-7eb1dd11a2.patch", @@ -262,8 +262,6 @@ "@metamask/message-manager": "^10.1.0", "@metamask/network-controller@npm:^19.0.0": "patch:@metamask/network-controller@npm%3A20.2.0#~/.yarn/patches/@metamask-network-controller-npm-20.2.0-98b1a5ae59.patch", "@metamask/gas-fee-controller@npm:^15.1.1": "patch:@metamask/gas-fee-controller@npm%3A15.1.2#~/.yarn/patches/@metamask-gas-fee-controller-npm-15.1.2-db4d2976aa.patch", - "@metamask/snaps-controllers@npm:^8.1.1": "patch:@metamask/snaps-controllers@npm%3A9.5.0#~/.yarn/patches/@metamask-snaps-controllers-npm-9.5.0-8b21e3c072.patch", - "@metamask/snaps-controllers@npm:^9.5.0": "patch:@metamask/snaps-controllers@npm%3A9.5.0#~/.yarn/patches/@metamask-snaps-controllers-npm-9.5.0-8b21e3c072.patch", "@metamask/nonce-tracker@npm:^5.0.0": "patch:@metamask/nonce-tracker@npm%3A5.0.0#~/.yarn/patches/@metamask-nonce-tracker-npm-5.0.0-d81478218e.patch", "@metamask/keyring-controller@npm:^16.0.0": "patch:@metamask/keyring-controller@npm%3A17.1.1#~/.yarn/patches/@metamask-keyring-controller-npm-17.1.1-098cb41930.patch", "@metamask/keyring-controller@npm:^17.1.0": "patch:@metamask/keyring-controller@npm%3A17.1.1#~/.yarn/patches/@metamask-keyring-controller-npm-17.1.1-098cb41930.patch", @@ -318,7 +316,7 @@ "@metamask/eth-ledger-bridge-keyring": "^3.0.1", "@metamask/eth-query": "^4.0.0", "@metamask/eth-sig-util": "^7.0.1", - "@metamask/eth-snap-keyring": "^4.3.1", + "@metamask/eth-snap-keyring": "^4.3.3", "@metamask/eth-token-tracker": "^8.0.0", "@metamask/eth-trezor-keyring": "^3.1.0", "@metamask/etherscan-link": "^3.0.0", @@ -355,11 +353,11 @@ "@metamask/selected-network-controller": "^15.0.2", "@metamask/signature-controller": "^19.0.0", "@metamask/smart-transactions-controller": "^13.0.0", - "@metamask/snaps-controllers": "^9.5.0", - "@metamask/snaps-execution-environments": "^6.6.2", - "@metamask/snaps-rpc-methods": "^11.0.0", - "@metamask/snaps-sdk": "^6.3.0", - "@metamask/snaps-utils": "^8.0.1", + "@metamask/snaps-controllers": "^9.7.0", + "@metamask/snaps-execution-environments": "^6.7.2", + "@metamask/snaps-rpc-methods": "^11.1.1", + "@metamask/snaps-sdk": "^6.5.1", + "@metamask/snaps-utils": "^8.1.1", "@metamask/transaction-controller": "^37.0.0", "@metamask/user-operation-controller": "^13.0.0", "@metamask/utils": "^9.1.0", diff --git a/test/e2e/snaps/enums.js b/test/e2e/snaps/enums.js index a7a69e13a13c..2b1a6bc6532d 100644 --- a/test/e2e/snaps/enums.js +++ b/test/e2e/snaps/enums.js @@ -1,3 +1,3 @@ module.exports = { - TEST_SNAPS_WEBSITE_URL: 'https://metamask.github.io/snaps/test-snaps/2.13.0/', + TEST_SNAPS_WEBSITE_URL: 'https://metamask.github.io/snaps/test-snaps/2.13.1/', }; diff --git a/test/e2e/snaps/test-snap-metrics.spec.js b/test/e2e/snaps/test-snap-metrics.spec.js index 6856aab2fd08..a26671ca4261 100644 --- a/test/e2e/snaps/test-snap-metrics.spec.js +++ b/test/e2e/snaps/test-snap-metrics.spec.js @@ -234,7 +234,7 @@ describe('Test Snap Metrics', function () { assert.deepStrictEqual(events[1].properties, { snap_id: 'npm:@metamask/notification-example-snap', origin: 'https://metamask.github.io', - version: '2.1.3', + version: '2.1.4', category: 'Snaps', locale: 'en', chain_id: '0x539', @@ -501,7 +501,7 @@ describe('Test Snap Metrics', function () { const events = await getEventPayloads(driver, mockedEndpoints); assert.deepStrictEqual(events[0].properties, { snap_id: 'npm:@metamask/notification-example-snap', - version: '2.1.3', + version: '2.1.4', category: 'Snaps', locale: 'en', chain_id: '0x539', diff --git a/ui/components/app/confirm/info/row/value-double.tsx b/ui/components/app/confirm/info/row/value-double.tsx index adf7510ba2bd..b58016541c07 100644 --- a/ui/components/app/confirm/info/row/value-double.tsx +++ b/ui/components/app/confirm/info/row/value-double.tsx @@ -33,7 +33,7 @@ export const ConfirmInfoRowValueDouble = ({ flexDirection={FlexDirection.Row} alignItems={AlignItems.center} flexWrap={FlexWrap.Wrap} - gap={2} + gap={1} > {left} {right} diff --git a/ui/components/app/metamask-template-renderer/safe-component-list.js b/ui/components/app/metamask-template-renderer/safe-component-list.js index 40932c2fbb4a..5756c5cbed2b 100644 --- a/ui/components/app/metamask-template-renderer/safe-component-list.js +++ b/ui/components/app/metamask-template-renderer/safe-component-list.js @@ -42,6 +42,7 @@ import { SnapUIRadioGroup } from '../snaps/snap-ui-radio-group'; import { SnapUICheckbox } from '../snaps/snap-ui-checkbox'; import { SnapUITooltip } from '../snaps/snap-ui-tooltip'; import { SnapUICard } from '../snaps/snap-ui-card'; +import { SnapUIAddress } from '../snaps/snap-ui-address'; import { SnapUISelector } from '../snaps/snap-ui-selector'; import { SnapFooterButton } from '../snaps/snap-footer-button'; ///: BEGIN:ONLY_INCLUDE_IF(keyring-snaps) @@ -104,6 +105,7 @@ export const safeComponentList = { SnapUITooltip, SnapUICard, SnapUISelector, + SnapUIAddress, SnapFooterButton, FormTextField, ///: BEGIN:ONLY_INCLUDE_IF(keyring-snaps) diff --git a/ui/components/app/snaps/snap-footer-button/snap-footer-button.tsx b/ui/components/app/snaps/snap-footer-button/snap-footer-button.tsx index 04f84b64f23c..e2b8c9609714 100644 --- a/ui/components/app/snaps/snap-footer-button/snap-footer-button.tsx +++ b/ui/components/app/snaps/snap-footer-button/snap-footer-button.tsx @@ -1,6 +1,16 @@ import React, { FunctionComponent, MouseEvent as ReactMouseEvent } from 'react'; -import { ButtonVariant, UserInputEventType } from '@metamask/snaps-sdk'; -import { Button, ButtonSize, IconSize } from '../../../component-library'; +import { + ButtonType, + ButtonVariant, + UserInputEventType, +} from '@metamask/snaps-sdk'; +import { useSelector } from 'react-redux'; +import { + Button, + ButtonLinkProps, + ButtonSize, + IconSize, +} from '../../../component-library'; import { AlignItems, Display, @@ -8,6 +18,7 @@ import { } from '../../../../helpers/constants/design-system'; import { useSnapInterfaceContext } from '../../../../contexts/snaps'; import { SnapIcon } from '../snap-icon'; +import { getHideSnapBranding } from '../../../../selectors'; type SnapFooterButtonProps = { name?: string; @@ -15,17 +26,26 @@ type SnapFooterButtonProps = { onCancel?: () => void; }; -export const SnapFooterButton: FunctionComponent = ({ +export const SnapFooterButton: FunctionComponent< + SnapFooterButtonProps & ButtonLinkProps<'button'> +> = ({ onCancel, name, children, isSnapAction = false, + type, + form, ...props }) => { const { handleEvent, snapId } = useSnapInterfaceContext(); + const hideSnapBranding = useSelector((state) => + getHideSnapBranding(state, snapId), + ); const handleSnapAction = (event: ReactMouseEvent) => { - event.preventDefault(); + if (type === ButtonType.Button) { + event.preventDefault(); + } handleEvent({ event: UserInputEventType.ButtonClickEvent, @@ -38,6 +58,8 @@ export const SnapFooterButton: FunctionComponent = ({ return ( )} - {isSnapCustomUIDialog && ( + {isSnapCustomUIDialog && !hideSnapBranding && ( - - } - > + {!snap.hideSnapBranding && ( + + } + /> + )} { + return installedSnaps[snapId]?.hideSnapBranding; + }, +); + /** * Get a memoized version of the target subject metadata. */ diff --git a/yarn.lock b/yarn.lock index 5fd8f17c33a1..cc998430baae 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5329,21 +5329,21 @@ __metadata: languageName: node linkType: hard -"@metamask/eth-snap-keyring@npm:^4.3.1": - version: 4.3.1 - resolution: "@metamask/eth-snap-keyring@npm:4.3.1" +"@metamask/eth-snap-keyring@npm:^4.3.1, @metamask/eth-snap-keyring@npm:^4.3.3": + version: 4.3.3 + resolution: "@metamask/eth-snap-keyring@npm:4.3.3" dependencies: "@ethereumjs/tx": "npm:^4.2.0" - "@metamask/eth-sig-util": "npm:^7.0.1" - "@metamask/keyring-api": "npm:^8.0.0" - "@metamask/snaps-controllers": "npm:^8.1.1" - "@metamask/snaps-sdk": "npm:^4.2.0" - "@metamask/snaps-utils": "npm:^7.4.0" - "@metamask/utils": "npm:^8.4.0" + "@metamask/eth-sig-util": "npm:^7.0.3" + "@metamask/keyring-api": "npm:^8.1.0" + "@metamask/snaps-controllers": "npm:^9.6.0" + "@metamask/snaps-sdk": "npm:^6.4.0" + "@metamask/snaps-utils": "npm:^7.8.0" + "@metamask/superstruct": "npm:^3.1.0" + "@metamask/utils": "npm:^9.2.1" "@types/uuid": "npm:^9.0.1" - superstruct: "npm:^1.0.3" uuid: "npm:^9.0.0" - checksum: 10/6362a499e8e25413bf8039c06e66939104bdb69b9dc22df5a44dd55e32304cffb869d4969755e8b4f3234749c6f382d8bbcdfeafe5a75064e85fa43307dbefee + checksum: 10/035c82afef82a4cee7bc63b5c4f152a132b683017ec90a4b614764a4bc7adcca8faccf78c25adcddca2d29eee2fed08706f07d72afb93640956b86e862d4f555 languageName: node linkType: hard @@ -5954,33 +5954,19 @@ __metadata: languageName: node linkType: hard -"@metamask/phishing-controller@npm:^10.1.1": - version: 10.1.1 - resolution: "@metamask/phishing-controller@npm:10.1.1" - dependencies: - "@metamask/base-controller": "npm:^6.0.2" - "@metamask/controller-utils": "npm:^11.0.2" - "@types/punycode": "npm:^2.1.0" - eth-phishing-detect: "npm:^1.2.0" - fastest-levenshtein: "npm:^1.0.16" - punycode: "npm:^2.1.1" - checksum: 10/4c6723d62a3a0b071fbf4c2b227a2eef6daa5f742bce80677bdf96312393c427d0d3c183ffcc13e065464c6c644f2b556c56e79161757bbccb525d4b34ee46b0 - languageName: node - linkType: hard - -"@metamask/phishing-controller@npm:^12.0.1": - version: 12.0.1 - resolution: "@metamask/phishing-controller@npm:12.0.1" +"@metamask/phishing-controller@npm:^12.0.1, @metamask/phishing-controller@npm:^12.0.2": + version: 12.0.2 + resolution: "@metamask/phishing-controller@npm:12.0.2" dependencies: "@metamask/base-controller": "npm:^7.0.0" - "@metamask/controller-utils": "npm:^11.1.0" + "@metamask/controller-utils": "npm:^11.2.0" "@noble/hashes": "npm:^1.4.0" "@types/punycode": "npm:^2.1.0" eth-phishing-detect: "npm:^1.2.0" ethereum-cryptography: "npm:^2.1.2" fastest-levenshtein: "npm:^1.0.16" punycode: "npm:^2.1.1" - checksum: 10/3f7c69434a783251657f333495fbee1cb8a02ffb731cf430fcd21812482bf1237948c498db74b55fb4e1e6976d71932f4b11c39a26f9e367ffd26a69efa2583e + checksum: 10/78781e1b781c838e303677157616fb3b5e581030fe8f0ed8913f6b75fbcb7ee2ba59a44831936cc68cca8b295ef6546761b40ea3277d810b68d8ed39a58d0e29 languageName: node linkType: hard @@ -6032,13 +6018,13 @@ __metadata: languageName: node linkType: hard -"@metamask/post-message-stream@npm:^8.0.0, @metamask/post-message-stream@npm:^8.1.0": - version: 8.1.0 - resolution: "@metamask/post-message-stream@npm:8.1.0" +"@metamask/post-message-stream@npm:^8.0.0, @metamask/post-message-stream@npm:^8.1.1": + version: 8.1.1 + resolution: "@metamask/post-message-stream@npm:8.1.1" dependencies: - "@metamask/utils": "npm:^8.1.0" + "@metamask/utils": "npm:^9.0.0" readable-stream: "npm:3.6.2" - checksum: 10/0a4f06250e2162b86d0b618e234e3caa3361767af95d0fd86c654aa33352f1948477a1e39d8a40804614f6d8ee29916e63b4f6c70792a0bfc93b2fffaf6fd4c2 + checksum: 10/8218d321abe734522aefaf6b44e4203966c3feaf83e2de6e68eef9dbe92b7fb47fe7fd82eae362147b1d741cc58d78bcc95d8bf02058e260ad2fb978104c96cf languageName: node linkType: hard @@ -6274,9 +6260,9 @@ __metadata: languageName: node linkType: hard -"@metamask/snaps-controllers@npm:9.5.0": - version: 9.5.0 - resolution: "@metamask/snaps-controllers@npm:9.5.0" +"@metamask/snaps-controllers@npm:^9.6.0, @metamask/snaps-controllers@npm:^9.7.0": + version: 9.7.0 + resolution: "@metamask/snaps-controllers@npm:9.7.0" dependencies: "@metamask/approval-controller": "npm:^7.0.2" "@metamask/base-controller": "npm:^6.0.2" @@ -6284,51 +6270,14 @@ __metadata: "@metamask/json-rpc-middleware-stream": "npm:^8.0.2" "@metamask/object-multiplex": "npm:^2.0.0" "@metamask/permission-controller": "npm:^11.0.0" - "@metamask/phishing-controller": "npm:^10.1.1" - "@metamask/post-message-stream": "npm:^8.1.0" + "@metamask/phishing-controller": "npm:^12.0.2" + "@metamask/post-message-stream": "npm:^8.1.1" "@metamask/rpc-errors": "npm:^6.3.1" "@metamask/snaps-registry": "npm:^3.2.1" - "@metamask/snaps-rpc-methods": "npm:^11.0.0" - "@metamask/snaps-sdk": "npm:^6.3.0" - "@metamask/snaps-utils": "npm:^8.0.1" - "@metamask/utils": "npm:^9.1.0" - "@xstate/fsm": "npm:^2.0.0" - browserify-zlib: "npm:^0.2.0" - concat-stream: "npm:^2.0.0" - fast-deep-equal: "npm:^3.1.3" - get-npm-tarball-url: "npm:^2.0.3" - immer: "npm:^9.0.6" - nanoid: "npm:^3.1.31" - readable-stream: "npm:^3.6.2" - readable-web-to-node-stream: "npm:^3.0.2" - tar-stream: "npm:^3.1.7" - peerDependencies: - "@metamask/snaps-execution-environments": ^6.6.2 - peerDependenciesMeta: - "@metamask/snaps-execution-environments": - optional: true - checksum: 10/a71ba096205e9c62ac13b7cc00d34a565072945d9d7bf06aea2f057e1281d4c594871bd7928403dc7a0597dca023b21a222d5c30c1fa306891f5e51baab1df51 - languageName: node - linkType: hard - -"@metamask/snaps-controllers@patch:@metamask/snaps-controllers@npm%3A9.5.0#~/.yarn/patches/@metamask-snaps-controllers-npm-9.5.0-8b21e3c072.patch": - version: 9.5.0 - resolution: "@metamask/snaps-controllers@patch:@metamask/snaps-controllers@npm%3A9.5.0#~/.yarn/patches/@metamask-snaps-controllers-npm-9.5.0-8b21e3c072.patch::version=9.5.0&hash=916653" - dependencies: - "@metamask/approval-controller": "npm:^7.0.2" - "@metamask/base-controller": "npm:^6.0.2" - "@metamask/json-rpc-engine": "npm:^9.0.2" - "@metamask/json-rpc-middleware-stream": "npm:^8.0.2" - "@metamask/object-multiplex": "npm:^2.0.0" - "@metamask/permission-controller": "npm:^11.0.0" - "@metamask/phishing-controller": "npm:^10.1.1" - "@metamask/post-message-stream": "npm:^8.1.0" - "@metamask/rpc-errors": "npm:^6.3.1" - "@metamask/snaps-registry": "npm:^3.2.1" - "@metamask/snaps-rpc-methods": "npm:^11.0.0" - "@metamask/snaps-sdk": "npm:^6.3.0" - "@metamask/snaps-utils": "npm:^8.0.1" - "@metamask/utils": "npm:^9.1.0" + "@metamask/snaps-rpc-methods": "npm:^11.1.1" + "@metamask/snaps-sdk": "npm:^6.5.0" + "@metamask/snaps-utils": "npm:^8.1.1" + "@metamask/utils": "npm:^9.2.1" "@xstate/fsm": "npm:^2.0.0" browserify-zlib: "npm:^0.2.0" concat-stream: "npm:^2.0.0" @@ -6340,30 +6289,30 @@ __metadata: readable-web-to-node-stream: "npm:^3.0.2" tar-stream: "npm:^3.1.7" peerDependencies: - "@metamask/snaps-execution-environments": ^6.6.2 + "@metamask/snaps-execution-environments": ^6.7.1 peerDependenciesMeta: "@metamask/snaps-execution-environments": optional: true - checksum: 10/42c94e15e68bc3d45bd28d50f03f0a90e8c8e36e89c3011a565f211da57979ebf5e780125eeb95507b403b6fc1f93a42b5e628a49bb0b0861fba56f82118b5b6 + checksum: 10/8a353819e60330ef3e338a40b1115d4c830b92b1cc0c92afb2b34bf46fbc906e6da5f905654e1d486cacd40b7025ec74d3cd01cb935090035ce9f1021ce5469f languageName: node linkType: hard -"@metamask/snaps-execution-environments@npm:^6.6.2": - version: 6.6.2 - resolution: "@metamask/snaps-execution-environments@npm:6.6.2" +"@metamask/snaps-execution-environments@npm:^6.7.2": + version: 6.7.2 + resolution: "@metamask/snaps-execution-environments@npm:6.7.2" dependencies: "@metamask/json-rpc-engine": "npm:^9.0.2" "@metamask/object-multiplex": "npm:^2.0.0" - "@metamask/post-message-stream": "npm:^8.1.0" + "@metamask/post-message-stream": "npm:^8.1.1" "@metamask/providers": "npm:^17.1.2" "@metamask/rpc-errors": "npm:^6.3.1" - "@metamask/snaps-sdk": "npm:^6.1.0" - "@metamask/snaps-utils": "npm:^7.8.1" + "@metamask/snaps-sdk": "npm:^6.5.0" + "@metamask/snaps-utils": "npm:^8.1.1" "@metamask/superstruct": "npm:^3.1.0" - "@metamask/utils": "npm:^9.1.0" + "@metamask/utils": "npm:^9.2.1" nanoid: "npm:^3.1.31" readable-stream: "npm:^3.6.2" - checksum: 10/b06b03f784b7c20ac9f39f9bec8a7e2e06ebcd8678659e01745d73f1c08bd2605352144bc8ecab7d6b0a7db69ebf62febad517a5c8a1309aa1e173049ce350e7 + checksum: 10/4b8ec4c0f6e628feeffd92fe4378fd204d2ed78012a1ed5282b24b00c78cebc3b6d7cb1306903b045a2ca887ecc0adafb2c96da4a19f2730a268f4912b36bec3 languageName: node linkType: hard @@ -6379,36 +6328,36 @@ __metadata: languageName: node linkType: hard -"@metamask/snaps-rpc-methods@npm:^11.0.0": - version: 11.0.0 - resolution: "@metamask/snaps-rpc-methods@npm:11.0.0" +"@metamask/snaps-rpc-methods@npm:^11.1.1": + version: 11.1.1 + resolution: "@metamask/snaps-rpc-methods@npm:11.1.1" dependencies: "@metamask/key-tree": "npm:^9.1.2" "@metamask/permission-controller": "npm:^11.0.0" "@metamask/rpc-errors": "npm:^6.3.1" - "@metamask/snaps-sdk": "npm:^6.2.0" - "@metamask/snaps-utils": "npm:^8.0.0" + "@metamask/snaps-sdk": "npm:^6.5.0" + "@metamask/snaps-utils": "npm:^8.1.1" "@metamask/superstruct": "npm:^3.1.0" - "@metamask/utils": "npm:^9.1.0" + "@metamask/utils": "npm:^9.2.1" "@noble/hashes": "npm:^1.3.1" - checksum: 10/2e594d7f9fde910e87525a6ded9a162d2ea8631249b7868ca710df0d8d25c127674079956976c7443e30c96bedb84bf818748a01aad41cfe69f88524781b994f + checksum: 10/e23279dabc6f4ffe2c6c4a7003a624cd5e79b558d7981ec12c23e54a5da25cb7be9bc7bddfa8b2ce84af28a89b42076a2c14ab004b7a976a4426bf1e1de71b5b languageName: node linkType: hard -"@metamask/snaps-sdk@npm:^6.3.0": - version: 6.3.0 - resolution: "@metamask/snaps-sdk@npm:6.3.0" +"@metamask/snaps-sdk@npm:^6.5.1": + version: 6.5.1 + resolution: "@metamask/snaps-sdk@npm:6.5.1" dependencies: "@metamask/key-tree": "npm:^9.1.2" "@metamask/providers": "npm:^17.1.2" "@metamask/rpc-errors": "npm:^6.3.1" "@metamask/superstruct": "npm:^3.1.0" - "@metamask/utils": "npm:^9.1.0" - checksum: 10/9978532c964973c570ec075000cd3940ce19c873047015f8372c8c589d971ce1f2c7e653afcceed69ad2f910ceacc0f6bd5e4c72446e6f6b4fd1cdbcba362fca + "@metamask/utils": "npm:^9.2.1" + checksum: 10/7831fb2ca61a32ad43e971de9307b221f6bd2f65c84a3286f350cfdd2396166c58db6cd2fac9711654a211c8dc2049e591a79ab720b3f5ad562e434f75e95d32 languageName: node linkType: hard -"@metamask/snaps-utils@npm:^7.4.0, @metamask/snaps-utils@npm:^7.8.1": +"@metamask/snaps-utils@npm:^7.4.0, @metamask/snaps-utils@npm:^7.8.0, @metamask/snaps-utils@npm:^7.8.1": version: 7.8.1 resolution: "@metamask/snaps-utils@npm:7.8.1" dependencies: @@ -6439,7 +6388,7 @@ __metadata: languageName: node linkType: hard -"@metamask/snaps-utils@npm:^8.0.0, @metamask/snaps-utils@npm:^8.0.1, @metamask/snaps-utils@npm:^8.1.1": +"@metamask/snaps-utils@npm:^8.1.1": version: 8.1.1 resolution: "@metamask/snaps-utils@npm:8.1.1" dependencies: @@ -6614,7 +6563,7 @@ __metadata: languageName: node linkType: hard -"@metamask/utils@npm:^8.1.0, @metamask/utils@npm:^8.2.0, @metamask/utils@npm:^8.3.0, @metamask/utils@npm:^8.4.0": +"@metamask/utils@npm:^8.1.0, @metamask/utils@npm:^8.2.0, @metamask/utils@npm:^8.3.0": version: 8.5.0 resolution: "@metamask/utils@npm:8.5.0" dependencies: @@ -9502,7 +9451,7 @@ __metadata: languageName: node linkType: hard -"@swc/types@npm:0.1.7, @swc/types@npm:^0.1.5": +"@swc/types@npm:0.1.7": version: 0.1.7 resolution: "@swc/types@npm:0.1.7" dependencies: @@ -9511,6 +9460,15 @@ __metadata: languageName: node linkType: hard +"@swc/types@npm:^0.1.5": + version: 0.1.12 + resolution: "@swc/types@npm:0.1.12" + dependencies: + "@swc/counter": "npm:^0.1.3" + checksum: 10/92dbbc70cd068ea30fb6fbdc1ae8599d6c058a5d09b2923d6e4e24fab5ad7c86a19dd01f349a8e03e300a9321e06911a24df18303b40e307fbd4109372cef2ef + languageName: node + linkType: hard + "@szmarczak/http-timer@npm:^4.0.5": version: 4.0.6 resolution: "@szmarczak/http-timer@npm:4.0.6" @@ -26143,7 +26101,7 @@ __metadata: "@metamask/eth-ledger-bridge-keyring": "npm:^3.0.1" "@metamask/eth-query": "npm:^4.0.0" "@metamask/eth-sig-util": "npm:^7.0.1" - "@metamask/eth-snap-keyring": "npm:^4.3.1" + "@metamask/eth-snap-keyring": "npm:^4.3.3" "@metamask/eth-token-tracker": "npm:^8.0.0" "@metamask/eth-trezor-keyring": "npm:^3.1.0" "@metamask/etherscan-link": "npm:^3.0.0" @@ -26182,11 +26140,11 @@ __metadata: "@metamask/selected-network-controller": "npm:^15.0.2" "@metamask/signature-controller": "npm:^19.0.0" "@metamask/smart-transactions-controller": "npm:^13.0.0" - "@metamask/snaps-controllers": "npm:^9.5.0" - "@metamask/snaps-execution-environments": "npm:^6.6.2" - "@metamask/snaps-rpc-methods": "npm:^11.0.0" - "@metamask/snaps-sdk": "npm:^6.3.0" - "@metamask/snaps-utils": "npm:^8.0.1" + "@metamask/snaps-controllers": "npm:^9.7.0" + "@metamask/snaps-execution-environments": "npm:^6.7.2" + "@metamask/snaps-rpc-methods": "npm:^11.1.1" + "@metamask/snaps-sdk": "npm:^6.5.1" + "@metamask/snaps-utils": "npm:^8.1.1" "@metamask/test-bundler": "npm:^1.0.0" "@metamask/test-dapp": "npm:^8.4.0" "@metamask/transaction-controller": "npm:^37.0.0" From d8b14776c23cd779cc4ebff8739d58b578043f7d Mon Sep 17 00:00:00 2001 From: Matthew Walsh Date: Thu, 19 Sep 2024 12:38:25 +0100 Subject: [PATCH 19/61] fix: no sentry DSN (#27272) --- shared/lib/trace.ts | 47 ++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 44 insertions(+), 3 deletions(-) diff --git a/shared/lib/trace.ts b/shared/lib/trace.ts index f5919bae74e0..aaf3db7d46af 100644 --- a/shared/lib/trace.ts +++ b/shared/lib/trace.ts @@ -114,7 +114,7 @@ function traceCallback(request: TraceRequest, fn: TraceCallback): T { }; return startSpan(request, (spanOptions) => - globalThis.sentry.startSpan(spanOptions, callback), + sentryStartSpan(spanOptions, callback), ); } @@ -138,7 +138,7 @@ function startTrace(request: TraceRequest): TraceContext { }; return startSpan(request, (spanOptions) => - globalThis.sentry.startSpanManual(spanOptions, callback), + sentryStartSpanManual(spanOptions, callback), ); } @@ -157,7 +157,7 @@ function startSpan( startTime, }; - return globalThis.sentry.withIsolationScope((scope: Sentry.Scope) => { + return sentryWithIsolationScope((scope: Sentry.Scope) => { scope.setTags(tags as Record); return callback(spanOptions); @@ -207,3 +207,44 @@ function tryCatchMaybePromise( return undefined; } + +function sentryStartSpan( + spanOptions: StartSpanOptions, + callback: (span: Sentry.Span | null) => T, +): T { + const actual = globalThis.sentry?.startSpan; + + if (!actual) { + return callback(null); + } + + return actual(spanOptions, callback); +} + +function sentryStartSpanManual( + spanOptions: StartSpanOptions, + callback: (span: Sentry.Span | null) => T, +): T { + const actual = globalThis.sentry?.startSpanManual; + + if (!actual) { + return callback(null); + } + + return actual(spanOptions, callback); +} + +function sentryWithIsolationScope(callback: (scope: Sentry.Scope) => T): T { + const actual = globalThis.sentry?.withIsolationScope; + + if (!actual) { + const scope = { + // eslint-disable-next-line no-empty-function + setTags: () => {}, + } as unknown as Sentry.Scope; + + return callback(scope); + } + + return actual(callback); +} From b15e7cdc91435276eca39daff941769d3431ec0d Mon Sep 17 00:00:00 2001 From: Mathieu Artu Date: Thu, 19 Sep 2024 15:14:47 +0200 Subject: [PATCH 20/61] feat(NOTIFY-866): add account syncing (#27060) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## **Description** This PR adds [account syncing](https://www.figma.com/board/sx26FtZcQc0zs0z5hpdqBh/Account-Syncing-Solution?t=5Oy00gbHLnoPqyYP-0) to MetaMask. As part of profile syncing, with this new feature, users will be able to synchronize all of their accounts and accounts' names across all of their devices. [![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/27060?quickstart=1) ## **Related issues** Fixes: [NOTIFY-866](https://consensyssoftware.atlassian.net/jira/software/projects/NOTIFY/boards/616?assignee=712020%3A5843b7e2-a7fe-4c45-9fbd-e1f2b2eb58c2&selectedIssue=NOTIFY-866) ## **Manual testing steps** 1. Log in with SRP 2. Activate profile syncing in preferences 3. Add new accounts and rename others 4. Using another browser, log in with SRP 5. Activate profile syncing in preferences 6. Watch the magic happen! ## **Pre-merge author checklist** - [x] I've followed [MetaMask Contributor Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Extension Coding Standards](https://github.com/MetaMask/metamask-extension/blob/develop/.github/guidelines/CODING_GUIDELINES.md). - [x] I've completed the PR template to the best of my ability - [x] I’ve included tests if applicable - [x] I’ve documented my code using [JSDoc](https://jsdoc.app/) format if applicable - [x] I’ve applied the right labels on the PR (see [labeling guidelines](https://github.com/MetaMask/metamask-extension/blob/develop/.github/guidelines/LABELING_GUIDELINES.md)). Not required for external contributors. ## **Pre-merge reviewer checklist** - [x] I've manually tested the PR (e.g. pull and build branch, run the app, test code being changed). - [x] I confirm that this PR addresses all acceptance criteria described in the ticket it closes and includes the necessary testing evidence such as recordings and or screenshots. [NOTIFY-866]: https://consensyssoftware.atlassian.net/browse/NOTIFY-866?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --------- Co-authored-by: MetaMask Bot Co-authored-by: Nick Gambino <35090461+gambinish@users.noreply.github.com> Co-authored-by: Brian Bergeron Co-authored-by: Jack Clancy --- ...ing-controller-npm-17.1.1-098cb41930.patch | 13 --- app/scripts/metamask-controller.js | 32 +++++ lavamoat/browserify/beta/policy.json | 10 +- lavamoat/browserify/flask/policy.json | 10 +- lavamoat/browserify/main/policy.json | 10 +- lavamoat/browserify/mmi/policy.json | 10 +- package.json | 8 +- shared/constants/metametrics.ts | 3 + test/e2e/tests/notifications/mocks.ts | 2 +- .../metamask-notifications.tsx | 3 + .../useNotifications.test.tsx | 1 + .../useProfileSyncing.test.tsx | 109 +++++++++++++----- .../useProfileSyncing.ts | 64 +++++++++- ui/store/actions.test.js | 26 +++++ ui/store/actions.ts | 27 +++++ yarn.lock | 77 +++++-------- 16 files changed, 270 insertions(+), 135 deletions(-) delete mode 100644 .yarn/patches/@metamask-keyring-controller-npm-17.1.1-098cb41930.patch diff --git a/.yarn/patches/@metamask-keyring-controller-npm-17.1.1-098cb41930.patch b/.yarn/patches/@metamask-keyring-controller-npm-17.1.1-098cb41930.patch deleted file mode 100644 index 439c1ddf49ae..000000000000 --- a/.yarn/patches/@metamask-keyring-controller-npm-17.1.1-098cb41930.patch +++ /dev/null @@ -1,13 +0,0 @@ -diff --git a/package.json b/package.json -index 5a6217eaed16fdfe7f1ad693871f85320bd6b421..69bdf1a9155497e37fc58db7bbc74597fd543535 100644 ---- a/package.json -+++ b/package.json -@@ -18,7 +18,7 @@ - "sideEffects": false, - "exports": { - ".": { -- "import": "./dist/index.mjs", -+ "import": "./dist/index.js", - "require": "./dist/index.js", - "types": "./dist/types/index.d.ts" - }, diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js index e04e4efcd46a..62d117ce799c 100644 --- a/app/scripts/metamask-controller.js +++ b/app/scripts/metamask-controller.js @@ -1478,10 +1478,36 @@ export default class MetamaskController extends EventEmitter { getMetaMetricsState: () => this.metaMetricsController.state.participateInMetaMetrics ?? false, state: initState.UserStorageController, + config: { + accountSyncing: { + onAccountAdded: (profileId) => { + this.metaMetricsController.trackEvent({ + category: MetaMetricsEventCategory.ProfileSyncing, + event: MetaMetricsEventName.AccountsSyncAccountAdded, + properties: { + profile_id: profileId, + }, + }); + }, + onAccountNameUpdated: (profileId) => { + this.metaMetricsController.trackEvent({ + category: MetaMetricsEventCategory.ProfileSyncing, + event: MetaMetricsEventName.AccountsSyncAccountNameUpdated, + properties: { + profile_id: profileId, + }, + }); + }, + }, + }, + env: { + isAccountSyncingEnabled: true, + }, messenger: this.controllerMessenger.getRestricted({ name: 'UserStorageController', allowedActions: [ 'KeyringController:getState', + 'KeyringController:addNewAccount', 'SnapController:handleRequest', 'AuthenticationController:getBearerToken', 'AuthenticationController:getSessionProfile', @@ -1490,6 +1516,8 @@ export default class MetamaskController extends EventEmitter { 'AuthenticationController:performSignIn', 'NotificationServicesController:disableNotificationServices', 'NotificationServicesController:selectIsNotificationServicesEnabled', + 'AccountsController:listAccounts', + 'AccountsController:updateAccountMetadata', ], allowedEvents: [ 'KeyringController:lock', @@ -3898,6 +3926,10 @@ export default class MetamaskController extends EventEmitter { userStorageController.setIsProfileSyncingEnabled.bind( userStorageController, ), + syncInternalAccountsWithUserStorage: + userStorageController.syncInternalAccountsWithUserStorage.bind( + userStorageController, + ), // NotificationServicesController checkAccountsPresence: diff --git a/lavamoat/browserify/beta/policy.json b/lavamoat/browserify/beta/policy.json index 9f5281aa4f25..0e13938c6111 100644 --- a/lavamoat/browserify/beta/policy.json +++ b/lavamoat/browserify/beta/policy.json @@ -1341,9 +1341,9 @@ "@metamask/keyring-controller": { "packages": { "@ethereumjs/tx>@ethereumjs/util": true, + "@metamask/base-controller": true, "@metamask/browser-passworder": true, "@metamask/eth-sig-util": true, - "@metamask/keyring-controller>@metamask/base-controller": true, "@metamask/keyring-controller>@metamask/eth-hd-keyring": true, "@metamask/keyring-controller>@metamask/eth-simple-keyring": true, "@metamask/keyring-controller>ethereumjs-wallet": true, @@ -1351,14 +1351,6 @@ "@metamask/utils": true } }, - "@metamask/keyring-controller>@metamask/base-controller": { - "globals": { - "setTimeout": true - }, - "packages": { - "immer": true - } - }, "@metamask/keyring-controller>@metamask/eth-hd-keyring": { "globals": { "TextEncoder": true diff --git a/lavamoat/browserify/flask/policy.json b/lavamoat/browserify/flask/policy.json index 9f5281aa4f25..0e13938c6111 100644 --- a/lavamoat/browserify/flask/policy.json +++ b/lavamoat/browserify/flask/policy.json @@ -1341,9 +1341,9 @@ "@metamask/keyring-controller": { "packages": { "@ethereumjs/tx>@ethereumjs/util": true, + "@metamask/base-controller": true, "@metamask/browser-passworder": true, "@metamask/eth-sig-util": true, - "@metamask/keyring-controller>@metamask/base-controller": true, "@metamask/keyring-controller>@metamask/eth-hd-keyring": true, "@metamask/keyring-controller>@metamask/eth-simple-keyring": true, "@metamask/keyring-controller>ethereumjs-wallet": true, @@ -1351,14 +1351,6 @@ "@metamask/utils": true } }, - "@metamask/keyring-controller>@metamask/base-controller": { - "globals": { - "setTimeout": true - }, - "packages": { - "immer": true - } - }, "@metamask/keyring-controller>@metamask/eth-hd-keyring": { "globals": { "TextEncoder": true diff --git a/lavamoat/browserify/main/policy.json b/lavamoat/browserify/main/policy.json index 9f5281aa4f25..0e13938c6111 100644 --- a/lavamoat/browserify/main/policy.json +++ b/lavamoat/browserify/main/policy.json @@ -1341,9 +1341,9 @@ "@metamask/keyring-controller": { "packages": { "@ethereumjs/tx>@ethereumjs/util": true, + "@metamask/base-controller": true, "@metamask/browser-passworder": true, "@metamask/eth-sig-util": true, - "@metamask/keyring-controller>@metamask/base-controller": true, "@metamask/keyring-controller>@metamask/eth-hd-keyring": true, "@metamask/keyring-controller>@metamask/eth-simple-keyring": true, "@metamask/keyring-controller>ethereumjs-wallet": true, @@ -1351,14 +1351,6 @@ "@metamask/utils": true } }, - "@metamask/keyring-controller>@metamask/base-controller": { - "globals": { - "setTimeout": true - }, - "packages": { - "immer": true - } - }, "@metamask/keyring-controller>@metamask/eth-hd-keyring": { "globals": { "TextEncoder": true diff --git a/lavamoat/browserify/mmi/policy.json b/lavamoat/browserify/mmi/policy.json index 6d8c4c43bcb8..e5913a27f248 100644 --- a/lavamoat/browserify/mmi/policy.json +++ b/lavamoat/browserify/mmi/policy.json @@ -1433,9 +1433,9 @@ "@metamask/keyring-controller": { "packages": { "@ethereumjs/tx>@ethereumjs/util": true, + "@metamask/base-controller": true, "@metamask/browser-passworder": true, "@metamask/eth-sig-util": true, - "@metamask/keyring-controller>@metamask/base-controller": true, "@metamask/keyring-controller>@metamask/eth-hd-keyring": true, "@metamask/keyring-controller>@metamask/eth-simple-keyring": true, "@metamask/keyring-controller>ethereumjs-wallet": true, @@ -1443,14 +1443,6 @@ "@metamask/utils": true } }, - "@metamask/keyring-controller>@metamask/base-controller": { - "globals": { - "setTimeout": true - }, - "packages": { - "immer": true - } - }, "@metamask/keyring-controller>@metamask/eth-hd-keyring": { "globals": { "TextEncoder": true diff --git a/package.json b/package.json index ee89fac5f874..a4cbaf938aec 100644 --- a/package.json +++ b/package.json @@ -263,8 +263,6 @@ "@metamask/network-controller@npm:^19.0.0": "patch:@metamask/network-controller@npm%3A20.2.0#~/.yarn/patches/@metamask-network-controller-npm-20.2.0-98b1a5ae59.patch", "@metamask/gas-fee-controller@npm:^15.1.1": "patch:@metamask/gas-fee-controller@npm%3A15.1.2#~/.yarn/patches/@metamask-gas-fee-controller-npm-15.1.2-db4d2976aa.patch", "@metamask/nonce-tracker@npm:^5.0.0": "patch:@metamask/nonce-tracker@npm%3A5.0.0#~/.yarn/patches/@metamask-nonce-tracker-npm-5.0.0-d81478218e.patch", - "@metamask/keyring-controller@npm:^16.0.0": "patch:@metamask/keyring-controller@npm%3A17.1.1#~/.yarn/patches/@metamask-keyring-controller-npm-17.1.1-098cb41930.patch", - "@metamask/keyring-controller@npm:^17.1.0": "patch:@metamask/keyring-controller@npm%3A17.1.1#~/.yarn/patches/@metamask-keyring-controller-npm-17.1.1-098cb41930.patch", "@trezor/connect-web@npm:^9.1.11": "patch:@trezor/connect-web@npm%3A9.3.0#~/.yarn/patches/@trezor-connect-web-npm-9.3.0-040ab10d9a.patch", "path-to-regexp": "1.9.0" }, @@ -298,7 +296,7 @@ "@metamask-institutional/types": "^1.1.0", "@metamask/abi-utils": "^2.0.2", "@metamask/account-watcher": "^4.1.0", - "@metamask/accounts-controller": "^18.2.0", + "@metamask/accounts-controller": "^18.2.1", "@metamask/address-book-controller": "^5.0.0", "@metamask/announcement-controller": "^7.0.0", "@metamask/approval-controller": "^7.0.0", @@ -325,8 +323,8 @@ "@metamask/ethjs-query": "^0.7.1", "@metamask/gas-fee-controller": "^18.0.0", "@metamask/jazzicon": "^2.0.0", - "@metamask/keyring-api": "^8.0.0", - "@metamask/keyring-controller": "patch:@metamask/keyring-controller@npm%3A17.1.1#~/.yarn/patches/@metamask-keyring-controller-npm-17.1.1-098cb41930.patch", + "@metamask/keyring-api": "^8.1.0", + "@metamask/keyring-controller": "^17.2.1", "@metamask/logging-controller": "^6.0.0", "@metamask/logo": "^3.1.2", "@metamask/message-manager": "^10.1.0", diff --git a/shared/constants/metametrics.ts b/shared/constants/metametrics.ts index 85a374125685..243b2409f1af 100644 --- a/shared/constants/metametrics.ts +++ b/shared/constants/metametrics.ts @@ -507,6 +507,8 @@ export enum MetaMetricsEventName { AccountPasswordCreated = 'Account Password Created', AccountReset = 'Account Reset', AccountRenamed = 'Account Renamed', + AccountsSyncAccountAdded = 'Accounts Sync Account Added', + AccountsSyncAccountNameUpdated = 'Accounts Sync Account Name Updated', ActivityDetailsOpened = 'Activity Details Opened', ActivityDetailsClosed = 'Activity Details Closed', AnalyticsPreferenceSelected = 'Analytics Preference Selected', @@ -767,6 +769,7 @@ export enum MetaMetricsEventCategory { NotificationSettings = 'Notification Settings', Petnames = 'Petnames', Phishing = 'Phishing', + ProfileSyncing = 'Profile Syncing', PushNotifications = 'Notifications', Retention = 'Retention', Send = 'Send', diff --git a/test/e2e/tests/notifications/mocks.ts b/test/e2e/tests/notifications/mocks.ts index 290db7024360..5cceee276436 100644 --- a/test/e2e/tests/notifications/mocks.ts +++ b/test/e2e/tests/notifications/mocks.ts @@ -20,7 +20,7 @@ type MockResponse = { }; /** - * E2E mock setup for notification APIs (Auth, Storage, Notifications, Push Notifications) + * E2E mock setup for notification APIs (Auth, Storage, Notifications, Push Notifications, Profile syncing) * * @param server - server obj used to mock our endpoints */ diff --git a/ui/contexts/metamask-notifications/metamask-notifications.tsx b/ui/contexts/metamask-notifications/metamask-notifications.tsx index 1a09dc71d821..2b1824c6d131 100644 --- a/ui/contexts/metamask-notifications/metamask-notifications.tsx +++ b/ui/contexts/metamask-notifications/metamask-notifications.tsx @@ -2,6 +2,7 @@ import React, { createContext, useContext, useEffect, useMemo } from 'react'; import { useSelector } from 'react-redux'; import type { NotificationServicesController } from '@metamask/notification-services-controller'; import { useListNotifications } from '../../hooks/metamask-notifications/useNotifications'; +import { useAccountSyncingEffect } from '../../hooks/metamask-notifications/useProfileSyncing'; import { selectIsProfileSyncingEnabled } from '../../selectors/metamask-notifications/profile-syncing'; import { selectIsMetamaskNotificationsEnabled } from '../../selectors/metamask-notifications/metamask-notifications'; import { getUseExternalServices } from '../../selectors'; @@ -45,6 +46,8 @@ export const MetamaskNotificationsProvider: React.FC = ({ children }) => { [isProfileSyncingEnabled, isNotificationsEnabled], ); + useAccountSyncingEffect(); + useEffect(() => { if (basicFunctionality && shouldFetchNotifications && isUnlocked) { listNotifications(); diff --git a/ui/hooks/metamask-notifications/useNotifications.test.tsx b/ui/hooks/metamask-notifications/useNotifications.test.tsx index b89bade7befb..a4723750c8d0 100644 --- a/ui/hooks/metamask-notifications/useNotifications.test.tsx +++ b/ui/hooks/metamask-notifications/useNotifications.test.tsx @@ -29,6 +29,7 @@ jest.mock('./useProfileSyncing', () => ({ useEnableProfileSyncing: jest.fn(() => ({ enableProfileSyncing: jest.fn(), })), + useAccountSyncingEffect: jest.fn(), })); describe('useNotifications', () => { diff --git a/ui/hooks/metamask-notifications/useProfileSyncing.test.tsx b/ui/hooks/metamask-notifications/useProfileSyncing.test.tsx index e8a37b58460a..178c646d0dda 100644 --- a/ui/hooks/metamask-notifications/useProfileSyncing.test.tsx +++ b/ui/hooks/metamask-notifications/useProfileSyncing.test.tsx @@ -3,11 +3,12 @@ import { Provider } from 'react-redux'; import { renderHook, act } from '@testing-library/react-hooks'; import configureStore from 'redux-mock-store'; import thunk from 'redux-thunk'; -import type { Store } from 'redux'; +import { waitFor } from '@testing-library/react'; import * as actions from '../../store/actions'; import { useEnableProfileSyncing, useDisableProfileSyncing, + useAccountSyncingEffect, } from './useProfileSyncing'; const middlewares = [thunk]; @@ -20,43 +21,62 @@ jest.mock('../../store/actions', () => ({ disableProfileSyncing: jest.fn(), showLoadingIndication: jest.fn(), hideLoadingIndication: jest.fn(), + syncInternalAccountsWithUserStorage: jest.fn(), })); -describe('useProfileSyncing', () => { - let store: Store; - - beforeEach(() => { - store = mockStore({ - metamask: { - isProfileSyncingEnabled: false, - isSignedIn: false, - participateInMetaMetrics: false, - internalAccounts: { - accounts: { - '0x123': { - address: '0x123', - id: 'account1', - metadata: {}, - options: {}, - methods: [], - type: 'eip155:eoa', - }, +type ArrangeMocksMetamaskStateOverrides = { + isSignedIn?: boolean; + isProfileSyncingEnabled?: boolean; + isUnlocked?: boolean; + useExternalServices?: boolean; +}; + +const initialMetamaskState: ArrangeMocksMetamaskStateOverrides = { + isSignedIn: false, + isProfileSyncingEnabled: false, + isUnlocked: true, + useExternalServices: true, +}; + +const arrangeMocks = ( + metamaskStateOverrides?: ArrangeMocksMetamaskStateOverrides, +) => { + const store = mockStore({ + metamask: { + ...initialMetamaskState, + ...metamaskStateOverrides, + participateInMetaMetrics: false, + internalAccounts: { + accounts: { + '0x123': { + address: '0x123', + id: 'account1', + metadata: {}, + options: {}, + methods: [], + type: 'eip155:eoa', }, }, }, - }); - - store.dispatch = jest.fn().mockImplementation((action) => { - if (typeof action === 'function') { - return action(store.dispatch, store.getState); - } - return Promise.resolve(); - }); + }, + }); - jest.clearAllMocks(); + store.dispatch = jest.fn().mockImplementation((action) => { + if (typeof action === 'function') { + return action(store.dispatch, store.getState); + } + return Promise.resolve(); }); + jest.clearAllMocks(); + + return { store }; +}; + +describe('useProfileSyncing', () => { it('should enable profile syncing', async () => { + const { store } = arrangeMocks(); + const { result } = renderHook(() => useEnableProfileSyncing(), { wrapper: ({ children }) => {children}, }); @@ -69,6 +89,8 @@ describe('useProfileSyncing', () => { }); it('should disable profile syncing', async () => { + const { store } = arrangeMocks(); + const { result } = renderHook(() => useDisableProfileSyncing(), { wrapper: ({ children }) => {children}, }); @@ -79,4 +101,33 @@ describe('useProfileSyncing', () => { expect(actions.disableProfileSyncing).toHaveBeenCalled(); }); + + it('should dispatch account syncing when conditions are met', async () => { + const { store } = arrangeMocks({ + isSignedIn: true, + isProfileSyncingEnabled: true, + }); + + renderHook(() => useAccountSyncingEffect(), { + wrapper: ({ children }) => {children}, + }); + + await waitFor(() => { + expect(actions.syncInternalAccountsWithUserStorage).toHaveBeenCalled(); + }); + }); + + it('should not dispatch account syncing when conditions are not met', async () => { + const { store } = arrangeMocks(); + + renderHook(() => useAccountSyncingEffect(), { + wrapper: ({ children }) => {children}, + }); + + await waitFor(() => { + expect( + actions.syncInternalAccountsWithUserStorage, + ).not.toHaveBeenCalled(); + }); + }); }); diff --git a/ui/hooks/metamask-notifications/useProfileSyncing.ts b/ui/hooks/metamask-notifications/useProfileSyncing.ts index 4a30bf7978fd..c951e174d485 100644 --- a/ui/hooks/metamask-notifications/useProfileSyncing.ts +++ b/ui/hooks/metamask-notifications/useProfileSyncing.ts @@ -1,5 +1,5 @@ -import { useState, useCallback } from 'react'; -import { useDispatch } from 'react-redux'; +import { useState, useCallback, useEffect, useMemo } from 'react'; +import { useDispatch, useSelector } from 'react-redux'; import type { InternalAccount } from '@metamask/keyring-api'; import log from 'loglevel'; import { @@ -7,8 +7,14 @@ import { enableProfileSyncing as enableProfileSyncingAction, setIsProfileSyncingEnabled as setIsProfileSyncingEnabledAction, hideLoadingIndication, + syncInternalAccountsWithUserStorage, } from '../../store/actions'; +import { selectIsSignedIn } from '../../selectors/metamask-notifications/authentication'; +import { selectIsProfileSyncingEnabled } from '../../selectors/metamask-notifications/profile-syncing'; +import { getUseExternalServices } from '../../selectors'; +import { getIsUnlocked } from '../../ducks/metamask/metamask'; + // Define KeyringType interface export type KeyringType = { type: string; @@ -112,3 +118,57 @@ export function useSetIsProfileSyncingEnabled(): { return { setIsProfileSyncingEnabled, error }; } + +/** + * Custom hook to dispatch account syncing. + * + * @returns An object containing the `dispatchAccountSyncing` function, boolean `shouldDispatchAccountSyncing`, + * and error state. + */ +export const useAccountSyncing = () => { + const dispatch = useDispatch(); + + const [error, setError] = useState(null); + + const isProfileSyncingEnabled = useSelector(selectIsProfileSyncingEnabled); + const basicFunctionality = useSelector(getUseExternalServices); + const isUnlocked = useSelector(getIsUnlocked); + const isSignedIn = useSelector(selectIsSignedIn); + + const shouldDispatchAccountSyncing = useMemo( + () => + basicFunctionality && isProfileSyncingEnabled && isUnlocked && isSignedIn, + [basicFunctionality, isProfileSyncingEnabled, isUnlocked, isSignedIn], + ); + + const dispatchAccountSyncing = useCallback(async () => { + setError(null); + + try { + if (!shouldDispatchAccountSyncing) { + return; + } + await dispatch(syncInternalAccountsWithUserStorage()); + } catch (e) { + log.error(e); + setError(e instanceof Error ? e.message : 'An unexpected error occurred'); + } + }, [dispatch, shouldDispatchAccountSyncing]); + + return { + dispatchAccountSyncing, + shouldDispatchAccountSyncing, + error, + }; +}; + +/** + * Custom hook to apply account syncing effect. + */ +export const useAccountSyncingEffect = () => { + const { dispatchAccountSyncing } = useAccountSyncing(); + + useEffect(() => { + dispatchAccountSyncing(); + }, [dispatchAccountSyncing]); +}; diff --git a/ui/store/actions.test.js b/ui/store/actions.test.js index 543390be7d15..0ca8ef982316 100644 --- a/ui/store/actions.test.js +++ b/ui/store/actions.test.js @@ -2531,6 +2531,7 @@ describe('Actions', () => { expect(store.getActions()).toStrictEqual(expectedActions); }); }); + describe('#createMetaMetricsDataDeletionTask', () => { afterEach(() => { sinon.restore(); @@ -2570,4 +2571,29 @@ describe('Actions', () => { expect(updateDataDeletionTaskStatusStub.callCount).toStrictEqual(1); }); }); + + describe('syncInternalAccountsWithUserStorage', () => { + afterEach(() => { + sinon.restore(); + }); + + it('calls syncInternalAccountsWithUserStorage in the background', async () => { + const store = mockStore(); + + const syncInternalAccountsWithUserStorageStub = sinon + .stub() + .callsFake((cb) => cb()); + + background.getApi.returns({ + syncInternalAccountsWithUserStorage: + syncInternalAccountsWithUserStorageStub, + }); + setBackgroundConnection(background.getApi()); + + await store.dispatch(actions.syncInternalAccountsWithUserStorage()); + expect(syncInternalAccountsWithUserStorageStub.calledOnceWith()).toBe( + true, + ); + }); + }); }); diff --git a/ui/store/actions.ts b/ui/store/actions.ts index ccceba2e4048..939a0d2bf215 100644 --- a/ui/store/actions.ts +++ b/ui/store/actions.ts @@ -5383,6 +5383,33 @@ export function fetchAndUpdateMetamaskNotifications(): ThunkAction< }; } +/** + * Synchronizes accounts data with user storage between devices. + * + * This function sends a request to the background script to sync accounts data and update the state accordingly. + * If the operation encounters an error, it logs the error message and rethrows the error to ensure it is handled appropriately. + * + * @returns A thunk action that, when dispatched, attempts to synchronize accounts data with user storage between devices. + */ +export function syncInternalAccountsWithUserStorage(): ThunkAction< + void, + MetaMaskReduxState, + unknown, + AnyAction +> { + return async () => { + try { + const response = await submitRequestToBackground( + 'syncInternalAccountsWithUserStorage', + ); + return response; + } catch (error) { + logErrorWithMessage(error); + throw error; + } + }; +} + /** * Marks MetaMask notifications as read. * diff --git a/yarn.lock b/yarn.lock index cc998430baae..afb0d7cbde7e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4800,16 +4800,16 @@ __metadata: languageName: node linkType: hard -"@metamask/accounts-controller@npm:^18.2.0": - version: 18.2.0 - resolution: "@metamask/accounts-controller@npm:18.2.0" +"@metamask/accounts-controller@npm:^18.2.1": + version: 18.2.1 + resolution: "@metamask/accounts-controller@npm:18.2.1" dependencies: "@ethereumjs/util": "npm:^8.1.0" - "@metamask/base-controller": "npm:^7.0.0" - "@metamask/eth-snap-keyring": "npm:^4.3.1" + "@metamask/base-controller": "npm:^7.0.1" + "@metamask/eth-snap-keyring": "npm:^4.3.3" "@metamask/keyring-api": "npm:^8.1.0" - "@metamask/snaps-sdk": "npm:^6.1.1" - "@metamask/snaps-utils": "npm:^7.8.1" + "@metamask/snaps-sdk": "npm:^6.5.0" + "@metamask/snaps-utils": "npm:^8.1.1" "@metamask/utils": "npm:^9.1.0" deepmerge: "npm:^4.2.2" ethereum-cryptography: "npm:^2.1.2" @@ -4817,8 +4817,8 @@ __metadata: uuid: "npm:^8.3.2" peerDependencies: "@metamask/keyring-controller": ^17.0.0 - "@metamask/snaps-controllers": ^9.3.0 - checksum: 10/dc352195621252682eb4cf60e4abc26afe8ae1111574e0e64e7d2e2e1e3ab5c2be906ee586496e12a134b175db00ebd0a68b1a0cd200cb5d298185a683fe68e4 + "@metamask/snaps-controllers": ^9.7.0 + checksum: 10/cad8d68e5c5d8b349fcf5bfd6bc900cccbb5ad54bdcf2678a4469f7b3118064ca26bedafaafa89bea6ddce6f0cfb22af8eb8b7958bbd6cfce916f19a91a8e770 languageName: node linkType: hard @@ -4923,7 +4923,7 @@ __metadata: languageName: node linkType: hard -"@metamask/base-controller@npm:^6.0.0, @metamask/base-controller@npm:^6.0.1, @metamask/base-controller@npm:^6.0.2": +"@metamask/base-controller@npm:^6.0.0, @metamask/base-controller@npm:^6.0.2": version: 6.0.3 resolution: "@metamask/base-controller@npm:6.0.3" dependencies: @@ -5642,45 +5642,24 @@ __metadata: languageName: node linkType: hard -"@metamask/keyring-controller@npm:17.1.1": - version: 17.1.1 - resolution: "@metamask/keyring-controller@npm:17.1.1" +"@metamask/keyring-controller@npm:^17.1.0, @metamask/keyring-controller@npm:^17.2.1": + version: 17.2.1 + resolution: "@metamask/keyring-controller@npm:17.2.1" dependencies: "@ethereumjs/util": "npm:^8.1.0" "@keystonehq/metamask-airgapped-keyring": "npm:^0.14.1" - "@metamask/base-controller": "npm:^6.0.1" - "@metamask/browser-passworder": "npm:^4.3.0" - "@metamask/eth-hd-keyring": "npm:^7.0.1" - "@metamask/eth-sig-util": "npm:^7.0.1" - "@metamask/eth-simple-keyring": "npm:^6.0.1" - "@metamask/keyring-api": "npm:^8.0.0" - "@metamask/message-manager": "npm:^10.0.1" - "@metamask/utils": "npm:^9.0.0" - async-mutex: "npm:^0.5.0" - ethereumjs-wallet: "npm:^1.0.1" - immer: "npm:^9.0.6" - checksum: 10/441bd01b42658819281ef45ebfb214d3282db2cf523284314ca8e6786e7c06fa564a6799e506edc67153d2b51126a8aca3b67762bbb5221c382f70c81a81db29 - languageName: node - linkType: hard - -"@metamask/keyring-controller@patch:@metamask/keyring-controller@npm%3A17.1.1#~/.yarn/patches/@metamask-keyring-controller-npm-17.1.1-098cb41930.patch": - version: 17.1.1 - resolution: "@metamask/keyring-controller@patch:@metamask/keyring-controller@npm%3A17.1.1#~/.yarn/patches/@metamask-keyring-controller-npm-17.1.1-098cb41930.patch::version=17.1.1&hash=1c0f1d" - dependencies: - "@ethereumjs/util": "npm:^8.1.0" - "@keystonehq/metamask-airgapped-keyring": "npm:^0.14.1" - "@metamask/base-controller": "npm:^6.0.1" + "@metamask/base-controller": "npm:^7.0.1" "@metamask/browser-passworder": "npm:^4.3.0" "@metamask/eth-hd-keyring": "npm:^7.0.1" "@metamask/eth-sig-util": "npm:^7.0.1" "@metamask/eth-simple-keyring": "npm:^6.0.1" - "@metamask/keyring-api": "npm:^8.0.0" - "@metamask/message-manager": "npm:^10.0.1" - "@metamask/utils": "npm:^9.0.0" + "@metamask/keyring-api": "npm:^8.1.0" + "@metamask/message-manager": "npm:^10.1.1" + "@metamask/utils": "npm:^9.1.0" async-mutex: "npm:^0.5.0" ethereumjs-wallet: "npm:^1.0.1" immer: "npm:^9.0.6" - checksum: 10/ea04fde80dd6f1bc9f7ee4c4631aeaeb149c8fd16bb8879f5d9edaf077a655866deef31d95357f152558fcc22c993ae1a8a42533ebc6b66fe60897b83a2e8d39 + checksum: 10/051cfc790d74a64c2e8139dbcdb38e845d10f3a3a85792ece6b38b0f239057f553c6f74b49e79dd6748093f1bf3b82d484d927aead3aa891247839b1fac8df66 languageName: node linkType: hard @@ -6107,8 +6086,8 @@ __metadata: linkType: hard "@metamask/providers@npm:^17.1.2": - version: 17.1.2 - resolution: "@metamask/providers@npm:17.1.2" + version: 17.2.0 + resolution: "@metamask/providers@npm:17.2.0" dependencies: "@metamask/json-rpc-engine": "npm:^9.0.1" "@metamask/json-rpc-middleware-stream": "npm:^8.0.1" @@ -6123,7 +6102,7 @@ __metadata: readable-stream: "npm:^3.6.2" peerDependencies: webextension-polyfill: ^0.10.0 || ^0.11.0 || ^0.12.0 - checksum: 10/bf555f9774e340d4497c09c980094e759a198f11c5a78b403e639cf01904b9ec3b19a5e9f53567465dd8739da4138e2021ac9a404a99b1a6022add12a4b19a31 + checksum: 10/b2fc93cdc059528bfeb14a61d6153f9a5f2679e5c6640648c16cd4e5067f758a67c2c6abab962615e878e6b9d7f1bbcd3632584ad7e57ec9df8c16f47b13e608 languageName: node linkType: hard @@ -6357,7 +6336,7 @@ __metadata: languageName: node linkType: hard -"@metamask/snaps-utils@npm:^7.4.0, @metamask/snaps-utils@npm:^7.8.0, @metamask/snaps-utils@npm:^7.8.1": +"@metamask/snaps-utils@npm:^7.4.0, @metamask/snaps-utils@npm:^7.8.0": version: 7.8.1 resolution: "@metamask/snaps-utils@npm:7.8.1" dependencies: @@ -6647,9 +6626,9 @@ __metadata: linkType: hard "@noble/ciphers@npm:^0.5.1, @noble/ciphers@npm:^0.5.2": - version: 0.5.2 - resolution: "@noble/ciphers@npm:0.5.2" - checksum: 10/47a5958954249d5edb49aff48ae6fbfff4d4e5a6bb221c010ebc8e7470c410e9208a2f3f6bf8b7eca83057277478f4ccbdbdcf1bfd324608b334b9f9d28a9fbb + version: 0.5.3 + resolution: "@noble/ciphers@npm:0.5.3" + checksum: 10/af0ad96b5807feace93e63549e05de6f5e305b36e2e95f02d90532893fbc3af3f19b9621b6de4caa98303659e5df2e7aa082064e5d4a82e6f38c728d48dfae5d languageName: node linkType: hard @@ -26074,7 +26053,7 @@ __metadata: "@metamask-institutional/types": "npm:^1.1.0" "@metamask/abi-utils": "npm:^2.0.2" "@metamask/account-watcher": "npm:^4.1.0" - "@metamask/accounts-controller": "npm:^18.2.0" + "@metamask/accounts-controller": "npm:^18.2.1" "@metamask/address-book-controller": "npm:^5.0.0" "@metamask/announcement-controller": "npm:^7.0.0" "@metamask/api-specs": "npm:^0.9.3" @@ -26111,8 +26090,8 @@ __metadata: "@metamask/forwarder": "npm:^1.1.0" "@metamask/gas-fee-controller": "npm:^18.0.0" "@metamask/jazzicon": "npm:^2.0.0" - "@metamask/keyring-api": "npm:^8.0.0" - "@metamask/keyring-controller": "patch:@metamask/keyring-controller@npm%3A17.1.1#~/.yarn/patches/@metamask-keyring-controller-npm-17.1.1-098cb41930.patch" + "@metamask/keyring-api": "npm:^8.1.0" + "@metamask/keyring-controller": "npm:^17.2.1" "@metamask/logging-controller": "npm:^6.0.0" "@metamask/logo": "npm:^3.1.2" "@metamask/message-manager": "npm:^10.1.0" From eecff3116076af71c22e027f9bb18567634455c8 Mon Sep 17 00:00:00 2001 From: Matthew Walsh Date: Thu, 19 Sep 2024 14:28:21 +0100 Subject: [PATCH 21/61] perf: use redux state patches (#26738) Send state patches to the UI. Create `PatchStore` for each UI connection. --- app/scripts/constants/sentry-state.ts | 2 - .../controllers/preferences-controller.ts | 24 ++- app/scripts/lib/ComposableObservableStore.js | 12 +- app/scripts/lib/PatchStore.test.ts | 183 ++++++++++++++++++ app/scripts/lib/PatchStore.ts | 103 ++++++++++ app/scripts/lib/state-utils.test.ts | 60 ++++++ app/scripts/lib/state-utils.ts | 43 ++++ app/scripts/metamask-controller.js | 55 +++--- .../errors-after-init-opt-in-ui-state.json | 2 - .../new-account-modal.test.tsx | 2 +- ui/index.js | 4 + .../confirm-approve.stories-to-do.js | 45 +++-- ui/selectors/selectors.js | 2 +- ui/selectors/transactions.js | 9 +- ui/store/actions.test.js | 116 ++--------- ui/store/actions.ts | 155 ++++++++------- 16 files changed, 570 insertions(+), 247 deletions(-) create mode 100644 app/scripts/lib/PatchStore.test.ts create mode 100644 app/scripts/lib/PatchStore.ts create mode 100644 app/scripts/lib/state-utils.test.ts create mode 100644 app/scripts/lib/state-utils.ts diff --git a/app/scripts/constants/sentry-state.ts b/app/scripts/constants/sentry-state.ts index 10539fc7a5e4..33bf9bac0f22 100644 --- a/app/scripts/constants/sentry-state.ts +++ b/app/scripts/constants/sentry-state.ts @@ -279,8 +279,6 @@ export const SENTRY_BACKGROUND_STATE = { }, }, SnapController: { - unencryptedSnapStates: false, - snapStates: false, snaps: false, }, SnapInterfaceController: { diff --git a/app/scripts/controllers/preferences-controller.ts b/app/scripts/controllers/preferences-controller.ts index 8a3451b8b163..b06f83739e8f 100644 --- a/app/scripts/controllers/preferences-controller.ts +++ b/app/scripts/controllers/preferences-controller.ts @@ -521,8 +521,11 @@ export default class PreferencesController { */ addKnownMethodData(fourBytePrefix: string, methodData: string): void { const { knownMethodData } = this.store.getState(); - knownMethodData[fourBytePrefix] = methodData; - this.store.updateState({ knownMethodData }); + + const updatedKnownMethodData = { ...knownMethodData }; + updatedKnownMethodData[fourBytePrefix] = methodData; + + this.store.updateState({ knownMethodData: updatedKnownMethodData }); } /** @@ -765,11 +768,16 @@ export default class PreferencesController { const addresses = Object.values(accounts).map((account) => account.address.toLowerCase(), ); - Object.keys(identities).forEach((identity) => { - if (addresses.includes(identity.toLowerCase())) { - lostIdentities[identity] = identities[identity]; - } - }); + + const updatedLostIdentities = Object.keys(identities).reduce( + (acc, identity) => { + if (addresses.includes(identity.toLowerCase())) { + acc[identity] = identities[identity]; + } + return acc; + }, + { ...(lostIdentities ?? {}) }, + ); const updatedIdentities = Object.values(accounts).reduce( (identitiesMap: Record, account) => { @@ -786,7 +794,7 @@ export default class PreferencesController { this.store.updateState({ identities: updatedIdentities, - lostIdentities, + lostIdentities: updatedLostIdentities, selectedAddress: selectedAccount?.address || '', // it will be an empty string during onboarding }); } diff --git a/app/scripts/lib/ComposableObservableStore.js b/app/scripts/lib/ComposableObservableStore.js index def67b51240f..e3ce671719d7 100644 --- a/app/scripts/lib/ComposableObservableStore.js +++ b/app/scripts/lib/ComposableObservableStore.js @@ -59,7 +59,7 @@ export default class ComposableObservableStore extends ObservableStore { const store = config[key]; if (store.subscribe) { config[key].subscribe((state) => { - this.updateState({ [key]: state }); + this.#onStateChange(key, state); }); } else { this.controllerMessenger.subscribe( @@ -69,7 +69,7 @@ export default class ComposableObservableStore extends ObservableStore { if (this.persist) { updatedState = getPersistentState(state, config[key].metadata); } - this.updateState({ [key]: updatedState }); + this.#onStateChange(key, updatedState); }, ); } @@ -104,4 +104,12 @@ export default class ComposableObservableStore extends ObservableStore { } return flatState; } + + #onStateChange(controllerKey, newState) { + const oldState = this.getState()[controllerKey]; + + this.updateState({ [controllerKey]: newState }); + + this.emit('stateChange', { oldState, newState, controllerKey }); + } } diff --git a/app/scripts/lib/PatchStore.test.ts b/app/scripts/lib/PatchStore.test.ts new file mode 100644 index 000000000000..2be1ec091a45 --- /dev/null +++ b/app/scripts/lib/PatchStore.test.ts @@ -0,0 +1,183 @@ +import ComposableObservableStore from './ComposableObservableStore'; +import { PatchStore } from './PatchStore'; +import { sanitizeUIState } from './state-utils'; + +jest.mock('./state-utils'); + +function createComposableStoreMock() { + return { + on: jest.fn(), + removeListener: jest.fn(), + } as unknown as jest.Mocked; +} + +function triggerStateChange( + composableStoreMock: jest.Mocked, + oldState: Record, + newState: Record, +) { + composableStoreMock.on.mock.calls[0][1]({ + controllerKey: 'test-controller', + oldState, + newState, + }); +} + +describe('PatchStore', () => { + const sanitizeUIStateMock = jest.mocked(sanitizeUIState); + + beforeEach(() => { + jest.resetAllMocks(); + sanitizeUIStateMock.mockImplementation((state) => state); + }); + + describe('flushPendingPatches', () => { + it('returns pending patches created by composable store events', () => { + const composableStoreMock = createComposableStoreMock(); + const patchStore = new PatchStore(composableStoreMock); + + triggerStateChange( + composableStoreMock, + { test1: 'value1' }, + { test1: 'value2' }, + ); + + triggerStateChange( + composableStoreMock, + { test2: true }, + { test2: false }, + ); + + const patches = patchStore.flushPendingPatches(); + + expect(patches).toEqual([ + { + op: 'replace', + path: ['test1'], + value: 'value2', + }, + { + op: 'replace', + path: ['test2'], + value: false, + }, + ]); + }); + + it('ignores state properties if old and new state is shallow equal', () => { + const objectMock = {}; + const composableStoreMock = createComposableStoreMock(); + const patchStore = new PatchStore(composableStoreMock); + + triggerStateChange( + composableStoreMock, + { test1: 'value1' }, + { test1: 'value1' }, + ); + + triggerStateChange( + composableStoreMock, + { test2: objectMock }, + { test2: objectMock }, + ); + + triggerStateChange( + composableStoreMock, + { test3: { test: 'value' } }, + { test3: { test: 'value' } }, + ); + + const patches = patchStore.flushPendingPatches(); + + expect(patches).toEqual([ + { + op: 'replace', + path: ['test3'], + value: { test: 'value' }, + }, + ]); + }); + + it('returns empty array if no composable store events', () => { + const composableStoreMock = createComposableStoreMock(); + const patchStore = new PatchStore(composableStoreMock); + + const patches = patchStore.flushPendingPatches(); + + expect(patches).toEqual([]); + }); + + it('clears pending patches', () => { + const composableStoreMock = createComposableStoreMock(); + const patchStore = new PatchStore(composableStoreMock); + + triggerStateChange( + composableStoreMock, + { test1: 'value1' }, + { test1: 'value2' }, + ); + + const patches1 = patchStore.flushPendingPatches(); + const patches2 = patchStore.flushPendingPatches(); + + expect(patches1).toHaveLength(1); + expect(patches2).toHaveLength(0); + }); + + it('sanitizes state in patches', () => { + const composableStoreMock = createComposableStoreMock(); + const patchStore = new PatchStore(composableStoreMock); + + sanitizeUIStateMock.mockReturnValueOnce({ test2: 'value' }); + + triggerStateChange( + composableStoreMock, + { test1: false }, + { test1: true }, + ); + + const patches = patchStore.flushPendingPatches(); + + expect(patches).toEqual([ + { + op: 'replace', + path: ['test2'], + value: 'value', + }, + ]); + }); + + it('adds isInitialized patch if vault in new state', () => { + const composableStoreMock = createComposableStoreMock(); + const patchStore = new PatchStore(composableStoreMock); + + triggerStateChange(composableStoreMock, { vault: 0 }, { vault: 123 }); + + const patches = patchStore.flushPendingPatches(); + + expect(patches).toEqual([ + { + op: 'replace', + path: ['vault'], + value: 123, + }, + { + op: 'replace', + path: ['isInitialized'], + value: true, + }, + ]); + }); + }); + + describe('destroy', () => { + it('removes listener from composable store', () => { + const composableStoreMock = createComposableStoreMock(); + const patchStore = new PatchStore(composableStoreMock); + + patchStore.destroy(); + + expect(composableStoreMock.removeListener).toHaveBeenCalledTimes(1); + }); + }); +}); diff --git a/app/scripts/lib/PatchStore.ts b/app/scripts/lib/PatchStore.ts new file mode 100644 index 000000000000..3da2d0d24b3d --- /dev/null +++ b/app/scripts/lib/PatchStore.ts @@ -0,0 +1,103 @@ +import { createProjectLogger } from '@metamask/utils'; +import { Patch } from 'immer'; +import { v4 as uuid } from 'uuid'; +import ComposableObservableStore from './ComposableObservableStore'; +import { sanitizeUIState } from './state-utils'; + +const log = createProjectLogger('patch-store'); + +export class PatchStore { + private id: string; + + private observableStore: ComposableObservableStore; + + private pendingPatches: Map = new Map(); + + private listener: (request: { + controllerKey: string; + oldState: Record; + newState: Record; + }) => void; + + constructor(observableStore: ComposableObservableStore) { + this.id = uuid(); + this.observableStore = observableStore; + this.listener = this._onStateChange.bind(this); + + this.observableStore.on('stateChange', this.listener); + + log('Created', this.id); + } + + flushPendingPatches(): Patch[] { + const patches = [...this.pendingPatches.values()]; + + this.pendingPatches.clear(); + + for (const patch of patches) { + log('Flushed', patch.path.join('.'), this.id, patch); + } + + return patches; + } + + destroy() { + this.observableStore.removeListener('stateChange', this.listener); + log('Destroyed', this.id); + } + + private _onStateChange({ + oldState, + newState, + }: { + controllerKey: string; + oldState: Record; + newState: Record; + }) { + const sanitizedNewState = sanitizeUIState(newState); + const patches = this._generatePatches(oldState, sanitizedNewState); + const isInitialized = Boolean(newState.vault); + + if (isInitialized) { + patches.push({ + op: 'replace', + path: ['isInitialized'], + value: isInitialized, + }); + } + + if (!patches.length) { + return; + } + + for (const patch of patches) { + const path = patch.path.join('.'); + + this.pendingPatches.set(path, patch); + + log('Updated', path, this.id, patch); + } + } + + private _generatePatches( + oldState: Record, + newState: Record, + ): Patch[] { + return Object.keys(newState) + .map((key) => { + const oldData = oldState[key]; + const newData = newState[key]; + + if (oldData === newData) { + return null; + } + + return { + op: 'replace', + path: [key], + value: newData, + }; + }) + .filter(Boolean) as Patch[]; + } +} diff --git a/app/scripts/lib/state-utils.test.ts b/app/scripts/lib/state-utils.test.ts new file mode 100644 index 000000000000..bd296141aef7 --- /dev/null +++ b/app/scripts/lib/state-utils.test.ts @@ -0,0 +1,60 @@ +import { sanitizeUIState } from './state-utils'; + +describe('State Utils', () => { + describe('sanitizeUIState', () => { + it('removes unsafe properties', () => { + const state = { + test1: 'value1', + snapStates: true, + unencryptedSnapStates: true, + vault: true, + test2: false, + }; + + const sanitizedState = sanitizeUIState(state); + + expect(sanitizedState).toStrictEqual({ + test1: 'value1', + test2: false, + }); + }); + + it('strips large properties from snaps state', () => { + const state = { + test1: 'value1', + test2: true, + snaps: { + snap1: { + id: 'snap1', + test3: 123, + sourceCode: 'sourceCode1', + auxiliaryFiles: 'auxiliaryFiles1', + }, + snap2: { + id: 'snap2', + test4: 456, + sourceCode: 'sourceCode2', + auxiliaryFiles: 'auxiliaryFiles2', + }, + }, + }; + + const sanitizedState = sanitizeUIState(state); + + expect(sanitizedState).toStrictEqual({ + test1: 'value1', + test2: true, + snaps: { + snap1: { + id: 'snap1', + test3: 123, + }, + snap2: { + id: 'snap2', + test4: 456, + }, + }, + }); + }); + }); +}); diff --git a/app/scripts/lib/state-utils.ts b/app/scripts/lib/state-utils.ts new file mode 100644 index 000000000000..90275bbc7d33 --- /dev/null +++ b/app/scripts/lib/state-utils.ts @@ -0,0 +1,43 @@ +import { SnapControllerState } from '@metamask/snaps-controllers'; +import { Snap } from '@metamask/snaps-utils'; + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +type FlattenedUIState = Record; + +const REMOVE_KEYS = ['snapStates', 'unencryptedSnapStates', 'vault']; + +export function sanitizeUIState(state: FlattenedUIState): FlattenedUIState { + const newState = { ...state }; + + for (const key of REMOVE_KEYS) { + delete newState[key]; + } + + sanitizeSnapData(newState); + + return newState; +} + +function sanitizeSnapData(state: FlattenedUIState) { + const snapsData = state.snaps as SnapControllerState['snaps'] | undefined; + + if (!snapsData) { + return; + } + + state.snaps = Object.values(snapsData).reduce((acc, snap) => { + acc[snap.id] = stripLargeSnapData(snap) as Snap; + return acc; + }, {} as SnapControllerState['snaps']); +} + +function stripLargeSnapData(snapData: Snap): Partial { + const newData: Partial = { + ...snapData, + }; + + delete newData.sourceCode; + delete newData.auxiliaryFiles; + + return newData; +} diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js index 62d117ce799c..9eff0ed6d2be 100644 --- a/app/scripts/metamask-controller.js +++ b/app/scripts/metamask-controller.js @@ -345,6 +345,8 @@ import { onPushNotificationReceived, } from './controllers/push-notifications'; import createTracingMiddleware from './lib/createTracingMiddleware'; +import { PatchStore } from './lib/PatchStore'; +import { sanitizeUIState } from './lib/state-utils'; export const METAMASK_CONTROLLER_EVENTS = { // Fired after state changes that impact the extension badge (unapproved msg count) @@ -3085,24 +3087,11 @@ export default class MetamaskController extends EventEmitter { getState() { const { vault } = this.keyringController.state; const isInitialized = Boolean(vault); - const flatState = this.memStore.getFlatState(); - // The vault should not be exposed to the UI - delete flatState.vault; - return { isInitialized, - ...flatState, - // Snap state, source code and other files are stripped out to prevent piping to the MetaMask UI. - snapStates: {}, - unencryptedSnapStates: {}, - snaps: Object.values(flatState.snaps ?? {}).reduce((acc, snap) => { - // eslint-disable-next-line no-unused-vars - const { sourceCode, auxiliaryFiles, ...rest } = snap; - acc[snap.id] = rest; - return acc; - }, {}), + ...sanitizeUIState(flatState), }; } @@ -5231,26 +5220,41 @@ export default class MetamaskController extends EventEmitter { * @param {*} outStream - The stream to provide our API over. */ setupControllerConnection(outStream) { - const api = this.getApi(); - - // report new active controller connection - this.activeControllerConnections += 1; - this.emit('controllerConnectionChanged', this.activeControllerConnections); + const patchStore = new PatchStore(this.memStore); + let uiReady = false; - // set up postStream transport - outStream.on('data', createMetaRPCHandler(api, outStream)); - const handleUpdate = (update) => { - if (!isStreamWritable(outStream)) { + const handleUpdate = () => { + if (!isStreamWritable(outStream) || !uiReady) { return; } - // send notification to client-side + + const patches = patchStore.flushPendingPatches(); + outStream.write({ jsonrpc: '2.0', method: 'sendUpdate', - params: [update], + params: [patches], }); }; + + const api = { + ...this.getApi(), + startPatches: () => { + uiReady = true; + handleUpdate(); + }, + getStatePatches: () => patchStore.flushPendingPatches(), + }; + this.on('update', handleUpdate); + + // report new active controller connection + this.activeControllerConnections += 1; + this.emit('controllerConnectionChanged', this.activeControllerConnections); + + // set up postStream transport + outStream.on('data', createMetaRPCHandler(api, outStream)); + const startUISync = () => { if (!isStreamWritable(outStream)) { return; @@ -5277,6 +5281,7 @@ export default class MetamaskController extends EventEmitter { ); outStream.mmFinished = true; this.removeListener('update', handleUpdate); + patchStore.destroy(); } }; diff --git a/test/e2e/tests/metrics/state-snapshots/errors-after-init-opt-in-ui-state.json b/test/e2e/tests/metrics/state-snapshots/errors-after-init-opt-in-ui-state.json index 5a4b95548315..f474b2492ba4 100644 --- a/test/e2e/tests/metrics/state-snapshots/errors-after-init-opt-in-ui-state.json +++ b/test/e2e/tests/metrics/state-snapshots/errors-after-init-opt-in-ui-state.json @@ -179,8 +179,6 @@ "rates": { "btc": { "conversionDate": 0, "conversionRate": "0" } }, "cryptocurrencies": ["btc"], "snaps": "object", - "snapStates": "object", - "unencryptedSnapStates": "object", "jobs": "object", "database": null, "lastUpdated": null, diff --git a/ui/components/app/modals/new-account-modal/new-account-modal.test.tsx b/ui/components/app/modals/new-account-modal/new-account-modal.test.tsx index 4c3fdf8de3e2..bb078773cd66 100644 --- a/ui/components/app/modals/new-account-modal/new-account-modal.test.tsx +++ b/ui/components/app/modals/new-account-modal/new-account-modal.test.tsx @@ -79,7 +79,7 @@ describe('NewAccountModal', () => { await waitFor(() => { expect(mockSubmitRequestToBackground).toHaveBeenNthCalledWith( 2, - 'getState', + 'getStatePatches', undefined, ); }); diff --git a/ui/index.js b/ui/index.js index 5cce0a2a85d4..0198e586bfdf 100644 --- a/ui/index.js +++ b/ui/index.js @@ -70,6 +70,10 @@ export default async function launchMetamaskUi(opts) { const store = await startApp(metamaskState, backgroundConnection, opts); + await promisify( + backgroundConnection.startPatches.bind(backgroundConnection), + )(); + setupStateHooks(store); return store; diff --git a/ui/pages/confirmations/confirm-approve/confirm-approve.stories-to-do.js b/ui/pages/confirmations/confirm-approve/confirm-approve.stories-to-do.js index 7cac641fc9c0..d48e8fa19b58 100644 --- a/ui/pages/confirmations/confirm-approve/confirm-approve.stories-to-do.js +++ b/ui/pages/confirmations/confirm-approve/confirm-approve.stories-to-do.js @@ -5,7 +5,7 @@ import { useParams } from 'react-router-dom'; import { useSelector } from 'react-redux'; import { updateMetamaskState } from '../../../store/actions'; import { getCurrentNetworkTransactions } from '../../../selectors/transactions'; -import { store, getNewState } from '../../../../.storybook/preview'; +import { store } from '../../../../.storybook/preview'; import { subjectMetadata } from '../../../../.storybook/initial-states/approval-screens/token-approval'; import ConfirmApprove from '.'; @@ -24,34 +24,37 @@ const PageSet = ({ children }) => { 'Icon URL', 'https://metamask.github.io/test-dapp/metamask-fox.svg', ); - const state = store.getState(); const currentNetworkTxList = useSelector(getCurrentNetworkTransactions); const transaction = currentNetworkTxList.find(({ id }) => id === txId); useEffect(() => { transaction.origin = origin; store.dispatch( - updateMetamaskState( - getNewState(state.metamask, { - transactions: [transaction], - }), - ), + updateMetamaskState([ + { + op: 'replace', + path: ['transactions'], + value: [transaction], + }, + ]), ); - }, [origin, transaction, state.metamask]); + }, [origin, transaction]); useEffect(() => { store.dispatch( - updateMetamaskState( - getNewState(state.metamask, { - subjectMetadata: { + updateMetamaskState([ + { + op: 'replace', + path: ['subjectMetadata'], + value: { [origin]: { iconUrl: subjectIconUrl, }, }, - }), - ), + }, + ]), ); - }, [subjectIconUrl, origin, state.metamask]); + }, [subjectIconUrl, origin]); const params = useParams(); params.id = txId; @@ -59,14 +62,16 @@ const PageSet = ({ children }) => { }; export const DefaultStory = () => { - const state = store.getState(); store.dispatch( - updateMetamaskState( - getNewState(state.metamask, { - subjectMetadata, - }), - ), + updateMetamaskState([ + { + op: 'replace', + path: ['subjectMetadata'], + value: subjectMetadata, + }, + ]), ); + return ( diff --git a/ui/selectors/selectors.js b/ui/selectors/selectors.js index 9266bc5050e4..96c956d72223 100644 --- a/ui/selectors/selectors.js +++ b/ui/selectors/selectors.js @@ -301,7 +301,7 @@ export const getMetaMaskAccounts = createSelector( // TODO: `AccountTracker` balances are in hex and `MultichainBalance` are in number. // We should consolidate the format to either hex or number if (isEvmAccountType(internalAccount.type)) { - if (balances[internalAccount.address]) { + if (balances?.[internalAccount.address]) { account = { ...account, ...balances[internalAccount.address], diff --git a/ui/selectors/transactions.js b/ui/selectors/transactions.js index 5e1303ef2e57..2c5fb8fe4b98 100644 --- a/ui/selectors/transactions.js +++ b/ui/selectors/transactions.js @@ -45,7 +45,7 @@ export const getTransactions = createDeepEqualSelector( return []; } - return transactions.sort((a, b) => a.time - b.time); // Ascending + return [...transactions].sort((a, b) => a.time - b.time); // Ascending }, (transactions) => transactions, ); @@ -84,7 +84,10 @@ export const getAllUnapprovedTransactions = createDeepEqualSelector( return []; } - const sortedTransactions = transactions.sort((a, b) => a.time - b.time); + const sortedTransactions = [...transactions].sort( + (a, b) => a.time - b.time, + ); + return filterAndShapeUnapprovedTransactions(sortedTransactions); }, (transactions) => transactions, @@ -220,7 +223,7 @@ export const transactionsSelector = createSelector( (subSelectorTxList = [], selectedAddressTxList = []) => { const txsToRender = selectedAddressTxList.concat(subSelectorTxList); - return txsToRender.sort((a, b) => b.time - a.time); + return [...txsToRender].sort((a, b) => b.time - a.time); }, ); diff --git a/ui/store/actions.test.js b/ui/store/actions.test.js index 0ca8ef982316..213fa3fcf6c8 100644 --- a/ui/store/actions.test.js +++ b/ui/store/actions.test.js @@ -51,8 +51,6 @@ const defaultState = { }; const mockStore = (state = defaultState) => configureStore(middleware)(state); -const baseMockState = defaultState.metamask; - describe('Actions', () => { let background; @@ -60,7 +58,7 @@ describe('Actions', () => { beforeEach(async () => { background = sinon.createStubInstance(MetaMaskController, { - getState: sinon.stub().callsFake((cb) => cb(null, baseMockState)), + getState: sinon.stub().callsFake((cb) => cb(null, [])), }); background.signMessage = sinon.stub(); @@ -68,6 +66,7 @@ describe('Actions', () => { background.signTypedMessage = sinon.stub(); background.abortTransactionSigning = sinon.stub(); background.toggleExternalServices = sinon.stub(); + background.getStatePatches = sinon.stub().callsFake((cb) => cb(null, [])); }); describe('#tryUnlockMetamask', () => { @@ -88,10 +87,6 @@ describe('Actions', () => { { type: 'SHOW_LOADING_INDICATION', payload: undefined }, { type: 'UNLOCK_IN_PROGRESS' }, { type: 'UNLOCK_SUCCEEDED', value: undefined }, - { - type: 'UPDATE_METAMASK_STATE', - value: baseMockState, - }, { type: 'HIDE_LOADING_INDICATION' }, ]; @@ -155,10 +150,6 @@ describe('Actions', () => { const expectedActions = [ { type: 'SHOW_LOADING_INDICATION', payload: undefined }, - { - type: 'UPDATE_METAMASK_STATE', - value: baseMockState, - }, { type: 'SHOW_ACCOUNTS_PAGE' }, { type: 'HIDE_LOADING_INDICATION' }, ]; @@ -246,46 +237,12 @@ describe('Actions', () => { it('calls removeAccount in background and expect actions to show account', async () => { const store = mockStore(); - background.getState.callsFake((cb) => - cb(null, { - ...mockNetworkState({ chainId: CHAIN_IDS.MAINNET }), - currentLocale: 'test', - accounts: { - '0xAnotherAddress': { - balance: '0x0', - }, - }, - internalAccounts: { - accounts: { - '22497cc9-e791-42b8-adef-2f13ef216b86': { - address: '0xAnotherAddress', - id: '22497cc9-e791-42b8-adef-2f13ef216b86', - metadata: { - name: 'Test Account 2', - keyring: { - type: 'HD Key Tree', - }, - }, - options: {}, - methods: ETH_EOA_METHODS, - type: EthAccountType.Eoa, - }, - }, - selectedAccount: '22497cc9-e791-42b8-adef-2f13ef216b86', - }, - }), - ); - const removeAccount = background.removeAccount.callsFake((_, cb) => cb()); setBackgroundConnection(background); const expectedActions = [ 'SHOW_LOADING_INDICATION', - 'SELECTED_ADDRESS_CHANGED', - 'ACCOUNT_CHANGED', - 'SELECTED_ACCOUNT_CHANGED', - 'UPDATE_METAMASK_STATE', 'HIDE_LOADING_INDICATION', 'SHOW_ACCOUNTS_PAGE', ]; @@ -702,7 +659,7 @@ describe('Actions', () => { background.getApi.returns({ updateTransaction: updateTransactionStub, - getState: sinon.stub().callsFake((cb) => cb(null, baseMockState)), + getStatePatches: sinon.stub().callsFake((cb) => cb(null, [])), }); setBackgroundConnection(background.getApi()); @@ -725,11 +682,7 @@ describe('Actions', () => { updateTransaction: (_, callback) => { callback(new Error('error')); }, - getState: sinon.stub().callsFake((cb) => - cb(null, { - currentLocale: 'test', - }), - ), + getStatePatches: sinon.stub().callsFake((cb) => cb(null, [])), }); setBackgroundConnection(background.getApi()); @@ -916,7 +869,7 @@ describe('Actions', () => { background.getApi.returns({ addToken: addTokenStub, - getState: sinon.stub().callsFake((cb) => cb(null, baseMockState)), + getStatePatches: sinon.stub().callsFake((cb) => cb(null, [])), }); setBackgroundConnection(background.getApi()); @@ -947,17 +900,13 @@ describe('Actions', () => { background.getApi.returns({ addToken: addTokenStub, - getState: sinon.stub().callsFake((cb) => cb(null, baseMockState)), + getStatePatches: sinon.stub().callsFake((cb) => cb(null, [])), }); setBackgroundConnection(background.getApi()); const expectedActions = [ { type: 'SHOW_LOADING_INDICATION', payload: undefined }, - { - type: 'UPDATE_METAMASK_STATE', - value: baseMockState, - }, { type: 'HIDE_LOADING_INDICATION' }, ]; @@ -986,7 +935,7 @@ describe('Actions', () => { background.getApi.returns({ ignoreTokens: ignoreTokensStub, - getState: sinon.stub().callsFake((cb) => cb(null, baseMockState)), + getStatePatches: sinon.stub().callsFake((cb) => cb(null, [])), }); setBackgroundConnection(background.getApi()); @@ -1002,7 +951,7 @@ describe('Actions', () => { background.getApi.returns({ ignoreTokens: sinon.stub().callsFake((_, cb) => cb(new Error('error'))), - getState: sinon.stub().callsFake((cb) => cb(null, baseMockState)), + getStatePatches: sinon.stub().callsFake((cb) => cb(null, [])), }); setBackgroundConnection(background.getApi()); @@ -1010,10 +959,6 @@ describe('Actions', () => { const expectedActions = [ { type: 'SHOW_LOADING_INDICATION', payload: undefined }, { type: 'DISPLAY_WARNING', payload: 'error' }, - { - type: 'UPDATE_METAMASK_STATE', - value: baseMockState, - }, { type: 'HIDE_LOADING_INDICATION' }, ]; @@ -1270,7 +1215,7 @@ describe('Actions', () => { background.getApi.returns({ setAddressBook: setAddressBookStub, - getState: sinon.stub().callsFake((cb) => cb(null, baseMockState)), + getStatePatches: sinon.stub().callsFake((cb) => cb(null, [])), }); setBackgroundConnection(background.getApi()); @@ -1862,13 +1807,7 @@ describe('Actions', () => { setBackgroundConnection(background); - const expectedActions = [ - { type: 'HIDE_LOADING_INDICATION' }, - { - type: 'UPDATE_METAMASK_STATE', - value: baseMockState, - }, - ]; + const expectedActions = [{ type: 'HIDE_LOADING_INDICATION' }]; await expect( store.dispatch(actions.markPasswordForgotten('test')), @@ -1917,40 +1856,7 @@ describe('Actions', () => { rejectPendingApproval: sinon.stub().callsFake((_1, _2, cb) => { cb(); }), - getState: sinon.stub().callsFake((cb) => - cb(null, { - ...mockNetworkState({ chainId: CHAIN_IDS.MAINNET }), - currentLocale: 'test', - accounts: { - '0xFirstAddress': { - balance: '0x0', - }, - }, - internalAccounts: { - accounts: { - '8e110453-2231-4e62-82de-29b913dfef4b': { - address: '0xFirstAddress', - id: '8e110453-2231-4e62-82de-29b913dfef4b', - metadata: { - name: 'Test Account 2', - keyring: { - type: 'HD Key Tree', - }, - }, - options: {}, - methods: ETH_EOA_METHODS, - type: EthAccountType.Eoa, - }, - }, - selectedAccount: '8e110453-2231-4e62-82de-29b913dfef4b', - }, - cachedBalances: { - '0x1': { - '0xFirstAddress': '0x0', - }, - }, - }), - ), + getStatePatches: sinon.stub().callsFake((cb) => cb(null, [])), }); setBackgroundConnection(background.getApi()); diff --git a/ui/store/actions.ts b/ui/store/actions.ts index 939a0d2bf215..c3d234100a1a 100644 --- a/ui/store/actions.ts +++ b/ui/store/actions.ts @@ -38,6 +38,7 @@ import { import { InterfaceState } from '@metamask/snaps-sdk'; import { KeyringTypes } from '@metamask/keyring-controller'; import type { NotificationServicesController } from '@metamask/notification-services-controller'; +import { Patch } from 'immer'; import switchDirection from '../../shared/lib/switch-direction'; import { ENVIRONMENT_TYPE_NOTIFICATION, @@ -422,8 +423,6 @@ export function importNewAccount( AnyAction > { return async (dispatch: MetaMaskReduxDispatch) => { - let newState; - dispatch(showLoadingIndication(loadingMessage)); try { @@ -432,16 +431,11 @@ export function importNewAccount( strategy, args, ]); - log.debug(`background.getState`); - newState = await submitRequestToBackground< - MetaMaskReduxState['metamask'] - >('getState'); } finally { dispatch(hideLoadingIndication()); } - dispatch(updateMetamaskState(newState)); - return newState; + return await forceUpdateMetamaskState(dispatch); }; } @@ -679,18 +673,17 @@ export function decryptMsgInline( return async (dispatch: MetaMaskReduxDispatch) => { log.debug(`actions calling background.decryptMessageInline`); - let newState; try { - newState = await submitRequestToBackground< - MetaMaskReduxState['metamask'] - >('decryptMessageInline', [decryptedMsgData]); + await submitRequestToBackground('decryptMessageInline', [ + decryptedMsgData, + ]); } catch (error) { logErrorWithMessage(error); dispatch(displayWarning(error)); throw error; } - dispatch(updateMetamaskState(newState)); + const newState = await forceUpdateMetamaskState(dispatch); return newState.unapprovedDecryptMsgs[decryptedMsgData.metamaskId]; }; } @@ -708,11 +701,8 @@ export function decryptMsg( dispatch(showLoadingIndication()); log.debug(`actions calling background.decryptMessage`); - let newState: MetaMaskReduxState['metamask']; try { - newState = await submitRequestToBackground< - MetaMaskReduxState['metamask'] - >('decryptMessage', [decryptedMsgData]); + await submitRequestToBackground('decryptMessage', [decryptedMsgData]); } catch (error) { logErrorWithMessage(error); dispatch(displayWarning(error)); @@ -721,7 +711,7 @@ export function decryptMsg( dispatch(hideLoadingIndication()); } - dispatch(updateMetamaskState(newState)); + await forceUpdateMetamaskState(dispatch); dispatch(completedTx(decryptedMsgData.metamaskId)); dispatch(closeCurrentNotificationWindow()); return decryptedMsgData; @@ -741,11 +731,11 @@ export function encryptionPublicKeyMsg( dispatch(showLoadingIndication()); log.debug(`actions calling background.encryptionPublicKey`); - let newState: MetaMaskReduxState['metamask']; try { - newState = await submitRequestToBackground< - MetaMaskReduxState['metamask'] - >('encryptionPublicKey', [msgData]); + await submitRequestToBackground( + 'encryptionPublicKey', + [msgData], + ); } catch (error) { logErrorWithMessage(error); dispatch(displayWarning(error)); @@ -754,7 +744,7 @@ export function encryptionPublicKeyMsg( dispatch(hideLoadingIndication()); } - dispatch(updateMetamaskState(newState)); + await forceUpdateMetamaskState(dispatch); dispatch(completedTx(msgData.metamaskId)); dispatch(closeCurrentNotificationWindow()); return msgData; @@ -768,27 +758,6 @@ export function updateCustomNonce(value: string) { }; } -const updateMetamaskStateFromBackground = (): Promise< - MetaMaskReduxState['metamask'] -> => { - log.debug(`background.getState`); - - return new Promise((resolve, reject) => { - callBackgroundMethod( - 'getState', - [], - (error, newState) => { - if (error) { - reject(error); - return; - } - - resolve(newState as MetaMaskReduxState['metamask']); - }, - ); - }); -}; - /** * TODO: update previousGasParams to use typed gas params object * TODO: Not a thunk, but rather a wrapper around a background call @@ -963,8 +932,7 @@ export function updateTransaction( try { dispatch(updateTransactionParams(txMeta.id, txMeta.txParams)); - const newState = await updateMetamaskStateFromBackground(); - dispatch(updateMetamaskState(newState)); + await forceUpdateMetamaskState(dispatch); dispatch(showConfTxPage({ id: txMeta.id })); return txMeta; } finally { @@ -1100,8 +1068,7 @@ export function updateAndApproveTx( }, ); }) - .then(() => updateMetamaskStateFromBackground()) - .then((newState) => dispatch(updateMetamaskState(newState))) + .then(() => forceUpdateMetamaskState(dispatch)) .then(() => { if (!getIsSendActive()) { dispatch(resetSendState()); @@ -1346,16 +1313,16 @@ export function cancelDecryptMsg( return async (dispatch: MetaMaskReduxDispatch) => { dispatch(showLoadingIndication()); - let newState; try { - newState = await submitRequestToBackground< - MetaMaskReduxState['metamask'] - >('cancelDecryptMessage', [msgData.id]); + await submitRequestToBackground( + 'cancelDecryptMessage', + [msgData.id], + ); } finally { dispatch(hideLoadingIndication()); } - dispatch(updateMetamaskState(newState)); + await forceUpdateMetamaskState(dispatch); dispatch(completedTx(msgData.id)); dispatch(closeCurrentNotificationWindow()); return msgData; @@ -1373,16 +1340,16 @@ export function cancelEncryptionPublicKeyMsg( return async (dispatch: MetaMaskReduxDispatch) => { dispatch(showLoadingIndication()); - let newState; try { - newState = await submitRequestToBackground< - MetaMaskReduxState['metamask'] - >('cancelEncryptionPublicKey', [msgData.id]); + await submitRequestToBackground( + 'cancelEncryptionPublicKey', + [msgData.id], + ); } finally { dispatch(hideLoadingIndication()); } - dispatch(updateMetamaskState(newState)); + await forceUpdateMetamaskState(dispatch); dispatch(completedTx(msgData.id)); dispatch(closeCurrentNotificationWindow()); return msgData; @@ -1417,8 +1384,7 @@ export function cancelTx( }, ); }) - .then(() => updateMetamaskStateFromBackground()) - .then((newState) => dispatch(updateMetamaskState(newState))) + .then(() => forceUpdateMetamaskState(dispatch)) .then(() => { dispatch(resetSendState()); dispatch(completedTx(txMeta.id)); @@ -1471,8 +1437,7 @@ export function cancelTxs( await Promise.all(cancellations); - const newState = await updateMetamaskStateFromBackground(); - dispatch(updateMetamaskState(newState)); + await forceUpdateMetamaskState(dispatch); dispatch(resetSendState()); txIds.forEach((id) => { @@ -1559,13 +1524,18 @@ export function unlockSucceeded(message?: string) { } export function updateMetamaskState( - newState: MetaMaskReduxState['metamask'], + patches: Patch[], ): ThunkAction { return (dispatch, getState) => { const state = getState(); const providerConfig = getProviderConfig(state); const { metamask: currentState } = state; + if (!patches?.length) { + return currentState; + } + + const newState = applyPatches(currentState, patches); const { currentLocale } = currentState; const currentInternalAccount = getSelectedInternalAccount(state); const selectedAddress = currentInternalAccount?.address; @@ -1657,6 +1627,8 @@ export function updateMetamaskState( ///: BEGIN:ONLY_INCLUDE_IF(build-mmi) updateCustodyState(dispatch, newState, getState()); ///: END:ONLY_INCLUDE_IF + + return newState; }; } @@ -1684,13 +1656,12 @@ export function lockMetamask(): ThunkAction< dispatch(showLoadingIndication()); return backgroundSetLocked() - .then(() => updateMetamaskStateFromBackground()) + .then(() => forceUpdateMetamaskState(dispatch)) .catch((error) => { dispatch(displayWarning(error.message)); return Promise.reject(error); }) - .then((newState) => { - dispatch(updateMetamaskState(newState)); + .then(() => { dispatch(hideLoadingIndication()); dispatch({ type: actionConstants.LOCK_METAMASK }); }) @@ -2288,12 +2259,12 @@ export function createCancelTransaction( const { id } = currentNetworkTxList[currentNetworkTxList.length - 1]; newTxId = id; - resolve(newState); + resolve(); } }, ); }) - .then((newState) => dispatch(updateMetamaskState(newState))) + .then(() => forceUpdateMetamaskState(dispatch)) .then(() => newTxId); }; } @@ -2323,12 +2294,12 @@ export function createSpeedUpTransaction( const currentNetworkTxList = getCurrentNetworkTransactions(newState); newTx = currentNetworkTxList[currentNetworkTxList.length - 1]; - resolve(newState); + resolve(); } }, ); }) - .then((newState) => dispatch(updateMetamaskState(newState))) + .then(() => forceUpdateMetamaskState(dispatch)) .then(() => newTx); }; } @@ -2355,12 +2326,12 @@ export function createRetryTransaction( const currentNetworkTxList = getCurrentNetworkTransactions(newState); newTx = currentNetworkTxList[currentNetworkTxList.length - 1]; - resolve(newState); + resolve(); } }, ); }) - .then((newState) => dispatch(updateMetamaskState(newState))) + .then(() => forceUpdateMetamaskState(dispatch)) .then(() => newTx); }; } @@ -3159,20 +3130,18 @@ export function setServiceWorkerKeepAlivePreference( export async function forceUpdateMetamaskState( dispatch: MetaMaskReduxDispatch, ) { - log.debug(`background.getState`); + let pendingPatches: Patch[] | undefined; - let newState; try { - newState = await submitRequestToBackground( - 'getState', + pendingPatches = await submitRequestToBackground( + 'getStatePatches', ); } catch (error) { dispatch(displayWarning(error)); throw error; } - dispatch(updateMetamaskState(newState)); - return newState; + return dispatch(updateMetamaskState(pendingPatches)); } export function toggleAccountMenu() { @@ -5663,3 +5632,33 @@ export async function endBackgroundTrace(request: EndTraceRequest) { { ...request, timestamp }, ]); } + +/** + * Apply the state patches from the background. + * Intentionally not using immer as a temporary measure to avoid + * freezing the resulting state and requiring further fixes + * to remove direct state mutations. + * + * @param oldState - The current state. + * @param patches - The patches to apply. + * Only supports 'replace' operations with a single path element. + * @returns The new state. + */ +function applyPatches( + oldState: Record, + patches: Patch[], +): Record { + const newState = { ...oldState }; + + for (const patch of patches) { + const { op, path, value } = patch; + + if (op === 'replace') { + newState[path[0]] = value; + } else { + throw new Error(`Unsupported patch operation: ${op}`); + } + } + + return newState; +} From 4f58f14a8e715877ad02a94be4801613eb7a5909 Mon Sep 17 00:00:00 2001 From: David Murdoch <187813+davidmurdoch@users.noreply.github.com> Date: Thu, 19 Sep 2024 11:03:18 -0400 Subject: [PATCH 22/61] perf: finish getting rid of uses of the Roboto font (#26552) We use two custom fonts in our typography CSS: Euclid Circular B and Roboto. Roboto is a fallback font, but since both are custom fonts Roboto will never be activated by our default typography. It can be removed. Roboto is only used in one other place in our CSS, but the selector looks to be not used anymore. Lastly, Material UI uses Roboto by default for input elements and their labels. This PR updates our use of it to use "Euclid Circular B" and our usual fall back fonts. I don't particularly like the implementation (setting `fontFamily` as a string constant in JS), but I'm not sure how to do it any better (cc @georgewrmarshall ). It saves about 0-2ms from the load time (compared to `popup-defer-scripts` branch), so it's not substantial by any stretch. It does save 1.4 megabytes, about 6%, from the dist zip (compared to `popup-defer-scripts` branch), which seems worthwhile. Fixes: https://github.com/MetaMask/metamask-extension/issues/26589 --- .storybook/metamask-storybook-theme.js | 2 +- .../ui/text-field/text-field.component.js | 9 ++++ ui/css/design-system/_typography.scss | 2 +- ui/css/utilities/fonts.scss | 42 ------------------ .../utilities/fonts/Roboto/Roboto-Black.ttf | Bin 142472 -> 0 bytes .../fonts/Roboto/Roboto-BlackItalic.ttf | Bin 149644 -> 0 bytes ui/css/utilities/fonts/Roboto/Roboto-Bold.ttf | Bin 135820 -> 0 bytes .../fonts/Roboto/Roboto-BoldItalic.ttf | Bin 144700 -> 0 bytes .../utilities/fonts/Roboto/Roboto-Italic.ttf | Bin 148540 -> 0 bytes .../utilities/fonts/Roboto/Roboto-Light.ttf | Bin 140276 -> 0 bytes .../fonts/Roboto/Roboto-LightItalic.ttf | Bin 145932 -> 0 bytes .../utilities/fonts/Roboto/Roboto-Medium.ttf | Bin 137308 -> 0 bytes .../fonts/Roboto/Roboto-MediumItalic.ttf | Bin 147876 -> 0 bytes .../utilities/fonts/Roboto/Roboto-Regular.ttf | Bin 145348 -> 0 bytes ui/css/utilities/fonts/Roboto/Roboto-Thin.ttf | Bin 130044 -> 0 bytes .../fonts/Roboto/Roboto-ThinItalic.ttf | Bin 132376 -> 0 bytes .../fonts/Roboto/RobotoCondensed-Bold.ttf | Bin 141796 -> 0 bytes .../Roboto/RobotoCondensed-BoldItalic.ttf | Bin 145256 -> 0 bytes .../fonts/Roboto/RobotoCondensed-Italic.ttf | Bin 144404 -> 0 bytes .../fonts/Roboto/RobotoCondensed-Light.ttf | Bin 141384 -> 0 bytes .../Roboto/RobotoCondensed-LightItalic.ttf | Bin 145104 -> 0 bytes .../fonts/Roboto/RobotoCondensed-Regular.ttf | Bin 140396 -> 0 bytes ui/pages/swaps/fee-card/index.scss | 5 --- 23 files changed, 11 insertions(+), 49 deletions(-) delete mode 100644 ui/css/utilities/fonts/Roboto/Roboto-Black.ttf delete mode 100644 ui/css/utilities/fonts/Roboto/Roboto-BlackItalic.ttf delete mode 100644 ui/css/utilities/fonts/Roboto/Roboto-Bold.ttf delete mode 100644 ui/css/utilities/fonts/Roboto/Roboto-BoldItalic.ttf delete mode 100644 ui/css/utilities/fonts/Roboto/Roboto-Italic.ttf delete mode 100644 ui/css/utilities/fonts/Roboto/Roboto-Light.ttf delete mode 100644 ui/css/utilities/fonts/Roboto/Roboto-LightItalic.ttf delete mode 100644 ui/css/utilities/fonts/Roboto/Roboto-Medium.ttf delete mode 100644 ui/css/utilities/fonts/Roboto/Roboto-MediumItalic.ttf delete mode 100644 ui/css/utilities/fonts/Roboto/Roboto-Regular.ttf delete mode 100644 ui/css/utilities/fonts/Roboto/Roboto-Thin.ttf delete mode 100644 ui/css/utilities/fonts/Roboto/Roboto-ThinItalic.ttf delete mode 100644 ui/css/utilities/fonts/Roboto/RobotoCondensed-Bold.ttf delete mode 100644 ui/css/utilities/fonts/Roboto/RobotoCondensed-BoldItalic.ttf delete mode 100644 ui/css/utilities/fonts/Roboto/RobotoCondensed-Italic.ttf delete mode 100644 ui/css/utilities/fonts/Roboto/RobotoCondensed-Light.ttf delete mode 100644 ui/css/utilities/fonts/Roboto/RobotoCondensed-LightItalic.ttf delete mode 100644 ui/css/utilities/fonts/Roboto/RobotoCondensed-Regular.ttf diff --git a/.storybook/metamask-storybook-theme.js b/.storybook/metamask-storybook-theme.js index ac58fe319ca4..685702767484 100644 --- a/.storybook/metamask-storybook-theme.js +++ b/.storybook/metamask-storybook-theme.js @@ -2,5 +2,5 @@ export const metamaskStorybookTheme = { brandTitle: 'MetaMask Storybook', // Typography - fontBase: 'Euclid Circular B, Roboto, Helvetica, Arial, sans-serif', + fontBase: 'Euclid Circular B, Helvetica, Arial, sans-serif', }; diff --git a/ui/components/ui/text-field/text-field.component.js b/ui/components/ui/text-field/text-field.component.js index a7637e76a729..6ed0a9bff6fb 100644 --- a/ui/components/ui/text-field/text-field.component.js +++ b/ui/components/ui/text-field/text-field.component.js @@ -19,6 +19,13 @@ const inputLabelBase = { color: 'var(--color-text-default)', }; +const fontFamily = [ + '"Euclid Circular B"', + 'Helvetica', + 'Arial', + 'sans-serif', +].join(', '); + const styles = { materialLabel: { '&$materialFocused': { @@ -60,6 +67,7 @@ const styles = { }, // Non-material styles formLabel: { + fontFamily, '&$formLabelFocused': { color: 'var(--color-text-alternative)', }, @@ -70,6 +78,7 @@ const styles = { formLabelFocused: {}, inputFocused: {}, inputRoot: { + fontFamily, 'label + &': { marginTop: '9px', }, diff --git a/ui/css/design-system/_typography.scss b/ui/css/design-system/_typography.scss index aa2c22d1f0c0..260ace9ae11f 100644 --- a/ui/css/design-system/_typography.scss +++ b/ui/css/design-system/_typography.scss @@ -1,6 +1,6 @@ @use "sass:map"; -$font-family: 'Euclid Circular B', Roboto, Helvetica, Arial, sans-serif; +$font-family: 'Euclid Circular B', Helvetica, Arial, sans-serif; $typography-variants: ( 'h1': 2.5rem, diff --git a/ui/css/utilities/fonts.scss b/ui/css/utilities/fonts.scss index b7754758eaba..a189b49d9a94 100644 --- a/ui/css/utilities/fonts.scss +++ b/ui/css/utilities/fonts.scss @@ -21,48 +21,6 @@ $font-path: './fonts'; $fa-font-path: $fa-font-path ); -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 100; - src: local('Roboto Thin'), local('Roboto-Thin'), url('#{$font-path}/Roboto/Roboto-Thin.ttf') format('truetype'); -} - -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 300; - src: local('Roboto Light'), local('Roboto-Light'), url('#{$font-path}/Roboto/Roboto-Light.ttf') format('truetype'); -} - -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 400; - src: local('Roboto'), local('Roboto-Regular'), url('#{$font-path}/Roboto/Roboto-Regular.ttf') format('truetype'); -} - -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 500; - src: local('Roboto Medium'), local('Roboto-Medium'), url('#{$font-path}/Roboto/Roboto-Medium.ttf') format('truetype'); -} - -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 700; - src: local('Roboto Bold'), local('Roboto-Bold'), url('#{$font-path}/Roboto/Roboto-Bold.ttf') format('truetype'); -} - -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 900; - src: local('Roboto Black'), local('Roboto-Black'), url('#{$font-path}/Roboto/Roboto-Black.ttf') format('truetype'); -} - @font-face { font-family: 'Euclid Circular B'; font-style: normal; diff --git a/ui/css/utilities/fonts/Roboto/Roboto-Black.ttf b/ui/css/utilities/fonts/Roboto/Roboto-Black.ttf deleted file mode 100644 index 71f01ac2b216d59547ab51d15c031bf64c671738..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 142472 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/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�mD+ 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 diff --git a/ui/css/utilities/fonts/Roboto/Roboto-Bold.ttf b/ui/css/utilities/fonts/Roboto/Roboto-Bold.ttf deleted file mode 100644 index aaf374d2cc000c058f434f43c3b53bcaf315e2a0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 135820 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 TYqd&VnqJLHIX9iq_T+y7#;O#c diff --git a/ui/css/utilities/fonts/Roboto/Roboto-BoldItalic.ttf b/ui/css/utilities/fonts/Roboto/Roboto-BoldItalic.ttf deleted file mode 100644 index dcd0f800730ba1a562ce450a8079f77e7500eb3a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 144700 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 diff --git a/ui/css/utilities/fonts/Roboto/Roboto-Italic.ttf b/ui/css/utilities/fonts/Roboto/Roboto-Italic.ttf deleted file mode 100644 index f382c6874359c1e98bdc2a2ecd1d141e8f1cc15e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 148540 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 B*%JT& diff --git a/ui/css/utilities/fonts/Roboto/Roboto-Light.ttf b/ui/css/utilities/fonts/Roboto/Roboto-Light.ttf deleted file mode 100644 index 664e1b2f9dbafbf6280305123d2df7fa0c66cee9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 140276 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 diff --git a/ui/css/utilities/fonts/Roboto/Roboto-LightItalic.ttf b/ui/css/utilities/fonts/Roboto/Roboto-LightItalic.ttf deleted file mode 100644 index b8f52963716da01c0ddfaa564aecc1bd2cce9d00..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 145932 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%0ASr-(6zF~G?n0X5UOlg@nL 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 DtJNnc diff --git a/ui/css/utilities/fonts/Roboto/Roboto-Medium.ttf b/ui/css/utilities/fonts/Roboto/Roboto-Medium.ttf deleted file mode 100644 index aa00de0ef929483ea17fbe5f3fef66de45ed724b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 137308 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 diff --git a/ui/css/utilities/fonts/Roboto/Roboto-MediumItalic.ttf b/ui/css/utilities/fonts/Roboto/Roboto-MediumItalic.ttf deleted file mode 100644 index 67e25f0197465f051496ad1e7ccd175402228527..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 147876 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

)N~QJd5S4s&flYMzzDupd-> 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 z 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 diff --git a/ui/css/utilities/fonts/Roboto/Roboto-ThinItalic.ttf b/ui/css/utilities/fonts/Roboto/Roboto-ThinItalic.ttf deleted file mode 100644 index 63e9f97186f8ba7703e019dd0bd29f3c875d60fc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 132376 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 E3RVjh_3^^}%MI`#wIF{g*4XL3;$vk;omBxMFH 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�wMpd(vy)n5 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

lxY7sTs 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 p60_h=B@Zs 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 z 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 Iq-}TpA2k&yXaE2J diff --git a/ui/pages/swaps/fee-card/index.scss b/ui/pages/swaps/fee-card/index.scss index f4e88a7d2281..991b4030beb4 100644 --- a/ui/pages/swaps/fee-card/index.scss +++ b/ui/pages/swaps/fee-card/index.scss @@ -207,11 +207,6 @@ &__bold { font-weight: bold; } - - &__tilde { - font-family: Roboto, Helvetica, Arial, sans-serif; - margin-right: -3.5px; - } } .info-tooltip { From 6f5862adf35f4af942ce565ed666d0710f01d5b7 Mon Sep 17 00:00:00 2001 From: Jyoti Puri Date: Thu, 19 Sep 2024 20:53:25 +0530 Subject: [PATCH 23/61] fix: re-designed confirmation storybooks (#27281) --- .../signatures/personal-sign.stories.tsx | 30 ++++++------- .../sign-typed-data-v3-or-v4.stories.tsx | 43 ++++++++++--------- .../signatures/sign-typed-data.stories.tsx | 17 ++++---- .../contract-interaction.stories.tsx | 10 ++++- .../confirmations/confirm/stories/utils.tsx | 24 +++++------ 5 files changed, 67 insertions(+), 57 deletions(-) diff --git a/ui/pages/confirmations/confirm/stories/signatures/personal-sign.stories.tsx b/ui/pages/confirmations/confirm/stories/signatures/personal-sign.stories.tsx index 1bffc1e34b3e..a0f278ec4266 100644 --- a/ui/pages/confirmations/confirm/stories/signatures/personal-sign.stories.tsx +++ b/ui/pages/confirmations/confirm/stories/signatures/personal-sign.stories.tsx @@ -1,10 +1,14 @@ -import ConfirmPage from '../../confirm' +import { + getMockPersonalSignConfirmState, + getMockPersonalSignConfirmStateForRequest, +} from '../../../../../../test/data/confirmations/helper'; +import ConfirmPage from '../../confirm'; import { ARG_TYPES_SIGNATURE, CONFIRM_PAGE_DECORATOR, - SignatureStoryTemplate + ConfirmStoryTemplate, } from '../utils'; -import { signatureRequestSIWE, unapprovedPersonalSignMsg } from '../../../../../../test/data/confirmations/personal_sign'; +import { signatureRequestSIWE } from '../../../../../../test/data/confirmations/personal_sign'; /** * The `` that's displayed when the current confirmation is a `personal_sign` signature. @@ -16,22 +20,18 @@ export default { argTypes: ARG_TYPES_SIGNATURE, }; -export const DefaultStory = (args) => { - return SignatureStoryTemplate(args, unapprovedPersonalSignMsg); -} -DefaultStory.storyName = 'Default'; -DefaultStory.args = { - msgParams: { ...unapprovedPersonalSignMsg.msgParams }, +export const DefaultStory = () => { + return ConfirmStoryTemplate(getMockPersonalSignConfirmState()); }; +DefaultStory.storyName = 'Default'; /** * The `` that's displayed when the current confirmation is a `personal_sign` signature * that parses as a valid Sign-in-With-Ethereum (SIWE)(EIP-4361) signature. */ -export const SignInWithEthereumStory = (args) => { - return SignatureStoryTemplate(args, signatureRequestSIWE); -} +export const SignInWithEthereumStory = () => { + return ConfirmStoryTemplate( + getMockPersonalSignConfirmStateForRequest(signatureRequestSIWE), + ); +}; SignInWithEthereumStory.storyName = 'Sign-in With Ethereum (SIWE)'; -SignInWithEthereumStory.args = { - msgParams: { ...signatureRequestSIWE.msgParams }, -}; \ No newline at end of file diff --git a/ui/pages/confirmations/confirm/stories/signatures/sign-typed-data-v3-or-v4.stories.tsx b/ui/pages/confirmations/confirm/stories/signatures/sign-typed-data-v3-or-v4.stories.tsx index 80c86a41137c..36f5c6cec8b6 100644 --- a/ui/pages/confirmations/confirm/stories/signatures/sign-typed-data-v3-or-v4.stories.tsx +++ b/ui/pages/confirmations/confirm/stories/signatures/sign-typed-data-v3-or-v4.stories.tsx @@ -1,10 +1,18 @@ -import ConfirmPage from '../../confirm' +import { + getMockTypedSignConfirmState, + getMockTypedSignConfirmStateForRequest, +} from '../../../../../../test/data/confirmations/helper'; +import ConfirmPage from '../../confirm'; import { ARG_TYPES_SIGNATURE, CONFIRM_PAGE_DECORATOR, - SignatureStoryTemplate + ConfirmStoryTemplate, } from '../utils'; -import { permitSignatureMsg, unapprovedTypedSignMsgV3, unapprovedTypedSignMsgV4 } from '../../../../../../test/data/confirmations/typed_sign'; +import { + permitSignatureMsg, + unapprovedTypedSignMsgV3, + unapprovedTypedSignMsgV4, +} from '../../../../../../test/data/confirmations/typed_sign'; /** * The `` that's displayed when the current confirmation is either a version @@ -21,32 +29,27 @@ export default { * The `` that's displayed when the current confirmation is either a * "V3" or "V4" `eth_signTypedData` signature that parses as a valid permit signature. */ -export const PermitStory = (args) => { - return SignatureStoryTemplate(args, permitSignatureMsg); +export const PermitStory = () => { + return ConfirmStoryTemplate( + getMockTypedSignConfirmStateForRequest(permitSignatureMsg), + ); }; PermitStory.storyName = 'Permit'; -PermitStory.args = { - msgParams: { ...permitSignatureMsg.msgParams }, -}; /** * The `` that's displayed when the current confirmation is a "V3" `eth_signTypedData` signature. */ -export const V3Story = (args) => { - return SignatureStoryTemplate(args, unapprovedTypedSignMsgV4); -} -V3Story.storyName = 'V3'; -V3Story.args = { - msgParams: { ...unapprovedTypedSignMsgV3.msgParams }, +export const V3Story = () => { + return ConfirmStoryTemplate( + getMockTypedSignConfirmStateForRequest(unapprovedTypedSignMsgV3), + ); }; +V3Story.storyName = 'V3'; /** * The `` that's displayed when the current confirmation is a "V4" `eth_signTypedData` signature. */ -export const DefaultStory = (args) => { - return SignatureStoryTemplate(args, unapprovedTypedSignMsgV4); -} -DefaultStory.storyName = 'V4'; -DefaultStory.args = { - msgParams: { ...unapprovedTypedSignMsgV4.msgParams }, +export const DefaultStory = () => { + return ConfirmStoryTemplate(getMockTypedSignConfirmState()); }; +DefaultStory.storyName = 'V4'; diff --git a/ui/pages/confirmations/confirm/stories/signatures/sign-typed-data.stories.tsx b/ui/pages/confirmations/confirm/stories/signatures/sign-typed-data.stories.tsx index 89c46695f60c..e11db79af928 100644 --- a/ui/pages/confirmations/confirm/stories/signatures/sign-typed-data.stories.tsx +++ b/ui/pages/confirmations/confirm/stories/signatures/sign-typed-data.stories.tsx @@ -1,8 +1,9 @@ -import ConfirmPage from '../../confirm' +import { getMockTypedSignConfirmStateForRequest } from '../../../../../../test/data/confirmations/helper'; +import ConfirmPage from '../../confirm'; import { ARG_TYPES_SIGNATURE, CONFIRM_PAGE_DECORATOR, - SignatureStoryTemplate + ConfirmStoryTemplate, } from '../utils'; import { unapprovedTypedSignMsgV1 } from '../../../../../../test/data/confirmations/typed_sign'; @@ -14,12 +15,12 @@ export default { component: ConfirmPage, decorators: CONFIRM_PAGE_DECORATOR, argTypes: ARG_TYPES_SIGNATURE, - args: { - msgParams: { ...unapprovedTypedSignMsgV1.msgParams }, - }, }; export const DefaultStory = (args) => { - return SignatureStoryTemplate(args, unapprovedTypedSignMsgV1); -} -DefaultStory.storyName = 'Default'; \ No newline at end of file + return ConfirmStoryTemplate( + getMockTypedSignConfirmStateForRequest(unapprovedTypedSignMsgV1), + ); +}; + +DefaultStory.storyName = 'Default'; diff --git a/ui/pages/confirmations/confirm/stories/transactions/contract-interaction.stories.tsx b/ui/pages/confirmations/confirm/stories/transactions/contract-interaction.stories.tsx index 278501e1baf6..33a8c2e67f0b 100644 --- a/ui/pages/confirmations/confirm/stories/transactions/contract-interaction.stories.tsx +++ b/ui/pages/confirmations/confirm/stories/transactions/contract-interaction.stories.tsx @@ -1,3 +1,4 @@ +import { getMockConfirmStateForTransaction } from '../../../../../../test/data/confirmations/helper'; import ConfirmPage from '../../confirm'; import { CONFIRM_PAGE_DECORATOR, ConfirmStoryTemplate } from '../utils'; import { @@ -19,9 +20,10 @@ export const DefaultStory = () => { const confirmation = genUnapprovedContractInteractionConfirmation({ address: FROM, txData: DEPOSIT_METHOD_DATA, + chainId: '0x5', }); - return ConfirmStoryTemplate(confirmation); + return ConfirmStoryTemplate(getMockConfirmStateForTransaction(confirmation)); }; DefaultStory.storyName = 'Default'; @@ -31,11 +33,13 @@ export const UserOperationStory = () => { ...genUnapprovedContractInteractionConfirmation({ address: FROM, txData: DEPOSIT_METHOD_DATA, + chainId: '0x5', }), isUserOperation: true, }; - return ConfirmStoryTemplate(confirmation, { + const confirmState = getMockConfirmStateForTransaction(confirmation, { + metamask: {}, preferences: { ...mockState.metamask.preferences, petnamesEnabled: true, @@ -48,6 +52,8 @@ export const UserOperationStory = () => { }, }, }); + + return ConfirmStoryTemplate(confirmState); }; UserOperationStory.storyName = 'User Operation'; diff --git a/ui/pages/confirmations/confirm/stories/utils.tsx b/ui/pages/confirmations/confirm/stories/utils.tsx index d6c94ade9c0e..dd194d574109 100644 --- a/ui/pages/confirmations/confirm/stories/utils.tsx +++ b/ui/pages/confirmations/confirm/stories/utils.tsx @@ -1,11 +1,8 @@ import React from 'react'; import { Provider } from 'react-redux'; import { MemoryRouter, Route } from 'react-router-dom'; -import { cloneDeep } from 'lodash'; -import mockState from '../../../../../test/data/mock-state.json'; import configureStore from '../../../../store/store'; import { ConfirmContextProvider } from '../../context/confirm'; -import { SignatureRequestType } from '../../types/confirm'; import ConfirmPage from '../confirm'; export const CONFIRM_PAGE_DECORATOR = [ @@ -30,9 +27,9 @@ export function ConfirmStoryTemplate( metamaskState: any = {}, ): JSX.Element { const store = configureStore({ + ...metamaskState, metamask: { - ...mockState.metamask, - ...metamaskState, + ...metamaskState.metamask, useTransactionSimulations: true, }, }); @@ -42,7 +39,13 @@ export function ConfirmStoryTemplate( {/* Adding the MemoryRouter and Route is a workaround to bypass a 404 error in storybook that is caused when the 'ui/pages/confirmations/hooks/syncConfirmPath.ts' hook calls history.replace. To avoid history.replace, we can provide a param id. */} - + } /> @@ -50,11 +53,8 @@ export function ConfirmStoryTemplate( } export function SignatureStoryTemplate( - args: { msgParams: SignatureRequestType['msgParams'] }, - confirmation: SignatureRequestType, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + metamaskState: any = {}, ): JSX.Element { - const mockConfirmation = cloneDeep(confirmation) as SignatureRequestType; - mockConfirmation.msgParams = args.msgParams; - - return ConfirmStoryTemplate(mockConfirmation); + return ConfirmStoryTemplate(metamaskState); } From 4a55b5345239d7377bf8689e7b400ba926a9446f Mon Sep 17 00:00:00 2001 From: Norbert Elter <72046715+itsyoboieltr@users.noreply.github.com> Date: Thu, 19 Sep 2024 19:31:32 +0400 Subject: [PATCH 24/61] feat: quality gate test coverage fix (#27282) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## **Description** [![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/27282?quickstart=1) This PR fixes SonarCloud quality gate test coverage. ## **Related issues** Fixes: https://github.com/MetaMask/MetaMask-planning/issues/2962 ## **Manual testing steps** 1. Test coverage is correctly reported, local coverage matches SonarCloud numbers. ## **Screenshots/Recordings** Not applicable ## **Pre-merge author checklist** - [x] I've followed [MetaMask Contributor Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Extension Coding Standards](https://github.com/MetaMask/metamask-extension/blob/develop/.github/guidelines/CODING_GUIDELINES.md). - [x] I've completed the PR template to the best of my ability - [x] I’ve included tests if applicable - [x] I’ve documented my code using [JSDoc](https://jsdoc.app/) format if applicable - [x] I’ve applied the right labels on the PR (see [labeling guidelines](https://github.com/MetaMask/metamask-extension/blob/develop/.github/guidelines/LABELING_GUIDELINES.md)). Not required for external contributors. ## **Pre-merge reviewer checklist** - [ ] I've manually tested the PR (e.g. pull and build branch, run the app, test code being changed). - [ ] I confirm that this PR addresses all acceptance criteria described in the ticket it closes and includes the necessary testing evidence such as recordings and or screenshots. --- jest.config.js | 8 +++++--- sonar-project.properties | 4 ++-- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/jest.config.js b/jest.config.js index dbfb0522cff7..be304e027ace 100644 --- a/jest.config.js +++ b/jest.config.js @@ -1,10 +1,12 @@ module.exports = { collectCoverageFrom: [ - '/app/scripts/**/*.(js|ts|tsx)', + '/app/**/*.(js|ts|tsx)', + '/development/**/*.(js|ts|tsx)', + '/offscreen/**/*.(js|ts|tsx)', '/shared/**/*.(js|ts|tsx)', + '/test/**/*.(js|ts|tsx)', + '/types/**/*.(js|ts|tsx)', '/ui/**/*.(js|ts|tsx)', - '/development/build/transforms/**/*.js', - '/test/unit-global/**/*.test.(js|ts|tsx)', ], coverageDirectory: './coverage/unit', coveragePathIgnorePatterns: ['.stories.*', '.snap'], diff --git a/sonar-project.properties b/sonar-project.properties index 3b8ff8dfba9f..5b00806c662f 100644 --- a/sonar-project.properties +++ b/sonar-project.properties @@ -2,11 +2,11 @@ sonar.projectKey=metamask-extension sonar.organization=consensys # Source -sonar.sources=app,development,offscreen,shared,types,ui +sonar.sources=app,development,offscreen,shared,test,types,ui sonar.exclusions=**/*.test.**,**/*.spec.**,app/images # Tests -sonar.tests=app,test,development,offscreen,shared,types,ui +sonar.tests=app,development,offscreen,shared,test,types,ui sonar.test.inclusions=**/*.test.**,**/*.spec.** sonar.javascript.lcov.reportPaths=coverage/lcov.info From 178c95ba21f80c9f44a207276a854759a65adc61 Mon Sep 17 00:00:00 2001 From: jiexi Date: Thu, 19 Sep 2024 10:58:36 -0700 Subject: [PATCH 25/61] feat: use networkClientId to resolve chainId in PPOM Middleware (#27263) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## **Description** Updates the PPOM Middleware to use the chainId for the dapp selected network instead of the globally selected network when processing a request [![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/27263?quickstart=1) ## **Related issues** Fixes: ## **Manual testing steps** 1. Go to this page... 2. 3. ## **Screenshots/Recordings** ### **Before** ### **After** ## **Pre-merge author checklist** - [ ] I've followed [MetaMask Contributor Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Extension Coding Standards](https://github.com/MetaMask/metamask-extension/blob/develop/.github/guidelines/CODING_GUIDELINES.md). - [ ] I've completed the PR template to the best of my ability - [ ] I’ve included tests if applicable - [ ] I’ve documented my code using [JSDoc](https://jsdoc.app/) format if applicable - [ ] I’ve applied the right labels on the PR (see [labeling guidelines](https://github.com/MetaMask/metamask-extension/blob/develop/.github/guidelines/LABELING_GUIDELINES.md)). Not required for external contributors. ## **Pre-merge reviewer checklist** - [ ] I've manually tested the PR (e.g. pull and build branch, run the app, test code being changed). - [ ] I confirm that this PR addresses all acceptance criteria described in the ticket it closes and includes the necessary testing evidence such as recordings and or screenshots. --- app/scripts/lib/ppom/ppom-middleware.test.ts | 112 ++++++++++--------- app/scripts/lib/ppom/ppom-middleware.ts | 17 ++- app/scripts/metamask-controller.js | 1 + 3 files changed, 72 insertions(+), 58 deletions(-) diff --git a/app/scripts/lib/ppom/ppom-middleware.test.ts b/app/scripts/lib/ppom/ppom-middleware.test.ts index a0188a96ae8a..f82d029aac51 100644 --- a/app/scripts/lib/ppom/ppom-middleware.test.ts +++ b/app/scripts/lib/ppom/ppom-middleware.test.ts @@ -8,7 +8,6 @@ import { BlockaidResultType, } from '../../../../shared/constants/security-provider'; import { flushPromises } from '../../../../test/lib/timer-helpers'; -import { mockNetworkState } from '../../../../test/stub/networks'; import { createPPOMMiddleware, PPOMMiddlewareRequest } from './ppom-middleware'; import { generateSecurityAlertId, @@ -34,6 +33,8 @@ const REQUEST_MOCK = { params: [], id: '', jsonrpc: '2.0' as const, + origin: 'test.com', + networkClientId: 'networkClientId', }; const createMiddleware = ( @@ -41,15 +42,9 @@ const createMiddleware = ( chainId?: Hex; error?: Error; securityAlertsEnabled?: boolean; - // TODO: Replace `any` with type - // eslint-disable-next-line @typescript-eslint/no-explicit-any - updateSecurityAlertResponse?: any; - } = { - updateSecurityAlertResponse: () => undefined, - }, + } = {}, ) => { - const { chainId, error, securityAlertsEnabled, updateSecurityAlertResponse } = - options; + const { chainId, error, securityAlertsEnabled } = options; const ppomController = {}; @@ -68,7 +63,9 @@ const createMiddleware = ( } const networkController = { - state: mockNetworkState({ chainId: chainId || CHAIN_IDS.MAINNET }), + getNetworkConfigurationByNetworkClientId: jest + .fn() + .mockReturnValue({ chainId: chainId || CHAIN_IDS.MAINNET }), }; const appStateController = { @@ -79,7 +76,9 @@ const createMiddleware = ( listAccounts: () => [{ address: INTERNAL_ACCOUNT_ADDRESS }], }; - return createPPOMMiddleware( + const updateSecurityAlertResponse = jest.fn(); + + const middleware = createPPOMMiddleware( // TODO: Replace `any` with type // eslint-disable-next-line @typescript-eslint/no-explicit-any ppomController as any, @@ -96,6 +95,16 @@ const createMiddleware = ( accountsController as any, updateSecurityAlertResponse, ); + + return { + middleware, + ppomController, + preferenceController, + networkController, + appStateController, + accountsController, + updateSecurityAlertResponse, + }; }; describe('PPOMMiddleware', () => { @@ -121,12 +130,29 @@ describe('PPOMMiddleware', () => { }; }); - it('updates alert response after validating request', async () => { - const updateSecurityAlertResponse = jest.fn(); + it('gets the network configuration for the request networkClientId', async () => { + const { middleware, networkController } = createMiddleware(); - const middlewareFunction = createMiddleware({ - updateSecurityAlertResponse, - }); + const req = { + ...REQUEST_MOCK, + method: 'eth_sendTransaction', + securityAlertResponse: undefined, + }; + + await middleware(req, { ...JsonRpcResponseStruct.TYPE }, () => undefined); + + await flushPromises(); + + expect( + networkController.getNetworkConfigurationByNetworkClientId, + ).toHaveBeenCalledTimes(1); + expect( + networkController.getNetworkConfigurationByNetworkClientId, + ).toHaveBeenCalledWith('networkClientId'); + }); + + it('updates alert response after validating request', async () => { + const { middleware, updateSecurityAlertResponse } = createMiddleware(); const req = { ...REQUEST_MOCK, @@ -134,11 +160,7 @@ describe('PPOMMiddleware', () => { securityAlertResponse: undefined, }; - await middlewareFunction( - req, - { ...JsonRpcResponseStruct.TYPE }, - () => undefined, - ); + await middleware(req, { ...JsonRpcResponseStruct.TYPE }, () => undefined); await flushPromises(); @@ -151,7 +173,7 @@ describe('PPOMMiddleware', () => { }); it('adds loading response to confirmation requests while validation is in progress', async () => { - const middlewareFunction = createMiddleware(); + const { middleware } = createMiddleware(); const req: PPOMMiddlewareRequest<(string | { to: string })[]> = { ...REQUEST_MOCK, @@ -159,11 +181,7 @@ describe('PPOMMiddleware', () => { securityAlertResponse: undefined, }; - await middlewareFunction( - req, - { ...JsonRpcResponseStruct.TYPE }, - () => undefined, - ); + await middleware(req, { ...JsonRpcResponseStruct.TYPE }, () => undefined); expect(req.securityAlertResponse?.reason).toBe(BlockaidReason.inProgress); expect(req.securityAlertResponse?.result_type).toBe( @@ -172,7 +190,7 @@ describe('PPOMMiddleware', () => { }); it('does not do validation if the user has not enabled the preference', async () => { - const middlewareFunction = createMiddleware({ + const { middleware } = createMiddleware({ securityAlertsEnabled: false, }); @@ -183,7 +201,7 @@ describe('PPOMMiddleware', () => { }; // @ts-expect-error Passing in invalid input for testing purposes - await middlewareFunction(req, undefined, () => undefined); + await middleware(req, undefined, () => undefined); expect(req.securityAlertResponse).toBeUndefined(); expect(validateRequestWithPPOM).not.toHaveBeenCalled(); @@ -191,7 +209,7 @@ describe('PPOMMiddleware', () => { it('does not do validation if user is not on a supported network', async () => { isChainSupportedMock.mockResolvedValue(false); - const middlewareFunction = createMiddleware({ + const { middleware } = createMiddleware({ chainId: '0x2', }); @@ -201,18 +219,14 @@ describe('PPOMMiddleware', () => { securityAlertResponse: undefined, }; - await middlewareFunction( - req, - { ...JsonRpcResponseStruct.TYPE }, - () => undefined, - ); + await middleware(req, { ...JsonRpcResponseStruct.TYPE }, () => undefined); expect(req.securityAlertResponse).toBeUndefined(); expect(validateRequestWithPPOM).not.toHaveBeenCalled(); }); it('does not do validation when request is not for confirmation method', async () => { - const middlewareFunction = createMiddleware(); + const { middleware } = createMiddleware(); const req = { ...REQUEST_MOCK, @@ -220,18 +234,14 @@ describe('PPOMMiddleware', () => { securityAlertResponse: undefined, }; - await middlewareFunction( - req, - { ...JsonRpcResponseStruct.TYPE }, - () => undefined, - ); + await middleware(req, { ...JsonRpcResponseStruct.TYPE }, () => undefined); expect(req.securityAlertResponse).toBeUndefined(); expect(validateRequestWithPPOM).not.toHaveBeenCalled(); }); it('does not do validation when request is send to users own account', async () => { - const middlewareFunction = createMiddleware(); + const { middleware } = createMiddleware(); const req = { ...REQUEST_MOCK, @@ -240,18 +250,14 @@ describe('PPOMMiddleware', () => { securityAlertResponse: undefined, }; - await middlewareFunction( - req, - { ...JsonRpcResponseStruct.TYPE }, - () => undefined, - ); + await middleware(req, { ...JsonRpcResponseStruct.TYPE }, () => undefined); expect(req.securityAlertResponse).toBeUndefined(); expect(validateRequestWithPPOM).not.toHaveBeenCalled(); }); it('does not do validation for SIWE signature', async () => { - const middlewareFunction = createMiddleware({ + const { middleware } = createMiddleware({ securityAlertsEnabled: true, }); @@ -290,17 +296,17 @@ describe('PPOMMiddleware', () => { }); // @ts-expect-error Passing invalid input for testing purposes - await middlewareFunction(req, undefined, () => undefined); + await middleware(req, undefined, () => undefined); expect(req.securityAlertResponse).toBeUndefined(); expect(validateRequestWithPPOM).not.toHaveBeenCalled(); }); it('calls next method', async () => { - const middlewareFunction = createMiddleware(); + const { middleware } = createMiddleware(); const nextMock = jest.fn(); - await middlewareFunction( + await middleware( { ...REQUEST_MOCK, method: 'eth_sendTransaction' }, { ...JsonRpcResponseStruct.TYPE }, nextMock, @@ -315,7 +321,7 @@ describe('PPOMMiddleware', () => { const nextMock = jest.fn(); - const middlewareFunction = createMiddleware({ error }); + const { middleware } = createMiddleware({ error }); const req = { ...REQUEST_MOCK, @@ -323,7 +329,7 @@ describe('PPOMMiddleware', () => { securityAlertResponse: undefined, }; - await middlewareFunction(req, { ...JsonRpcResponseStruct.TYPE }, nextMock); + await middleware(req, { ...JsonRpcResponseStruct.TYPE }, nextMock); expect(req.securityAlertResponse).toStrictEqual( SECURITY_ALERT_RESPONSE_MOCK, diff --git a/app/scripts/lib/ppom/ppom-middleware.ts b/app/scripts/lib/ppom/ppom-middleware.ts index d623d4868af5..5b9107337a05 100644 --- a/app/scripts/lib/ppom/ppom-middleware.ts +++ b/app/scripts/lib/ppom/ppom-middleware.ts @@ -1,6 +1,9 @@ import { AccountsController } from '@metamask/accounts-controller'; import { PPOMController } from '@metamask/ppom-validator'; -import { NetworkController } from '@metamask/network-controller'; +import { + NetworkClientId, + NetworkController, +} from '@metamask/network-controller'; import { Json, JsonRpcParams, @@ -14,7 +17,6 @@ import { SIGNING_METHODS } from '../../../../shared/constants/transaction'; import PreferencesController from '../../controllers/preferences-controller'; import { AppStateController } from '../../controllers/app-state'; import { LOADING_SECURITY_ALERT_RESPONSE } from '../../../../shared/constants/security-provider'; -import { getProviderConfig } from '../../../../ui/ducks/metamask/metamask'; import { trace, TraceContext, TraceName } from '../../../../shared/lib/trace'; import { generateSecurityAlertId, @@ -33,6 +35,7 @@ const CONFIRMATION_METHODS = Object.freeze([ export type PPOMMiddlewareRequest< Params extends JsonRpcParams = JsonRpcParams, > = Required> & { + networkClientId: NetworkClientId; securityAlertResponse?: SecurityAlertResponse | undefined; traceContext?: TraceContext; }; @@ -78,9 +81,13 @@ export function createPPOMMiddleware< const securityAlertsEnabled = preferencesController.store.getState()?.securityAlertsEnabled; - const { chainId } = getProviderConfig({ - metamask: networkController.state, - }); + // This will always exist as the SelectedNetworkMiddleware + // adds networkClientId to the request before this middleware runs + const { chainId } = + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + networkController.getNetworkConfigurationByNetworkClientId( + req.networkClientId, + )!; const isSupportedChain = await isChainSupported(chainId); if ( diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js index 9eff0ed6d2be..c5fd4b834aed 100644 --- a/app/scripts/metamask-controller.js +++ b/app/scripts/metamask-controller.js @@ -5530,6 +5530,7 @@ export default class MetamaskController extends EventEmitter { engine.push(createTracingMiddleware()); + // PPOMMiddleware come after the SelectedNetworkMiddleware engine.push( createPPOMMiddleware( this.ppomController, From 0fcc063a7d3af345c2c432cfe3d396cb243c0681 Mon Sep 17 00:00:00 2001 From: Dan J Miller Date: Thu, 19 Sep 2024 15:33:07 -0230 Subject: [PATCH 26/61] chore: Make sonarcloud failures non-blocking (#27289) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## **Description** Sonarcloud is failing some PRs based on pre-existing issues present in files that a PR edits. We will make it non-blocking until that is resolved [![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/27289?quickstart=1) ## **Related issues** Fixes: ## **Manual testing steps** 1. Go to this page... 2. 3. ## **Screenshots/Recordings** ### **Before** ### **After** ## **Pre-merge author checklist** - [ ] I've followed [MetaMask Contributor Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Extension Coding Standards](https://github.com/MetaMask/metamask-extension/blob/develop/.github/guidelines/CODING_GUIDELINES.md). - [ ] I've completed the PR template to the best of my ability - [ ] I’ve included tests if applicable - [ ] I’ve documented my code using [JSDoc](https://jsdoc.app/) format if applicable - [ ] I’ve applied the right labels on the PR (see [labeling guidelines](https://github.com/MetaMask/metamask-extension/blob/develop/.github/guidelines/LABELING_GUIDELINES.md)). Not required for external contributors. ## **Pre-merge reviewer checklist** - [ ] I've manually tested the PR (e.g. pull and build branch, run the app, test code being changed). - [ ] I confirm that this PR addresses all acceptance criteria described in the ticket it closes and includes the necessary testing evidence such as recordings and or screenshots. --- sonar-project.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sonar-project.properties b/sonar-project.properties index 5b00806c662f..1475b64f4acb 100644 --- a/sonar-project.properties +++ b/sonar-project.properties @@ -12,4 +12,4 @@ sonar.test.inclusions=**/*.test.**,**/*.spec.** sonar.javascript.lcov.reportPaths=coverage/lcov.info # Fail CI job if quality gate failures -sonar.qualitygate.wait=true +sonar.qualitygate.wait=false From f7eed2a26a852c1eeffb539d8bf76a3981a0ce60 Mon Sep 17 00:00:00 2001 From: Matteo Scurati Date: Thu, 19 Sep 2024 20:55:36 +0200 Subject: [PATCH 27/61] fix: :sparkles: move notifications activated event (#27290) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## **Description** This PR moves a simple event before an async function to ensure that the event is executed properly. [![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/27290?quickstart=1) ## **Related issues** N/A ## **Manual testing steps** N/A ## **Screenshots/Recordings** N/A ### **Before** N/A ### **After** N/A ## **Pre-merge author checklist** - [x] I've followed [MetaMask Contributor Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Extension Coding Standards](https://github.com/MetaMask/metamask-extension/blob/develop/.github/guidelines/CODING_GUIDELINES.md). - [x] I've completed the PR template to the best of my ability - [x] I’ve included tests if applicable - [x] I’ve documented my code using [JSDoc](https://jsdoc.app/) format if applicable - [x] I’ve applied the right labels on the PR (see [labeling guidelines](https://github.com/MetaMask/metamask-extension/blob/develop/.github/guidelines/LABELING_GUIDELINES.md)). Not required for external contributors. ## **Pre-merge reviewer checklist** - [x] I've manually tested the PR (e.g. pull and build branch, run the app, test code being changed). - [x] I confirm that this PR addresses all acceptance criteria described in the ticket it closes and includes the necessary testing evidence such as recordings and or screenshots. --- .../turn-on-metamask-notifications.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/components/app/modals/turn-on-metamask-notifications/turn-on-metamask-notifications.tsx b/ui/components/app/modals/turn-on-metamask-notifications/turn-on-metamask-notifications.tsx index de3da35fa841..b340ee8c5e60 100644 --- a/ui/components/app/modals/turn-on-metamask-notifications/turn-on-metamask-notifications.tsx +++ b/ui/components/app/modals/turn-on-metamask-notifications/turn-on-metamask-notifications.tsx @@ -59,7 +59,6 @@ export default function TurnOnMetamaskNotifications() { const handleTurnOnNotifications = async () => { setIsLoading(true); - await createNotifications(); trackEvent({ category: MetaMetricsEventCategory.NotificationsActivationFlow, event: MetaMetricsEventName.NotificationsActivated, @@ -68,6 +67,7 @@ export default function TurnOnMetamaskNotifications() { action_type: 'activated', }, }); + await createNotifications(); }; const handleHideModal = () => { From 9611708651f29e4651e63910727ef76909629ffc Mon Sep 17 00:00:00 2001 From: Harika <153644847+hjetpoluru@users.noreply.github.com> Date: Thu, 19 Sep 2024 20:35:43 -0400 Subject: [PATCH 28/61] chore: Changed the order of the report (#27260) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## **Description** I noticed that the test scenario successfully passed but immediately showed as a failure due to the snapshot check that happens after the console statement. This could be causing confusion, so with the suggestion by @HowardBraham changed the order to report success at the end. [![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/27260?quickstart=1) ## **Related issues** Fixes: ## **Manual testing steps** Check the order of the report. ## **Screenshots/Recordings** ### **Before** Screenshot 2024-09-18 at 1 46 41 PM ### **After** Screenshot 2024-09-18 at 2 04 10 PM ## **Pre-merge author checklist** - [ ] I've followed [MetaMask Contributor Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Extension Coding Standards](https://github.com/MetaMask/metamask-extension/blob/develop/.github/guidelines/CODING_GUIDELINES.md). - [ ] I've completed the PR template to the best of my ability - [ ] I’ve included tests if applicable - [ ] I’ve documented my code using [JSDoc](https://jsdoc.app/) format if applicable - [ ] I’ve applied the right labels on the PR (see [labeling guidelines](https://github.com/MetaMask/metamask-extension/blob/develop/.github/guidelines/LABELING_GUIDELINES.md)). Not required for external contributors. ## **Pre-merge reviewer checklist** - [ ] I've manually tested the PR (e.g. pull and build branch, run the app, test code being changed). - [ ] I confirm that this PR addresses all acceptance criteria described in the ticket it closes and includes the necessary testing evidence such as recordings and or screenshots. --- test/e2e/helpers.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/e2e/helpers.js b/test/e2e/helpers.js index 15fc5eff1ade..cf337b84e8f5 100644 --- a/test/e2e/helpers.js +++ b/test/e2e/helpers.js @@ -229,10 +229,6 @@ async function withFixtures(options, testSuite) { throw new Error(errorsAndExceptions); } - // At this point the suite has executed successfully, so we can log out a success message - // (Note: a Chrome browser error will unfortunately pop up after this success message) - console.log(`\nSuccess on testcase: '${title}'\n`); - // Evaluate whether any new hosts received network requests during E2E test // suite execution. If so, fail the test unless the // --update-privacy-snapshot was specified. In that case, update the @@ -271,6 +267,10 @@ async function withFixtures(options, testSuite) { ); } } + + // At this point the suite has executed successfully, so we can log out a success message + // (Note: a Chrome browser error will unfortunately pop up after this success message) + console.log(`\nSuccess on testcase: '${title}'\n`); } catch (error) { failed = true; if (webDriver) { From a1962dcc1aec3091911041ed357a3740a56c61c1 Mon Sep 17 00:00:00 2001 From: "devin-ai-integration[bot]" <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Fri, 20 Sep 2024 09:53:07 +0200 Subject: [PATCH 29/61] test: [POM] create ResetPasswordPage for e2e tests and migrate 2 test files to POM (#27244) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## **Description** This pull request creates the ResetPasswordPage class for the E2E tests page object model and migrates 2 test files in `test/e2e/tests/account` to POM **and** TypeScript, with enhanced log messages. I have placed the test `test/e2e/tests/account/metamask-responsive-ui.spec.js` outside the account folder because these tests don't test account functionality. They are for testing the extension UI in small viewports. [![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/27155?quickstart=1) ## **Related issues** Fixes: #27245 ## **Manual testing steps** Check code readability, make sure tests pass. ## **Screenshots/Recordings** ### **Before** ### **After** ## **Pre-merge author checklist** - [x] I've followed [MetaMask Contributor Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Extension Coding Standards](https://github.com/MetaMask/metamask-extension/blob/develop/.github/guidelines/CODING_GUIDELINES.md). - [x] I've completed the PR template to the best of my ability - [x] I’ve included tests if applicable - [x] I’ve documented my code using [JSDoc](https://jsdoc.app/) format if applicable - [x] I’ve applied the right labels on the PR (see [labeling guidelines](https://github.com/MetaMask/metamask-extension/blob/develop/.github/guidelines/LABELING_GUIDELINES.md)). Not required for external contributors. ## **Pre-merge reviewer checklist** - [x] I've manually tested the PR (e.g. pull and build branch, run the app, test code being changed). - [x] I confirm that this PR addresses all acceptance criteria described in the ticket it closes and includes the necessary testing evidence such as recordings and or screenshots. --------- Co-authored-by: devin-ai-integration[bot] <158243242+devin-ai-integration[bot]@users.noreply.github.com> Co-authored-by: Chloe Gao --- test/e2e/accounts/forgot-password.spec.ts | 65 ------------------- .../page-objects/pages/account-list-page.ts | 13 ++++ test/e2e/page-objects/pages/login-page.ts | 11 ++++ .../page-objects/pages/reset-password-page.ts | 53 +++++++++++++++ .../tests/account/account-hide-unhide.spec.ts | 1 + .../tests/account/account-pin-unpin.spec.ts | 2 + .../e2e/tests/account/forgot-password.spec.ts | 42 ++++++++++++ .../tests/account/migrate-old-vault.spec.js | 39 ----------- .../tests/account/migrate-old-vault.spec.ts | 24 +++++++ .../metamask-responsive-ui.spec.js | 0 10 files changed, 146 insertions(+), 104 deletions(-) delete mode 100644 test/e2e/accounts/forgot-password.spec.ts create mode 100644 test/e2e/page-objects/pages/reset-password-page.ts create mode 100644 test/e2e/tests/account/forgot-password.spec.ts delete mode 100644 test/e2e/tests/account/migrate-old-vault.spec.js create mode 100644 test/e2e/tests/account/migrate-old-vault.spec.ts rename test/e2e/tests/{account => responsive-ui}/metamask-responsive-ui.spec.js (100%) diff --git a/test/e2e/accounts/forgot-password.spec.ts b/test/e2e/accounts/forgot-password.spec.ts deleted file mode 100644 index 3bf347fa59cc..000000000000 --- a/test/e2e/accounts/forgot-password.spec.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { Suite } from 'mocha'; -import { unlockWallet, withFixtures, TEST_SEED_PHRASE_TWO } from '../helpers'; -import FixtureBuilder from '../fixture-builder'; -import { Driver } from '../webdriver/driver'; - -const newPassword = 'this is the best password ever'; - -describe('Forgot password', function (this: Suite) { - it('resets password and then unlock wallet with new password', async function () { - await withFixtures( - { - fixtures: new FixtureBuilder().build(), - title: this.test?.fullTitle(), - }, - async ({ driver }: { driver: Driver }) => { - await unlockWallet(driver); - - // Lock Wallet - await driver.waitForSelector( - '[data-testid="account-options-menu-button"]', - ); - await driver.clickElement( - '[data-testid="account-options-menu-button"]', - ); - await driver.clickElement({ - text: 'Lock MetaMask', - tag: 'div', - }); - - // Go to reset password page - await driver.waitForSelector('.unlock-page__link'); - await driver.clickElement({ - text: 'Forgot password?', - tag: 'a', - }); - - // Reset password with a new password - await driver.pasteIntoField( - '[data-testid="import-srp__srp-word-0"]', - TEST_SEED_PHRASE_TWO, - ); - - await driver.fill('#password', newPassword); - await driver.fill('#confirm-password', newPassword); - await driver.press('#confirm-password', driver.Key.ENTER); - - // Lock wallet again - await driver.waitForSelector( - '[data-testid="account-options-menu-button"]', - ); - await driver.clickElement( - '[data-testid="account-options-menu-button"]', - ); - await driver.clickElement({ - text: 'Lock MetaMask', - tag: 'div', - }); - - // log in with new password - await driver.fill('#password', newPassword); - await driver.press('#password', driver.Key.ENTER); - }, - ); - }); -}); diff --git a/test/e2e/page-objects/pages/account-list-page.ts b/test/e2e/page-objects/pages/account-list-page.ts index 8550c092b23c..5ebf7fbc861e 100644 --- a/test/e2e/page-objects/pages/account-list-page.ts +++ b/test/e2e/page-objects/pages/account-list-page.ts @@ -33,6 +33,19 @@ class AccountListPage { '.multichain-account-menu-popover__list--menu-item-hidden-account [data-testid="account-list-item-menu-button"]'; } + async check_pageIsLoaded(): Promise { + try { + await this.driver.waitForMultipleSelectors([ + this.accountListItem, + this.accountOptionsMenuButton, + ]); + } catch (e) { + console.log('Timeout while waiting for account list to be loaded', e); + throw e; + } + console.log('Account list is loaded'); + } + async hideAccount(): Promise { console.log(`Hide account in account list`); await this.driver.clickElement(this.hideUnhideAccountButton); diff --git a/test/e2e/page-objects/pages/login-page.ts b/test/e2e/page-objects/pages/login-page.ts index b96600675040..079e8e091f04 100644 --- a/test/e2e/page-objects/pages/login-page.ts +++ b/test/e2e/page-objects/pages/login-page.ts @@ -9,6 +9,8 @@ class LoginPage { private welcomeBackMessage: object; + private forgotPasswordButton: object; + constructor(driver: Driver) { this.driver = driver; this.passwordInput = '[data-testid="unlock-password"]'; @@ -17,6 +19,10 @@ class LoginPage { css: '[data-testid="unlock-page-title"]', text: 'Welcome back!', }; + this.forgotPasswordButton = { + text: 'Forgot password?', + tag: 'a', + }; } async check_pageIsLoaded(): Promise { @@ -40,6 +46,11 @@ class LoginPage { async clickUnlockButton(): Promise { await this.driver.clickElement(this.unlockButton); } + + async gotoResetPasswordPage(): Promise { + console.log('Navigating to reset password page'); + await this.driver.clickElement(this.forgotPasswordButton); + } } export default LoginPage; diff --git a/test/e2e/page-objects/pages/reset-password-page.ts b/test/e2e/page-objects/pages/reset-password-page.ts new file mode 100644 index 000000000000..fa811f0a85dc --- /dev/null +++ b/test/e2e/page-objects/pages/reset-password-page.ts @@ -0,0 +1,53 @@ +import { Driver } from '../../webdriver/driver'; + +class ResetPasswordPage { + private driver: Driver; + + private seedPhraseInput: string; + + private passwordInput: string; + + private confirmPasswordInput: string; + + private restoreButton: string; + + constructor(driver: Driver) { + this.driver = driver; + this.seedPhraseInput = '[data-testid="import-srp__srp-word-0"]'; + this.passwordInput = '[data-testid="create-vault-password"]'; + this.confirmPasswordInput = '[data-testid="create-vault-confirm-password"]'; + this.restoreButton = '[data-testid="create-new-vault-submit-button"]'; + } + + async check_pageIsLoaded(): Promise { + try { + await this.driver.waitForMultipleSelectors([ + this.passwordInput, + this.confirmPasswordInput, + ]); + } catch (e) { + console.log( + 'Timeout while waiting for reset password page to be loaded', + e, + ); + throw e; + } + console.log('Reset password page is loaded'); + } + + /** + * Resets the password using the provided seed phrase and new password. + * + * @param seedPhrase - The seed phrase to verify account ownership + * @param newPassword - The new password to set for the account + */ + async resetPassword(seedPhrase: string, newPassword: string): Promise { + console.log(`Resetting password with new password: ${newPassword}`); + await this.driver.pasteIntoField(this.seedPhraseInput, seedPhrase); + await this.driver.fill(this.passwordInput, newPassword); + await this.driver.fill(this.confirmPasswordInput, newPassword); + await this.driver.clickElement(this.restoreButton); + } +} + +export default ResetPasswordPage; diff --git a/test/e2e/tests/account/account-hide-unhide.spec.ts b/test/e2e/tests/account/account-hide-unhide.spec.ts index 19523b0ab0ce..136cf32fb5cd 100644 --- a/test/e2e/tests/account/account-hide-unhide.spec.ts +++ b/test/e2e/tests/account/account-hide-unhide.spec.ts @@ -20,6 +20,7 @@ describe('Account list - hide/unhide functionality', function (this: Suite) { // hide account const accountListPage = new AccountListPage(driver); + await accountListPage.check_pageIsLoaded(); await accountListPage.openAccountOptionsMenu(); await accountListPage.hideAccount(); await accountListPage.check_hiddenAccountsListExists(); diff --git a/test/e2e/tests/account/account-pin-unpin.spec.ts b/test/e2e/tests/account/account-pin-unpin.spec.ts index a37859dfa6a9..8c8bcea59796 100644 --- a/test/e2e/tests/account/account-pin-unpin.spec.ts +++ b/test/e2e/tests/account/account-pin-unpin.spec.ts @@ -20,6 +20,7 @@ describe('Account list - pin/unpin functionality', function (this: Suite) { // pin account const accountListPage = new AccountListPage(driver); + await accountListPage.check_pageIsLoaded(); await accountListPage.openAccountOptionsMenu(); await accountListPage.pinAccount(); await accountListPage.check_accountIsPinned(); @@ -45,6 +46,7 @@ describe('Account list - pin/unpin functionality', function (this: Suite) { // pin account const accountListPage = new AccountListPage(driver); + await accountListPage.check_pageIsLoaded(); await accountListPage.openAccountOptionsMenu(); await accountListPage.pinAccount(); await accountListPage.check_accountIsPinned(); diff --git a/test/e2e/tests/account/forgot-password.spec.ts b/test/e2e/tests/account/forgot-password.spec.ts new file mode 100644 index 000000000000..d5af9998520d --- /dev/null +++ b/test/e2e/tests/account/forgot-password.spec.ts @@ -0,0 +1,42 @@ +import { withFixtures, defaultGanacheOptions } from '../../helpers'; +import FixtureBuilder from '../../fixture-builder'; +import { E2E_SRP } from '../../default-fixture'; +import { Driver } from '../../webdriver/driver'; +import HomePage from '../../page-objects/pages/homepage'; +import LoginPage from '../../page-objects/pages/login-page'; +import ResetPasswordPage from '../../page-objects/pages/reset-password-page'; +import { loginWithBalanceValidation } from '../../page-objects/flows/login.flow'; + +const newPassword = 'this is the best password ever'; + +describe('Forgot password', function () { + it('resets password and then unlock wallet with new password', async function () { + await withFixtures( + { + fixtures: new FixtureBuilder().build(), + ganacheOptions: defaultGanacheOptions, + title: this.test?.fullTitle(), + }, + async ({ driver }: { driver: Driver }) => { + await loginWithBalanceValidation(driver); + + // Lock Wallet + const homePage = new HomePage(driver); + await homePage.headerNavbar.lockMetaMask(); + + // Click forgot password button and reset password + await new LoginPage(driver).gotoResetPasswordPage(); + + const resetPasswordPage = new ResetPasswordPage(driver); + await resetPasswordPage.check_pageIsLoaded(); + await resetPasswordPage.resetPassword(E2E_SRP, newPassword); + + // Lock wallet again + await homePage.headerNavbar.lockMetaMask(); + + // Check user can log in with new password + await loginWithBalanceValidation(driver, newPassword); + }, + ); + }); +}); diff --git a/test/e2e/tests/account/migrate-old-vault.spec.js b/test/e2e/tests/account/migrate-old-vault.spec.js deleted file mode 100644 index 610a2afebec3..000000000000 --- a/test/e2e/tests/account/migrate-old-vault.spec.js +++ /dev/null @@ -1,39 +0,0 @@ -const { strict: assert } = require('assert'); -const { defaultGanacheOptions, withFixtures } = require('../../helpers'); -const FixtureBuilder = require('../../fixture-builder'); - -const lock = async (driver) => { - await driver.clickElement('[data-testid="account-options-menu-button"]'); - const lockButton = await driver.findClickableElement( - '[data-testid="global-menu-lock"]', - ); - await lockButton.click(); -}; - -const unlock = async (driver) => { - await driver.fill('#password', 'correct horse battery staple'); - await driver.press('#password', driver.Key.ENTER); -}; - -describe('Migrate vault with old encryption', function () { - it('successfully unlocks an old vault, locks it, and unlock again', async function () { - await withFixtures( - { - fixtures: new FixtureBuilder().withKeyringControllerOldVault().build(), - ganacheOptions: defaultGanacheOptions, - title: this.test.fullTitle(), - }, - async ({ driver }) => { - await driver.navigate(); - - await unlock(driver); - await lock(driver); - await unlock(driver); - const walletBalance = await driver.findElement( - '.eth-overview__primary-balance', - ); - assert.equal(/^25\s*ETH$/u.test(await walletBalance.getText()), true); - }, - ); - }); -}); diff --git a/test/e2e/tests/account/migrate-old-vault.spec.ts b/test/e2e/tests/account/migrate-old-vault.spec.ts new file mode 100644 index 000000000000..eeacfbc24a09 --- /dev/null +++ b/test/e2e/tests/account/migrate-old-vault.spec.ts @@ -0,0 +1,24 @@ +import { Suite } from 'mocha'; +import { defaultGanacheOptions, withFixtures } from '../../helpers'; +import FixtureBuilder from '../../fixture-builder'; +import { Driver } from '../../webdriver/driver'; +import HomePage from '../../page-objects/pages/homepage'; +import { loginWithBalanceValidation } from '../../page-objects/flows/login.flow'; + +describe('Migrate vault with old encryption', function (this: Suite) { + it('successfully unlocks an old vault, locks it, and unlocks again', async function () { + await withFixtures( + { + fixtures: new FixtureBuilder().withKeyringControllerOldVault().build(), + ganacheOptions: defaultGanacheOptions, + title: this.test?.fullTitle(), + }, + async ({ driver }: { driver: Driver }) => { + await loginWithBalanceValidation(driver); + const homePage = new HomePage(driver); + await homePage.headerNavbar.lockMetaMask(); + await loginWithBalanceValidation(driver); + }, + ); + }); +}); diff --git a/test/e2e/tests/account/metamask-responsive-ui.spec.js b/test/e2e/tests/responsive-ui/metamask-responsive-ui.spec.js similarity index 100% rename from test/e2e/tests/account/metamask-responsive-ui.spec.js rename to test/e2e/tests/responsive-ui/metamask-responsive-ui.spec.js From 555d42b9ead0f4919356ff16e11c663c5e38639e Mon Sep 17 00:00:00 2001 From: Brian Bergeron Date: Fri, 20 Sep 2024 01:35:03 -0700 Subject: [PATCH 30/61] feat: network controller upgrade + network editing UI (#26433) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## **Description** This PR upgrades the network controller, and enables a new UI for adding and editing networks. The network controller changes are described in full in https://github.com/MetaMask/core/pull/4286 In short, there's now a single network per chain id. Multiple RPC endpoints for a chain are now represented as an array under the single network configuration, instead of being separate networks. Each network has some RPC endpoint chosen as the default. Also the built in Infura networks are now represented in state, where they were not before. A migration is added to transform the network controller state to this new format. For the UI, networks are now added, edited, and deleted directly in the network list. Networks are no longer edited via the settings page. Users with multiple RPC endpoints per chain are shown a modal upon upgrade, allowing them to select a different endpoint as the default. The UI for `wallet_addEthereumChain` is changed, to message that users may be adding an additional endpoint to an existing network, rather than adding a new network. This PR contains both the controller upgrade and UI, because it's not possible to perfectly recrate the old UI with the new state or vice versa. To minimize changes, some selectors are shimmed to return equivalent data. This includes `getProviderConfig` and `getCurrentNetwork`. Other selectors have been removed in favor of selecting the new state, as there was no behavior that satisfied every caller. This includes `getNetworkConfigurations` and its dependents like `getNonTestNetworks` `getTestNetworks`. Places listing networks now go through the new `getNetworkConfigurationsByChainId`. [![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/26433?quickstart=1) ## **Related issues** Fixes: ## **Manual testing steps** 1. Upgrade from an older build with custom networks 2. Verify they all still appear in the network dropdown - Verify multiple endpoints for the same chain have been merged into 1 network with multiple RPC endponits 3. Click the network dropdown 4. Try: - Adding popular networks - Adding a custom network - Editing an existing network - Deleting an existing network 5. Try adding a new network via a dapp 6. Try adding a new RPC endpoint to an existing network via a dapp ## **Screenshots/Recordings** ### **Before** ### **After** https://github.com/user-attachments/assets/dd215f30-9c83-4490-83c3-8aaf39412763 ## **Pre-merge author checklist** - [ ] I've followed [MetaMask Contributor Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Extension Coding Standards](https://github.com/MetaMask/metamask-extension/blob/develop/.github/guidelines/CODING_GUIDELINES.md). - [ ] I've completed the PR template to the best of my ability - [ ] I’ve included tests if applicable - [ ] I’ve documented my code using [JSDoc](https://jsdoc.app/) format if applicable - [ ] I’ve applied the right labels on the PR (see [labeling guidelines](https://github.com/MetaMask/metamask-extension/blob/develop/.github/guidelines/LABELING_GUIDELINES.md)). Not required for external contributors. ## **Pre-merge reviewer checklist** - [ ] I've manually tested the PR (e.g. pull and build branch, run the app, test code being changed). - [ ] I confirm that this PR addresses all acceptance criteria described in the ticket it closes and includes the necessary testing evidence such as recordings and or screenshots. --------- Co-authored-by: salimtb Co-authored-by: MetaMask Bot Co-authored-by: David Walsh Co-authored-by: Howard Braham Co-authored-by: Maarten Zuidhoorn --- .storybook/test-data.js | 28 +- ...rk-controller-npm-21.0.0-559aa8e395.patch} | 24 +- app/_locales/am/messages.json | 6 - app/_locales/ar/messages.json | 6 - app/_locales/bg/messages.json | 6 - app/_locales/bn/messages.json | 6 - app/_locales/ca/messages.json | 6 - app/_locales/cs/messages.json | 3 - app/_locales/da/messages.json | 6 - app/_locales/de/messages.json | 80 - app/_locales/el/messages.json | 80 - app/_locales/en/messages.json | 118 +- app/_locales/es/messages.json | 80 - app/_locales/es_419/messages.json | 18 - app/_locales/et/messages.json | 6 - app/_locales/fa/messages.json | 6 - app/_locales/fi/messages.json | 6 - app/_locales/fil/messages.json | 6 - app/_locales/fr/messages.json | 80 - app/_locales/he/messages.json | 6 - app/_locales/hi/messages.json | 80 - app/_locales/hn/messages.json | 3 - app/_locales/hr/messages.json | 6 - app/_locales/ht/messages.json | 3 - app/_locales/hu/messages.json | 6 - app/_locales/id/messages.json | 80 - app/_locales/it/messages.json | 31 - app/_locales/ja/messages.json | 80 - app/_locales/kn/messages.json | 6 - app/_locales/ko/messages.json | 80 - app/_locales/lt/messages.json | 6 - app/_locales/lv/messages.json | 6 - app/_locales/ms/messages.json | 6 - app/_locales/nl/messages.json | 3 - app/_locales/no/messages.json | 6 - app/_locales/ph/messages.json | 15 - app/_locales/pl/messages.json | 6 - app/_locales/pt/messages.json | 80 - app/_locales/pt_BR/messages.json | 18 - app/_locales/ro/messages.json | 6 - app/_locales/ru/messages.json | 80 - app/_locales/sk/messages.json | 6 - app/_locales/sl/messages.json | 6 - app/_locales/sr/messages.json | 6 - app/_locales/sv/messages.json | 6 - app/_locales/sw/messages.json | 6 - app/_locales/ta/messages.json | 3 - app/_locales/th/messages.json | 6 - app/_locales/tl/messages.json | 80 - app/_locales/tr/messages.json | 80 - app/_locales/uk/messages.json | 6 - app/_locales/vi/messages.json | 80 - app/_locales/zh_CN/messages.json | 80 - app/_locales/zh_TW/messages.json | 15 - app/images/networks1.png | Bin 0 -> 5923 bytes app/scripts/controllers/metametrics.js | 6 +- app/scripts/controllers/mmi-controller.ts | 50 +- app/scripts/controllers/network-order.ts | 83 +- .../preferences-controller.test.ts | 20 +- .../controllers/preferences-controller.ts | 6 +- app/scripts/lib/backup.js | 4 +- app/scripts/lib/backup.test.js | 35 +- .../handlers/add-ethereum-chain.js | 195 ++- .../handlers/add-ethereum-chain.test.js | 352 ++-- .../handlers/ethereum-chain-utils.js | 25 - .../handlers/switch-ethereum-chain.js | 20 +- .../handlers/switch-ethereum-chain.test.js | 78 +- app/scripts/metamask-controller.js | 188 +- app/scripts/metamask-controller.test.js | 91 - app/scripts/migrations/127.test.ts | 1263 ++++++++++++++ app/scripts/migrations/127.ts | 453 +++++ app/scripts/migrations/index.js | 1 + builds.yml | 2 - lavamoat/browserify/beta/policy.json | 66 +- lavamoat/browserify/flask/policy.json | 66 +- lavamoat/browserify/main/policy.json | 66 +- lavamoat/browserify/mmi/policy.json | 66 +- lavamoat/build-system/policy.json | 18 +- package.json | 10 +- shared/constants/network.test.ts | 34 +- shared/constants/network.ts | 133 +- shared/constants/swaps.ts | 4 +- .../modules/selectors/smart-transactions.ts | 8 - test/data/confirmations/helper.ts | 3 +- test/data/mock-send-state.json | 19 +- test/data/mock-state.json | 34 +- test/e2e/default-fixture.js | 9 +- test/e2e/fixture-builder.js | 50 +- .../dapp-interactions/block-explorer.spec.js | 16 +- ...rs-after-init-opt-in-background-state.json | 7 +- .../errors-after-init-opt-in-ui-state.json | 6 +- ...s-before-init-opt-in-background-state.json | 3 +- .../errors-before-init-opt-in-ui-state.json | 3 +- .../tests/network/add-custom-network.spec.js | 491 ++++-- .../tests/network/custom-rpc-history.spec.js | 220 ++- test/e2e/tests/network/update-network.spec.ts | 82 +- test/e2e/tests/onboarding/onboarding.spec.js | 61 +- test/e2e/tests/request-queuing/ui.spec.js | 50 +- .../e2e/tests/settings/backup-restore.spec.js | 2 +- .../tests/settings/settings-search.spec.js | 26 - .../data/integration-init-state.json | 69 +- .../data/onboarding-completion-route.json | 19 +- test/jest/mock-store.js | 7 + test/stub/networks.ts | 84 +- ui/components/app/add-network/add-network.js | 324 ---- .../app/add-network/add-network.stories.js | 115 -- .../app/add-network/add-network.test.js | 66 - ui/components/app/add-network/index.js | 1 - ui/components/app/add-network/index.scss | 94 - ui/components/app/app-components.scss | 1 - .../__snapshots__/nft-details.test.js.snap | 4 +- .../__snapshots__/nft-full-image.test.js.snap | 2 +- .../nfts/nfts-items/nfts-items.stories.tsx | 28 +- .../incoming-transaction-toggle.test.js.snap | 6 +- .../incoming-transaction-toggle.stories.tsx | 6 +- .../incoming-transaction-toggle.test.js | 22 +- .../incoming-transaction-toggle.tsx | 44 +- .../incoming-trasaction-toggle/mock-data.ts | 135 +- .../loading-network-screen.container.js | 6 +- .../confirm-delete-network.component.js | 6 +- .../confirm-delete-network.container.js | 16 +- .../confirm-delete-network.test.js | 8 +- .../confirm-delete-rpc-url-modal.tsx | 72 - ui/components/app/modals/modal.js | 49 - .../multi-rpc-edit-modal.test.tsx.snap | 53 +- .../multi-rpc-edit-modal.test.tsx | 3 +- .../multi-rpc-edit-modal.tsx | 12 +- .../network-list-item.test.tsx | 2 + .../network-list-item/network-list-item.tsx | 14 +- .../app/network-display/network-display.js | 1 + .../selected-account-component.test.js.snap | 49 + .../selected-account-component.test.js | 31 +- .../keyring-snap-removal-warning.tsx | 4 +- .../snap-permission-adapter.test.js | 3 + .../snap-permissions-list.test.js | 2 + .../wrong-network-notification.tsx | 6 +- .../address-copy-button.test.js.snap | 35 + .../address-copy-button.test.js | 14 +- .../multichain/app-header/app-header.test.js | 2 +- .../edit-networks-modal.js | 41 +- .../network-list-item-menu.js | 8 +- .../network-list-item.test.js.snap | 30 +- .../multichain/network-list-item/index.scss | 11 - .../network-list-item.test.js | 42 +- ...ork-list-item.js => network-list-item.tsx} | 166 +- .../add-block-explorer-modal.tsx | 1 + .../add-rpc-url-modal.test.tsx.snap | 4 +- .../add-rpc-url-modal/add-rpc-url-modal.tsx | 1 + .../multichain/network-list-menu/index.scss | 11 +- .../network-list-menu/network-list-menu.js | 647 ------- .../network-list-menu.test.js | 108 +- .../network-list-menu/network-list-menu.tsx | 601 +++++++ .../popular-network-list.test.tsx | 67 +- .../popular-network-list.tsx | 159 +- .../network-list-menu/rpc-list-item.tsx | 7 +- .../select-rpc-url-modal.test.tsx | 35 +- .../select-rpc-url-modal.tsx | 77 +- ...ification-detail-block-explorer-button.tsx | 26 +- .../permissions-page/permissions-page.test.js | 10 +- .../network-picker.test.tsx.snap | 4 +- .../permission-details-modal.test.tsx | 7 +- .../token-list-item/token-list-item.tsx | 18 +- .../deprecated-networks.js | 40 +- .../new-network-info/new-network-info.test.js | 7 +- ui/ducks/app/app.ts | 7 +- ui/ducks/bridge/selectors.test.ts | 43 +- ui/ducks/bridge/selectors.ts | 32 +- ui/ducks/metamask/metamask.js | 50 +- ui/ducks/send/helpers.test.js | 1 + ui/ducks/send/send.js | 2 +- ui/helpers/constants/zendesk-url.js | 2 +- ui/helpers/utils/feature-flags.js | 3 - ui/helpers/utils/notification.util.ts | 2 +- ui/hooks/ramps/useRamps/useRamps.test.tsx | 2 + ui/hooks/useTokenTracker.js | 11 +- ui/index.js | 6 - ui/pages/asset/components/native-asset.tsx | 4 +- .../confirm-add-suggested-nft.test.js | 4 +- .../advanced-gas-controls.test.js | 6 +- .../advanced-gas-fee-defaults.test.js | 5 +- .../advanced-gas-inputs.test.js | 2 +- .../confirm-subtitle/confirm-subtitle.test.js | 5 +- .../header/__snapshots__/header.test.tsx.snap | 12 +- .../components/confirm/header/header.test.tsx | 2 +- .../network-change-toast-legacy.tsx | 13 +- .../blockaid-banner-alert.test.js | 38 +- .../signature-request-header.test.js.snap | 4 +- .../signature-request-original.test.js.snap | 4 +- .../signature-request-siwe.test.js.snap | 4 +- ...ture-request-header.component.test.js.snap | 8 +- .../signature-request.test.js | 3 + .../confirm-send-ether.test.js.snap | 6 +- .../__snapshots__/confirm.test.tsx.snap | 38 +- .../confirmation-network-switch.js | 16 +- .../confirmation-network-switch.stories.js | 4 +- .../confirmation/confirmation.js | 9 + .../confirmation/stories/util.js | 13 + .../add-ethereum-chain.test.js.snap | 4 +- .../remove-snap-account.test.js.snap | 10 +- .../templates/add-ethereum-chain.js | 67 +- .../confirmation/templates/index.js | 5 +- .../templates/remove-snap-account.test.js | 3 + .../templates/switch-ethereum-chain.test.js | 12 +- .../useConfirmationOriginAlerts.test.ts | 3 +- .../hooks/useConfirmationNetworkInfo.ts | 52 +- .../hooks/useTransactionInfo.test.js | 5 +- ui/pages/home/home.component.js | 72 +- ui/pages/home/home.container.js | 4 +- .../institutional-entity-done-page.test.tsx | 1 + .../add-network-modal.test.js.snap | 175 -- .../add-network-modal.stories.tsx | 40 - .../add-network-modal.test.js | 76 - .../add-network-modal/index.js | 89 - .../onboarding-flow/onboarding-flow.test.js | 6 +- .../privacy-settings/privacy-settings.js | 180 +- .../privacy-settings/privacy-settings.test.js | 8 +- ui/pages/routes/routes.component.js | 4 +- ui/pages/routes/routes.component.test.js | 5 - ui/pages/routes/routes.container.js | 2 - .../developer-options-tab.test.tsx.snap | 70 - .../developer-options-tab.tsx | 24 - .../custom-content-search.js | 110 -- .../custom-content-search.stories.js | 23 - .../custom-content-search.test.js | 110 -- .../custom-content-search/index.js | 1 - ui/pages/settings/networks-tab/index.js | 1 - ui/pages/settings/networks-tab/index.scss | 117 +- .../rpc-url-editor.test.tsx.snap | 29 - .../networks-form/networks-form-state.ts | 75 + .../networks-form/networks-form.js | 1512 ----------------- .../networks-form/networks-form.test.js | 520 +++--- .../networks-form/networks-form.tsx | 651 +++++++ .../networks-form/rpc-url-editor.test.tsx | 82 - .../networks-form/rpc-url-editor.tsx | 168 -- .../networks-tab/networks-list-item/index.js | 1 - .../networks-list-item/networks-list-item.js | 147 -- .../networks-list-item.stories.js | 41 - .../networks-list-item.test.js | 46 - .../networks-tab/networks-list/index.js | 1 - .../networks-list/network-list.stories.js | 28 - .../networks-list/networks-list.js | 96 -- .../networks-list/networks-list.test.js | 41 - .../networks-tab-content/index.js | 1 - .../networks-tab-content.js | 52 - .../networks-tab-content.test.js | 100 -- .../networks-tab-subheader/index.js | 1 - .../networks-tab-subheader.js | 44 - .../networks-tab-subheader.test.js | 37 - .../networks-tab/networks-tab.constants.js | 64 - .../settings/networks-tab/networks-tab.js | 155 -- .../networks-tab/networks-tab.test.js | 53 - .../__snapshots__/security-tab.test.js.snap | 261 +-- .../security-tab/security-tab.component.js | 6 +- .../security-tab/security-tab.container.js | 6 +- ui/pages/settings/settings.component.js | 25 +- ui/pages/settings/settings.container.js | 12 +- .../swaps/build-quote/build-quote.test.js | 46 +- .../prepare-swap-page.test.js | 26 +- ui/selectors/institutional/selectors.test.ts | 13 + ui/selectors/multichain.test.ts | 24 +- ui/selectors/multichain.ts | 58 +- ui/selectors/selectors.js | 247 +-- ui/selectors/selectors.test.js | 368 ++-- ui/store/actions.test.js | 96 +- ui/store/actions.ts | 121 +- yarn.lock | 109 +- 266 files changed, 6910 insertions(+), 9625 deletions(-) rename .yarn/patches/{@metamask-network-controller-npm-20.2.0-98b1a5ae59.patch => @metamask-network-controller-npm-21.0.0-559aa8e395.patch} (69%) create mode 100644 app/images/networks1.png create mode 100644 app/scripts/migrations/127.test.ts create mode 100644 app/scripts/migrations/127.ts delete mode 100644 ui/components/app/add-network/add-network.js delete mode 100644 ui/components/app/add-network/add-network.stories.js delete mode 100644 ui/components/app/add-network/add-network.test.js delete mode 100644 ui/components/app/add-network/index.js delete mode 100644 ui/components/app/add-network/index.scss delete mode 100644 ui/components/app/modals/confirm-delete-rpc-url-modal/confirm-delete-rpc-url-modal.tsx create mode 100644 ui/components/app/selected-account/__snapshots__/selected-account-component.test.js.snap create mode 100644 ui/components/multichain/address-copy-button/__snapshots__/address-copy-button.test.js.snap rename ui/components/multichain/network-list-item/{network-list-item.js => network-list-item.tsx} (50%) delete mode 100644 ui/components/multichain/network-list-menu/network-list-menu.js create mode 100644 ui/components/multichain/network-list-menu/network-list-menu.tsx delete mode 100644 ui/helpers/utils/feature-flags.js delete mode 100644 ui/pages/onboarding-flow/add-network-modal/__snapshots__/add-network-modal.test.js.snap delete mode 100644 ui/pages/onboarding-flow/add-network-modal/add-network-modal.stories.tsx delete mode 100644 ui/pages/onboarding-flow/add-network-modal/add-network-modal.test.js delete mode 100644 ui/pages/onboarding-flow/add-network-modal/index.js delete mode 100644 ui/pages/settings/networks-tab/custom-content-search/custom-content-search.js delete mode 100644 ui/pages/settings/networks-tab/custom-content-search/custom-content-search.stories.js delete mode 100644 ui/pages/settings/networks-tab/custom-content-search/custom-content-search.test.js delete mode 100644 ui/pages/settings/networks-tab/custom-content-search/index.js delete mode 100644 ui/pages/settings/networks-tab/index.js delete mode 100644 ui/pages/settings/networks-tab/networks-form/__snapshots__/rpc-url-editor.test.tsx.snap create mode 100644 ui/pages/settings/networks-tab/networks-form/networks-form-state.ts delete mode 100644 ui/pages/settings/networks-tab/networks-form/networks-form.js create mode 100644 ui/pages/settings/networks-tab/networks-form/networks-form.tsx delete mode 100644 ui/pages/settings/networks-tab/networks-form/rpc-url-editor.test.tsx delete mode 100644 ui/pages/settings/networks-tab/networks-form/rpc-url-editor.tsx delete mode 100644 ui/pages/settings/networks-tab/networks-list-item/index.js delete mode 100644 ui/pages/settings/networks-tab/networks-list-item/networks-list-item.js delete mode 100644 ui/pages/settings/networks-tab/networks-list-item/networks-list-item.stories.js delete mode 100644 ui/pages/settings/networks-tab/networks-list-item/networks-list-item.test.js delete mode 100644 ui/pages/settings/networks-tab/networks-list/index.js delete mode 100644 ui/pages/settings/networks-tab/networks-list/network-list.stories.js delete mode 100644 ui/pages/settings/networks-tab/networks-list/networks-list.js delete mode 100644 ui/pages/settings/networks-tab/networks-list/networks-list.test.js delete mode 100644 ui/pages/settings/networks-tab/networks-tab-content/index.js delete mode 100644 ui/pages/settings/networks-tab/networks-tab-content/networks-tab-content.js delete mode 100644 ui/pages/settings/networks-tab/networks-tab-content/networks-tab-content.test.js delete mode 100644 ui/pages/settings/networks-tab/networks-tab-subheader/index.js delete mode 100644 ui/pages/settings/networks-tab/networks-tab-subheader/networks-tab-subheader.js delete mode 100644 ui/pages/settings/networks-tab/networks-tab-subheader/networks-tab-subheader.test.js delete mode 100644 ui/pages/settings/networks-tab/networks-tab.constants.js delete mode 100644 ui/pages/settings/networks-tab/networks-tab.js delete mode 100644 ui/pages/settings/networks-tab/networks-tab.test.js diff --git a/.storybook/test-data.js b/.storybook/test-data.js index 274fdfdb3651..72a9bc3b78aa 100644 --- a/.storybook/test-data.js +++ b/.storybook/test-data.js @@ -2,7 +2,10 @@ import { draftTransactionInitialState } from '../ui/ducks/send'; import { KeyringType } from '../shared/constants/keyring'; import { NetworkStatus } from '@metamask/network-controller'; import { EthAccountType } from '@metamask/keyring-api'; -import { CHAIN_IDS } from '../shared/constants/network'; +import { + CHAIN_IDS, + LINEA_MAINNET_DISPLAY_NAME, +} from '../shared/constants/network'; import { copyable, divider, heading, panel, text } from '@metamask/snaps-sdk'; import { getJsxElementFromComponent } from '@metamask/snaps-utils'; import { FirstTimeFlowType } from '../shared/constants/onboarding'; @@ -1218,23 +1221,37 @@ const state = { accounts: ['0x9d0ba4ddac06032527b140912ec808ab9451b788'], }, ], - ...mockNetworkState({ + ...mockNetworkState( + { id: 'test-networkConfigurationId-1', rpcUrl: 'https://testrpc.com', chainId: '0x1', nickname: 'mainnet', + name: 'mainnet', blockExplorerUrl: 'https://etherscan.io', metadata: { EIPS: { 1559: true }, status: NetworkStatus.Available, - } - }, { + }, + }, + { id: 'test-networkConfigurationId-2', + rpcUrl: 'https://testrpc2.com', + chainId: '0xe708', + nickname: LINEA_MAINNET_DISPLAY_NAME, + name: LINEA_MAINNET_DISPLAY_NAME, + blockExplorerUrl: 'https://lineascan.build', + metadata: { EIPS: { 1559: true }, status: NetworkStatus.Available }, + }, + { + id: 'test-networkConfigurationId-3', rpcUrl: 'http://localhost:8545', chainId: '0x539', + name: 'test network', ticker: 'ETH', nickname: 'Localhost 8545', - }), + }, + ), accountTokens: { '0x64a845a5b02460acf8a3d84503b0d68d028b4bb4': { '0x1': [ @@ -1278,6 +1295,7 @@ const state = { ipfsGateway: 'dweb.link', migratedPrivacyMode: false, selectedAddress: '0x9d0ba4ddac06032527b140912ec808ab9451b788', + selectedNetworkClientId: 'test-networkConfigurationId-1', metaMetricsId: '0xc2377d11fec1c3b7dd88c4854240ee5e3ed0d9f63b00456d98d80320337b827f', currentCurrency: 'usd', diff --git a/.yarn/patches/@metamask-network-controller-npm-20.2.0-98b1a5ae59.patch b/.yarn/patches/@metamask-network-controller-npm-21.0.0-559aa8e395.patch similarity index 69% rename from .yarn/patches/@metamask-network-controller-npm-20.2.0-98b1a5ae59.patch rename to .yarn/patches/@metamask-network-controller-npm-21.0.0-559aa8e395.patch index 63fff98c47e6..5719ae0284f7 100644 --- a/.yarn/patches/@metamask-network-controller-npm-20.2.0-98b1a5ae59.patch +++ b/.yarn/patches/@metamask-network-controller-npm-21.0.0-559aa8e395.patch @@ -7,26 +7,26 @@ index 0000000000000000000000000000000000000000..78b9156dc2b0bf7c33dadf325cb3ec0b +We remove `lookupNetwork` from `initializeProvider` in the network controller to prevent network requests before user onboarding is completed. +The network lookup is done after onboarding is completed, and when the extension reloads if onboarding has been completed. +This patch is part of a temporary fix that will be reverted soon to make way for a more permanent solution. https://github.com/MetaMask/metamask-extension/pull/23005 -diff --git a/dist/chunk-BEL2VMHN.js b/dist/chunk-BEL2VMHN.js -index fcf6c5ad51d0db75cf0e3219a569e17437a55486..751447609c924e626c0f442931eb77687b160e42 100644 ---- a/dist/chunk-BEL2VMHN.js -+++ b/dist/chunk-BEL2VMHN.js -@@ -315,7 +315,6 @@ var NetworkController = class extends _basecontroller.BaseController { +diff --git a/dist/chunk-BV3ZGWII.mjs b/dist/chunk-BV3ZGWII.mjs +index 0d1bf3b6348ad4ec7a799083fcadf36f9fc74851..48a09c6e474da9c18115bec88130a88888337044 100644 +--- a/dist/chunk-BV3ZGWII.mjs ++++ b/dist/chunk-BV3ZGWII.mjs +@@ -468,7 +468,6 @@ var NetworkController = class extends BaseController { */ async initializeProvider() { - _chunkZ4BLTVTBjs.__privateMethod.call(void 0, this, _applyNetworkSelection, applyNetworkSelection_fn).call(this, this.state.selectedNetworkClientId); + __privateMethod(this, _applyNetworkSelection, applyNetworkSelection_fn).call(this, this.state.selectedNetworkClientId); - await this.lookupNetwork(); } /** * Refreshes the network meta with EIP-1559 support and the network status -diff --git a/dist/chunk-RTMQACMX.mjs b/dist/chunk-RTMQACMX.mjs -index fc6ae58a396aaa062e8d9a8de2cddd5ef073a5a4..2a6f811c10a0ed3fc943f4672b21a5d1c195c7cd 100644 ---- a/dist/chunk-RTMQACMX.mjs -+++ b/dist/chunk-RTMQACMX.mjs -@@ -315,7 +315,6 @@ var NetworkController = class extends BaseController { +diff --git a/dist/chunk-YOHMQPGM.js b/dist/chunk-YOHMQPGM.js +index ff15cd78ef90b35f86aae9dc64d17d1d2efe352d..14a8bba39c204585164dfb252d0a183844a58d63 100644 +--- a/dist/chunk-YOHMQPGM.js ++++ b/dist/chunk-YOHMQPGM.js +@@ -468,7 +468,6 @@ var NetworkController = class extends _basecontroller.BaseController { */ async initializeProvider() { - __privateMethod(this, _applyNetworkSelection, applyNetworkSelection_fn).call(this, this.state.selectedNetworkClientId); + _chunkZ4BLTVTBjs.__privateMethod.call(void 0, this, _applyNetworkSelection, applyNetworkSelection_fn).call(this, this.state.selectedNetworkClientId); - await this.lookupNetwork(); } /** diff --git a/app/_locales/am/messages.json b/app/_locales/am/messages.json index f2efb2511d06..4ce44a388ac1 100644 --- a/app/_locales/am/messages.json +++ b/app/_locales/am/messages.json @@ -196,9 +196,6 @@ "delete": { "message": "ሰርዝ" }, - "deleteNetwork": { - "message": "አውታረ መረብ ይሰረዝ?" - }, "details": { "message": "ዝርዝሮች" }, @@ -342,9 +339,6 @@ "invalidAddressRecipient": { "message": "የተቀባይ አድራሻ ትክክል አይደለም" }, - "invalidBlockExplorerURL": { - "message": "ልክ ያልሆነ Block Explorer ዩአርኤል" - }, "invalidRPC": { "message": "ልክ ያልሆነ RPC ዩአርኤል" }, diff --git a/app/_locales/ar/messages.json b/app/_locales/ar/messages.json index e9a099be976c..6cb79c56b136 100644 --- a/app/_locales/ar/messages.json +++ b/app/_locales/ar/messages.json @@ -209,9 +209,6 @@ "delete": { "message": "حذف" }, - "deleteNetwork": { - "message": "هل تريد حذف الشبكة؟" - }, "details": { "message": "التفاصيل" }, @@ -351,9 +348,6 @@ "invalidAddressRecipient": { "message": "عنوان المستلم غير صحيح" }, - "invalidBlockExplorerURL": { - "message": "غير صحيح Block Explorer رابط" - }, "invalidRPC": { "message": "رابط آر بي سي غير صحيح" }, diff --git a/app/_locales/bg/messages.json b/app/_locales/bg/messages.json index 8a21fc86c7f4..1fa7a14393d4 100644 --- a/app/_locales/bg/messages.json +++ b/app/_locales/bg/messages.json @@ -205,9 +205,6 @@ "delete": { "message": "Изтриване" }, - "deleteNetwork": { - "message": "Да се изтрие ли мрежата?" - }, "details": { "message": "Подробности" }, @@ -347,9 +344,6 @@ "invalidAddressRecipient": { "message": "Адресът на получателя е невалиден" }, - "invalidBlockExplorerURL": { - "message": "Невалиден Block Explorer URL адрес" - }, "invalidRPC": { "message": "Невалиден RPC URL адрес" }, diff --git a/app/_locales/bn/messages.json b/app/_locales/bn/messages.json index 593ab8dd158b..a9cc5aa0d845 100644 --- a/app/_locales/bn/messages.json +++ b/app/_locales/bn/messages.json @@ -202,9 +202,6 @@ "delete": { "message": "মুছুন" }, - "deleteNetwork": { - "message": "নেটওয়ার্ক মুছবেন?" - }, "details": { "message": "বিশদ বিবরণ" }, @@ -348,9 +345,6 @@ "invalidAddressRecipient": { "message": "প্রাপকের ঠিকানা অবৈধ" }, - "invalidBlockExplorerURL": { - "message": "অবৈধ Block Explorer URL" - }, "invalidRPC": { "message": "অবৈধ RPC URL" }, diff --git a/app/_locales/ca/messages.json b/app/_locales/ca/messages.json index 61f2c5e32481..92f2b2771ff9 100644 --- a/app/_locales/ca/messages.json +++ b/app/_locales/ca/messages.json @@ -202,9 +202,6 @@ "delete": { "message": "Suprimeix" }, - "deleteNetwork": { - "message": "Esborrar Xarxa?" - }, "details": { "message": "Detalls" }, @@ -338,9 +335,6 @@ "invalidAddressRecipient": { "message": "L'adreça del recipient no és vàlida" }, - "invalidBlockExplorerURL": { - "message": "URL de Block Explorer" - }, "invalidRPC": { "message": "URL de RPC" }, diff --git a/app/_locales/cs/messages.json b/app/_locales/cs/messages.json index 96b9a3291ea3..6e3bfa315303 100644 --- a/app/_locales/cs/messages.json +++ b/app/_locales/cs/messages.json @@ -157,9 +157,6 @@ "invalidAddressRecipient": { "message": "Adresa příjemce je neplatná" }, - "invalidBlockExplorerURL": { - "message": "Neplatné Block Explorer URI" - }, "invalidRPC": { "message": "Neplatné RPC URI" }, diff --git a/app/_locales/da/messages.json b/app/_locales/da/messages.json index 26aa63a60257..12eba292e0a4 100644 --- a/app/_locales/da/messages.json +++ b/app/_locales/da/messages.json @@ -205,9 +205,6 @@ "delete": { "message": "Slet" }, - "deleteNetwork": { - "message": "Slet Netværk?" - }, "details": { "message": "Detaljer" }, @@ -344,9 +341,6 @@ "invalidAddressRecipient": { "message": "Modtageradressen er ugyldig" }, - "invalidBlockExplorerURL": { - "message": "Ugyldig Block Explorer-webadresse" - }, "invalidRPC": { "message": "Ugyldig RPC-webadresse" }, diff --git a/app/_locales/de/messages.json b/app/_locales/de/messages.json index ff0773178691..85e776155793 100644 --- a/app/_locales/de/messages.json +++ b/app/_locales/de/messages.json @@ -183,9 +183,6 @@ "addANetwork": { "message": "Ein neues Netzwerk hinzufügen" }, - "addANetworkManually": { - "message": "Ein Netzwerk manuell hinzufügen" - }, "addANickname": { "message": "Spitznamen hinzufügen" }, @@ -252,9 +249,6 @@ "addFriendsAndAddresses": { "message": "Freunde und Adressen hinzufügen, welchen Sie vertrauen" }, - "addFromAListOfPopularNetworks": { - "message": "Fügen Sie ein Netzwerk aus einer Liste beliebter Netzwerke hinzu oder fügen Sie es manuell hinzu. Interagieren Sie nur mit Organisationen, denen Sie vertrauen." - }, "addHardwareWallet": { "message": "Hardware-Wallet hinzufügen" }, @@ -267,16 +261,9 @@ "addMemo": { "message": "Notiz hinzufügen" }, - "addMoreNetworks": { - "message": "weitere Netzwerke manuell hinzufügen" - }, "addNetwork": { "message": "Netzwerk hinzufügen" }, - "addNetworkTooltipWarning": { - "message": "Diese Netzwerkverbindung ist von Dritten abhängig. Diese Verbindung könnte unzuverlässiger sein oder Dritten erlauben, Ihre Aktivitäten zu verfolgen. $1", - "description": "$1 is Learn more link" - }, "addNewAccount": { "message": "Ein neues Konto hinzufügen" }, @@ -1000,9 +987,6 @@ "confirmConnectionTitle": { "message": "Verbindung mit $1 bestätigen" }, - "confirmDeletion": { - "message": "Löschung bestätigen" - }, "confirmFieldPaymaster": { "message": "Gebühr bezahlt von" }, @@ -1015,9 +999,6 @@ "confirmRecoveryPhrase": { "message": "Geheime Wiederherstellungsphrase bestätigen" }, - "confirmRpcUrlDeletionMessage": { - "message": "Sind Sie sicher, dass Sie die RPC-URL löschen möchten? Ihre Informationen werden für dieses Netzwerk nicht gespeichert." - }, "confirmTitleDescPermitSignature": { "message": "Diese Website möchte die Genehmigung, Ihre Tokens auszugeben." }, @@ -1368,9 +1349,6 @@ "custom": { "message": "Erweitert" }, - "customContentSearch": { - "message": "Suche nach einem zuvor hinzugefügten Netzwerk" - }, "customGasSettingToolTipMessage": { "message": "$1 verwenden, um den Gas-Preis anzupassen. Das kann verwirrend sein, wenn Sie damit nicht vertraut sind. Interaktion auf eigene Gefahr.", "description": "$1 is key 'advanced' (text: 'Advanced') separated here so that it can be passed in with bold font-weight" @@ -1490,9 +1468,6 @@ "deleteContact": { "message": "Kontakt löschen" }, - "deleteNetwork": { - "message": "Netzwerk löschen?" - }, "deleteNetworkIntro": { "message": "Wenn Sie dieses Netzwerk löschen, müssen Sie es erneut hinzufügen, um Ihre Assets in diesem Netzwerk anzuzeigen." }, @@ -1500,9 +1475,6 @@ "message": "$1-Netzwerk löschen?", "description": "$1 represents the name of the network" }, - "deleteRpcUrl": { - "message": "RPC-URL löschen" - }, "deposit": { "message": "Einzahlung" }, @@ -1867,9 +1839,6 @@ "existingRequestsBannerAlertDesc": { "message": "Um sich Ihre jüngste Anfrage anzeigen zu lassen und diese zu bestätigen, müssen Sie zunächst bestehende Anfragen genehmigen oder ablehnen." }, - "existingRpcUrl": { - "message": "Diese URL ist mit einer anderen Chain-ID verknüpft." - }, "expandView": { "message": "Ansicht erweitern" }, @@ -1901,9 +1870,6 @@ "failedToFetchChainId": { "message": "Chain-ID konnte nicht abgerufen werden. Ist Ihre RPC-URL korrekt?" }, - "failedToFetchTickerSymbolData": { - "message": "Daten zur Überprüfung des Tickersymbols sind derzeit nicht verfügbar. Vergewissern Sie sich, dass das von Ihnen eingegebene Symbol korrekt ist. Es wirkt sich auf die Umrechnungskurse aus, die Sie für dieses Netzwerk sehen." - }, "failureMessage": { "message": "Etwas ist schiefgelaufen und wir konnten die Aktion nicht abschließen." }, @@ -1924,9 +1890,6 @@ "message": "Dateiimport fehlgeschlagen? Bitte hier klicken!", "description": "Helps user import their account from a JSON file" }, - "findTheRightChainId": { - "message": "Finden Sie das Richtige auf:" - }, "flaskWelcomeUninstall": { "message": "Sie sollten diese Erweiterung deinstallieren.", "description": "This request is shown on the Flask Welcome screen. It is intended for non-developers, and will be bolded." @@ -2416,9 +2379,6 @@ "invalidAssetType": { "message": "Dieses Asset ist ein NFT und muss auf der Seite „NFTs importieren“ unter dem Tab NFTs erneut hinzugefügt werden." }, - "invalidBlockExplorerURL": { - "message": "Ungültige Block Explorer URI" - }, "invalidChainIdTooBig": { "message": "Ungültige Chain-ID. Die Chain-ID ist zu groß." }, @@ -2938,9 +2898,6 @@ "network": { "message": "Netzwerk:" }, - "networkAddedSuccessfully": { - "message": "Netzwerk erfolgreich hinzugefügt!" - }, "networkDetails": { "message": "Netzwerkdetails" }, @@ -3001,9 +2958,6 @@ "networkProvider": { "message": "Netzwerkanbieter" }, - "networkSettingsChainIdDescription": { - "message": "Die Chain-ID wird zum Unterzeichnen von Transaktionen verwendet. Sie muss mit der vom Netzwerk zurückgegebenen Chain-ID übereinstimmen. Sie können eine Dezimalzahl oder eine Hexadezimalzahl mit vorangestelltem '0x' eingeben, aber wir zeigen die Zahl in Dezimalzahlen an." - }, "networkStatus": { "message": "Netzwerkstatus" }, @@ -3452,9 +3406,6 @@ "onboardingAdvancedPrivacyIPFSValid": { "message": "URL für IPFS-Gateway ist gültig" }, - "onboardingAdvancedPrivacyNetworkButton": { - "message": "Benutzerdefiniertes Netzwerk hinzufügen" - }, "onboardingAdvancedPrivacyNetworkDescription": { "message": "Wir verwenden Infura als Anbieter für ferngesteuerte Prozeduranrufe (RPC), um den verlässlichsten und vertraulichsten Zugriff auf Ethereum-Daten zu ermöglichen, den wir können. Sie können Ihren eigenen RPC auswählen, bedenken Sie aber, dass RPC Ihre IP-Adresse und Ihre Ethereum-Wallet erhalten wird, um Transaktionen durchzuführen. Lesen Sie unsere $1, um mehr darüber zu erfahren, wie Infura mit Ihren Daten umgeht." }, @@ -3483,9 +3434,6 @@ "onboardingMetametricsInfuraTermsPolicy": { "message": "Datenschutzrichtlinie" }, - "onboardingMetametricsModalTitle": { - "message": "Benutzerdefiniertes Netzwerk hinzufügen" - }, "onboardingMetametricsNeverCollect": { "message": "$1 Klicks und Aufrufe der App werden gespeichert, andere Details (wie Ihre öffentliche Adresse) jedoch nicht.", "description": "$1 represents `onboardingMetametricsNeverCollectEmphasis`" @@ -3578,9 +3526,6 @@ "onekey": { "message": "OneKey" }, - "onlyAddTrustedNetworks": { - "message": "Ein betrügerischer Netzwerkanbieter kann bezüglich des Status der Blockchain täuschen und Ihre Netzwerkaktivitäten aufzeichnen. Fügen Sie nur vertrauenswürdige Netzwerke hinzu." - }, "onlyConnectTrust": { "message": "Verbinden Sie sich nur mit Websites, denen Sie vertrauen. $1", "description": "Text displayed above the buttons for connection confirmation. $1 is the link to the learn more web page." @@ -3605,9 +3550,6 @@ "optional": { "message": "Optional" }, - "optionalWithParanthesis": { - "message": "(Optional)" - }, "options": { "message": "Optionen" }, @@ -3959,9 +3901,6 @@ "message": "+ $1 mehr", "description": "$1 is a number of additional but unshown items in a list- this message will be shown in place of those items" }, - "popularCustomNetworks": { - "message": "Beliebte benutzerdefinierte Netzwerke" - }, "popularNetworkAddToolTip": { "message": "Einige dieser Netzwerke werden von Dritten betrieben. Die Verbindungen können weniger zuverlässig sein oder Dritten ermöglichen, Aktivitäten zu verfolgen. $1", "description": "$1 is Learn more link" @@ -5298,9 +5237,6 @@ "suggestedTokenName": { "message": "Vorgeschlagener Name:" }, - "suggestedTokenSymbol": { - "message": "Vorgeschlagenes Tickersymbol:" - }, "support": { "message": "Support" }, @@ -5789,9 +5725,6 @@ "termsOfUseTitle": { "message": "Unsere Nutzungsbedingungen wurden aktualisiert." }, - "testNetworks": { - "message": "Test-Netzwerke" - }, "theme": { "message": "Motiv" }, @@ -6103,9 +6036,6 @@ "message": "U2F", "description": "A name on an API for the browser to interact with devices that support the U2F protocol. On some browsers we use it to connect MetaMask to Ledger devices." }, - "unMatchedChain": { - "message": "Laut unseren Aufzeichnungen stimmt diese URL nicht mit einem bekannten Anbieter für diese Chain-ID überein." - }, "unapproved": { "message": "Nicht genehmigt" }, @@ -6175,9 +6105,6 @@ "urlErrorMsg": { "message": "URIs benötigen die korrekten HTTP/HTTPS Präfixe." }, - "urlExistsErrorMsg": { - "message": "Diese URL wird derzeit vom $1-Netzwerk verwendet." - }, "use4ByteResolution": { "message": "Smart Contracts dekodieren" }, @@ -6387,9 +6314,6 @@ "whatsThis": { "message": "Was ist das?" }, - "wrongChainId": { - "message": "Diese Chain-ID stimmt nicht mit dem Netzwerknamen überein." - }, "wrongNetworkName": { "message": "Laut unseren Aufzeichnungen stimmt dieser Netzwerkname nicht mit dieser Chain-ID überein." }, @@ -6403,10 +6327,6 @@ "you": { "message": "Sie" }, - "youHaveAddedAll": { - "message": "Sie haben alle beliebten Netzwerke hinzugefügt. Sie können weitere Netzwerke entdecken $1 oder Sie können $2", - "description": "$1 is a link with the text 'here' and $2 is a button with the text 'add more networks manually'" - }, "youNeedToAllowCameraAccess": { "message": "Sie müssen Zugriff auf die Kamera erlauben, um diese Funktion nutzen zu können." }, diff --git a/app/_locales/el/messages.json b/app/_locales/el/messages.json index 3a191b6e9579..a8cee7a6aab1 100644 --- a/app/_locales/el/messages.json +++ b/app/_locales/el/messages.json @@ -183,9 +183,6 @@ "addANetwork": { "message": "Προσθήκη ενός δικτύου" }, - "addANetworkManually": { - "message": "Προσθήκη δικτύου με μη αυτόματο τρόπο" - }, "addANickname": { "message": "Προσθήκη ενός ψευδωνύμου" }, @@ -252,9 +249,6 @@ "addFriendsAndAddresses": { "message": "Προσθέστε φίλους και διευθύνσεις που εμπιστεύεστε" }, - "addFromAListOfPopularNetworks": { - "message": "Προσθέστε από μια λίστα δημοφιλών δικτύων ή προσθέστε ένα δίκτυο με μη αυτόματο τρόπο. Να αλληλεπιδράτε μόνο με τις οντότητες που εμπιστεύεστε." - }, "addHardwareWallet": { "message": "Προσθήκη πορτοφολιού υλικού" }, @@ -267,16 +261,9 @@ "addMemo": { "message": "Προσθήκη σημειώματος" }, - "addMoreNetworks": { - "message": "προσθέστε περισσότερα δίκτυα χειροκίνητα" - }, "addNetwork": { "message": "Προσθήκη δικτύου" }, - "addNetworkTooltipWarning": { - "message": "Αυτή η σύνδεση δικτύου βασίζεται σε τρίτους. H σύνδεση ενδέχεται να είναι λιγότερο αξιόπιστη ή να επιτρέπει σε τρίτους να παρακολουθούν τη δραστηριότητα. $1", - "description": "$1 is Learn more link" - }, "addNewAccount": { "message": "Προσθήκη νέου λογαριασμού Ethereum" }, @@ -1000,9 +987,6 @@ "confirmConnectionTitle": { "message": "Επιβεβαίωση σύνδεσης με το $1" }, - "confirmDeletion": { - "message": "Επιβεβαίωση διαγραφής" - }, "confirmFieldPaymaster": { "message": "Τα τέλη καταβλήθηκαν από" }, @@ -1015,9 +999,6 @@ "confirmRecoveryPhrase": { "message": "Επιβεβαιώστε τη Μυστική Φράση Ανάκτησης" }, - "confirmRpcUrlDeletionMessage": { - "message": "Είστε σίγουροι ότι θέλετε να διαγράψετε τη διεύθυνση URL RPC; Οι πληροφορίες σας δεν θα αποθηκευτούν για αυτό το δίκτυο." - }, "confirmTitleDescPermitSignature": { "message": "Αυτός ο ιστότοπος ζητάει άδεια για να δαπανήσει τα tokens σας." }, @@ -1368,9 +1349,6 @@ "custom": { "message": "Σύνθετες" }, - "customContentSearch": { - "message": "Αναζήτηση δικτύου που προστέθηκε προηγουμένως" - }, "customGasSettingToolTipMessage": { "message": "Χρησιμοποιήστε το $1 για να προσαρμόσετε την τιμή του τέλους συναλλαγής. Αυτό μπορεί να προκαλέσει σύγχυση, αν δεν είστε εξοικειωμένοι. Αλληλεπίδραση με δική σας ευθύνη.", "description": "$1 is key 'advanced' (text: 'Advanced') separated here so that it can be passed in with bold font-weight" @@ -1490,9 +1468,6 @@ "deleteContact": { "message": "Διαγραφή επαφής" }, - "deleteNetwork": { - "message": "Διαγραφή δικτύου;" - }, "deleteNetworkIntro": { "message": "Εάν διαγράψετε αυτό το δίκτυο, θα πρέπει να το προσθέσετε ξανά για να δείτε τα περιουσιακά σας στοιχεία σε αυτό το δίκτυο" }, @@ -1500,9 +1475,6 @@ "message": "Διαγραφή του δικτύου $1;", "description": "$1 represents the name of the network" }, - "deleteRpcUrl": { - "message": "Διαγραφή της διεύθυνσης URL RPC" - }, "deposit": { "message": "Κατάθεση" }, @@ -1867,9 +1839,6 @@ "existingRequestsBannerAlertDesc": { "message": "Για να προβάλετε και να επιβεβαιώσετε το πιο πρόσφατο αίτημά σας, θα πρέπει πρώτα να εγκρίνετε ή να απορρίψετε τα υπάρχοντα αιτήματα." }, - "existingRpcUrl": { - "message": "Αυτή η διεύθυνση URL συνδέεται με ένα άλλο αναγνωριστικό αλυσίδας." - }, "expandView": { "message": "Ανάπτυξη προβολής" }, @@ -1901,9 +1870,6 @@ "failedToFetchChainId": { "message": "Δεν είναι δυνατή η ανάκτηση του αναγνωριστικού αλυσίδας. Είναι σωστή η διεύθυνση URL του RPC;" }, - "failedToFetchTickerSymbolData": { - "message": "Τα δεδομένα επαλήθευσης αυτού του συμβόλου είναι προς το παρόν μη διαθέσιμα. Βεβαιωθείτε ότι το σύμβολο που έχετε εισάγει είναι σωστό. Αυτό θα επηρεάσει τα ποσοστά μετατροπών που βλέπετε για αυτό το δίκτυο" - }, "failureMessage": { "message": "Κάτι πήγε στραβά και δεν μπορέσαμε να ολοκληρώσουμε την ενέργεια" }, @@ -1924,9 +1890,6 @@ "message": "Η εισαγωγή αρχείων δεν λειτουργεί; Κάντε κλικ εδώ!", "description": "Helps user import their account from a JSON file" }, - "findTheRightChainId": { - "message": "Βρείτε το σωστό στο:" - }, "flaskWelcomeUninstall": { "message": "θα πρέπει να απεγκαταστήσετε αυτή την επέκταση", "description": "This request is shown on the Flask Welcome screen. It is intended for non-developers, and will be bolded." @@ -2416,9 +2379,6 @@ "invalidAssetType": { "message": "Αυτό το περιουσιακό στοιχείο είναι NFT και πρέπει να προστεθεί ξανά στη σελίδα «Εισαγωγή NFT» που βρίσκεται στην καρτέλα των NFT" }, - "invalidBlockExplorerURL": { - "message": "Μη έγκυρη διεύθυνση του Block Explorer" - }, "invalidChainIdTooBig": { "message": "Μη έγκυρο αναγνωριστικό αλυσίδας. Το αναγνωριστικό αλυσίδας είναι πολύ μεγάλο." }, @@ -2938,9 +2898,6 @@ "network": { "message": "Δίκτυο:" }, - "networkAddedSuccessfully": { - "message": "Το δίκτυο προστέθηκε με επιτυχία!" - }, "networkDetails": { "message": "Λεπτομέρειες Δικτύου" }, @@ -3001,9 +2958,6 @@ "networkProvider": { "message": "Πάροχος δικτύου" }, - "networkSettingsChainIdDescription": { - "message": "Το αναγνωριστικό αλυσίδας χρησιμοποιείται για την υπογραφή συναλλαγών. Πρέπει να ταιριάζει με το αναγνωριστικό αλυσίδας που επιστρέφεται από το δίκτυο. Μπορείτε να εισαγάγετε έναν δεκαδικό ή δεκαεξαδικό αριθμό με πρόθεμα \"0x\", αλλά εμείς θα εμφανίσουμε τον αριθμό στο δεκαδικό σύστημα." - }, "networkStatus": { "message": "Κατάσταση δικτύου" }, @@ -3452,9 +3406,6 @@ "onboardingAdvancedPrivacyIPFSValid": { "message": "Η διεύθυνση URL της πύλης IPFS είναι έγκυρη" }, - "onboardingAdvancedPrivacyNetworkButton": { - "message": "Προσθήκη προσαρμοσμένου δικτύου" - }, "onboardingAdvancedPrivacyNetworkDescription": { "message": "Χρησιμοποιούμε την Infura ως την υπηρεσία κλήσης απομακρυσμένης διαδικασίας (RPC) για να προσφέρουμε την πιο αξιόπιστη και ιδιωτική πρόσβαση στα δεδομένα του Ethereum που μπορούμε. Μπορείτε να επιλέξετε τη δική σας RPC, αλλά να θυμάστε ότι οποιαδήποτε RPC θα λαμβάνει τη διεύθυνση IP και το πορτοφόλι σας στο Ethereum για να πραγματοποιεί συναλλαγές. Διαβάστε το $1 για να μάθετε περισσότερα σχετικά με τον τρόπο με τον οποίο η Infura χειρίζεται τα δεδομένα." }, @@ -3483,9 +3434,6 @@ "onboardingMetametricsInfuraTermsPolicy": { "message": "Πολιτική Απορρήτου" }, - "onboardingMetametricsModalTitle": { - "message": "Προσθήκη προσαρμοσμένου δικτύου" - }, "onboardingMetametricsNeverCollect": { "message": "$1 τα κλικ και οι προβολές στην εφαρμογή αποθηκεύονται, ωστόσο άλλα στοιχεία (όπως η δημόσια διεύθυνσή σας) όχι.", "description": "$1 represents `onboardingMetametricsNeverCollectEmphasis`" @@ -3578,9 +3526,6 @@ "onekey": { "message": "OneKey" }, - "onlyAddTrustedNetworks": { - "message": "Ένας κακόβουλος πάροχος δικτύου μπορεί να πει ψέματα σχετικά με την κατάσταση του blockchain και να καταγράψει τη δραστηριότητα του δικτύου σας. Προσθέστε μόνο προσαρμοσμένα δίκτυα που εμπιστεύεστε." - }, "onlyConnectTrust": { "message": "Συνδεθείτε μόνο με ιστότοπους που εμπιστεύεστε. $1", "description": "Text displayed above the buttons for connection confirmation. $1 is the link to the learn more web page." @@ -3605,9 +3550,6 @@ "optional": { "message": "Προαιρετικά" }, - "optionalWithParanthesis": { - "message": "(Προαιρετικά)" - }, "options": { "message": "Επιλογές" }, @@ -3959,9 +3901,6 @@ "message": "+ $1 ακόμη", "description": "$1 is a number of additional but unshown items in a list- this message will be shown in place of those items" }, - "popularCustomNetworks": { - "message": "Δημοφιλή προσαρμοσμένα δίκτυα" - }, "popularNetworkAddToolTip": { "message": "Ορισμένα από αυτά τα δίκτυα βασίζονται σε τρίτους. Οι συνδέσεις μπορεί να είναι λιγότερο αξιόπιστες ή να επιτρέπουν σε τρίτους να παρακολουθούν τη δραστηριότητα. $1", "description": "$1 is Learn more link" @@ -5298,9 +5237,6 @@ "suggestedTokenName": { "message": "Προτεινόμενο όνομα:" }, - "suggestedTokenSymbol": { - "message": "Προτεινόμενο σύμβολο μετοχής:" - }, "support": { "message": "Υποστήριξη" }, @@ -5789,9 +5725,6 @@ "termsOfUseTitle": { "message": "Οι Όροι Χρήσης μας έχουν ενημερωθεί" }, - "testNetworks": { - "message": "Δοκιμαστικά δίκτυα" - }, "theme": { "message": "Θέμα" }, @@ -6103,9 +6036,6 @@ "message": "U2F", "description": "A name on an API for the browser to interact with devices that support the U2F protocol. On some browsers we use it to connect MetaMask to Ledger devices." }, - "unMatchedChain": { - "message": "Σύμφωνα με τα αρχεία μας, αυτή η διεύθυνση URL δεν ταιριάζει με γνωστό πάροχο για αυτό το αναγνωριστικό αλυσίδας." - }, "unapproved": { "message": "Μη εγκεκριμένο" }, @@ -6175,9 +6105,6 @@ "urlErrorMsg": { "message": "Οι διευθύνσεις URL απαιτούν το κατάλληλο πρόθεμα HTTP/HTTPS." }, - "urlExistsErrorMsg": { - "message": "Αυτή η διεύθυνση URL χρησιμοποιείται επί του παρόντος από το δίκτυο $1." - }, "use4ByteResolution": { "message": "Αποκωδικοποίηση έξυπνων συμβολαίων" }, @@ -6387,9 +6314,6 @@ "whatsThis": { "message": "Τι είναι αυτό;" }, - "wrongChainId": { - "message": "Αυτό το αναγνωριστικό αλυσίδας δεν ταιριάζει με το όνομα του δικτύου." - }, "wrongNetworkName": { "message": "Σύμφωνα με τα αρχεία μας, το όνομα του δικτύου ενδέχεται να μην αντιστοιχεί με αυτό το αναγνωριστικό αλυσίδας." }, @@ -6403,10 +6327,6 @@ "you": { "message": "Εσείς" }, - "youHaveAddedAll": { - "message": "Προσθέσατε όλα τα δημοφιλή δίκτυα. Μπορείτε να ανακαλύψετε περισσότερα δίκτυα $1 Ή μπορείτε να $2", - "description": "$1 is a link with the text 'here' and $2 is a button with the text 'add more networks manually'" - }, "youNeedToAllowCameraAccess": { "message": "Πρέπει να επιτρέψετε την πρόσβαση στην κάμερα για να χρησιμοποιήσετε αυτή τη λειτουργία." }, diff --git a/app/_locales/en/messages.json b/app/_locales/en/messages.json index 5aee8cd393aa..614318e22c89 100644 --- a/app/_locales/en/messages.json +++ b/app/_locales/en/messages.json @@ -186,15 +186,18 @@ "add": { "message": "Add" }, + "addACustomNetwork": { + "message": "Add a custom network" + }, "addANetwork": { "message": "Add a network" }, - "addANetworkManually": { - "message": "Add a network manually" - }, "addANickname": { "message": "Add a nickname" }, + "addAUrl": { + "message": "Add a URL" + }, "addAccount": { "message": "Add account" }, @@ -210,6 +213,9 @@ "addBlockExplorer": { "message": "Add a block explorer" }, + "addBlockExplorerUrl": { + "message": "Add a block explorer URL" + }, "addContact": { "message": "Add contact" }, @@ -261,9 +267,6 @@ "addFriendsAndAddresses": { "message": "Add friends and addresses you trust" }, - "addFromAListOfPopularNetworks": { - "message": "Add from a list of popular networks or add a network manually. Only interact with the entities you trust." - }, "addHardwareWallet": { "message": "Add hardware wallet" }, @@ -276,9 +279,6 @@ "addMemo": { "message": "Add memo" }, - "addMoreNetworks": { - "message": "add more networks manually" - }, "addNetwork": { "message": "Add network" }, @@ -286,10 +286,6 @@ "message": "Add $1", "description": "$1 represents network name" }, - "addNetworkTooltipWarning": { - "message": "This network connection relies on third parties. This connection may be less reliable or enable third-parties to track activity. $1", - "description": "$1 is Learn more link" - }, "addNewAccount": { "message": "Add a new Ethereum account" }, @@ -1033,9 +1029,6 @@ "confirmConnectionTitle": { "message": "Confirm connection to $1" }, - "confirmDeletion": { - "message": "Confirm deletion" - }, "confirmFieldPaymaster": { "message": "Fee paid by" }, @@ -1048,9 +1041,6 @@ "confirmRecoveryPhrase": { "message": "Confirm Secret Recovery Phrase" }, - "confirmRpcUrlDeletionMessage": { - "message": "Are you sure you want to delete the RPC URL? Your information will not be saved for this network." - }, "confirmTitleApproveTransaction": { "message": "Allowance request" }, @@ -1425,9 +1415,6 @@ "custom": { "message": "Advanced" }, - "customContentSearch": { - "message": "Search for a previously added network" - }, "customGasSettingToolTipMessage": { "message": "Use $1 to customize the gas price. This can be confusing if you aren’t familiar. Interact at your own risk.", "description": "$1 is key 'advanced' (text: 'Advanced') separated here so that it can be passed in with bold font-weight" @@ -1547,9 +1534,6 @@ "deleteContact": { "message": "Delete contact" }, - "deleteNetwork": { - "message": "Delete network?" - }, "deleteNetworkIntro": { "message": "If you delete this network, you will need to add it again to view your assets in this network" }, @@ -1557,9 +1541,6 @@ "message": "Delete $1 network?", "description": "$1 represents the name of the network" }, - "deleteRpcUrl": { - "message": "Delete RPC URL" - }, "deposit": { "message": "Deposit" }, @@ -1824,7 +1805,7 @@ "message": "Request encryption public key" }, "endpointReturnedDifferentChainId": { - "message": "The RPC URL you have entered returned a different chain ID ($1). Please update the Chain ID to match the RPC URL of the network you are trying to add.", + "message": "The RPC URL you have entered returned a different chain ID ($1).", "description": "$1 is the return value of eth_chainId from an RPC endpoint" }, "enhancedTokenDetectionAlertMessage": { @@ -1854,12 +1835,18 @@ "enterANumber": { "message": "Enter a number" }, + "enterChainId": { + "message": "Enter Chain ID" + }, "enterCustodianToken": { "message": "Enter your $1 token or add a new token" }, "enterMaxSpendLimit": { "message": "Enter max spend limit" }, + "enterNetworkName": { + "message": "Enter network name" + }, "enterOptionalPassword": { "message": "Enter optional password" }, @@ -1869,6 +1856,9 @@ "enterRpcUrl": { "message": "Enter RPC URL" }, + "enterSymbol": { + "message": "Enter symbol" + }, "enterTokenNameOrAddress": { "message": "Enter token name or paste address" }, @@ -1948,9 +1938,6 @@ "existingRequestsBannerAlertDesc": { "message": "To view and confirm your most recent request, you'll need to approve or reject existing requests first." }, - "existingRpcUrl": { - "message": "This URL is associated with another chain ID." - }, "expandView": { "message": "Expand view" }, @@ -1991,9 +1978,6 @@ "failedToFetchChainId": { "message": "Could not fetch chain ID. Is your RPC URL correct?" }, - "failedToFetchTickerSymbolData": { - "message": "Ticker symbol verification data is currently unavailable, make sure that the symbol you have entered is correct. It will impact the conversion rates that you see for this network" - }, "failureMessage": { "message": "Something went wrong, and we were unable to complete the action" }, @@ -2014,9 +1998,6 @@ "message": "File import not working? Click here!", "description": "Helps user import their account from a JSON file" }, - "findTheRightChainId": { - "message": "Find the right one on:" - }, "flaskWelcomeUninstall": { "message": "you should uninstall this extension", "description": "This request is shown on the Flask Welcome screen. It is intended for non-developers, and will be bolded." @@ -2512,9 +2493,6 @@ "invalidAssetType": { "message": "This asset is an NFT and needs to be re-added on the Import NFTs page found under the NFTs tab" }, - "invalidBlockExplorerURL": { - "message": "Invalid block explorer URL" - }, "invalidChainIdTooBig": { "message": "Invalid chain ID. The chain ID is too big." }, @@ -3040,9 +3018,6 @@ "network": { "message": "Network:" }, - "networkAddedSuccessfully": { - "message": "Network added successfully!" - }, "networkDetails": { "message": "Network details" }, @@ -3106,9 +3081,6 @@ "networkProvider": { "message": "Network provider" }, - "networkSettingsChainIdDescription": { - "message": "The chain ID is used for signing transactions. It must match the chain ID returned by the network. You can enter a decimal or '0x'-prefixed hexadecimal number, but we will display the number in decimal." - }, "networkStatus": { "message": "Network status" }, @@ -3194,6 +3166,9 @@ "newPrivacyPolicyTitle": { "message": "We’ve updated our privacy policy" }, + "newRpcUrl": { + "message": "New RPC URL" + }, "newTokensImportedMessage": { "message": "You’ve successfully imported $1.", "description": "$1 is the string of symbols of all the tokens imported" @@ -3565,9 +3540,6 @@ "onboardingAdvancedPrivacyIPFSValid": { "message": "IPFS gateway URL is valid" }, - "onboardingAdvancedPrivacyNetworkButton": { - "message": "Add custom network" - }, "onboardingAdvancedPrivacyNetworkDescription": { "message": "We use Infura as our remote procedure call (RPC) provider to offer the most reliable and private access to Ethereum data we can. You can choose your own RPC, but remember that any RPC will receive your IP address and Ethereum wallet to make transactions. Read our $1 to learn more about how Infura handles data." }, @@ -3596,9 +3568,6 @@ "onboardingMetametricsInfuraTermsPolicy": { "message": "Privacy Policy" }, - "onboardingMetametricsModalTitle": { - "message": "Add custom network" - }, "onboardingMetametricsNeverCollect": { "message": "$1 clicks and views on the app are stored, but other details (like your public address) are not.", "description": "$1 represents `onboardingMetametricsNeverCollectEmphasis`" @@ -3691,9 +3660,6 @@ "onekey": { "message": "OneKey" }, - "onlyAddTrustedNetworks": { - "message": "A malicious network provider can lie about the state of the blockchain and record your network activity. Only add custom networks you trust." - }, "onlyConnectTrust": { "message": "Only connect with sites you trust. $1", "description": "Text displayed above the buttons for connection confirmation. $1 is the link to the learn more web page." @@ -3718,9 +3684,6 @@ "optional": { "message": "Optional" }, - "optionalWithParanthesis": { - "message": "(Optional)" - }, "options": { "message": "Options" }, @@ -4080,9 +4043,6 @@ "message": "+ $1 more", "description": "$1 is a number of additional but unshown items in a list- this message will be shown in place of those items" }, - "popularCustomNetworks": { - "message": "Popular custom networks" - }, "popularNetworkAddToolTip": { "message": "Some of these networks rely on third parties. The connections may be less reliable or enable third-parties to track activity. $1", "description": "$1 is Learn more link" @@ -4547,7 +4507,7 @@ "message": "RPC Name (Optional)" }, "rpcUrl": { - "message": "New RPC URL" + "message": "RPC URL" }, "safeTransferFrom": { "message": "Safe transfer from" @@ -4702,6 +4662,9 @@ "selectPathHelp": { "message": "If you don't see the accounts you expect, try switching the HD path or current selected network." }, + "selectRpcUrl": { + "message": "Select RPC URL" + }, "selectType": { "message": "Select Type" }, @@ -5444,12 +5407,12 @@ "message": "Suggested by $1", "description": "$1 is the snap name" }, + "suggestedCurrencySymbol": { + "message": "Suggested currency symbol:" + }, "suggestedTokenName": { "message": "Suggested name:" }, - "suggestedTokenSymbol": { - "message": "Suggested ticker symbol:" - }, "support": { "message": "Support" }, @@ -5941,9 +5904,6 @@ "termsOfUseTitle": { "message": "Our Terms of Use have updated" }, - "testNetworks": { - "message": "Test networks" - }, "testnets": { "message": "Testnets" }, @@ -6261,9 +6221,6 @@ "message": "U2F", "description": "A name on an API for the browser to interact with devices that support the U2F protocol. On some browsers we use it to connect MetaMask to Ledger devices." }, - "unMatchedChain": { - "message": "According to our records, this URL does not match a known provider for this chain ID." - }, "unapproved": { "message": "Unapproved" }, @@ -6318,6 +6275,13 @@ "update": { "message": "Update" }, + "updateEthereumChainConfirmationDescription": { + "message": "This site is requesting to update your default network URL. You can edit defaults and network information any time." + }, + "updateNetworkConfirmationTitle": { + "message": "Update $1", + "description": "$1 represents network name" + }, "updateOrEditNetworkInformations": { "message": "Update your information or" }, @@ -6339,9 +6303,6 @@ "urlErrorMsg": { "message": "URLs require the appropriate HTTP/HTTPS prefix." }, - "urlExistsErrorMsg": { - "message": "This URL is currently used by the $1 network." - }, "use4ByteResolution": { "message": "Decode smart contracts" }, @@ -6558,9 +6519,6 @@ "whatsThis": { "message": "What's this?" }, - "wrongChainId": { - "message": "This chain ID doesn’t match the network name." - }, "wrongNetworkName": { "message": "According to our records, the network name may not correctly match this chain ID." }, @@ -6574,10 +6532,6 @@ "you": { "message": "You" }, - "youHaveAddedAll": { - "message": "You've added all the popular networks. You can discover more networks $1 Or you can $2", - "description": "$1 is a link with the text 'here' and $2 is a button with the text 'add more networks manually'" - }, "youNeedToAllowCameraAccess": { "message": "You need to allow camera access to use this feature." }, diff --git a/app/_locales/es/messages.json b/app/_locales/es/messages.json index 88524f86f3cc..2346fda97d16 100644 --- a/app/_locales/es/messages.json +++ b/app/_locales/es/messages.json @@ -183,9 +183,6 @@ "addANetwork": { "message": "Agregar una red" }, - "addANetworkManually": { - "message": "Agregar una red manualmente" - }, "addANickname": { "message": "Añadir un apodo" }, @@ -252,9 +249,6 @@ "addFriendsAndAddresses": { "message": "Agregue amigos y direcciones de confianza" }, - "addFromAListOfPopularNetworks": { - "message": "Agregue desde una lista de redes populares o agregue una red manualmente. Interactúe solo con las entidades en las que confía." - }, "addHardwareWallet": { "message": "Agregar monedero físico" }, @@ -267,16 +261,9 @@ "addMemo": { "message": "Añadir memo" }, - "addMoreNetworks": { - "message": "agregar más redes manualmente" - }, "addNetwork": { "message": "Agregar red" }, - "addNetworkTooltipWarning": { - "message": "Esta conexión de red depende de terceros. Y puede ser menos confiable o permite que terceros rastreen la actividad. $1", - "description": "$1 is Learn more link" - }, "addNewAccount": { "message": "Añadir una cuenta nueva de Ethereum" }, @@ -997,9 +984,6 @@ "confirmConnectionTitle": { "message": "Confirmar conexión a $1" }, - "confirmDeletion": { - "message": "Confirmar la eliminación" - }, "confirmFieldPaymaster": { "message": "Tarifa pagada por" }, @@ -1012,9 +996,6 @@ "confirmRecoveryPhrase": { "message": "Confirmar frase secreta de recuperación" }, - "confirmRpcUrlDeletionMessage": { - "message": "¿Está seguro de que desea eliminar la URL RPC? Su información no se guardará para esta red." - }, "confirmTitleDescPermitSignature": { "message": "Este sitio solicita permiso para gastar sus tokens." }, @@ -1365,9 +1346,6 @@ "custom": { "message": "Avanzado" }, - "customContentSearch": { - "message": "Buscar una red agregada anteriormente" - }, "customGasSettingToolTipMessage": { "message": "Use $1 para personalizar el precio de gas. Esto puede ser confuso si no está familiarizado. Interactúe bajo su propio riesgo.", "description": "$1 is key 'advanced' (text: 'Advanced') separated here so that it can be passed in with bold font-weight" @@ -1487,9 +1465,6 @@ "deleteContact": { "message": "Eliminar contacto" }, - "deleteNetwork": { - "message": "¿Eliminar red?" - }, "deleteNetworkIntro": { "message": "Si elimina esta red, deberá volver a agregarla para ver sus activos en esta red" }, @@ -1497,9 +1472,6 @@ "message": "¿Eliminar la red de $1?", "description": "$1 represents the name of the network" }, - "deleteRpcUrl": { - "message": "Eliminar URL RPC" - }, "deposit": { "message": "Depositar" }, @@ -1864,9 +1836,6 @@ "existingRequestsBannerAlertDesc": { "message": "Para ver y confirmar su solicitud más reciente, primero deberá aprobar o rechazar las solicitudes existentes." }, - "existingRpcUrl": { - "message": "Esta URL está asociada a otro ID de cadena." - }, "expandView": { "message": "Expandir vista" }, @@ -1898,9 +1867,6 @@ "failedToFetchChainId": { "message": "No se pudo capturar el id. de cadena. ¿La dirección URL de RPC es correcta?" }, - "failedToFetchTickerSymbolData": { - "message": "Los datos de verificación del símbolo de teletipo no están disponibles actualmente, asegúrese de que el símbolo que ingresó sea correcto. Tendrá un impacto en las tasas de conversión que vea para esta red" - }, "failureMessage": { "message": "Se produjo un error y no pudimos completar la acción" }, @@ -1921,9 +1887,6 @@ "message": "¿No funciona la importación del archivo? Haga clic aquí.", "description": "Helps user import their account from a JSON file" }, - "findTheRightChainId": { - "message": "Encuentre el correcto en:" - }, "flaskWelcomeUninstall": { "message": "le recomendamos que desinstale esta extensión", "description": "This request is shown on the Flask Welcome screen. It is intended for non-developers, and will be bolded." @@ -2413,9 +2376,6 @@ "invalidAssetType": { "message": "Este activo es un NFT y debe volver a añadirse en la página de Importar NFTs que se encuentra en la pestaña de NFTs" }, - "invalidBlockExplorerURL": { - "message": "Dirección URL del explorador de bloques no válida" - }, "invalidChainIdTooBig": { "message": "Identificador de cadena no válido. El identificador de cadena es demasiado grande." }, @@ -2935,9 +2895,6 @@ "network": { "message": "Red:" }, - "networkAddedSuccessfully": { - "message": "¡Red añadida exitosamente!" - }, "networkDetails": { "message": "Detalles de la red" }, @@ -2998,9 +2955,6 @@ "networkProvider": { "message": "Proveedor de red" }, - "networkSettingsChainIdDescription": { - "message": "El id. de la cadena se usa para firmar transacciones. Debe coincidir con el id. de la cadena que devuelve la red. Puede escribir un número decimal o un número hexadecimal con el prefijo “0x”, pero el número se mostrará en decimal." - }, "networkStatus": { "message": "Estado de la red" }, @@ -3449,9 +3403,6 @@ "onboardingAdvancedPrivacyIPFSValid": { "message": "La URL de la puerta de enlace de IPFS es válida" }, - "onboardingAdvancedPrivacyNetworkButton": { - "message": "Agregar red personalizada" - }, "onboardingAdvancedPrivacyNetworkDescription": { "message": "Usamos Infura como nuestro proveedor de llamada a procedimiento remoto (RPC) para ofrecer el acceso más confiable y privado posible a los datos de Ethereum. Puede elegir su propio RPC, pero recuerde que cualquier RPC recibirá su dirección IP y su monedero de Ethereum para realizar transacciones. Lea nuestra $1 para obtener más información sobre cómo Infura maneja los datos." }, @@ -3480,9 +3431,6 @@ "onboardingMetametricsInfuraTermsPolicy": { "message": "Política de privacidad" }, - "onboardingMetametricsModalTitle": { - "message": "Agregar red personalizada" - }, "onboardingMetametricsNeverCollect": { "message": "Se almacenan los clics y las visualizaciones de $1 en la aplicación, pero no otros detalles (como su dirección pública).", "description": "$1 represents `onboardingMetametricsNeverCollectEmphasis`" @@ -3575,9 +3523,6 @@ "onekey": { "message": "OneKey" }, - "onlyAddTrustedNetworks": { - "message": "Un proveedor de red malintencionado puede mentir sobre el estado de la cadena de bloques y registrar su actividad de red. Agregue solo redes personalizadas de confianza." - }, "onlyConnectTrust": { "message": "Conéctese solo con sitios de confianza. $1", "description": "Text displayed above the buttons for connection confirmation. $1 is the link to the learn more web page." @@ -3602,9 +3547,6 @@ "optional": { "message": "Opcional" }, - "optionalWithParanthesis": { - "message": "(Opcional)" - }, "options": { "message": "Opciones" }, @@ -3956,9 +3898,6 @@ "message": "+ $1 más", "description": "$1 is a number of additional but unshown items in a list- this message will be shown in place of those items" }, - "popularCustomNetworks": { - "message": "Redes populares personalizadas" - }, "popularNetworkAddToolTip": { "message": "Algunas de estas redes dependen de terceros. Las conexiones pueden ser menos confiables o permitir que terceros realicen un seguimiento de la actividad. $1", "description": "$1 is Learn more link" @@ -5295,9 +5234,6 @@ "suggestedTokenName": { "message": "Nombre sugerido:" }, - "suggestedTokenSymbol": { - "message": "Símbolo de cotización sugerido:" - }, "support": { "message": "Soporte técnico" }, @@ -5786,9 +5722,6 @@ "termsOfUseTitle": { "message": "Nuestros Términos de uso han sido actualizados" }, - "testNetworks": { - "message": "Redes de prueba" - }, "theme": { "message": "Tema" }, @@ -6100,9 +6033,6 @@ "message": "U2F", "description": "A name on an API for the browser to interact with devices that support the U2F protocol. On some browsers we use it to connect MetaMask to Ledger devices." }, - "unMatchedChain": { - "message": "Según nuestros registros, esta URL no coincide con un proveedor conocido para este ID de cadena." - }, "unapproved": { "message": "No aprobado" }, @@ -6172,9 +6102,6 @@ "urlErrorMsg": { "message": "Las direcciones URL requieren el prefijo HTTP/HTTPS adecuado." }, - "urlExistsErrorMsg": { - "message": "En este momento, la red $1 está utilizando esta dirección URL." - }, "use4ByteResolution": { "message": "Decodificar contratos inteligentes" }, @@ -6384,9 +6311,6 @@ "whatsThis": { "message": "¿Qué es esto?" }, - "wrongChainId": { - "message": "Este ID de cadena no coincide con el nombre de la red." - }, "wrongNetworkName": { "message": "Según nuestros registros, es posible que el nombre de la red no coincida correctamente con este ID de cadena." }, @@ -6400,10 +6324,6 @@ "you": { "message": "Usted" }, - "youHaveAddedAll": { - "message": "Ha agregado todas las redes populares. Puede descubrir más redes $1 o puede $2", - "description": "$1 is a link with the text 'here' and $2 is a button with the text 'add more networks manually'" - }, "youNeedToAllowCameraAccess": { "message": "Necesita permitir el acceso a la cámara para usar esta función." }, diff --git a/app/_locales/es_419/messages.json b/app/_locales/es_419/messages.json index 1dd375450a81..1b8bc945343b 100644 --- a/app/_locales/es_419/messages.json +++ b/app/_locales/es_419/messages.json @@ -534,9 +534,6 @@ "delete": { "message": "Eliminar" }, - "deleteNetwork": { - "message": "¿Eliminar red?" - }, "description": { "message": "Descripción" }, @@ -1014,9 +1011,6 @@ "invalidAddressRecipient": { "message": "La dirección del destinatario no es válida" }, - "invalidBlockExplorerURL": { - "message": "Dirección URL del explorador de bloques no válida" - }, "invalidChainIdTooBig": { "message": "ID de cadena no válido. El identificador de cadena es demasiado grande." }, @@ -1263,9 +1257,6 @@ "networkNameTestnet": { "message": "Red de prueba" }, - "networkSettingsChainIdDescription": { - "message": "El ID de la cadena se usa para firmar transacciones. Debe coincidir con el ID de la cadena que devuelve la red. Puede escribir un número decimal o un número hexadecimal con el prefijo “0x”, pero el número se mostrará en decimal." - }, "networkStatus": { "message": "Estado de la red" }, @@ -1420,9 +1411,6 @@ "onboardingPinExtensionTitle": { "message": "¡Su instalación de MetaMask ha finalizado!" }, - "onlyAddTrustedNetworks": { - "message": "Un proveedor de red malintencionado puede mentir sobre el estado de la cadena de bloques y registrar su actividad de red. Agregue solo redes personalizadas de confianza." - }, "onlyConnectTrust": { "message": "Conéctese solo con sitios de confianza.", "description": "Text displayed above the buttons for connection confirmation. $1 is the link to the learn more web page." @@ -1434,9 +1422,6 @@ "optional": { "message": "Opcional" }, - "optionalWithParanthesis": { - "message": "(Opcional)" - }, "or": { "message": "o" }, @@ -2426,9 +2411,6 @@ "urlErrorMsg": { "message": "Las direcciones URL requieren el prefijo HTTP/HTTPS adecuado." }, - "urlExistsErrorMsg": { - "message": "En este momento, la red $1 está utilizando esta dirección URL." - }, "useNftDetection": { "message": "Autodetectar NFT" }, diff --git a/app/_locales/et/messages.json b/app/_locales/et/messages.json index 1e9bdffeb20e..acebcc9091da 100644 --- a/app/_locales/et/messages.json +++ b/app/_locales/et/messages.json @@ -205,9 +205,6 @@ "delete": { "message": "Kustuta" }, - "deleteNetwork": { - "message": "Võrk kustutada?" - }, "details": { "message": "Üksikasjad" }, @@ -347,9 +344,6 @@ "invalidAddressRecipient": { "message": "Saaja aadress on vale" }, - "invalidBlockExplorerURL": { - "message": "Vale Block Explorer URL" - }, "invalidRPC": { "message": "Vale RPC URL" }, diff --git a/app/_locales/fa/messages.json b/app/_locales/fa/messages.json index 8fe574e7a81a..c9c1bafdc7bf 100644 --- a/app/_locales/fa/messages.json +++ b/app/_locales/fa/messages.json @@ -205,9 +205,6 @@ "delete": { "message": "حذف" }, - "deleteNetwork": { - "message": "شبکه حذف شود؟" - }, "details": { "message": "جزئیات" }, @@ -351,9 +348,6 @@ "invalidAddressRecipient": { "message": "آدرس دریافت کننده نامعتبر است" }, - "invalidBlockExplorerURL": { - "message": "Block Explorer URL نا معتبر" - }, "invalidRPC": { "message": "RPC URL نا معتبر" }, diff --git a/app/_locales/fi/messages.json b/app/_locales/fi/messages.json index b69440707992..1c9cdb7c7a43 100644 --- a/app/_locales/fi/messages.json +++ b/app/_locales/fi/messages.json @@ -205,9 +205,6 @@ "delete": { "message": "Poista" }, - "deleteNetwork": { - "message": "Poistetaanko verkko?" - }, "details": { "message": "Tiedot" }, @@ -351,9 +348,6 @@ "invalidAddressRecipient": { "message": "Vastaanottajan osoite on virheellinen" }, - "invalidBlockExplorerURL": { - "message": "Virheellinen Block Explorer URL-osoite" - }, "invalidRPC": { "message": "Virheellinen RPC:n URL-osoite" }, diff --git a/app/_locales/fil/messages.json b/app/_locales/fil/messages.json index a437fb1e7100..e08c88bd7ffa 100644 --- a/app/_locales/fil/messages.json +++ b/app/_locales/fil/messages.json @@ -181,9 +181,6 @@ "delete": { "message": "I-delete" }, - "deleteNetwork": { - "message": "I-delete ang Network?" - }, "details": { "message": "Mga Detalye" }, @@ -308,9 +305,6 @@ "invalidAddressRecipient": { "message": "Hindi valid ang address ng recipient" }, - "invalidBlockExplorerURL": { - "message": "Hindi valid ang Block Explorer URL" - }, "invalidRPC": { "message": "Hindi valid ang RPC URL" }, diff --git a/app/_locales/fr/messages.json b/app/_locales/fr/messages.json index f376101c5b2d..eff9261237fa 100644 --- a/app/_locales/fr/messages.json +++ b/app/_locales/fr/messages.json @@ -183,9 +183,6 @@ "addANetwork": { "message": "Ajouter un réseau" }, - "addANetworkManually": { - "message": "Ajouter manuellement un réseau" - }, "addANickname": { "message": "Ajouter un pseudo" }, @@ -252,9 +249,6 @@ "addFriendsAndAddresses": { "message": "Ajoutez uniquement des amis et des adresses de confiance" }, - "addFromAListOfPopularNetworks": { - "message": "Ajoutez à partir d’une liste de réseaux populaires ou ajoutez un réseau manuellement. Interagissez uniquement avec les entités en lesquelles vous avez confiance." - }, "addHardwareWallet": { "message": "Ajouter un portefeuille matériel" }, @@ -267,16 +261,9 @@ "addMemo": { "message": "Ajouter un mémo" }, - "addMoreNetworks": { - "message": "ajouter manuellement d’autres réseaux" - }, "addNetwork": { "message": "Ajouter un réseau" }, - "addNetworkTooltipWarning": { - "message": "Cette connexion réseau repose sur des tiers. Elle peut être moins fiable ou permettre à des tiers de suivre l’activité des utilisateurs. $1", - "description": "$1 is Learn more link" - }, "addNewAccount": { "message": "Ajouter un nouveau compte Ethereum" }, @@ -1000,9 +987,6 @@ "confirmConnectionTitle": { "message": "Confirmer la connexion à $1" }, - "confirmDeletion": { - "message": "Confirmer la suppression" - }, "confirmFieldPaymaster": { "message": "Frais payés par" }, @@ -1015,9 +999,6 @@ "confirmRecoveryPhrase": { "message": "Confirmer la phrase secrète de récupération" }, - "confirmRpcUrlDeletionMessage": { - "message": "Voulez-vous vraiment supprimer l’URL du RPC ? Vos informations ne seront pas sauvegardées pour ce réseau." - }, "confirmTitleDescPermitSignature": { "message": "Ce site demande que vous lui accordiez l'autorisation de dépenser vos jetons." }, @@ -1368,9 +1349,6 @@ "custom": { "message": "Paramètres avancés" }, - "customContentSearch": { - "message": "Chercher un réseau ajouté précédemment" - }, "customGasSettingToolTipMessage": { "message": "Utilisez $1 pour personnaliser le prix du carburant. Cela peut porter à confusion si vous n’en avez pas l’habitude. Agissez avec prudence !", "description": "$1 is key 'advanced' (text: 'Advanced') separated here so that it can be passed in with bold font-weight" @@ -1490,9 +1468,6 @@ "deleteContact": { "message": "Supprimer le contact" }, - "deleteNetwork": { - "message": "Supprimer le réseau ?" - }, "deleteNetworkIntro": { "message": "Si vous supprimez ce réseau, vous devrez l’ajouter à nouveau pour voir vos actifs sur ce réseau" }, @@ -1500,9 +1475,6 @@ "message": "Supprimer le réseau $1 ?", "description": "$1 represents the name of the network" }, - "deleteRpcUrl": { - "message": "Supprimer l’URL du RPC" - }, "deposit": { "message": "Effectuez un dépôt" }, @@ -1867,9 +1839,6 @@ "existingRequestsBannerAlertDesc": { "message": "Pour afficher et confirmer votre demande la plus récente, vous devez d’abord approuver ou rejeter les demandes existantes." }, - "existingRpcUrl": { - "message": "Cette URL est associée à un autre ID de chaîne." - }, "expandView": { "message": "Agrandir la vue" }, @@ -1901,9 +1870,6 @@ "failedToFetchChainId": { "message": "Impossible de récupérer l’ID de la chaîne. Votre URL de RPC est-elle correcte ?" }, - "failedToFetchTickerSymbolData": { - "message": "Les données de vérification de code mnémonique sont actuellement indisponibles. Assurez-vous que le code que vous avez saisi est correct. Il aura une incidence sur les taux de conversion que vous voyez pour ce réseau" - }, "failureMessage": { "message": "Un problème est survenu et nous n’avons pas pu mener à bien l’action" }, @@ -1924,9 +1890,6 @@ "message": "L’importation de fichier ne fonctionne pas ? Cliquez ici !", "description": "Helps user import their account from a JSON file" }, - "findTheRightChainId": { - "message": "Trouvez le bon ID de chaîne sur :" - }, "flaskWelcomeUninstall": { "message": "vous devriez désinstaller cette extension", "description": "This request is shown on the Flask Welcome screen. It is intended for non-developers, and will be bolded." @@ -2416,9 +2379,6 @@ "invalidAssetType": { "message": "Cet actif est un NFT et doit être ajouté de nouveau à la page Importer des NFT qui se trouve sous l’onglet NFT" }, - "invalidBlockExplorerURL": { - "message": "L’URL de l’explorateur de blocs est invalide" - }, "invalidChainIdTooBig": { "message": "ID de chaîne invalide. L’ID de la chaîne est trop grand." }, @@ -2938,9 +2898,6 @@ "network": { "message": "Réseau :" }, - "networkAddedSuccessfully": { - "message": "Réseau ajouté avec succès !" - }, "networkDetails": { "message": "Détails du réseau" }, @@ -3001,9 +2958,6 @@ "networkProvider": { "message": "Fournisseur de réseau" }, - "networkSettingsChainIdDescription": { - "message": "L’ID de la chaîne est utilisé pour la signature des transactions. Il doit correspondre à l’ID de la chaîne renvoyé par le réseau. Vous pouvez saisir un numéro décimal ou hexadécimal avec le préfixe « 0x », mais nous afficherons le numéro en décimal." - }, "networkStatus": { "message": "Statut du réseau" }, @@ -3452,9 +3406,6 @@ "onboardingAdvancedPrivacyIPFSValid": { "message": "L’URL de la passerelle IPFS est valide" }, - "onboardingAdvancedPrivacyNetworkButton": { - "message": "Ajouter un réseau personnalisé" - }, "onboardingAdvancedPrivacyNetworkDescription": { "message": "Nous utilisons Infura comme fournisseur de RPC (Remote Procedure Call) pour vous fournir l’accès le plus fiable et le plus privé possible aux données Ethereum. Vous pouvez choisir votre propre RPC, mais n’oubliez pas que tout RPC a besoin d’accéder à votre adresse IP et à l’adresse de votre portefeuille Ethereum pour valider les transactions. Lisez notre $1 pour en savoir plus sur la façon dont Infura traite les données personnelles." }, @@ -3483,9 +3434,6 @@ "onboardingMetametricsInfuraTermsPolicy": { "message": "Politique de confidentialité" }, - "onboardingMetametricsModalTitle": { - "message": "Ajouter un réseau personnalisé" - }, "onboardingMetametricsNeverCollect": { "message": "$1 les clics et les contenus visualisés sur l’application sont enregistrés, mais d’autres renseignements (comme votre adresse publique) ne le sont pas.", "description": "$1 represents `onboardingMetametricsNeverCollectEmphasis`" @@ -3578,9 +3526,6 @@ "onekey": { "message": "OneKey" }, - "onlyAddTrustedNetworks": { - "message": "Un fournisseur de réseau malveillant peut mentir quant à l’état de la blockchain et enregistrer votre activité réseau. N’ajoutez que des réseaux personnalisés auxquels vous faites confiance." - }, "onlyConnectTrust": { "message": "Ne vous connectez qu’aux sites auxquels vous faites confiance. $1", "description": "Text displayed above the buttons for connection confirmation. $1 is the link to the learn more web page." @@ -3605,9 +3550,6 @@ "optional": { "message": "Facultatif" }, - "optionalWithParanthesis": { - "message": "(Facultatif)" - }, "options": { "message": "Options" }, @@ -3959,9 +3901,6 @@ "message": "+ $1 de plus", "description": "$1 is a number of additional but unshown items in a list- this message will be shown in place of those items" }, - "popularCustomNetworks": { - "message": "Réseaux personnalisés populaires" - }, "popularNetworkAddToolTip": { "message": "Certains de ces réseaux dépendent de services tiers. Ils peuvent être moins fiables ou permettre à des tiers de suivre l’activité des utilisateurs. $1", "description": "$1 is Learn more link" @@ -5298,9 +5237,6 @@ "suggestedTokenName": { "message": "Nom suggéré :" }, - "suggestedTokenSymbol": { - "message": "Symbole boursier suggéré :" - }, "support": { "message": "Assistance" }, @@ -5789,9 +5725,6 @@ "termsOfUseTitle": { "message": "Nos conditions d’utilisation ont été mises à jour" }, - "testNetworks": { - "message": "Réseaux de test" - }, "theme": { "message": "Thème" }, @@ -6103,9 +6036,6 @@ "message": "U2F", "description": "A name on an API for the browser to interact with devices that support the U2F protocol. On some browsers we use it to connect MetaMask to Ledger devices." }, - "unMatchedChain": { - "message": "Selon nos informations, cette URL ne correspond pas à celle d’un fournisseur connu pour cet ID de chaîne." - }, "unapproved": { "message": "Non autorisé" }, @@ -6175,9 +6105,6 @@ "urlErrorMsg": { "message": "Les URLs requièrent un préfixe HTTP/HTTPS approprié." }, - "urlExistsErrorMsg": { - "message": "Cette URL est actuellement utilisée par le réseau $1." - }, "use4ByteResolution": { "message": "Décoder les contrats intelligents" }, @@ -6387,9 +6314,6 @@ "whatsThis": { "message": "Qu’est-ce que c’est ?" }, - "wrongChainId": { - "message": "Cet ID de chaîne ne correspond pas au nom du réseau." - }, "wrongNetworkName": { "message": "Selon nos informations, il se peut que le nom du réseau ne corresponde pas exactement à l’ID de chaîne." }, @@ -6403,10 +6327,6 @@ "you": { "message": "Vous" }, - "youHaveAddedAll": { - "message": "Vous avez ajouté tous les réseaux populaires. Vous pouvez découvrir d’autres réseaux $1 ou $2", - "description": "$1 is a link with the text 'here' and $2 is a button with the text 'add more networks manually'" - }, "youNeedToAllowCameraAccess": { "message": "Vous devez autoriser l’accès à votre appareil pour utiliser cette fonctionnalité." }, diff --git a/app/_locales/he/messages.json b/app/_locales/he/messages.json index b255bd0310c4..9d118e31c098 100644 --- a/app/_locales/he/messages.json +++ b/app/_locales/he/messages.json @@ -205,9 +205,6 @@ "delete": { "message": "מחיקה" }, - "deleteNetwork": { - "message": "למחוק את הרשת?" - }, "details": { "message": "פרטים" }, @@ -351,9 +348,6 @@ "invalidAddressRecipient": { "message": "כתובת הנמען אינה חוקית" }, - "invalidBlockExplorerURL": { - "message": "כתובת URL לא חוקית של Block Explorer" - }, "invalidRPC": { "message": "כתובת URL לא חוקית של RPC" }, diff --git a/app/_locales/hi/messages.json b/app/_locales/hi/messages.json index cff9295abc33..a41bda8439cc 100644 --- a/app/_locales/hi/messages.json +++ b/app/_locales/hi/messages.json @@ -183,9 +183,6 @@ "addANetwork": { "message": "एक नेटवर्क जोड़ें" }, - "addANetworkManually": { - "message": "मैन्युअल रूप से नेटवर्क जोड़ें" - }, "addANickname": { "message": "एक उपनाम जोड़ें" }, @@ -252,9 +249,6 @@ "addFriendsAndAddresses": { "message": "उन मित्रों और पतों को जोड़ें, जिन पर आप भरोसा करते हैं" }, - "addFromAListOfPopularNetworks": { - "message": "पॉपुलर नेटवर्क की लिस्ट से जोड़ें या मैन्युअल रूप से नेटवर्क जोड़ें। केवल उन संस्थाओं के साथ संवाद करें जिन पर आप भरोसा करते हैं।" - }, "addHardwareWallet": { "message": "hardware wallet जोड़ें" }, @@ -267,16 +261,9 @@ "addMemo": { "message": "मेमो जोड़ें" }, - "addMoreNetworks": { - "message": "मैन्युअल रूप से अधिक नेटवर्क जोड़ें" - }, "addNetwork": { "message": "नेटवर्क जोड़ें" }, - "addNetworkTooltipWarning": { - "message": "यह नेटवर्क कनेक्शन थर्ड पार्टियों पर निर्भर करता है। यह कनेक्शन संभवतः कम विश्वसनीय है या थर्ड-पार्टियों को एक्टिविटी को ट्रैक करने के लिए इनेबल कर सकता है। $1", - "description": "$1 is Learn more link" - }, "addNewAccount": { "message": "एक नया Ethereum अकाउंट जोड़ें" }, @@ -1000,9 +987,6 @@ "confirmConnectionTitle": { "message": "$1 से कनेक्शन को कन्फर्म करें" }, - "confirmDeletion": { - "message": "हटाना कन्फर्म करें" - }, "confirmFieldPaymaster": { "message": "के द्वारा शुल्क का भुगतान किया गया" }, @@ -1015,9 +999,6 @@ "confirmRecoveryPhrase": { "message": "सीक्रेट रिकवरी फ्रेज कन्फर्म करें" }, - "confirmRpcUrlDeletionMessage": { - "message": "क्या आप वाकई RPC URL को हटाना चाहते हैं? आपकी जानकारी इस नेटवर्क के लिए सेव नहीं की जाएगी।" - }, "confirmTitleDescPermitSignature": { "message": "यह साइट आपके टोकन खर्च करने की अनुमति चाहती है।" }, @@ -1368,9 +1349,6 @@ "custom": { "message": "एडवांस्ड" }, - "customContentSearch": { - "message": "पहले से जुड़े हुए नेटवर्क के लिए खोजें" - }, "customGasSettingToolTipMessage": { "message": "गैस प्राइस को कस्टमाइज़ करने के लिए $1 का इस्तेमाल करें। यदि आपको इसकी जानकारी नहीं हैं तो ये कंफ्यूज़ करने वाला हो सकता है। अपनी ज़िम्मेदारी पर इंटरैक्ट करें।", "description": "$1 is key 'advanced' (text: 'Advanced') separated here so that it can be passed in with bold font-weight" @@ -1490,9 +1468,6 @@ "deleteContact": { "message": "कॉन्टेक्ट मिटाएं" }, - "deleteNetwork": { - "message": "नेटवर्क हटाएं?" - }, "deleteNetworkIntro": { "message": "अगर आप इस नेटवर्क को हटाते हैं, तो आपको इस नेटवर्क में अपने एसेट देखने के लिए इसे फिर से जोड़ना होगा" }, @@ -1500,9 +1475,6 @@ "message": "$1 नेटवर्क को हटाएं?", "description": "$1 represents the name of the network" }, - "deleteRpcUrl": { - "message": "RPC URL को हटाएं" - }, "deposit": { "message": "डिपॉज़िट करें" }, @@ -1867,9 +1839,6 @@ "existingRequestsBannerAlertDesc": { "message": "अपने सबसे हालिया अनुरोध को देखने और कन्फर्म करने के लिए, आपको पहले मौजूदा अनुरोधों को एप्रूव या रिजेक्ट करना होगा।" }, - "existingRpcUrl": { - "message": "यह URL किसी अन्य चेन ID से जुड़ा है।" - }, "expandView": { "message": "व्यू को बड़ा करें" }, @@ -1901,9 +1870,6 @@ "failedToFetchChainId": { "message": "चेन ID प्राप्त नहीं की जा सकी। क्या आपका RPC URL सही है?" }, - "failedToFetchTickerSymbolData": { - "message": "टिकर सिंबल वेरिफिकेशन डेटा वर्तमान में अनुपलब्ध है, पक्का करें कि आपने जो चिन्ह डाला है वह सही है। ये उन कन्वर्शन दरों को प्रभावित करेगा जो आपको इस नेटवर्क के लिए दिख रहे हैं" - }, "failureMessage": { "message": "कुछ गलत हुआ और हम एक्शन को पूरा नहीं कर सकें" }, @@ -1924,9 +1890,6 @@ "message": "फाइल इम्पोर्ट काम नहीं कर रहा है? यहां क्लिक करें!", "description": "Helps user import their account from a JSON file" }, - "findTheRightChainId": { - "message": "यहां पर सही खोजें:" - }, "flaskWelcomeUninstall": { "message": "आपको इस एक्सटेन्शन को अनइंस्टाल करना चाहिए", "description": "This request is shown on the Flask Welcome screen. It is intended for non-developers, and will be bolded." @@ -2416,9 +2379,6 @@ "invalidAssetType": { "message": "ये एसेट एक NFT है और इसे इंपोर्ट NFTज़ पेज पर फिर से जोड़ना होगा जो NFTज़ टैब के नीचे मिलेगा" }, - "invalidBlockExplorerURL": { - "message": "ग़लत ब्लॉक एक्सप्लोरर URL" - }, "invalidChainIdTooBig": { "message": "ग़लत चेन ID। चेन ID बहुत बड़ी है।" }, @@ -2938,9 +2898,6 @@ "network": { "message": "नेटवर्क:" }, - "networkAddedSuccessfully": { - "message": "नेटवर्क सफलतापूर्वक जोड़ा गया!" - }, "networkDetails": { "message": "नेटवर्क विवरण" }, @@ -3001,9 +2958,6 @@ "networkProvider": { "message": "नेटवर्क प्रोवाइडर" }, - "networkSettingsChainIdDescription": { - "message": "चेन ID का इस्तेमाल ट्रांसेक्शन पर हस्ताक्षर करने के लिए किया जाता है। इसे नेटवर्क द्वारा दी गई चेन ID से मेल खाना चाहिए। आप डेसीमल या '0x'-प्रीफिक्स्ड वाली हेक्साडेसिमल संख्या डाल सकते हैं, लेकिन हम संख्या को डेसीमल में दिखाएंगे।" - }, "networkStatus": { "message": "नेटवर्क का स्टेटस" }, @@ -3452,9 +3406,6 @@ "onboardingAdvancedPrivacyIPFSValid": { "message": "IPFS गेटवे URL मान्य है" }, - "onboardingAdvancedPrivacyNetworkButton": { - "message": "कस्टम नेटवर्क जोड़ें" - }, "onboardingAdvancedPrivacyNetworkDescription": { "message": "हम अपने रिमोट प्रोसीजर कॉल (RPC) प्रोवाइडर के रूप में Infura का इस्तेमाल करते हैं ताकि हम Ethereum डेटा तक सबसे विश्वसनीय और निजी ऐक्सेस प्रदान कर सकें। आप अपना स्वयं का RPC चुन सकते हैं, लेकिन याद रखें कि कोई भी RPC ट्रांसेक्शन करने के लिए आपका IP एड्रेस और Ethereum वॉलेट प्राप्त करेगा। Infura डेटा को कैसे प्रबंधित करता है, इस बारे में अधिक जानने के लिए हमारा $1 पढ़ें।" }, @@ -3483,9 +3434,6 @@ "onboardingMetametricsInfuraTermsPolicy": { "message": "गोपनीयता नीति" }, - "onboardingMetametricsModalTitle": { - "message": "कस्टम नेटवर्क जोड़ें" - }, "onboardingMetametricsNeverCollect": { "message": "ऐप पर $1 क्लिक और व्यूज़ स्टोर किए जाते हैं, लेकिन अन्य विवरण (जैसे आपका पब्लिक एड्रेस) स्टोर नहीं होते।", "description": "$1 represents `onboardingMetametricsNeverCollectEmphasis`" @@ -3578,9 +3526,6 @@ "onekey": { "message": "OneKey" }, - "onlyAddTrustedNetworks": { - "message": "एक बुरी नीयत वाला नेटवर्क प्रोवाइडर ब्लॉकचेन की स्थिति के बारे में झूठ बोल सकता है और आपकी नेटवर्क एक्टिविटी को रिकॉर्ड कर सकता है। केवल उन कस्टम नेटवर्क को जोड़ें, जिन पर आप भरोसा करते हैं।" - }, "onlyConnectTrust": { "message": "केवल उन साइटों से कनेक्ट करें, जिन पर आप भरोसा करते हैं। $1", "description": "Text displayed above the buttons for connection confirmation. $1 is the link to the learn more web page." @@ -3605,9 +3550,6 @@ "optional": { "message": "वैकल्पिक" }, - "optionalWithParanthesis": { - "message": "(वैकल्पिक)" - }, "options": { "message": "विकल्प" }, @@ -3959,9 +3901,6 @@ "message": "+ $1 अधिक", "description": "$1 is a number of additional but unshown items in a list- this message will be shown in place of those items" }, - "popularCustomNetworks": { - "message": "पॉपुलर कस्टम नेटवर्क" - }, "popularNetworkAddToolTip": { "message": "इनमें से कुछ नेटवर्क थर्ड पार्टीज़ पर निर्भर हैं। कनेक्शन कम विश्वसनीय हो सकते हैं या गतिविधि को ट्रैक करने के लिए थर्ड पार्टीज़ को चालू कर सकते हैं। $1", "description": "$1 is Learn more link" @@ -5298,9 +5237,6 @@ "suggestedTokenName": { "message": "सुझाया गया नाम:" }, - "suggestedTokenSymbol": { - "message": "सुझाया गया टिकर सिंबल:" - }, "support": { "message": "सहायता" }, @@ -5789,9 +5725,6 @@ "termsOfUseTitle": { "message": "हमारी इस्तेमाल की शर्तों को अपडेट कर दिया गया है" }, - "testNetworks": { - "message": "टेस्ट नेटवर्क्स" - }, "theme": { "message": "थीम" }, @@ -6103,9 +6036,6 @@ "message": "U2F", "description": "A name on an API for the browser to interact with devices that support the U2F protocol. On some browsers we use it to connect MetaMask to Ledger devices." }, - "unMatchedChain": { - "message": "हमारे रिकॉर्ड के अनुसार, यह URL इस चेन ID के लिए ज्ञात प्रदाता से मेल नहीं खाता है।" - }, "unapproved": { "message": "रिजेक्ट" }, @@ -6175,9 +6105,6 @@ "urlErrorMsg": { "message": "URL को उपयुक्त HTTP/HTTPS प्रीफिक्स्ड की आवश्यकता होती है।" }, - "urlExistsErrorMsg": { - "message": "यह URL वर्तमान में $1 नेटवर्क द्वारा इस्तेमाल किया जाता है।" - }, "use4ByteResolution": { "message": "स्मार्ट कॉन्ट्रैक्ट्स को डीकोड करें" }, @@ -6387,9 +6314,6 @@ "whatsThis": { "message": "यह क्या है?" }, - "wrongChainId": { - "message": "यह चेन ID नेटवर्क के नाम से मेल नहीं खाती।" - }, "wrongNetworkName": { "message": "हमारे रिकॉर्ड के अनुसार, नेटवर्क का नाम इस चेन ID से ठीक से मेल नहीं खा सकता है।" }, @@ -6403,10 +6327,6 @@ "you": { "message": "आप" }, - "youHaveAddedAll": { - "message": "आपने सभी पॉपुलर नेटवर्क जोड़ लिए हैं। आप अधिक नेटवर्क खोज सकते हैं $1 या आप $2 कर सकते हैं", - "description": "$1 is a link with the text 'here' and $2 is a button with the text 'add more networks manually'" - }, "youNeedToAllowCameraAccess": { "message": "आपको इस सुविधा का इस्तेमाल करने के लिए कैमरे तक पहुंच की अनुमति देने की आवश्यकता है।" }, diff --git a/app/_locales/hn/messages.json b/app/_locales/hn/messages.json index 246c9c88d5bc..8e9091f911db 100644 --- a/app/_locales/hn/messages.json +++ b/app/_locales/hn/messages.json @@ -143,9 +143,6 @@ "invalidAddressRecipient": { "message": "प्राप्तकर्ता का पता अमान्य है" }, - "invalidBlockExplorerURL": { - "message": "अमान्य Block Explorer कै URI" - }, "invalidRPC": { "message": "अमान्य RPC कै URI" }, diff --git a/app/_locales/hr/messages.json b/app/_locales/hr/messages.json index b8e1c9bf15c1..4463408d9435 100644 --- a/app/_locales/hr/messages.json +++ b/app/_locales/hr/messages.json @@ -205,9 +205,6 @@ "delete": { "message": "Izbriši" }, - "deleteNetwork": { - "message": "Izbrisati mrežu?" - }, "details": { "message": "Detalji" }, @@ -347,9 +344,6 @@ "invalidAddressRecipient": { "message": "Adresa primatelja nije valjana" }, - "invalidBlockExplorerURL": { - "message": "Nevaljani URL Block Explorer-a" - }, "invalidRPC": { "message": "Nevaljani URL RPC-a" }, diff --git a/app/_locales/ht/messages.json b/app/_locales/ht/messages.json index 879eeab1722d..700f6debed18 100644 --- a/app/_locales/ht/messages.json +++ b/app/_locales/ht/messages.json @@ -236,9 +236,6 @@ "invalidAddressRecipient": { "message": "Moun ki resevwa adrès la pa valab" }, - "invalidBlockExplorerURL": { - "message": "Block Explorer URI pa valab" - }, "invalidRPC": { "message": "RPC URI pa valab" }, diff --git a/app/_locales/hu/messages.json b/app/_locales/hu/messages.json index eef301ef9273..4786cfb9703d 100644 --- a/app/_locales/hu/messages.json +++ b/app/_locales/hu/messages.json @@ -205,9 +205,6 @@ "delete": { "message": "Törlés" }, - "deleteNetwork": { - "message": "Törli a hálózatot?" - }, "details": { "message": "Részletek" }, @@ -347,9 +344,6 @@ "invalidAddressRecipient": { "message": "A címzett címe érvénytelen " }, - "invalidBlockExplorerURL": { - "message": "Helytelen Block Explorer URL" - }, "invalidRPC": { "message": "Helytelen RPC URL" }, diff --git a/app/_locales/id/messages.json b/app/_locales/id/messages.json index 8e2437d8c2bf..b13602011b99 100644 --- a/app/_locales/id/messages.json +++ b/app/_locales/id/messages.json @@ -183,9 +183,6 @@ "addANetwork": { "message": "Tambahkan jaringan" }, - "addANetworkManually": { - "message": "Tambahkan jaringan secara manual" - }, "addANickname": { "message": "Tambahkan nama panggilan" }, @@ -252,9 +249,6 @@ "addFriendsAndAddresses": { "message": "Tambahkan teman dan alamat yang Anda percayai" }, - "addFromAListOfPopularNetworks": { - "message": "Tambahkan dari daftar jaringan populer atau tambahkan jaringan secara manual. Lakukan interaksi hanya dengan entitas yang Anda percayai." - }, "addHardwareWallet": { "message": "Tambahkan dompet perangkat keras" }, @@ -267,16 +261,9 @@ "addMemo": { "message": "Tambahkan memo" }, - "addMoreNetworks": { - "message": "tambahkan jaringan lainnya secara manual" - }, "addNetwork": { "message": "Tambahkan jaringan" }, - "addNetworkTooltipWarning": { - "message": "Koneksi jaringan ini mengandalkan pihak ketiga. Koneksi ini mungkin kurang bisa diandalkan atau memungkinkan pihak ketiga melacak aktivitas. $1", - "description": "$1 is Learn more link" - }, "addNewAccount": { "message": "Tambahkan akun Ethereum baru" }, @@ -1000,9 +987,6 @@ "confirmConnectionTitle": { "message": "Konfirmasikan koneksi ke $1" }, - "confirmDeletion": { - "message": "Konfirmasikan penghapusan" - }, "confirmFieldPaymaster": { "message": "Biaya dibayar oleh" }, @@ -1015,9 +999,6 @@ "confirmRecoveryPhrase": { "message": "Konfirmasikan Frasa Pemulihan Rahasia" }, - "confirmRpcUrlDeletionMessage": { - "message": "Yakin ingin menghapus URL RPC? Informasi Anda tidak akan disimpan untuk jaringan ini." - }, "confirmTitleDescPermitSignature": { "message": "Situs ini meminta izin untuk menggunakan token Anda." }, @@ -1368,9 +1349,6 @@ "custom": { "message": "Lanjutan" }, - "customContentSearch": { - "message": "Cari jaringan yang ditambahkan sebelumnya" - }, "customGasSettingToolTipMessage": { "message": "Gunakan $1 untuk menyesuaikan harga gas. Anda akan bingung jika tidak terbiasa. Berinteraksi dengan risiko Anda sendiri.", "description": "$1 is key 'advanced' (text: 'Advanced') separated here so that it can be passed in with bold font-weight" @@ -1490,9 +1468,6 @@ "deleteContact": { "message": "Hapus kontak" }, - "deleteNetwork": { - "message": "Hapus jaringan?" - }, "deleteNetworkIntro": { "message": "Jika menghapus jaringan ini, Anda harus menambahkannya lagi untuk melihat aset Anda di jaringan ini" }, @@ -1500,9 +1475,6 @@ "message": "Hapus jaringan $1?", "description": "$1 represents the name of the network" }, - "deleteRpcUrl": { - "message": "Hapus URL RPC" - }, "deposit": { "message": "Deposit" }, @@ -1867,9 +1839,6 @@ "existingRequestsBannerAlertDesc": { "message": "Untuk melihat dan mengonfirmasi permintaan terkini, Anda harus menyetujui atau menolak permintaan yang ada terlebih dahulu." }, - "existingRpcUrl": { - "message": "URL ini terhubung dengan ID chain lain." - }, "expandView": { "message": "Perluas tampilan" }, @@ -1901,9 +1870,6 @@ "failedToFetchChainId": { "message": "Tidak dapat mengambil ID chain. Apakah URL RPC Anda benar?" }, - "failedToFetchTickerSymbolData": { - "message": "Data verifikasi simbol ticker saat ini tidak tersedia, pastikan simbol yang Anda masukkan sudah benar. Ini akan memengaruhi tingkat konversi yang Anda lihat untuk jaringan ini" - }, "failureMessage": { "message": "Terjadi kesalahan dan kami tidak dapat menyelesaikan tindakan" }, @@ -1924,9 +1890,6 @@ "message": "Impor file tidak bekerja? Klik di sini!", "description": "Helps user import their account from a JSON file" }, - "findTheRightChainId": { - "message": "Temukan yang tepat di:" - }, "flaskWelcomeUninstall": { "message": "Anda harus menghapus ekstensi ini", "description": "This request is shown on the Flask Welcome screen. It is intended for non-developers, and will be bolded." @@ -2416,9 +2379,6 @@ "invalidAssetType": { "message": "Aset ini merupakan NFT dan harus ditambahkan kembali di halaman Impor NFT yang ada di bawah tab NFT" }, - "invalidBlockExplorerURL": { - "message": "URL block explorer tidak valid" - }, "invalidChainIdTooBig": { "message": "ID chain tidak valid. ID chain terlalu besar." }, @@ -2938,9 +2898,6 @@ "network": { "message": "Jaringan:" }, - "networkAddedSuccessfully": { - "message": "Jaringan berhasil ditambahkan!" - }, "networkDetails": { "message": "Detail jaringan" }, @@ -3001,9 +2958,6 @@ "networkProvider": { "message": "Penyedia jaringan" }, - "networkSettingsChainIdDescription": { - "message": "ID chain digunakan untuk menandatangani transaksi. Harus cocok dengan ID chain yang dikembalikan oleh jaringan. Anda dapat memasukkan bilangan heksadesimal berawalan '0x' atau desimal, namun kami akan menampilkan bilangan tersebut dalam desimal." - }, "networkStatus": { "message": "Status jaringan" }, @@ -3452,9 +3406,6 @@ "onboardingAdvancedPrivacyIPFSValid": { "message": "URL gateway IPFS valid" }, - "onboardingAdvancedPrivacyNetworkButton": { - "message": "Tambahkan jaringan khusus" - }, "onboardingAdvancedPrivacyNetworkDescription": { "message": "Kami menggunakan Infura sebagai penyedia pemanggilan prosedur jarak jauh (RPC) kami untuk menawarkan akses paling andal dan pribadi ke data Ethereum. Anda dapat memilih RPC Anda sendiri, tetapi ingatlah bahwa setiap RPC akan menerima alamat IP dan dompet Ethereum Anda untuk melakukan transaksi. Baca $1 kami untuk mempelajari lebih lanjut seputar cara Infura menangani data." }, @@ -3483,9 +3434,6 @@ "onboardingMetametricsInfuraTermsPolicy": { "message": "Kebijakan Privasi" }, - "onboardingMetametricsModalTitle": { - "message": "Tambahkan jaringan khusus" - }, "onboardingMetametricsNeverCollect": { "message": "$1 klik dan tampilan pada aplikasi disimpan, tetapi tidak untuk detail lainnya (seperti alamat publik).", "description": "$1 represents `onboardingMetametricsNeverCollectEmphasis`" @@ -3578,9 +3526,6 @@ "onekey": { "message": "OneKey" }, - "onlyAddTrustedNetworks": { - "message": "Penyedia jaringan jahat dapat berbohong tentang status blockchain dan merekam aktivitas jaringan Anda. Hanya tambahkan jaringan kustom yang Anda percayai." - }, "onlyConnectTrust": { "message": "Hanya hubungkan ke situs yang Anda percayai. $1", "description": "Text displayed above the buttons for connection confirmation. $1 is the link to the learn more web page." @@ -3605,9 +3550,6 @@ "optional": { "message": "Opsional" }, - "optionalWithParanthesis": { - "message": "(Opsional)" - }, "options": { "message": "Opsi" }, @@ -3959,9 +3901,6 @@ "message": "+ $1 lagi", "description": "$1 is a number of additional but unshown items in a list- this message will be shown in place of those items" }, - "popularCustomNetworks": { - "message": "Jaringan khusus populer" - }, "popularNetworkAddToolTip": { "message": "Beberapa jaringan ini mengandalkan pihak ketiga. Koneksi ini kurang dapat diandalkan atau memungkinkan pihak ketiga melacak aktivitas. $1", "description": "$1 is Learn more link" @@ -5298,9 +5237,6 @@ "suggestedTokenName": { "message": "Nama yang disarankan:" }, - "suggestedTokenSymbol": { - "message": "Simbol ticker yang disarankan:" - }, "support": { "message": "Dukungan" }, @@ -5789,9 +5725,6 @@ "termsOfUseTitle": { "message": "Syarat Penggunaan kami telah diperbarui" }, - "testNetworks": { - "message": "Jaringan pengujian" - }, "theme": { "message": " Saya menyetujui Ketentuan Penggunaan, yang berlaku untuk penggunaan atas MetaMask dan semua fiturnya" }, @@ -6103,9 +6036,6 @@ "message": "U2F", "description": "A name on an API for the browser to interact with devices that support the U2F protocol. On some browsers we use it to connect MetaMask to Ledger devices." }, - "unMatchedChain": { - "message": "Menurut catatan kami, URL ini tidak sesuai dengan penyedia yang dikenal untuk ID chain ini." - }, "unapproved": { "message": "Tidak disetujui" }, @@ -6175,9 +6105,6 @@ "urlErrorMsg": { "message": "URL memerlukan awalan HTTP/HTTPS yang sesuai." }, - "urlExistsErrorMsg": { - "message": "URL ini saat ini digunakan oleh jaringan $1." - }, "use4ByteResolution": { "message": "Uraikan kode kontrak cerdas" }, @@ -6387,9 +6314,6 @@ "whatsThis": { "message": "Apa ini?" }, - "wrongChainId": { - "message": "ID chain ini tidak sesuai dengan nama jaringan." - }, "wrongNetworkName": { "message": "Menurut catatan kami, nama jaringan mungkin tidak cocok dengan ID chain ini." }, @@ -6403,10 +6327,6 @@ "you": { "message": "Anda" }, - "youHaveAddedAll": { - "message": "Anda telah menambahkan semua jaringan populer. Anda dapat menemukan lebih banyak jaringan $1 atau dapat $2", - "description": "$1 is a link with the text 'here' and $2 is a button with the text 'add more networks manually'" - }, "youNeedToAllowCameraAccess": { "message": "Anda harus mengizinkan akses kamera untuk menggunakan fitur ini." }, diff --git a/app/_locales/it/messages.json b/app/_locales/it/messages.json index 2cd696e5b5ba..7c413941da92 100644 --- a/app/_locales/it/messages.json +++ b/app/_locales/it/messages.json @@ -137,9 +137,6 @@ "addANetwork": { "message": "Aggiungi una rete" }, - "addANetworkManually": { - "message": "Aggungi manualmente una rete" - }, "addANickname": { "message": "Aggiungo un nickname" }, @@ -175,22 +172,12 @@ "addFriendsAndAddresses": { "message": "Aggiungi amici e indirizzi di cui ti fidi" }, - "addFromAListOfPopularNetworks": { - "message": "Aggiungi da un elenco di reti popolari o aggiungi una rete manualmente. Interagisci solo con le entità di cui ti fidi." - }, "addMemo": { "message": "Aggiungi memo" }, - "addMoreNetworks": { - "message": "aggiungi più reti manualmente" - }, "addNetwork": { "message": "Aggiungi Rete" }, - "addNetworkTooltipWarning": { - "message": "Questarete si basa su terze parti. La connessione potrebbe essere meno affidabile o consentire a terzi di tracciare le tue attività. $1", - "description": "$1 is Learn more link" - }, "addSuggestedTokens": { "message": "Aggiungi Token Suggeriti" }, @@ -588,9 +575,6 @@ "custom": { "message": "Avanzate" }, - "customContentSearch": { - "message": "Cerca una rete aggiunta in precedenza" - }, "customGasSettingToolTipMessage": { "message": "Usa $1 per personalizzare il prezzo del gas. Questo può creare confusione se non hai familiarità. Interagisci a tuo rischio.", "description": "$1 is key 'advanced' (text: 'Advanced') separated here so that it can be passed in with bold font-weight" @@ -662,9 +646,6 @@ "delete": { "message": "Elimina" }, - "deleteNetwork": { - "message": "Cancella la rete?" - }, "description": { "message": "Descrizione" }, @@ -952,9 +933,6 @@ "invalidAddressRecipient": { "message": "Indirizzo destinatario invalido" }, - "invalidBlockExplorerURL": { - "message": "URI Block Explorer invalido" - }, "invalidChainIdTooBig": { "message": "Chain ID non valido. Il chain ID è troppo grande." }, @@ -1076,9 +1054,6 @@ "networkName": { "message": "Nome Rete" }, - "networkSettingsChainIdDescription": { - "message": "Il chain ID è usato per firmare le transazioni. Deve essere uguale al chain ID restituito dalla rete. Puoi inserire un numero intero o un numero esadecimale con prefisso '0x', ma mostreremo sempre un numero intero." - }, "networks": { "message": "Reti" }, @@ -1144,9 +1119,6 @@ "offlineForMaintenance": { "message": "Offline per manutenzione" }, - "onlyAddTrustedNetworks": { - "message": "Una rete malevola può mentire sullo stato della blockchain e registrare le tue azioni. Aggiungi solo reti fidate." - }, "onlyConnectTrust": { "message": "Connettiti solo con siti di cui ti fidi.", "description": "Text displayed above the buttons for connection confirmation. $1 is the link to the learn more web page." @@ -1732,9 +1704,6 @@ "urlErrorMsg": { "message": "Gli URI richiedono un prefisso HTTP/HTTPS." }, - "urlExistsErrorMsg": { - "message": "L'URL è già presente nella lista di reti" - }, "usePhishingDetection": { "message": "Rilevamento del Phishing" }, diff --git a/app/_locales/ja/messages.json b/app/_locales/ja/messages.json index e1ca82a04a42..8d006fef2257 100644 --- a/app/_locales/ja/messages.json +++ b/app/_locales/ja/messages.json @@ -183,9 +183,6 @@ "addANetwork": { "message": "ネットワークを追加" }, - "addANetworkManually": { - "message": "ネットワークを手動で追加" - }, "addANickname": { "message": "ニックネームを追加" }, @@ -252,9 +249,6 @@ "addFriendsAndAddresses": { "message": "信頼できる友達とアドレスを追加する" }, - "addFromAListOfPopularNetworks": { - "message": "人気のネットワークのリストから追加するか、ネットワークを手動で追加します。信頼できる相手と以外はやり取りしないようにしてください。" - }, "addHardwareWallet": { "message": "ハードウェアウォレットを追加" }, @@ -267,16 +261,9 @@ "addMemo": { "message": "メモを追加" }, - "addMoreNetworks": { - "message": "他のネットワークを手動で追加" - }, "addNetwork": { "message": "ネットワークを追加" }, - "addNetworkTooltipWarning": { - "message": "このネットワーク接続はサードパーティに依存しているため、信頼性が低かったり、サードパーティによるアクティビティの追跡が可能になる可能性があります。$1", - "description": "$1 is Learn more link" - }, "addNewAccount": { "message": "新しいイーサリアムアカウントを追加" }, @@ -1000,9 +987,6 @@ "confirmConnectionTitle": { "message": "$1への接続の確定" }, - "confirmDeletion": { - "message": "削除の確定" - }, "confirmFieldPaymaster": { "message": "手数料の支払元" }, @@ -1015,9 +999,6 @@ "confirmRecoveryPhrase": { "message": "シークレットリカバリーフレーズの確認" }, - "confirmRpcUrlDeletionMessage": { - "message": "RPC URLを削除してよろしいですか?このネットワークの情報は保存されません。" - }, "confirmTitleDescPermitSignature": { "message": "このサイトがトークンの使用許可を求めています。" }, @@ -1368,9 +1349,6 @@ "custom": { "message": "高度な設定" }, - "customContentSearch": { - "message": "以前追加されたネットワークを検索" - }, "customGasSettingToolTipMessage": { "message": "ガス価格をカスタマイズするには$1を使用します。慣れていない場合はわかりにくい可能性があります。自己責任で操作してください。", "description": "$1 is key 'advanced' (text: 'Advanced') separated here so that it can be passed in with bold font-weight" @@ -1490,9 +1468,6 @@ "deleteContact": { "message": "連絡先を削除" }, - "deleteNetwork": { - "message": "ネットワークを削除しますか?" - }, "deleteNetworkIntro": { "message": "このネットワークを削除した場合、このネットワーク内の資産を見るには、再度ネットワークの追加が必要になります。" }, @@ -1500,9 +1475,6 @@ "message": "$1ネットワークを削除しますか?", "description": "$1 represents the name of the network" }, - "deleteRpcUrl": { - "message": "RPC URLを削除" - }, "deposit": { "message": "入金" }, @@ -1867,9 +1839,6 @@ "existingRequestsBannerAlertDesc": { "message": "一番最近の要求を表示して確定するには、はじめに既存の要求を承認または拒否する必要があります。" }, - "existingRpcUrl": { - "message": "このURLは別のチェーンIDに関連付けられています。" - }, "expandView": { "message": "ビューを展開" }, @@ -1901,9 +1870,6 @@ "failedToFetchChainId": { "message": "チェーンIDを取り込むことができませんでした。お使いのRPC URLは正しいですか?" }, - "failedToFetchTickerSymbolData": { - "message": "ティッカーシンボルの検証データが現在利用できません。入力されたシンボルが正しいことを確認してください。これはこのネットワークの換算レートに影響を与えます" - }, "failureMessage": { "message": "問題が発生しました。アクションを完了させることができません" }, @@ -1924,9 +1890,6 @@ "message": "ファイルのインポートが機能していない場合、ここをクリックしてください!", "description": "Helps user import their account from a JSON file" }, - "findTheRightChainId": { - "message": "正しいIDを検索:" - }, "flaskWelcomeUninstall": { "message": "この拡張機能はアンインストールしてください", "description": "This request is shown on the Flask Welcome screen. It is intended for non-developers, and will be bolded." @@ -2416,9 +2379,6 @@ "invalidAssetType": { "message": "このアセットはNFTであるため、「NFT」タブの「NFTのインポート」ページで追加しなおす必要があります" }, - "invalidBlockExplorerURL": { - "message": "ブロックエクスプローラーのURLが無効です" - }, "invalidChainIdTooBig": { "message": "無効なチェーンID。チェーンIDが大きすぎます。" }, @@ -2938,9 +2898,6 @@ "network": { "message": "ネットワーク:" }, - "networkAddedSuccessfully": { - "message": "ネットワークが追加されました!" - }, "networkDetails": { "message": "ネットワークの詳細" }, @@ -3001,9 +2958,6 @@ "networkProvider": { "message": "ネットワークプロバイダー" }, - "networkSettingsChainIdDescription": { - "message": "チェーンIDはトランザクションの署名に使用されます。チェーンIDはネットワークが返すチェーンIDと一致する必要があります。10進数または「0x」が先行する16進数を入力できますが、10進数で表示されます。" - }, "networkStatus": { "message": "ネットワークステータス" }, @@ -3452,9 +3406,6 @@ "onboardingAdvancedPrivacyIPFSValid": { "message": "IPFSゲートウェイのURLが有効です" }, - "onboardingAdvancedPrivacyNetworkButton": { - "message": "カスタムネットワークを追加" - }, "onboardingAdvancedPrivacyNetworkDescription": { "message": "当社では、遠隔手続き呼び出し (RPC) プロバイダーにInfuraを使用して、イーサリアムデータにできるだけ信頼性の高いプライベートな形でアクセスできるようにしています。独自のRPCをお選びいただくこともできますが、どのRPCもトランザクションを実行するために、ユーザーのIPアドレスとイーサリアムウォレットを取得する点にご注意ください。Infuraによるデータの取扱いに関する詳細は、$1をご覧ください。" }, @@ -3483,9 +3434,6 @@ "onboardingMetametricsInfuraTermsPolicy": { "message": "プライバシー ポリシー" }, - "onboardingMetametricsModalTitle": { - "message": "カスタムネットワークを追加" - }, "onboardingMetametricsNeverCollect": { "message": "$1 アプリのクリックやビューは保存されますが、その他の詳細 (ユーザーのパブリックアドレスなど) は保存されません。", "description": "$1 represents `onboardingMetametricsNeverCollectEmphasis`" @@ -3578,9 +3526,6 @@ "onekey": { "message": "OneKey" }, - "onlyAddTrustedNetworks": { - "message": "悪意のあるネットワーク プロバイダーは、ブロックチェーンのステートを偽り、ユーザーのネットワークアクティビティを記録することがあります。信頼するカスタムネットワークのみを追加してください。" - }, "onlyConnectTrust": { "message": "信頼するサイトにのみ接続してください。$1", "description": "Text displayed above the buttons for connection confirmation. $1 is the link to the learn more web page." @@ -3605,9 +3550,6 @@ "optional": { "message": "オプション" }, - "optionalWithParanthesis": { - "message": "(オプション)" - }, "options": { "message": "オプション" }, @@ -3959,9 +3901,6 @@ "message": "その他$1件", "description": "$1 is a number of additional but unshown items in a list- this message will be shown in place of those items" }, - "popularCustomNetworks": { - "message": "人気のカスタムネットワーク" - }, "popularNetworkAddToolTip": { "message": "これらのネットワークの一部はサードパーティに依存しているため、接続の信頼性が低かったり、サードパーティによるアクティビティの追跡が可能になったりする可能性があります。$1", "description": "$1 is Learn more link" @@ -5298,9 +5237,6 @@ "suggestedTokenName": { "message": "提案された名前:" }, - "suggestedTokenSymbol": { - "message": "推奨ティッカーシンボル:" - }, "support": { "message": "サポート" }, @@ -5789,9 +5725,6 @@ "termsOfUseTitle": { "message": "利用規約が更新されました" }, - "testNetworks": { - "message": "テストネットワーク" - }, "theme": { "message": "テーマ" }, @@ -6103,9 +6036,6 @@ "message": "U2F", "description": "A name on an API for the browser to interact with devices that support the U2F protocol. On some browsers we use it to connect MetaMask to Ledger devices." }, - "unMatchedChain": { - "message": "当社の記録によると、このURLは、このチェーンIDの既知のプロバイダーと一致しません。" - }, "unapproved": { "message": "未承認" }, @@ -6175,9 +6105,6 @@ "urlErrorMsg": { "message": "URLには適切なHTTP/HTTPSプレフィックスが必要です。" }, - "urlExistsErrorMsg": { - "message": "このURLは現在$1ネットワークで使用されています。" - }, "use4ByteResolution": { "message": "スマートコントラクトのデコード" }, @@ -6387,9 +6314,6 @@ "whatsThis": { "message": "これは何ですか?" }, - "wrongChainId": { - "message": "このチェーンIDはネットワーク名と一致しません。" - }, "wrongNetworkName": { "message": "弊社の記録によると、ネットワーク名がこのチェーンIDと正しく一致していない可能性があります。" }, @@ -6403,10 +6327,6 @@ "you": { "message": "ユーザー" }, - "youHaveAddedAll": { - "message": "すべての人気ネットワークを追加しました。$1で他のネットワークを発見するか、$2できます。", - "description": "$1 is a link with the text 'here' and $2 is a button with the text 'add more networks manually'" - }, "youNeedToAllowCameraAccess": { "message": "この機能を使用するには、カメラへのアクセスを許可する必要があります。" }, diff --git a/app/_locales/kn/messages.json b/app/_locales/kn/messages.json index d5fe970b32e0..6471b738b5b9 100644 --- a/app/_locales/kn/messages.json +++ b/app/_locales/kn/messages.json @@ -205,9 +205,6 @@ "delete": { "message": "ಅಳಿಸಿ" }, - "deleteNetwork": { - "message": "ನೆಟ್‌ವರ್ಕ್ ಅಳಿಸುವುದೇ?" - }, "details": { "message": "ವಿವರಗಳು" }, @@ -351,9 +348,6 @@ "invalidAddressRecipient": { "message": "ಸ್ವೀಕೃತಿದಾರರ ವಿಳಾಸವು ಅಮಾನ್ಯವಾಗಿದೆ" }, - "invalidBlockExplorerURL": { - "message": "ಅಮಾನ್ಯವಾದ Block Explorer URL" - }, "invalidRPC": { "message": "ಅಮಾನ್ಯವಾದ RPC URL" }, diff --git a/app/_locales/ko/messages.json b/app/_locales/ko/messages.json index 2c36d6ad2f58..666d99d90b00 100644 --- a/app/_locales/ko/messages.json +++ b/app/_locales/ko/messages.json @@ -183,9 +183,6 @@ "addANetwork": { "message": "네트워크 추가" }, - "addANetworkManually": { - "message": "네트워크 직접 추가" - }, "addANickname": { "message": "닉네임 추가" }, @@ -252,9 +249,6 @@ "addFriendsAndAddresses": { "message": "신뢰하는 친구 및 주소 추가" }, - "addFromAListOfPopularNetworks": { - "message": "주요 네트워크 목록에서 추가하거나 네트워크를 직접 추가합니다. 신뢰할 수 있는 엔터티만 이용하세요." - }, "addHardwareWallet": { "message": "하드웨어 지갑 추가" }, @@ -267,16 +261,9 @@ "addMemo": { "message": "메모 추가" }, - "addMoreNetworks": { - "message": "네트워크 직접 추가" - }, "addNetwork": { "message": "네트워크 추가" }, - "addNetworkTooltipWarning": { - "message": "이 네트워크 연결은 타사 서비스를 이용합니다. 연결의 보안이 취약하거나 타사에 연결 내용이 노출될 수 있습니다. $1", - "description": "$1 is Learn more link" - }, "addNewAccount": { "message": "새 이더리움 계정 추가" }, @@ -1000,9 +987,6 @@ "confirmConnectionTitle": { "message": "$1에 연결 확인" }, - "confirmDeletion": { - "message": "컨펌 삭제" - }, "confirmFieldPaymaster": { "message": "수수료 지불:" }, @@ -1015,9 +999,6 @@ "confirmRecoveryPhrase": { "message": "비밀복구구문 컨펌" }, - "confirmRpcUrlDeletionMessage": { - "message": "정말로 RPC URL을 삭제하시겠습니까? 고객님의 정보는 이 네트워크에 저장되지 않습니다." - }, "confirmTitleDescPermitSignature": { "message": "해당 사이트에서 토큰 사용 승인을 요청합니다." }, @@ -1368,9 +1349,6 @@ "custom": { "message": "고급" }, - "customContentSearch": { - "message": "이전에 추가된 네트워크 검색" - }, "customGasSettingToolTipMessage": { "message": "$1 사용으로 가스 가격을 맞춤 설정하세요. 익숙하지 않은 경우 혼동될 수 있습니다. 자신의 책임하에 인터렉션하세요.", "description": "$1 is key 'advanced' (text: 'Advanced') separated here so that it can be passed in with bold font-weight" @@ -1490,9 +1468,6 @@ "deleteContact": { "message": "연락처 삭제" }, - "deleteNetwork": { - "message": "네트워크를 삭제하시겠습니까?" - }, "deleteNetworkIntro": { "message": "이 네트워크를 삭제하면 나중에 이 네트워크에 있는 자산을 보고 싶을 때 네트워크를 다시 추가해야 합니다" }, @@ -1500,9 +1475,6 @@ "message": "$1 네트워크를 삭제하시겠습니까?", "description": "$1 represents the name of the network" }, - "deleteRpcUrl": { - "message": "RPC URL 삭제" - }, "deposit": { "message": "예치" }, @@ -1867,9 +1839,6 @@ "existingRequestsBannerAlertDesc": { "message": "가장 최근 요청을 보고 확인하려면, 먼저 기존 요청을 승인하거나 거부해야 합니다." }, - "existingRpcUrl": { - "message": "이 URL은 다른 체인 ID랑 연결되어 있습니다." - }, "expandView": { "message": "보기 확장" }, @@ -1901,9 +1870,6 @@ "failedToFetchChainId": { "message": "체인 ID를 가져올 수 없습니다. RPC URL이 올바른가요?" }, - "failedToFetchTickerSymbolData": { - "message": "현재 티커 기호 확인 데이터를 사용할 수 없습니다. 입력한 기호가 올바른지 확인하세요. 이는 네트워크에 표시되는 전환율에 영향을 미칩니다." - }, "failureMessage": { "message": "문제가 발생했습니다. 작업을 완료할 수 없습니다." }, @@ -1924,9 +1890,6 @@ "message": "파일 가져오기가 작동하지 않나요? 여기를 클릭하세요.", "description": "Helps user import their account from a JSON file" }, - "findTheRightChainId": { - "message": "다음에서 적합한 것을 찾아보세요" - }, "flaskWelcomeUninstall": { "message": "이 확장 프로그램을 삭제해야 합니다", "description": "This request is shown on the Flask Welcome screen. It is intended for non-developers, and will be bolded." @@ -2416,9 +2379,6 @@ "invalidAssetType": { "message": "이 자산은 NFT이므로 NFT 탭에 있는 NFT 가져오기 페이지에서 다시 추가해야 합니다" }, - "invalidBlockExplorerURL": { - "message": "잘못된 블록 탐색기 URL" - }, "invalidChainIdTooBig": { "message": "잘못된 체인 ID. 체인 ID가 너무 큽니다." }, @@ -2938,9 +2898,6 @@ "network": { "message": "네트워크:" }, - "networkAddedSuccessfully": { - "message": "성공적으로 네트워크를 추가했습니다!" - }, "networkDetails": { "message": "네트워크 세부 정보" }, @@ -3001,9 +2958,6 @@ "networkProvider": { "message": "네트워크 공급업체" }, - "networkSettingsChainIdDescription": { - "message": "체인 ID는 트랜잭션 서명에 사용됩니다. 이는 네트워크에서 반환하는 체인 ID와 일치해야 합니다. 십진수나 '0x'로 시작하는 16진수를 입력할 수 있지만, 표시되는 형식은 십진수입니다." - }, "networkStatus": { "message": "네트워크 상태" }, @@ -3452,9 +3406,6 @@ "onboardingAdvancedPrivacyIPFSValid": { "message": "PFS 게이트웨이 URL이 유효합니다" }, - "onboardingAdvancedPrivacyNetworkButton": { - "message": "사용자 정의 네트워크 추가" - }, "onboardingAdvancedPrivacyNetworkDescription": { "message": "가능한 가장 안정적인 비공개 이더리움 액세스를 위해 Infura를 원격 프로시저 호출(RPC) 공급업체로 선정하였습니다. 사용자는 개인적으로 원하는 RPC를 선택할 수 있습니다. 하지만, 모든 RPC는 거래를 위해 사용자의 IP 주소와 이더리움 지갑을 수령한다는 점을 잊지 말아야 합니다. Infura의 데이터 처리 방법은 $1에서 상세히 확인할 수 있습니다." }, @@ -3483,9 +3434,6 @@ "onboardingMetametricsInfuraTermsPolicy": { "message": "개인정보 처리방침" }, - "onboardingMetametricsModalTitle": { - "message": "맞춤 네트워크 추가" - }, "onboardingMetametricsNeverCollect": { "message": "$1 앱의 클릭 수와 조회수는 저장되지만, 공개 주소와 같은 기타 세부 정보는 저장되지 않습니다.", "description": "$1 represents `onboardingMetametricsNeverCollectEmphasis`" @@ -3578,9 +3526,6 @@ "onekey": { "message": "OneKey" }, - "onlyAddTrustedNetworks": { - "message": "악성 네트워크 공급업체는 블록체인 상태를 거짓으로 보고하고 네트워크 활동을 기록할 수 있습니다. 신뢰하는 맞춤 네트워크만 추가하세요." - }, "onlyConnectTrust": { "message": "신뢰하는 사이트만 연결하세요. $1", "description": "Text displayed above the buttons for connection confirmation. $1 is the link to the learn more web page." @@ -3605,9 +3550,6 @@ "optional": { "message": "옵션" }, - "optionalWithParanthesis": { - "message": "(옵션)" - }, "options": { "message": "옵션" }, @@ -3959,9 +3901,6 @@ "message": "+ 그 외 $1개", "description": "$1 is a number of additional but unshown items in a list- this message will be shown in place of those items" }, - "popularCustomNetworks": { - "message": "인기 사용자 정의 네트워크" - }, "popularNetworkAddToolTip": { "message": "이러한 네트워크 중 일부는 제삼자에 의존합니다. 이러한 연결은 안정성이 떨어지거나 제삼자가 활동을 추적할 수 있습니다. $1", "description": "$1 is Learn more link" @@ -5298,9 +5237,6 @@ "suggestedTokenName": { "message": "추천 이름:" }, - "suggestedTokenSymbol": { - "message": "추천 티커 심볼:" - }, "support": { "message": "지원" }, @@ -5789,9 +5725,6 @@ "termsOfUseTitle": { "message": "이용약관이 개정되었습니다" }, - "testNetworks": { - "message": "테스트 네트워크" - }, "theme": { "message": "테마" }, @@ -6103,9 +6036,6 @@ "message": "U2F", "description": "A name on an API for the browser to interact with devices that support the U2F protocol. On some browsers we use it to connect MetaMask to Ledger devices." }, - "unMatchedChain": { - "message": "기록에 따르면 이 URL은 이 체인 ID의 알려진 제공업체와 일치하지 않습니다." - }, "unapproved": { "message": "승인되지 않음" }, @@ -6175,9 +6105,6 @@ "urlErrorMsg": { "message": "URI에는 적절한 HTTP/HTTPS 접두사가 필요합니다." }, - "urlExistsErrorMsg": { - "message": "이 URL은 현재 $1 네트워크에서 사용됩니다." - }, "use4ByteResolution": { "message": "스마트 계약 디코딩" }, @@ -6387,9 +6314,6 @@ "whatsThis": { "message": "이것은 무엇인가요?" }, - "wrongChainId": { - "message": "이 체인 ID는 네트워크 이름과 일치하지 않습니다." - }, "wrongNetworkName": { "message": "기록에 따르면 네트워크 이름이 이 체인 ID와 일치하지 않습니다." }, @@ -6403,10 +6327,6 @@ "you": { "message": "회원님" }, - "youHaveAddedAll": { - "message": "모든 인기 네트워크를 추가했습니다. $1에서 더 많은 네트워크를 확인하거나 $2을(를) 할 수 있습니다.", - "description": "$1 is a link with the text 'here' and $2 is a button with the text 'add more networks manually'" - }, "youNeedToAllowCameraAccess": { "message": "이 기능을 사용하려면 카메라 액세스를 허용해야 합니다." }, diff --git a/app/_locales/lt/messages.json b/app/_locales/lt/messages.json index 1c0c341f7726..0668166eb8fe 100644 --- a/app/_locales/lt/messages.json +++ b/app/_locales/lt/messages.json @@ -205,9 +205,6 @@ "delete": { "message": "Ištrinti" }, - "deleteNetwork": { - "message": "Panaikinti tinklą?" - }, "details": { "message": "Išsami informacija" }, @@ -351,9 +348,6 @@ "invalidAddressRecipient": { "message": "Gavėjo adresas netinkamas" }, - "invalidBlockExplorerURL": { - "message": "Netinkamas Block Explorer URL" - }, "invalidRPC": { "message": "Netinkamas RPC URL" }, diff --git a/app/_locales/lv/messages.json b/app/_locales/lv/messages.json index 08b28f2c30ca..3939c9145c12 100644 --- a/app/_locales/lv/messages.json +++ b/app/_locales/lv/messages.json @@ -205,9 +205,6 @@ "delete": { "message": "Dzēst" }, - "deleteNetwork": { - "message": "Dzēst tīklu?" - }, "details": { "message": "Informācija" }, @@ -347,9 +344,6 @@ "invalidAddressRecipient": { "message": "Nederīga saņēmēja adrese" }, - "invalidBlockExplorerURL": { - "message": "Nederīgs Block Explorer URL" - }, "invalidRPC": { "message": "Nederīgs RPC URL" }, diff --git a/app/_locales/ms/messages.json b/app/_locales/ms/messages.json index 8bd9278ef2d3..cfad6a22d73d 100644 --- a/app/_locales/ms/messages.json +++ b/app/_locales/ms/messages.json @@ -205,9 +205,6 @@ "delete": { "message": "Padam" }, - "deleteNetwork": { - "message": "Padamkan Rangkaian?" - }, "details": { "message": "Butiran" }, @@ -340,9 +337,6 @@ "invalidAddressRecipient": { "message": "Alamat penerima tidak sah" }, - "invalidBlockExplorerURL": { - "message": "URL Block Explorer tidak sah" - }, "invalidRPC": { "message": "URL RPC tidak sah" }, diff --git a/app/_locales/nl/messages.json b/app/_locales/nl/messages.json index de0a2fd9f5e2..946976a7a93e 100644 --- a/app/_locales/nl/messages.json +++ b/app/_locales/nl/messages.json @@ -140,9 +140,6 @@ "invalidAddressRecipient": { "message": "Het adres van de ontvanger is ongeldig" }, - "invalidBlockExplorerURL": { - "message": "Ongeldige Block Explorer URI" - }, "invalidRPC": { "message": "Ongeldige RPC-URI" }, diff --git a/app/_locales/no/messages.json b/app/_locales/no/messages.json index 7e50d555e852..0d1fa5173a9f 100644 --- a/app/_locales/no/messages.json +++ b/app/_locales/no/messages.json @@ -202,9 +202,6 @@ "delete": { "message": "Slett" }, - "deleteNetwork": { - "message": "Slette nettverk? " - }, "details": { "message": "Detaljer" }, @@ -338,9 +335,6 @@ "invalidAddressRecipient": { "message": "Mottaksadresse er ugyldig " }, - "invalidBlockExplorerURL": { - "message": "Ugyldig Block Explorer URL" - }, "invalidRPC": { "message": "Ugyldig RPC URL" }, diff --git a/app/_locales/ph/messages.json b/app/_locales/ph/messages.json index ecbc7a99ab37..df15e05a0bb6 100644 --- a/app/_locales/ph/messages.json +++ b/app/_locales/ph/messages.json @@ -371,9 +371,6 @@ "delete": { "message": "I-delete" }, - "deleteNetwork": { - "message": "I-delete ang Network?" - }, "details": { "message": "Mga Detalye" }, @@ -667,9 +664,6 @@ "invalidAddressRecipient": { "message": "Hindi valid ang address ng tatanggap" }, - "invalidBlockExplorerURL": { - "message": "Invalid na URL ng Block Explorer" - }, "invalidChainIdTooBig": { "message": "Invalid na chain ID. Masyadong malaki ang chain ID." }, @@ -832,9 +826,6 @@ "networkNameTestnet": { "message": "Testnet" }, - "networkSettingsChainIdDescription": { - "message": "Ginagamit ang chain ID sa paglagda ng mga transaksyon. Dapat itong tumugma sa chain ID na ibinalik ng network. Puwede kang maglagay ng decimal o '0x'-prefixed hexadecimal number, pero ipapakita namin ang numero sa decimal." - }, "networkURL": { "message": "URL ng Network" }, @@ -915,9 +906,6 @@ "on": { "message": "Naka-on" }, - "onlyAddTrustedNetworks": { - "message": "Magagawa ng nakakapinsalang network provider na magsinungaling tungkol sa status ng blockchain at itala ang aktibidad ng iyong network. Magdagdag lang ng mga custom na network na pinagkakatiwalaan mo." - }, "onlyConnectTrust": { "message": "Kumonekta lang sa mga site na pinagkakatiwalaan mo.", "description": "Text displayed above the buttons for connection confirmation. $1 is the link to the learn more web page." @@ -1673,9 +1661,6 @@ "urlErrorMsg": { "message": "Kinakailangan ng mga URL ang naaangkop na HTTP/HTTPS prefix." }, - "urlExistsErrorMsg": { - "message": "Kasalukuyang ginagamit ng $1 network ang URL na ito." - }, "usePhishingDetection": { "message": "Gumamit ng Pag-detect ng Phishing" }, diff --git a/app/_locales/pl/messages.json b/app/_locales/pl/messages.json index 46b178cdf985..cb82388a8634 100644 --- a/app/_locales/pl/messages.json +++ b/app/_locales/pl/messages.json @@ -205,9 +205,6 @@ "delete": { "message": "Usuń" }, - "deleteNetwork": { - "message": "Usunąć sieć?" - }, "details": { "message": "Szczegóły" }, @@ -351,9 +348,6 @@ "invalidAddressRecipient": { "message": "Nieprawidłowy adres odbiorcy" }, - "invalidBlockExplorerURL": { - "message": "Nieprawidłowe Block Explorer URI" - }, "invalidRPC": { "message": "Nieprawidłowe RPC URI" }, diff --git a/app/_locales/pt/messages.json b/app/_locales/pt/messages.json index 27587daf31d0..a5de21cb0889 100644 --- a/app/_locales/pt/messages.json +++ b/app/_locales/pt/messages.json @@ -183,9 +183,6 @@ "addANetwork": { "message": "Adicionar uma rede" }, - "addANetworkManually": { - "message": "Adicionar uma rede manualmente" - }, "addANickname": { "message": "Adicionar um apelido" }, @@ -252,9 +249,6 @@ "addFriendsAndAddresses": { "message": "Adicionar amigos e endereços confiáveis" }, - "addFromAListOfPopularNetworks": { - "message": "Adicione a partir de uma lista de redes populares ou adicione uma rede manualmente. Interaja apenas com entidades de sua confiança." - }, "addHardwareWallet": { "message": "Adicionar carteira de hardware" }, @@ -267,16 +261,9 @@ "addMemo": { "message": "Adicionar observação" }, - "addMoreNetworks": { - "message": "adicionar mais redes manualmente" - }, "addNetwork": { "message": "Adicionar rede" }, - "addNetworkTooltipWarning": { - "message": "Esta conexão de rede depende de terceiros. Esta conexão pode ser menos confiável ou permitir que terceiros rastreiem atividades. $1", - "description": "$1 is Learn more link" - }, "addNewAccount": { "message": "Adicionar uma nova conta Ethereum" }, @@ -1000,9 +987,6 @@ "confirmConnectionTitle": { "message": "Confirmar conexão ao $1" }, - "confirmDeletion": { - "message": "Confirmar exclusão" - }, "confirmFieldPaymaster": { "message": "Taxa paga por" }, @@ -1015,9 +999,6 @@ "confirmRecoveryPhrase": { "message": "Confirmar Frase de Recuperação Secreta" }, - "confirmRpcUrlDeletionMessage": { - "message": "Tem certeza de que deseja excluir o URL da RPC? Suas informações não serão salvas para essa rede." - }, "confirmTitleDescPermitSignature": { "message": "Este site quer permissão para gastar seus tokens." }, @@ -1368,9 +1349,6 @@ "custom": { "message": "Avançado" }, - "customContentSearch": { - "message": "Pesquise uma rede previamente adicionada" - }, "customGasSettingToolTipMessage": { "message": "Use $1 para personalizar o preço do gás. Isso pode parecer confuso se você não estiver familiarizado. Interaja por sua conta e risco.", "description": "$1 is key 'advanced' (text: 'Advanced') separated here so that it can be passed in with bold font-weight" @@ -1490,9 +1468,6 @@ "deleteContact": { "message": "Excluir contato" }, - "deleteNetwork": { - "message": "Excluir rede?" - }, "deleteNetworkIntro": { "message": "Se excluir essa rede, você precisará adicioná-la novamente para ver seus ativos nela" }, @@ -1500,9 +1475,6 @@ "message": "Excluir rede $1?", "description": "$1 represents the name of the network" }, - "deleteRpcUrl": { - "message": "Excluir URL da RPC" - }, "deposit": { "message": "Depositar" }, @@ -1867,9 +1839,6 @@ "existingRequestsBannerAlertDesc": { "message": "Para visualizar e confirmar sua solicitação mais recente, primeiro é necessário aprovar ou recusar as solicitações existentes." }, - "existingRpcUrl": { - "message": "Este URL está associado a outro ID de cadeia." - }, "expandView": { "message": "Expandir exibição" }, @@ -1901,9 +1870,6 @@ "failedToFetchChainId": { "message": "Não foi possível buscar o ID da cadeia. Seu URL da RPC está correto?" }, - "failedToFetchTickerSymbolData": { - "message": "Dados de verificação do símbolo do ticker indisponíveis no momento. Certifique-se de que o símbolo inserido está correto. Isso afetará as taxas de conversão indicadas para essa rede" - }, "failureMessage": { "message": "Ocorreu algum erro e não conseguimos concluir a ação" }, @@ -1924,9 +1890,6 @@ "message": "A importação de arquivo não está funcionando? Clique aqui!", "description": "Helps user import their account from a JSON file" }, - "findTheRightChainId": { - "message": "Encontre a opção correta em:" - }, "flaskWelcomeUninstall": { "message": "você deve desinstalar essa extensão", "description": "This request is shown on the Flask Welcome screen. It is intended for non-developers, and will be bolded." @@ -2416,9 +2379,6 @@ "invalidAssetType": { "message": "Esse ativo é um NFT e precisa ser adicionado novamente à página Importar NFT, encontrada na aba NFTs." }, - "invalidBlockExplorerURL": { - "message": "URL inválido do explorador de blocos" - }, "invalidChainIdTooBig": { "message": "ID de cadeia inválido. O ID de cadeia é muito grande." }, @@ -2938,9 +2898,6 @@ "network": { "message": "Ethereum:" }, - "networkAddedSuccessfully": { - "message": "Rede adicionada com sucesso!" - }, "networkDetails": { "message": "Detalhes da rede" }, @@ -3001,9 +2958,6 @@ "networkProvider": { "message": "Provedor de rede" }, - "networkSettingsChainIdDescription": { - "message": "O ID da cadeia é usado para assinar transações. É preciso ser igual ao ID da cadeia retornado pela rede. Você pode informar um número decimal ou um número hexadecimal com prefixo “0x”, mas exibiremos o número em casas decimais." - }, "networkStatus": { "message": "Status da rede" }, @@ -3452,9 +3406,6 @@ "onboardingAdvancedPrivacyIPFSValid": { "message": "O URL do gateway IPFS é válido" }, - "onboardingAdvancedPrivacyNetworkButton": { - "message": "Adicionar rede personalizada" - }, "onboardingAdvancedPrivacyNetworkDescription": { "message": "Usamos a Infura como nosso provedor de chamadas de procedimento remoto (RPC) para oferecermos o acesso mais confiável e privado possível aos dados do Ethereum. Você pode escolher sua própria RPC, mas lembre-se de que qualquer RPC receberá seu endereço IP e da carteira de Ethereum para realizar transações. Leia nosso $1 para saber mais sobre como a Infura trata os dados." }, @@ -3483,9 +3434,6 @@ "onboardingMetametricsInfuraTermsPolicy": { "message": "Política de Privacidade" }, - "onboardingMetametricsModalTitle": { - "message": "Adicionar rede personalizada" - }, "onboardingMetametricsNeverCollect": { "message": "$1 cliques e visualizações no app são armazenados, mas outros detalhes (como seu endereço público) não são.", "description": "$1 represents `onboardingMetametricsNeverCollectEmphasis`" @@ -3578,9 +3526,6 @@ "onekey": { "message": "OneKey" }, - "onlyAddTrustedNetworks": { - "message": "Um provedor de rede mal-intencionado pode mentir sobre o estado da blockchain e registrar as atividades da sua rede. Adicione somente as redes personalizadas em que você confia." - }, "onlyConnectTrust": { "message": "Conecte-se somente com sites em que você confia. $1", "description": "Text displayed above the buttons for connection confirmation. $1 is the link to the learn more web page." @@ -3605,9 +3550,6 @@ "optional": { "message": "Opcional" }, - "optionalWithParanthesis": { - "message": "(Opcional)" - }, "options": { "message": "Opções" }, @@ -3959,9 +3901,6 @@ "message": "E mais $1", "description": "$1 is a number of additional but unshown items in a list- this message will be shown in place of those items" }, - "popularCustomNetworks": { - "message": "Redes personalizadas populares" - }, "popularNetworkAddToolTip": { "message": "Algumas dessas redes dependem de terceiros. As conexões podem ser menos confiáveis ​​ou permitir que terceiros rastreiem atividades. $1", "description": "$1 is Learn more link" @@ -5298,9 +5237,6 @@ "suggestedTokenName": { "message": "Nome sugerido:" }, - "suggestedTokenSymbol": { - "message": "Símbolo do ticker sugerido:" - }, "support": { "message": "Suporte" }, @@ -5789,9 +5725,6 @@ "termsOfUseTitle": { "message": "Nossos Termos de Uso foram atualizados" }, - "testNetworks": { - "message": "Redes de teste" - }, "theme": { "message": "Tema" }, @@ -6103,9 +6036,6 @@ "message": "U2F", "description": "A name on an API for the browser to interact with devices that support the U2F protocol. On some browsers we use it to connect MetaMask to Ledger devices." }, - "unMatchedChain": { - "message": "De acordo com nossos registros, este URL não corresponde a um provedor conhecido para este ID de cadeia." - }, "unapproved": { "message": "Não aprovado" }, @@ -6175,9 +6105,6 @@ "urlErrorMsg": { "message": "URLs precisam do prefixo HTTP/HTTPS adequado." }, - "urlExistsErrorMsg": { - "message": "O ID da cadeia está sendo usado pela rede $1." - }, "use4ByteResolution": { "message": "Decodificar contratos inteligentes" }, @@ -6387,9 +6314,6 @@ "whatsThis": { "message": "O que é isso?" }, - "wrongChainId": { - "message": "Este ID de cadeia não corresponde ao nome da rede." - }, "wrongNetworkName": { "message": "De acordo com os nossos registros, o nome da rede pode não corresponder a esta ID de cadeia." }, @@ -6403,10 +6327,6 @@ "you": { "message": "Você" }, - "youHaveAddedAll": { - "message": "Você adicionou todas as redes populares. Você pode descobrir mais redes $1 Ou você pode $2", - "description": "$1 is a link with the text 'here' and $2 is a button with the text 'add more networks manually'" - }, "youNeedToAllowCameraAccess": { "message": "Você precisa permitir o acesso à câmera para usar esse recurso." }, diff --git a/app/_locales/pt_BR/messages.json b/app/_locales/pt_BR/messages.json index eae48ba1dc7f..4c4b17d74f6e 100644 --- a/app/_locales/pt_BR/messages.json +++ b/app/_locales/pt_BR/messages.json @@ -534,9 +534,6 @@ "delete": { "message": "Excluir" }, - "deleteNetwork": { - "message": "Excluir rede?" - }, "description": { "message": "Descrição" }, @@ -1014,9 +1011,6 @@ "invalidAddressRecipient": { "message": "O endereço do destinatário é inválido" }, - "invalidBlockExplorerURL": { - "message": "URL inválido do Block Explorer" - }, "invalidChainIdTooBig": { "message": "ID de cadeia inválido. O ID de cadeia é muito grande." }, @@ -1263,9 +1257,6 @@ "networkNameTestnet": { "message": "Testnet" }, - "networkSettingsChainIdDescription": { - "message": "O ID da cadeia é usado para assinar transações. É preciso ser igual ao ID da cadeia retornado pela rede. Você pode informar um número decimal ou um número hexadecimal com prefixo “0x”, mas exibiremos o número em casas decimais." - }, "networkStatus": { "message": "Status da rede" }, @@ -1424,9 +1415,6 @@ "message": "Os alertas de detecção de phishing dependem de comunicação com $1. O jsDeliver terá acesso ao seu endereço IP. Veja $2.", "description": "The $1 is the word 'jsDeliver', from key 'jsDeliver' and $2 is the words Privacy Policy from key 'privacyMsg', both separated here so that it can be wrapped as a link" }, - "onlyAddTrustedNetworks": { - "message": "Um provedor de rede mal-intencionado pode mentir sobre o estado do blockchain e registrar as atividades da sua rede. Adicione somente as redes personalizadas em que você confia." - }, "onlyConnectTrust": { "message": "Conecte-se somente com sites em que você confia.", "description": "Text displayed above the buttons for connection confirmation. $1 is the link to the learn more web page." @@ -1438,9 +1426,6 @@ "optional": { "message": "Opcional" }, - "optionalWithParanthesis": { - "message": "(Opcional)" - }, "or": { "message": "ou" }, @@ -2430,9 +2415,6 @@ "urlErrorMsg": { "message": "Os URLs precisam do prefixo HTTP/HTTPS adequado." }, - "urlExistsErrorMsg": { - "message": "O ID da cadeia está sendo usado pela rede $1." - }, "useNftDetection": { "message": "Detectar NFTs automaticamente" }, diff --git a/app/_locales/ro/messages.json b/app/_locales/ro/messages.json index dde9be461087..aad720151da6 100644 --- a/app/_locales/ro/messages.json +++ b/app/_locales/ro/messages.json @@ -205,9 +205,6 @@ "delete": { "message": "Șterge" }, - "deleteNetwork": { - "message": "Ștergeți rețeaua?" - }, "details": { "message": "Detalii" }, @@ -341,9 +338,6 @@ "invalidAddressRecipient": { "message": "Adresa destinatarului nu este validă" }, - "invalidBlockExplorerURL": { - "message": "URL Block Explorer nevalid" - }, "invalidRPC": { "message": "URL RPC nevalid" }, diff --git a/app/_locales/ru/messages.json b/app/_locales/ru/messages.json index 6b13eaf1a46f..aba23b0b3284 100644 --- a/app/_locales/ru/messages.json +++ b/app/_locales/ru/messages.json @@ -183,9 +183,6 @@ "addANetwork": { "message": "Добавить сеть" }, - "addANetworkManually": { - "message": "Добавить сеть вручную" - }, "addANickname": { "message": "Добавить ник" }, @@ -252,9 +249,6 @@ "addFriendsAndAddresses": { "message": "Добавьте друзей и адреса, которым доверяете" }, - "addFromAListOfPopularNetworks": { - "message": "Добавьте из списка популярных сетей или добавьте сеть вручную. Взаимодействуйте только с теми организациями, которым доверяете." - }, "addHardwareWallet": { "message": "Добавить аппаратный кошелек" }, @@ -267,16 +261,9 @@ "addMemo": { "message": "Добавить примечание" }, - "addMoreNetworks": { - "message": "добавить другие сети вручную" - }, "addNetwork": { "message": "Добавить сеть" }, - "addNetworkTooltipWarning": { - "message": "Это сетевое подключение зависит от третьих сторон. Оно может быть менее надежным или позволять третьим лицам отслеживать активность. $1", - "description": "$1 is Learn more link" - }, "addNewAccount": { "message": "Добавить новый счет Ethereum" }, @@ -1000,9 +987,6 @@ "confirmConnectionTitle": { "message": "Подтвердите подключение к $1" }, - "confirmDeletion": { - "message": "Подтвердить удаление" - }, "confirmFieldPaymaster": { "message": "Комиссия оплачена" }, @@ -1015,9 +999,6 @@ "confirmRecoveryPhrase": { "message": "Подтвердите секретную фразу для восстановления" }, - "confirmRpcUrlDeletionMessage": { - "message": "Уверены, что хотите удалить URL-адрес RPC? Ваша информация не будет сохранена для этой сети." - }, "confirmTitleDescPermitSignature": { "message": "Этот сайт хочет получить разрешение на расходование ваших токенов." }, @@ -1368,9 +1349,6 @@ "custom": { "message": "Дополнительно" }, - "customContentSearch": { - "message": "Поиск ранее добавленной сети" - }, "customGasSettingToolTipMessage": { "message": "Использовать $1, чтобы настроить цену на газ. Это может сбивать с толку, если вы не знакомы с этим. Взаимодействуйте на свой страх и риск.", "description": "$1 is key 'advanced' (text: 'Advanced') separated here so that it can be passed in with bold font-weight" @@ -1490,9 +1468,6 @@ "deleteContact": { "message": "Удалить контакт" }, - "deleteNetwork": { - "message": "Удалить сеть?" - }, "deleteNetworkIntro": { "message": "Если вы удалите эту сеть, вам нужно будет добавить ее снова, чтобы просмотреть свои активы в этой сети" }, @@ -1500,9 +1475,6 @@ "message": "Удалить сеть $1?", "description": "$1 represents the name of the network" }, - "deleteRpcUrl": { - "message": "Удалить URL-адрес RPC" - }, "deposit": { "message": "Депозит" }, @@ -1867,9 +1839,6 @@ "existingRequestsBannerAlertDesc": { "message": "Чтобы просмотреть и подтвердить свой последний запрос, вам необходимо сначала утвердить или отклонить существующие запросы." }, - "existingRpcUrl": { - "message": "Этот URL-адрес связан с другим ID блокчейна." - }, "expandView": { "message": "Развернуть представление" }, @@ -1901,9 +1870,6 @@ "failedToFetchChainId": { "message": "Не удалось получить ID блокчейна. Ваш URL RPC правильный?" }, - "failedToFetchTickerSymbolData": { - "message": "Данные проверки тикера в настоящее время недоступны. Убедитесь, что вы ввели правильный символ. Это повлияет на коэффициенты обмена, которые вы видите для этой сети." - }, "failureMessage": { "message": "Что-то пошло не так, и мы не смогли завершить действие" }, @@ -1924,9 +1890,6 @@ "message": "Импорт файлов не работает? Нажмите здесь!", "description": "Helps user import their account from a JSON file" }, - "findTheRightChainId": { - "message": "Найдите подходящий в:" - }, "flaskWelcomeUninstall": { "message": "вам нужно должны удалить это расширение", "description": "This request is shown on the Flask Welcome screen. It is intended for non-developers, and will be bolded." @@ -2416,9 +2379,6 @@ "invalidAssetType": { "message": "Этот актив является NFT, и его необходимо повторно добавить на странице «Импорт NFT», которая находится на вкладке NFT." }, - "invalidBlockExplorerURL": { - "message": "Недействительный URL обозревателя блоков" - }, "invalidChainIdTooBig": { "message": "Недействительный ID блокчейна. Он слишком длинный." }, @@ -2938,9 +2898,6 @@ "network": { "message": "Сеть:" }, - "networkAddedSuccessfully": { - "message": "Сеть успешно добавлена!" - }, "networkDetails": { "message": "Сведения о сети" }, @@ -3001,9 +2958,6 @@ "networkProvider": { "message": "Поставщик услуг сети" }, - "networkSettingsChainIdDescription": { - "message": "ID блокчейна используется для подписания транзакций. Он должен соответствовать ID блокчейна, возвращаемому сетью. Вы можете ввести десятичное или шестнадцатеричное число с префиксом «0x», но мы будем отображать число в десятичном виде." - }, "networkStatus": { "message": "Статус сети" }, @@ -3452,9 +3406,6 @@ "onboardingAdvancedPrivacyIPFSValid": { "message": "URL шлюза IPFS действителен" }, - "onboardingAdvancedPrivacyNetworkButton": { - "message": "Добавить пользовательскую сеть" - }, "onboardingAdvancedPrivacyNetworkDescription": { "message": "Мы используем Infura в качестве нашего поставщика удаленного вызова процедур (RPC), чтобы предложить наиболее надежный и конфиденциальный доступ к данным Ethereum из возможных. Вы можете выбрать свой собственного RPC, но помните, что любой RPC получит ваш IP-адрес и номер кошелька Ethereum для совершения транзакций. См. наше $1, чтобы узнать больше о том, как Infura обрабатывает данные." }, @@ -3483,9 +3434,6 @@ "onboardingMetametricsInfuraTermsPolicy": { "message": "Политикой конфиденциальности" }, - "onboardingMetametricsModalTitle": { - "message": "Добавить пользовательскую сеть" - }, "onboardingMetametricsNeverCollect": { "message": "$1 клики и просмотры в приложении сохраняются, но другие данные (например, ваш публичный адрес) — нет.", "description": "$1 represents `onboardingMetametricsNeverCollectEmphasis`" @@ -3578,9 +3526,6 @@ "onekey": { "message": "OneKey" }, - "onlyAddTrustedNetworks": { - "message": "Вредоносный сетевой провайдер может дезинформировать о состоянии блокчейна и записывать ваши действия в сети. Добавляйте только те пользовательские сети, которым доверяете." - }, "onlyConnectTrust": { "message": "Подключайтесь только к сайтам, которым доверяете. $1", "description": "Text displayed above the buttons for connection confirmation. $1 is the link to the learn more web page." @@ -3605,9 +3550,6 @@ "optional": { "message": "Необязательно" }, - "optionalWithParanthesis": { - "message": "(Необязательно)" - }, "options": { "message": "Опционы" }, @@ -3959,9 +3901,6 @@ "message": "+ еще $1", "description": "$1 is a number of additional but unshown items in a list- this message will be shown in place of those items" }, - "popularCustomNetworks": { - "message": "Популярные пользовательские сети" - }, "popularNetworkAddToolTip": { "message": "Некоторые из этих сетей являются зависимыми от третьих сторон. Соединения могут быть менее надежными или позволять третьим сторонам отслеживать активность. $1", "description": "$1 is Learn more link" @@ -5298,9 +5237,6 @@ "suggestedTokenName": { "message": "Предлагаемое имя:" }, - "suggestedTokenSymbol": { - "message": "Рекомендуемый символ-тикер:" - }, "support": { "message": "Поддержка" }, @@ -5789,9 +5725,6 @@ "termsOfUseTitle": { "message": "Наши Условия использования обновлены" }, - "testNetworks": { - "message": "Протестировать сети" - }, "theme": { "message": "Тема" }, @@ -6103,9 +6036,6 @@ "message": "U2F", "description": "A name on an API for the browser to interact with devices that support the U2F protocol. On some browsers we use it to connect MetaMask to Ledger devices." }, - "unMatchedChain": { - "message": "Согласно нашим данным, этот URL-адрес не соответствует известному поставщику для этого ID блокчейна." - }, "unapproved": { "message": "Не одобрен" }, @@ -6175,9 +6105,6 @@ "urlErrorMsg": { "message": "URL должен иметь соответствующий префикс HTTP/HTTPS." }, - "urlExistsErrorMsg": { - "message": "Это URL в настоящее время используется сетью $1." - }, "use4ByteResolution": { "message": "Расшифровать смарт-контракты" }, @@ -6387,9 +6314,6 @@ "whatsThis": { "message": "Что это?" }, - "wrongChainId": { - "message": "Этот ID блокчейна не соответствует имени сети." - }, "wrongNetworkName": { "message": "Согласно нашим записям, имя сети может не соответствовать этому ID блокчейна." }, @@ -6403,10 +6327,6 @@ "you": { "message": "Вы" }, - "youHaveAddedAll": { - "message": "Вы добавили все популярные сети. Вы можете открыть для себя больше сетей $1 или можете $2", - "description": "$1 is a link with the text 'here' and $2 is a button with the text 'add more networks manually'" - }, "youNeedToAllowCameraAccess": { "message": "Для использования этой функции вам необходимо предоставить доступ к камере." }, diff --git a/app/_locales/sk/messages.json b/app/_locales/sk/messages.json index 6e28cc44f574..564e7cb12d94 100644 --- a/app/_locales/sk/messages.json +++ b/app/_locales/sk/messages.json @@ -199,9 +199,6 @@ "delete": { "message": "Odstrániť" }, - "deleteNetwork": { - "message": "Odstrániť sieť?" - }, "details": { "message": "Podrobnosti" }, @@ -338,9 +335,6 @@ "invalidAddressRecipient": { "message": "Adresa příjemce je neplatná" }, - "invalidBlockExplorerURL": { - "message": "Neplatné Block Explorer URI" - }, "invalidRPC": { "message": "Neplatné RPC URI" }, diff --git a/app/_locales/sl/messages.json b/app/_locales/sl/messages.json index 60f18a004305..8d43d184c427 100644 --- a/app/_locales/sl/messages.json +++ b/app/_locales/sl/messages.json @@ -205,9 +205,6 @@ "delete": { "message": "Izbriši" }, - "deleteNetwork": { - "message": "Izbrišem to omrežje?" - }, "details": { "message": "Podrobnosti" }, @@ -345,9 +342,6 @@ "invalidAddressRecipient": { "message": "Neveljaven nasklov prejemnika" }, - "invalidBlockExplorerURL": { - "message": "Neveljaven Block Explorer URL" - }, "invalidRPC": { "message": "Neveljaven RPC URL" }, diff --git a/app/_locales/sr/messages.json b/app/_locales/sr/messages.json index 58bc09614d32..d3f5e27c6235 100644 --- a/app/_locales/sr/messages.json +++ b/app/_locales/sr/messages.json @@ -202,9 +202,6 @@ "delete": { "message": "Избриши" }, - "deleteNetwork": { - "message": "Da li želite da obrišete mrežu?" - }, "details": { "message": "Детаљи" }, @@ -348,9 +345,6 @@ "invalidAddressRecipient": { "message": "Adresa primaoca nije važeća" }, - "invalidBlockExplorerURL": { - "message": "Nevažeći Block Explorer URL" - }, "invalidRPC": { "message": "Nevažeći RPC URL" }, diff --git a/app/_locales/sv/messages.json b/app/_locales/sv/messages.json index 204c84f63caa..a98db5bea015 100644 --- a/app/_locales/sv/messages.json +++ b/app/_locales/sv/messages.json @@ -199,9 +199,6 @@ "delete": { "message": "Radera" }, - "deleteNetwork": { - "message": "Radera nätverk?" - }, "details": { "message": "Info" }, @@ -341,9 +338,6 @@ "invalidAddressRecipient": { "message": "Mottagarens adress är ogiltig" }, - "invalidBlockExplorerURL": { - "message": "Ogiltig Block Explorer URL" - }, "invalidRPC": { "message": "Ogiltig RPC-URL" }, diff --git a/app/_locales/sw/messages.json b/app/_locales/sw/messages.json index 1d9be8ad3f8d..d8ad6258e8ba 100644 --- a/app/_locales/sw/messages.json +++ b/app/_locales/sw/messages.json @@ -199,9 +199,6 @@ "delete": { "message": "Futa" }, - "deleteNetwork": { - "message": "Futa Mtandao?" - }, "details": { "message": "Maelezo" }, @@ -338,9 +335,6 @@ "invalidAddressRecipient": { "message": "Anwani ya mpokeaji si halali" }, - "invalidBlockExplorerURL": { - "message": "Block Explorer URL batili" - }, "invalidRPC": { "message": "RPC URL batili" }, diff --git a/app/_locales/ta/messages.json b/app/_locales/ta/messages.json index 8a6f3351db0d..8e38061bebb2 100644 --- a/app/_locales/ta/messages.json +++ b/app/_locales/ta/messages.json @@ -191,9 +191,6 @@ "invalidAddressRecipient": { "message": "பெறுநர் முகவரி தவறானது" }, - "invalidBlockExplorerURL": { - "message": "தவறான Block Explorer URI" - }, "invalidRPC": { "message": "தவறான RPC URI" }, diff --git a/app/_locales/th/messages.json b/app/_locales/th/messages.json index 19b005ef7cee..c3b4a8a6e3fa 100644 --- a/app/_locales/th/messages.json +++ b/app/_locales/th/messages.json @@ -93,9 +93,6 @@ "delete": { "message": "ลบ" }, - "deleteNetwork": { - "message": "ลบเครือข่าย?" - }, "details": { "message": "รายละเอียด" }, @@ -182,9 +179,6 @@ "invalidAddressRecipient": { "message": "แอดแดรสผู้รับไม่ถูกต้อง" }, - "invalidBlockExplorerURL": { - "message": "Block Explorer URI ไม่ถูกต้อง" - }, "invalidRPC": { "message": "RPC URI ไม่ถูกต้อง" }, diff --git a/app/_locales/tl/messages.json b/app/_locales/tl/messages.json index 624e9059634a..9089ff123db1 100644 --- a/app/_locales/tl/messages.json +++ b/app/_locales/tl/messages.json @@ -183,9 +183,6 @@ "addANetwork": { "message": "Magdagdag ng network" }, - "addANetworkManually": { - "message": "Mano-manong idagdag ang network" - }, "addANickname": { "message": "Magdagdag ng palayaw" }, @@ -252,9 +249,6 @@ "addFriendsAndAddresses": { "message": "Magdagdag ng mga kaibigan at address na pinagkakatiwalaan mo" }, - "addFromAListOfPopularNetworks": { - "message": "Idagdag mula sa listahan ng mga sikat na network o mano-manong idagdag ang network. Makipag-ugnayan lamang sa mga entidad na iyong pinagkakatiwalaan." - }, "addHardwareWallet": { "message": "Magdagdag ng wallet na hardware" }, @@ -267,16 +261,9 @@ "addMemo": { "message": "Magdagdag ng memo" }, - "addMoreNetworks": { - "message": "magdagdag pa ng mga network nang mano-mano" - }, "addNetwork": { "message": "Magdagdag ng Network" }, - "addNetworkTooltipWarning": { - "message": "Ang koneksyon sa network na ito ay umaasa sa mga third party. Ang koneksyon na ito ay maaaring hindi gaanong maaasahan o binibigyang-daan ang mga third-party na mag-track ng aktibidad. $1", - "description": "$1 is Learn more link" - }, "addNewAccount": { "message": "Magdagdag ng bagong account sa Ethereum" }, @@ -1000,9 +987,6 @@ "confirmConnectionTitle": { "message": "Kumpirmahin ang koneksyon sa $1" }, - "confirmDeletion": { - "message": "Kumpirmahin ang pagtanggal" - }, "confirmFieldPaymaster": { "message": "Ang bayarin ay binayaran ni" }, @@ -1015,9 +999,6 @@ "confirmRecoveryPhrase": { "message": "Kumpirmahin ang Lihim na Parirala sa Pagbawi" }, - "confirmRpcUrlDeletionMessage": { - "message": "Sigurado ka ba na nais mong tanggalin ang RPC URL? Ang iyong impormasyon ay hindi mase-save sa network na ito." - }, "confirmTitleDescPermitSignature": { "message": "Ang site na ito ay nais ng permiso para gamitin ang iyong mga token." }, @@ -1368,9 +1349,6 @@ "custom": { "message": "Makabago" }, - "customContentSearch": { - "message": "Maghanap ng naunang idinagdag na network" - }, "customGasSettingToolTipMessage": { "message": "Gamitin ang $1 para i-customize ang presyo ng gas. Ito ay maaaring nakakalito kung hindi ka pamilyar. Harapin ang sarili mong panganib.", "description": "$1 is key 'advanced' (text: 'Advanced') separated here so that it can be passed in with bold font-weight" @@ -1490,9 +1468,6 @@ "deleteContact": { "message": "Tanggalin ang kontak" }, - "deleteNetwork": { - "message": "Tanggalin ang network?" - }, "deleteNetworkIntro": { "message": "Kapag tinanggal mo ang network na ito, kakailanganin mo itong idagdag muli para makita ang mga asset mo sa network na ito" }, @@ -1500,9 +1475,6 @@ "message": "Tanggalin ang $1 network?", "description": "$1 represents the name of the network" }, - "deleteRpcUrl": { - "message": "Tanggalin ang RPC URL" - }, "deposit": { "message": "Deposito" }, @@ -1867,9 +1839,6 @@ "existingRequestsBannerAlertDesc": { "message": "Para tingnan at kumpirmahin ang iyong pinakabagong hiling, kailangan mo munang aprubahan o tanggihan ang mga umiiral na hiling." }, - "existingRpcUrl": { - "message": "Ang URL na ito ay nauugnay sa ibang ID ng chain." - }, "expandView": { "message": "I-expand ang view" }, @@ -1901,9 +1870,6 @@ "failedToFetchChainId": { "message": "Hindi makuha ang ID ng chain. Tama ba ang iyong RPC URL?" }, - "failedToFetchTickerSymbolData": { - "message": "Ang data ng pag-verify sa simbolo ng ticker ay hindi available sa kasalukuyan, tiyaking tama ang simbolo na inilagay mo. Makakaapekto ito sa mga rate ng palitan na nakikita mo para sa network na ito" - }, "failureMessage": { "message": "Nagkaproblema, at hindi namin makumpleto ang aksyon" }, @@ -1924,9 +1890,6 @@ "message": "Hindi gumagana ang pag-import ng file? Mag-click dito!", "description": "Helps user import their account from a JSON file" }, - "findTheRightChainId": { - "message": "Hanapin ang tama sa:" - }, "flaskWelcomeUninstall": { "message": "dapat mong i-uninstall ang extension na ito", "description": "This request is shown on the Flask Welcome screen. It is intended for non-developers, and will be bolded." @@ -2416,9 +2379,6 @@ "invalidAssetType": { "message": "Ang asset na ito ay isang NFT at kailangang idagdag muli sa pahina ng Mag-import ng mga NFT na matatagpuan sa ilalim ng tab ng mga NFT" }, - "invalidBlockExplorerURL": { - "message": "Di-wastong URL ng block explorer" - }, "invalidChainIdTooBig": { "message": "Di-wastong ID ng chain. Napakalaki ng ID ng chain." }, @@ -2938,9 +2898,6 @@ "network": { "message": "Network:" }, - "networkAddedSuccessfully": { - "message": "Matagumpay na naidagdag ang network!" - }, "networkDetails": { "message": "Mga Detalye ng Network" }, @@ -3001,9 +2958,6 @@ "networkProvider": { "message": "Network provider" }, - "networkSettingsChainIdDescription": { - "message": "Ginagamit ang ID ng chain sa pagpirma ng mga transaksyon. Dapat itong tumugma sa ID ng chain na ibinalik ng network. Puwede kang maglagay ng decimal o '0x'-prefixed hexadecimal number, pero ipapakita namin ang numero sa decimal." - }, "networkStatus": { "message": "Katayuan ng network" }, @@ -3452,9 +3406,6 @@ "onboardingAdvancedPrivacyIPFSValid": { "message": "Ang URL ng IPFS gateway ay wasto" }, - "onboardingAdvancedPrivacyNetworkButton": { - "message": "Magdagdag ng custom na network" - }, "onboardingAdvancedPrivacyNetworkDescription": { "message": "Gumagamit kami ng Infura bilang aming provider ng remote procedure call (RPC) para mag-alok ng pinakamaaasahan at pribadong access sa Ethereum data na kaya namin. Maaari kang pumili ng iyong sariling RPC, ngunit tandaan na ang anumang RPC ay makakatanggap ng iyong IP address at Ethereum wallet upang gumawa ng mga transaksyon. Basahin ang aming $1 para matuto pa tungkol sa kung paano pinangangasiwaan ng Infura ang data." }, @@ -3483,9 +3434,6 @@ "onboardingMetametricsInfuraTermsPolicy": { "message": "Patakaran sa Pagkapribado" }, - "onboardingMetametricsModalTitle": { - "message": "Magdagdag ng custom na network" - }, "onboardingMetametricsNeverCollect": { "message": "$1 mga click at view sa app ay nakaimbak, ngunit ang ibang detalye (tulad ng iyong address) ay hindi.", "description": "$1 represents `onboardingMetametricsNeverCollectEmphasis`" @@ -3578,9 +3526,6 @@ "onekey": { "message": "OneKey" }, - "onlyAddTrustedNetworks": { - "message": "Ang isang mapaminsalang network provider ay maaaring magsinungaling tungkol sa estado ng blockchain at itala ang iyong aktibidad sa network. Magdagdag lamang ng mga custom na network na pinagkakatiwalaan mo." - }, "onlyConnectTrust": { "message": "Kumonekta lang sa mga site na pinagkakatiwalaan mo. $1", "description": "Text displayed above the buttons for connection confirmation. $1 is the link to the learn more web page." @@ -3605,9 +3550,6 @@ "optional": { "message": "Opsyonal" }, - "optionalWithParanthesis": { - "message": "(Opsyonal)" - }, "options": { "message": "Mga pagpipilian" }, @@ -3959,9 +3901,6 @@ "message": "+ $1 pa", "description": "$1 is a number of additional but unshown items in a list- this message will be shown in place of those items" }, - "popularCustomNetworks": { - "message": "Mga sikat na custom na network" - }, "popularNetworkAddToolTip": { "message": "Ang ilan sa mga network na ito ay umaasa sa mga third party. Ang koneksyon na ito ay maaaring hindi gaanong maaasahan o binibigyang-daan ang mga third-party na mag-track ng aktibidad. $1", "description": "$1 is Learn more link" @@ -5298,9 +5237,6 @@ "suggestedTokenName": { "message": "Iminumungkahing pangalan:" }, - "suggestedTokenSymbol": { - "message": "Iminumungkahing ticket symbol:" - }, "support": { "message": "Humingi ng Tulong" }, @@ -5789,9 +5725,6 @@ "termsOfUseTitle": { "message": "Na-update ang aming Mga Tuntunin sa Paggamit" }, - "testNetworks": { - "message": "Suriin ang mga network" - }, "theme": { "message": "Tema" }, @@ -6103,9 +6036,6 @@ "message": "U2F", "description": "A name on an API for the browser to interact with devices that support the U2F protocol. On some browsers we use it to connect MetaMask to Ledger devices." }, - "unMatchedChain": { - "message": "Ayon sa aming mga talaan, ang URL na ito ay hindi tumutugma sa isang kilalang provider para sa ID ng chain na ito." - }, "unapproved": { "message": "Hindi inaprubahan" }, @@ -6175,9 +6105,6 @@ "urlErrorMsg": { "message": "Kinakailangan ng mga URL ang naaangkop na HTTP/HTTPS prefix." }, - "urlExistsErrorMsg": { - "message": "Nasa kasalukuyang listahan ng mga network na ang URL." - }, "use4ByteResolution": { "message": "I-decode ang mga smart na kontrata" }, @@ -6387,9 +6314,6 @@ "whatsThis": { "message": "Ano ito?" }, - "wrongChainId": { - "message": "Ang ID ng chain na ito ay hindi tugma sa pangalan ng network." - }, "wrongNetworkName": { "message": "Ayon sa aming mga talaan, ang pangalan ng network ay maaaring hindi tumugma nang tama sa ID ng chain na ito." }, @@ -6403,10 +6327,6 @@ "you": { "message": "Ikaw" }, - "youHaveAddedAll": { - "message": "Idinagdag mo ang lahat ng sikat na network. Maaari kang makatuklas ng higit pang mga network $1 O maaari kang", - "description": "$1 is a link with the text 'here' and $2 is a button with the text 'add more networks manually'" - }, "youNeedToAllowCameraAccess": { "message": "Kailangan mong payagan ang pag-access sa camera para magamit ang feature na ito." }, diff --git a/app/_locales/tr/messages.json b/app/_locales/tr/messages.json index 09ee23ea8d92..7537fd19b1fe 100644 --- a/app/_locales/tr/messages.json +++ b/app/_locales/tr/messages.json @@ -183,9 +183,6 @@ "addANetwork": { "message": "Ağ ekle" }, - "addANetworkManually": { - "message": "Manuel olarak bir ağ ekle" - }, "addANickname": { "message": "Takma ad ekle" }, @@ -252,9 +249,6 @@ "addFriendsAndAddresses": { "message": "Güvendiğiniz arkadaşlarınızı ve adresleri ekleyin" }, - "addFromAListOfPopularNetworks": { - "message": "Popüler ağlar listesinden ekle veya manuel olarak bir ağ ekle. Yalnızca güvendiğin varlıklarla etkileşim kur." - }, "addHardwareWallet": { "message": "Donanım cüzdanı ekleyin" }, @@ -267,16 +261,9 @@ "addMemo": { "message": "Not ekleyin" }, - "addMoreNetworks": { - "message": "manuel olarak daha fazla ağ ekleyin" - }, "addNetwork": { "message": "Ağ ekle" }, - "addNetworkTooltipWarning": { - "message": "Bu ağ bağlantısı üçüncü taraflara dayalıdır. Bu bağlantı daha az güvenli olabilir veya üçüncü tarafların aktiviteleri takip etmesine olanak sağlayabilir. $1", - "description": "$1 is Learn more link" - }, "addNewAccount": { "message": "Yeni bir Ethereum hesabı ekle" }, @@ -1000,9 +987,6 @@ "confirmConnectionTitle": { "message": "$1 ile bağlantıyı onayla" }, - "confirmDeletion": { - "message": "Silme işlemini onayla" - }, "confirmFieldPaymaster": { "message": "Ücreti ödeyen taraf" }, @@ -1015,9 +999,6 @@ "confirmRecoveryPhrase": { "message": "Gizli Kurtarma İfadesini Onayla" }, - "confirmRpcUrlDeletionMessage": { - "message": "RPC URL adresini silmek istediğinizden emin misiniz? Bilgileriniz bu ağ için kaydedilmeyecektir." - }, "confirmTitleDescPermitSignature": { "message": "Bu site token'lerinizi harcamak için izin istiyor." }, @@ -1368,9 +1349,6 @@ "custom": { "message": "Gelişmiş" }, - "customContentSearch": { - "message": "Önceden eklenmiş bir ağı ara" - }, "customGasSettingToolTipMessage": { "message": "Gaz fiyatını özelleştirmek için $1 kullanın. Bu, bilgi sahibi değilseniz kafa karıştırıcı olabilir. Riski size ait olmak üzere kullanın.", "description": "$1 is key 'advanced' (text: 'Advanced') separated here so that it can be passed in with bold font-weight" @@ -1490,9 +1468,6 @@ "deleteContact": { "message": "Kişiyi sil" }, - "deleteNetwork": { - "message": "Ağı Sil?" - }, "deleteNetworkIntro": { "message": "Bu ağı silerseniz bu ağdaki varlıklarınızı görüntülemek için bu ağı tekrar eklemeniz gerekecek" }, @@ -1500,9 +1475,6 @@ "message": "$1 ağını sil?", "description": "$1 represents the name of the network" }, - "deleteRpcUrl": { - "message": "RPC URL'sini sil" - }, "deposit": { "message": "Para Yatır" }, @@ -1867,9 +1839,6 @@ "existingRequestsBannerAlertDesc": { "message": "En son talebinizi görüntülemek ve onaylamak için önce mevcut taleplerinizi onaylamanız veya reddetmeniz gereklidir." }, - "existingRpcUrl": { - "message": "Bu URL adresi başka bir zincir kimliği ile ilişkilidir." - }, "expandView": { "message": "Görünümü genişlet" }, @@ -1901,9 +1870,6 @@ "failedToFetchChainId": { "message": "Zincir kimliği alınamadı. RPC URL adresiniz doğru mu?" }, - "failedToFetchTickerSymbolData": { - "message": "Ticker sembolü doğrulama verileri şu anda mevcut değil, girdiğin sembolün doğru olduğundan emin ol. Bu ağ için gördüğün dönüşüm oranlarını etkileyecektir" - }, "failureMessage": { "message": "Bir şeyler ters gitti ve işlemi tamamlayamadık" }, @@ -1924,9 +1890,6 @@ "message": "Dosya içe aktarma çalışmıyor mu? Buraya tıklayın!", "description": "Helps user import their account from a JSON file" }, - "findTheRightChainId": { - "message": "Doğrusunu şurada bulabilirsiniz:" - }, "flaskWelcomeUninstall": { "message": "bu uzantıyı kaldırmalısın", "description": "This request is shown on the Flask Welcome screen. It is intended for non-developers, and will be bolded." @@ -2416,9 +2379,6 @@ "invalidAssetType": { "message": "Bu varlık bir NFT'dir ve NFT'ler sekmesi altında bulunan NFT'leri İçe Aktar sayfasına yeniden eklenmesi gerekir" }, - "invalidBlockExplorerURL": { - "message": "Block Explorer URL adresi geçersiz" - }, "invalidChainIdTooBig": { "message": "Zincir kimliği geçersiz. Zincir kimliği çok büyük." }, @@ -2938,9 +2898,6 @@ "network": { "message": "Ağ:" }, - "networkAddedSuccessfully": { - "message": "Ağ başarılı bir şekilde eklendi!" - }, "networkDetails": { "message": "Ağ bilgileri" }, @@ -3001,9 +2958,6 @@ "networkProvider": { "message": "Ağ sağlayıcısı" }, - "networkSettingsChainIdDescription": { - "message": "İşlemlerin imzalanması için kullanılan zincir kimliği. Ağ tarafından yanıt olarak sunulan zincir kimliği ile uyumlu olmalıdır. Bir ondalık ya da \"0x\" ön ekli on altılı sayı girebilirsiniz ancak biz sayıyı ondalık olarak gösteririz." - }, "networkStatus": { "message": "Ağ durumu" }, @@ -3452,9 +3406,6 @@ "onboardingAdvancedPrivacyIPFSValid": { "message": "IPFS ağ geçidi URL adresi geçerli" }, - "onboardingAdvancedPrivacyNetworkButton": { - "message": "Özel ağ ekle" - }, "onboardingAdvancedPrivacyNetworkDescription": { "message": "Ethereum verilerine mümkün olan en güvenilir ve gizli erişimi sunmak amacıyla uzak yordam çağrısı (RPC) sağlayıcısı olarak Infura kullanırız. Kendi RPC'nizi seçebilirsiniz ancak tüm RPC'lerin işlemleri gerçekleştirmek için IP adresinizi ve Ethereum cüzdanınızı alacağını unutmayın. Infura'nın verileri nasıl kullandığı hakkında daha fazla bilgi edinmek için $1 bölümümüzü okuyun." }, @@ -3483,9 +3434,6 @@ "onboardingMetametricsInfuraTermsPolicy": { "message": "Gizlilik Politikası" }, - "onboardingMetametricsModalTitle": { - "message": "Özel ağ ekle" - }, "onboardingMetametricsNeverCollect": { "message": "$1 uygulama üzerindeki tıklamalar ve görüntülemeler depolanır ancak diğer bilgiler (genel adresiniz gibi) depolanmaz.", "description": "$1 represents `onboardingMetametricsNeverCollectEmphasis`" @@ -3578,9 +3526,6 @@ "onekey": { "message": "OneKey" }, - "onlyAddTrustedNetworks": { - "message": "Kötü amaçlı bir ağ sağlayıcı blokzinciri durumu hakkında yalan söyleyebilir ve ağ aktivitenizi kaydedebilir. Sadece güvendiğiniz özel ağları ekleyin." - }, "onlyConnectTrust": { "message": "Sadece güvendiğiniz sitelere bağlayın. $1", "description": "Text displayed above the buttons for connection confirmation. $1 is the link to the learn more web page." @@ -3605,9 +3550,6 @@ "optional": { "message": "İsteğe bağlı" }, - "optionalWithParanthesis": { - "message": "(İsteğe bağlı)" - }, "options": { "message": "Seçenekler" }, @@ -3959,9 +3901,6 @@ "message": "+ $1 tane daha", "description": "$1 is a number of additional but unshown items in a list- this message will be shown in place of those items" }, - "popularCustomNetworks": { - "message": "Popüler özel ağlar" - }, "popularNetworkAddToolTip": { "message": "Bu ağların bazıları üçüncü taraflara dayalıdır. Bağlantılar daha az güvenilir olabilir veya üçüncü tarafların aktiviteleri takip etmesine olanak sağlayabilir. $1", "description": "$1 is Learn more link" @@ -5298,9 +5237,6 @@ "suggestedTokenName": { "message": "Önerilen isim:" }, - "suggestedTokenSymbol": { - "message": "Önerilen ticker sembolü:" - }, "support": { "message": "Destek" }, @@ -5789,9 +5725,6 @@ "termsOfUseTitle": { "message": "Kullanım Şartları bölümümüz güncellendi" }, - "testNetworks": { - "message": "Test ağları" - }, "theme": { "message": "Tema" }, @@ -6103,9 +6036,6 @@ "message": "U2F", "description": "A name on an API for the browser to interact with devices that support the U2F protocol. On some browsers we use it to connect MetaMask to Ledger devices." }, - "unMatchedChain": { - "message": "Kayıtlarımıza göre bu URL adresi bu zincir kimliğinin bilinen bir sağlayıcısı ile uyumlu değil." - }, "unapproved": { "message": "Onaylanmadı" }, @@ -6175,9 +6105,6 @@ "urlErrorMsg": { "message": "URL adresleri için uygun HTTP/HTTPS ön eki gerekir." }, - "urlExistsErrorMsg": { - "message": "Bu URL şu anda $1 ağı tarafından kullanılıyor." - }, "use4ByteResolution": { "message": "Akıllı sözleşmelerin şifresini çöz" }, @@ -6387,9 +6314,6 @@ "whatsThis": { "message": "Bu nedir?" }, - "wrongChainId": { - "message": "Bu zincir kimliği ağ adı ile uyumlu değil." - }, "wrongNetworkName": { "message": "Kayıtlarımıza göre ağ adı bu zincir kimliği ile doğru şekilde eşleşmiyor olabilir." }, @@ -6403,10 +6327,6 @@ "you": { "message": "Siz" }, - "youHaveAddedAll": { - "message": "Tüm popüler ağları eklediniz. $1 daha fazla ağ gekşefedebilir veya $2 seçeneğini seçebilirsiniz", - "description": "$1 is a link with the text 'here' and $2 is a button with the text 'add more networks manually'" - }, "youNeedToAllowCameraAccess": { "message": "Bu özelliği kullanmak için kamera erişimine izin vermeniz gerekir." }, diff --git a/app/_locales/uk/messages.json b/app/_locales/uk/messages.json index 48d559bbdb40..37bab506a87d 100644 --- a/app/_locales/uk/messages.json +++ b/app/_locales/uk/messages.json @@ -205,9 +205,6 @@ "delete": { "message": "Видалити" }, - "deleteNetwork": { - "message": "Видалити мережу?" - }, "details": { "message": "Деталі" }, @@ -351,9 +348,6 @@ "invalidAddressRecipient": { "message": "Недійсна адреса отримувача" }, - "invalidBlockExplorerURL": { - "message": "Недійсний Block Explorer URL" - }, "invalidRPC": { "message": "Недійсний RPC URL" }, diff --git a/app/_locales/vi/messages.json b/app/_locales/vi/messages.json index b1fa5514980e..81e8c008a46b 100644 --- a/app/_locales/vi/messages.json +++ b/app/_locales/vi/messages.json @@ -183,9 +183,6 @@ "addANetwork": { "message": "Thêm mạng" }, - "addANetworkManually": { - "message": "Thêm mạng theo cách thủ công" - }, "addANickname": { "message": "Thêm biệt danh" }, @@ -252,9 +249,6 @@ "addFriendsAndAddresses": { "message": "Thêm bạn bè và địa chỉ mà bạn tin tưởng" }, - "addFromAListOfPopularNetworks": { - "message": "Thêm từ danh sách các mạng phổ biến hoặc thêm mạng theo cách thủ công. Chỉ tương tác với các đối tượng mà bạn tin tưởng." - }, "addHardwareWallet": { "message": "Thêm ví cứng" }, @@ -267,16 +261,9 @@ "addMemo": { "message": "Thêm bản ghi nhớ" }, - "addMoreNetworks": { - "message": "thêm thủ công các mạng khác" - }, "addNetwork": { "message": "Thêm mạng" }, - "addNetworkTooltipWarning": { - "message": "Kết nối mạng này dựa vào các bên thứ ba. Kết nối này có thể kém tin cậy hơn hoặc cho phép các bên thứ ba theo dõi hoạt động. $1", - "description": "$1 is Learn more link" - }, "addNewAccount": { "message": "Thêm tài khoản Ethereum mới" }, @@ -1000,9 +987,6 @@ "confirmConnectionTitle": { "message": "Xác nhận kết nối với $1" }, - "confirmDeletion": { - "message": "Xác nhận xóa" - }, "confirmFieldPaymaster": { "message": "Phí được thanh toán bởi" }, @@ -1015,9 +999,6 @@ "confirmRecoveryPhrase": { "message": "Xác nhận Cụm từ khôi phục bí mật" }, - "confirmRpcUrlDeletionMessage": { - "message": "Bạn có chắc chắn muốn xóa URL RPC? Thông tin của bạn sẽ không được lưu cho mạng này." - }, "confirmTitleDescPermitSignature": { "message": "Trang web này muốn được cấp quyền để chi tiêu số token của bạn." }, @@ -1368,9 +1349,6 @@ "custom": { "message": "Nâng cao" }, - "customContentSearch": { - "message": "Tìm kiếm mạng đã thêm trước đây" - }, "customGasSettingToolTipMessage": { "message": "Sử dụng $1 để tùy chỉnh giá gas. Việc này có thể gây nhầm lẫn nếu bạn không quen thuộc. Bạn phải tự chịu trách nhiệm nếu thực hiện.", "description": "$1 is key 'advanced' (text: 'Advanced') separated here so that it can be passed in with bold font-weight" @@ -1490,9 +1468,6 @@ "deleteContact": { "message": "Xóa địa chỉ liên hệ" }, - "deleteNetwork": { - "message": "Xóa mạng?" - }, "deleteNetworkIntro": { "message": "Nếu xóa mạng này, bạn sẽ cần thêm lại mạng này để xem các tài sản của mình trong mạng này" }, @@ -1500,9 +1475,6 @@ "message": "Xóa mạng $1?", "description": "$1 represents the name of the network" }, - "deleteRpcUrl": { - "message": "Xóa URL RPC" - }, "deposit": { "message": "Nạp" }, @@ -1867,9 +1839,6 @@ "existingRequestsBannerAlertDesc": { "message": "Để xem và xác nhận yêu cầu gần đây nhất của bạn, trước tiên bạn cần phải chấp thuận hoặc từ chối các yêu cầu hiện có." }, - "existingRpcUrl": { - "message": "URL này được liên kết với một ID chuỗi khác." - }, "expandView": { "message": "Chế độ xem mở rộng" }, @@ -1901,9 +1870,6 @@ "failedToFetchChainId": { "message": "Không thể tìm nạp ID chuỗi. URL RPC của bạn có chính xác không?" }, - "failedToFetchTickerSymbolData": { - "message": "Dữ liệu xác minh ký hiệu mã hiện không khả dụng, hãy chắc chắn bạn đã nhập đúng ký hiệu. Điều này sẽ ảnh hưởng đến tỷ giá chuyển đổi mà bạn nhìn thấy trong mạng này" - }, "failureMessage": { "message": "Đã xảy ra sự cố và chúng tôi không thể hoàn tất hành động" }, @@ -1924,9 +1890,6 @@ "message": "Tính năng nhập tập tin không hoạt động? Nhấp vào đây!", "description": "Helps user import their account from a JSON file" }, - "findTheRightChainId": { - "message": "Tìm ID chuỗi đúng trên:" - }, "flaskWelcomeUninstall": { "message": "bạn nên gỡ cài đặt tiện ích mở rộng này", "description": "This request is shown on the Flask Welcome screen. It is intended for non-developers, and will be bolded." @@ -2416,9 +2379,6 @@ "invalidAssetType": { "message": "Tài sản này là một NFT và cần được thêm lại trên trang Nhập NFT bên dưới thẻ NFT" }, - "invalidBlockExplorerURL": { - "message": "URL trình khám phá khối không hợp lệ" - }, "invalidChainIdTooBig": { "message": "ID chuỗi không hợp lệ. ID chuỗi quá lớn." }, @@ -2938,9 +2898,6 @@ "network": { "message": "Mạng:" }, - "networkAddedSuccessfully": { - "message": "Đã thêm mạng thành công!" - }, "networkDetails": { "message": "Thông tin về mạng" }, @@ -3001,9 +2958,6 @@ "networkProvider": { "message": "Nhà cung cấp mạng" }, - "networkSettingsChainIdDescription": { - "message": "ID chuỗi được dùng để ký các giao dịch. Giá trị này phải khớp với ID chuỗi do mạng trả về. Bạn có thể nhập một số thập phân hoặc số thập lục phân bắt đầu bằng “0x” nhưng chúng tôi sẽ hiển thị số ở dạng thập phân." - }, "networkStatus": { "message": "Trạng thái mạng" }, @@ -3452,9 +3406,6 @@ "onboardingAdvancedPrivacyIPFSValid": { "message": "URL cổng IPFS hợp lệ" }, - "onboardingAdvancedPrivacyNetworkButton": { - "message": "Thêm mạng tùy chỉnh" - }, "onboardingAdvancedPrivacyNetworkDescription": { "message": "Chúng tôi sử dụng Infura làm nhà cung cấp dịch vụ gọi hàm từ xa (RPC) để cung cấp quyền truy cập riêng tư và đáng tin cậy nhất vào dữ liệu Ethereum mà chúng tôi có thể. Bạn có thể chọn RPC của riêng mình, nhưng hãy nhớ rằng bất kỳ RPC nào cũng sẽ thu thập địa chỉ IP và ví Ethereum của bạn để thực hiện giao dịch. Đọc $1 của chúng tôi để tìm hiểu thêm về cách Infura xử lý dữ liệu." }, @@ -3483,9 +3434,6 @@ "onboardingMetametricsInfuraTermsPolicy": { "message": "Chính sách quyền riêng tư" }, - "onboardingMetametricsModalTitle": { - "message": "Thêm mạng tùy chỉnh" - }, "onboardingMetametricsNeverCollect": { "message": "$1 chỉ lưu trữ các lượt nhấn và lượt xem trên ứng dụng, các thông tin khác (chẳng hạn như địa chỉ công khai của bạn) sẽ không được lưu trữ.", "description": "$1 represents `onboardingMetametricsNeverCollectEmphasis`" @@ -3578,9 +3526,6 @@ "onekey": { "message": "OneKey" }, - "onlyAddTrustedNetworks": { - "message": "Một nhà cung cấp mạng độc hại có thể nói dối về trạng thái của chuỗi khối và ghi lại hoạt động của bạn trên mạng. Chỉ thêm các mạng tùy chỉnh mà bạn tin tưởng." - }, "onlyConnectTrust": { "message": "Chỉ kết nối với các trang web mà bạn tin tưởng. $1", "description": "Text displayed above the buttons for connection confirmation. $1 is the link to the learn more web page." @@ -3605,9 +3550,6 @@ "optional": { "message": "Không bắt buộc" }, - "optionalWithParanthesis": { - "message": "(Không bắt buộc)" - }, "options": { "message": "Tùy chọn" }, @@ -3959,9 +3901,6 @@ "message": "+ $1 khác", "description": "$1 is a number of additional but unshown items in a list- this message will be shown in place of those items" }, - "popularCustomNetworks": { - "message": "Mạng tùy chỉnh phổ biến" - }, "popularNetworkAddToolTip": { "message": "Một vài mạng trong số này phụ thuộc vào bên thứ ba. Kết nối có thể kém tin cậy hơn hoặc cho phép bên thứ ba theo dõi hoạt động. $1", "description": "$1 is Learn more link" @@ -5298,9 +5237,6 @@ "suggestedTokenName": { "message": "Tên đề xuất:" }, - "suggestedTokenSymbol": { - "message": "Mã chứng khoán được đề xuất:" - }, "support": { "message": "Hỗ trợ" }, @@ -5789,9 +5725,6 @@ "termsOfUseTitle": { "message": "Điều khoản sử dụng của chúng tôi đã được cập nhật" }, - "testNetworks": { - "message": "Mạng thử nghiệm" - }, "theme": { "message": "Chủ đề" }, @@ -6103,9 +6036,6 @@ "message": "U2F", "description": "A name on an API for the browser to interact with devices that support the U2F protocol. On some browsers we use it to connect MetaMask to Ledger devices." }, - "unMatchedChain": { - "message": "Theo hồ sơ của chúng tôi, URL này không khớp với nhà cung cấp đã biết cho ID chuỗi này." - }, "unapproved": { "message": "Chưa chấp thuận" }, @@ -6175,9 +6105,6 @@ "urlErrorMsg": { "message": "URL phải có tiền tố HTTP/HTTPS phù hợp." }, - "urlExistsErrorMsg": { - "message": "Mạng $1 hiện đang sử dụng URL này." - }, "use4ByteResolution": { "message": "Giải mã hợp đồng thông minh" }, @@ -6387,9 +6314,6 @@ "whatsThis": { "message": "Đây là gì?" }, - "wrongChainId": { - "message": "ID chuỗi này không khớp với tên mạng." - }, "wrongNetworkName": { "message": "Theo hồ sơ của chúng tôi, tên mạng có thể không khớp chính xác với ID chuỗi này." }, @@ -6403,10 +6327,6 @@ "you": { "message": "Bạn" }, - "youHaveAddedAll": { - "message": "Bạn đã thêm tất cả các mạng phổ biến. Bạn có thể khám phá thêm nhiều mạng khác $1 Hoặc bạn có thể $2", - "description": "$1 is a link with the text 'here' and $2 is a button with the text 'add more networks manually'" - }, "youNeedToAllowCameraAccess": { "message": "Bạn cần cho phép truy cập vào máy ảnh để sử dụng tính năng này." }, diff --git a/app/_locales/zh_CN/messages.json b/app/_locales/zh_CN/messages.json index 8733daf9431c..5b556663ac31 100644 --- a/app/_locales/zh_CN/messages.json +++ b/app/_locales/zh_CN/messages.json @@ -183,9 +183,6 @@ "addANetwork": { "message": "添加网络" }, - "addANetworkManually": { - "message": "手动添加网络" - }, "addANickname": { "message": "添加昵称" }, @@ -252,9 +249,6 @@ "addFriendsAndAddresses": { "message": "添加您信任的朋友和地址" }, - "addFromAListOfPopularNetworks": { - "message": "从热门网络列表中选择网络来添加,或手动添加网络。仅可与您信任的实体互动。" - }, "addHardwareWallet": { "message": "添加硬件钱包" }, @@ -267,16 +261,9 @@ "addMemo": { "message": "添加备忘录" }, - "addMoreNetworks": { - "message": "手动添加更多网络" - }, "addNetwork": { "message": "添加网络" }, - "addNetworkTooltipWarning": { - "message": "此网络连接依赖于第三方。此连接可能不太可靠,或使第三方可进行活动跟踪。$1", - "description": "$1 is Learn more link" - }, "addNewAccount": { "message": "添加新账户" }, @@ -1000,9 +987,6 @@ "confirmConnectionTitle": { "message": "确认连接到$1" }, - "confirmDeletion": { - "message": "确认删除" - }, "confirmFieldPaymaster": { "message": "费用支付方" }, @@ -1015,9 +999,6 @@ "confirmRecoveryPhrase": { "message": "确认私钥助记词" }, - "confirmRpcUrlDeletionMessage": { - "message": "您确定要删除 RPC(远程过程调用)URL 吗?您的信息将不会保存到此网络。" - }, "confirmTitleDescPermitSignature": { "message": "此网站需要获得许可来使用您的代币。" }, @@ -1368,9 +1349,6 @@ "custom": { "message": "高级" }, - "customContentSearch": { - "message": "搜索以前添加的网络" - }, "customGasSettingToolTipMessage": { "message": "使用$1来定制燃料价格。如果您不熟悉这可能会引起混淆。操作风险自付。", "description": "$1 is key 'advanced' (text: 'Advanced') separated here so that it can be passed in with bold font-weight" @@ -1490,9 +1468,6 @@ "deleteContact": { "message": "删除联系人" }, - "deleteNetwork": { - "message": "删除网络?" - }, "deleteNetworkIntro": { "message": "如果您删除此网络,则需要再次添加此网络才能查看您在其中的资产" }, @@ -1500,9 +1475,6 @@ "message": "要删除$1网络吗?", "description": "$1 represents the name of the network" }, - "deleteRpcUrl": { - "message": "删除 RPC(远程过程调用)URL" - }, "deposit": { "message": "保证金" }, @@ -1867,9 +1839,6 @@ "existingRequestsBannerAlertDesc": { "message": "如需查看和确认您的最新请求,您需要首先批准或拒绝现有请求。" }, - "existingRpcUrl": { - "message": "此 URL 与另一个链 ID 相关联。" - }, "expandView": { "message": "展开视图" }, @@ -1901,9 +1870,6 @@ "failedToFetchChainId": { "message": "无法获取链 ID。您的 RPC URL 正确吗?" }, - "failedToFetchTickerSymbolData": { - "message": "股票代码验证数据当前未能提供,请确保您输入的代码正确无误。这会影响您在此网络看到的兑换率" - }, "failureMessage": { "message": "出了点问题,我们无法完成此操作" }, @@ -1924,9 +1890,6 @@ "message": "文件导入失败?点击这里!", "description": "Helps user import their account from a JSON file" }, - "findTheRightChainId": { - "message": "在下方找到合适的:" - }, "flaskWelcomeUninstall": { "message": "您应该卸载此扩展程序", "description": "This request is shown on the Flask Welcome screen. It is intended for non-developers, and will be bolded." @@ -2416,9 +2379,6 @@ "invalidAssetType": { "message": "该资产是NFT,需要在NFT选项卡下的“导入NFT”页面上重新添加" }, - "invalidBlockExplorerURL": { - "message": "无效的区块浏览器 URL" - }, "invalidChainIdTooBig": { "message": "无效的链 ID,链 ID 过大。" }, @@ -2938,9 +2898,6 @@ "network": { "message": "网络: " }, - "networkAddedSuccessfully": { - "message": "网络添加成功!" - }, "networkDetails": { "message": "网络详情" }, @@ -3001,9 +2958,6 @@ "networkProvider": { "message": "网络提供商" }, - "networkSettingsChainIdDescription": { - "message": "链 ID 用于签署交易。它必须与网络返回的链 ID 相匹配。您可以输入十进制或以'0x'开头的十六进制数字,但我们将以十进制显示该数字。" - }, "networkStatus": { "message": "网络状态" }, @@ -3452,9 +3406,6 @@ "onboardingAdvancedPrivacyIPFSValid": { "message": "IPFS 网关 URL 有效" }, - "onboardingAdvancedPrivacyNetworkButton": { - "message": "添加自定义网络" - }, "onboardingAdvancedPrivacyNetworkDescription": { "message": "我们使用 Infura 作为我们的远程过程调用(RPC)提供商,以提供最可靠和最私密的以太坊数据访问。您可以选择自己的 RPC,但请谨记,任何 RPC 都可以接收您的 IP 地址和以太坊钱包以进行交易。请阅读我们的 $1,进一步了解 Infura 如何处理数据。" }, @@ -3483,9 +3434,6 @@ "onboardingMetametricsInfuraTermsPolicy": { "message": "隐私政策" }, - "onboardingMetametricsModalTitle": { - "message": "添加自定义网络" - }, "onboardingMetametricsNeverCollect": { "message": "$1 会存储点击量和应用程序的浏览量,但不会存储其他详情(如您的公钥)。", "description": "$1 represents `onboardingMetametricsNeverCollectEmphasis`" @@ -3578,9 +3526,6 @@ "onekey": { "message": "OneKey" }, - "onlyAddTrustedNetworks": { - "message": "恶意网络提供商可能会谎报区块链的状态并记录您的网络活动。只添加您信任的自定义网络。" - }, "onlyConnectTrust": { "message": "仅连接您信任的网站。$1", "description": "Text displayed above the buttons for connection confirmation. $1 is the link to the learn more web page." @@ -3605,9 +3550,6 @@ "optional": { "message": "可选" }, - "optionalWithParanthesis": { - "message": "(可选)" - }, "options": { "message": "期权" }, @@ -3959,9 +3901,6 @@ "message": "另外 $1 项", "description": "$1 is a number of additional but unshown items in a list- this message will be shown in place of those items" }, - "popularCustomNetworks": { - "message": "流行自定义网络" - }, "popularNetworkAddToolTip": { "message": "这些网络中的其中一些依赖于第三方。此连接可能不太可靠,或使第三方可进行活动跟踪。$1", "description": "$1 is Learn more link" @@ -5298,9 +5237,6 @@ "suggestedTokenName": { "message": "建议名称:" }, - "suggestedTokenSymbol": { - "message": "建议的股票代码:" - }, "support": { "message": "获取帮助" }, @@ -5789,9 +5725,6 @@ "termsOfUseTitle": { "message": "我们的使用条款已更新" }, - "testNetworks": { - "message": "测试网络" - }, "theme": { "message": "主题" }, @@ -6103,9 +6036,6 @@ "message": "U2F", "description": "A name on an API for the browser to interact with devices that support the U2F protocol. On some browsers we use it to connect MetaMask to Ledger devices." }, - "unMatchedChain": { - "message": "根据我们的记录,此 URL 与此链 ID 的已知提供者不匹配。" - }, "unapproved": { "message": "未批准" }, @@ -6175,9 +6105,6 @@ "urlErrorMsg": { "message": "URL 需要相应的 HTTP/HTTPS 前缀。" }, - "urlExistsErrorMsg": { - "message": "此 URL 目前已被 $1 网络使用。" - }, "use4ByteResolution": { "message": "对智能合约进行解码" }, @@ -6387,9 +6314,6 @@ "whatsThis": { "message": "这是什么?" }, - "wrongChainId": { - "message": "此链 ID 与网络名称不匹配。" - }, "wrongNetworkName": { "message": "根据我们的记录,该网络名称可能与此链 ID 不匹配。" }, @@ -6403,10 +6327,6 @@ "you": { "message": "您" }, - "youHaveAddedAll": { - "message": "您已经添加了所有热门网络。您可以探索更多网络$1,或者您可以$2", - "description": "$1 is a link with the text 'here' and $2 is a button with the text 'add more networks manually'" - }, "youNeedToAllowCameraAccess": { "message": "需要开启相机访问权限,才能使用该功能。" }, diff --git a/app/_locales/zh_TW/messages.json b/app/_locales/zh_TW/messages.json index 04d3b772da22..0924d284b529 100644 --- a/app/_locales/zh_TW/messages.json +++ b/app/_locales/zh_TW/messages.json @@ -367,9 +367,6 @@ "delete": { "message": "刪除" }, - "deleteNetwork": { - "message": "刪除網路?" - }, "details": { "message": "詳情" }, @@ -669,9 +666,6 @@ "invalidAddressRecipient": { "message": "接收位址錯誤" }, - "invalidBlockExplorerURL": { - "message": "無效的區塊鏈瀏覽器 URL" - }, "invalidChainIdTooBig": { "message": "無效的鏈 ID。鏈 ID 數值過大。" }, @@ -822,9 +816,6 @@ "networkNameTestnet": { "message": "測試網路" }, - "networkSettingsChainIdDescription": { - "message": "鏈 ID 用來簽署交易。它必須和該網路回傳的鏈 ID 一致。您可以輸入一個十進位數值或 0x 開頭的十六進位數值,但我們會顯示成十進位。" - }, "networkURL": { "message": "網路 URL" }, @@ -908,9 +899,6 @@ "onboardingPinExtensionBillboardAccess": { "message": "Full Access" }, - "onlyAddTrustedNetworks": { - "message": "惡意的網路提供者可以欺騙您區塊鏈上的狀態或記錄您的網路活動。請只新增您信任的自訂網路。" - }, "onlyConnectTrust": { "message": "記住,只連線到您信任的網站。", "description": "Text displayed above the buttons for connection confirmation. $1 is the link to the learn more web page." @@ -1398,9 +1386,6 @@ "urlErrorMsg": { "message": "URL 需要以適當的 HTTP/HTTPS 作為開頭" }, - "urlExistsErrorMsg": { - "message": "URL 已經在既有的網路列表裡了" - }, "usePhishingDetection": { "message": "使用網路釣魚偵測" }, diff --git a/app/images/networks1.png b/app/images/networks1.png new file mode 100644 index 0000000000000000000000000000000000000000..780470e87810c91b5e531e635e89229bf8406aae GIT binary patch literal 5923 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 ZqRf+lv7bhf{xNL?C3!WuS{XC&{{TXuTB-m5 literal 0 HcmV?d00001 diff --git a/app/scripts/controllers/metametrics.js b/app/scripts/controllers/metametrics.js index e7618decb3ba..5ce36871262d 100644 --- a/app/scripts/controllers/metametrics.js +++ b/app/scripts/controllers/metametrics.js @@ -815,12 +815,12 @@ export default class MetaMetricsController { [MetaMetricsUserTrait.LedgerConnectionType]: metamaskState.ledgerTransportType, [MetaMetricsUserTrait.NetworksAdded]: Object.values( - metamaskState.networkConfigurations, + metamaskState.networkConfigurationsByChainId, ).map((networkConfiguration) => networkConfiguration.chainId), [MetaMetricsUserTrait.NetworksWithoutTicker]: Object.values( - metamaskState.networkConfigurations, + metamaskState.networkConfigurationsByChainId, ) - .filter(({ ticker }) => !ticker) + .filter(({ nativeCurrency }) => !nativeCurrency) .map(({ chainId }) => chainId), [MetaMetricsUserTrait.NftAutodetectionEnabled]: metamaskState.useNftDetection, diff --git a/app/scripts/controllers/mmi-controller.ts b/app/scripts/controllers/mmi-controller.ts index 7cc024d0cd47..6351de5b7239 100644 --- a/app/scripts/controllers/mmi-controller.ts +++ b/app/scripts/controllers/mmi-controller.ts @@ -26,8 +26,8 @@ import { } from '@metamask/message-manager'; import { NetworkController } from '@metamask/network-controller'; import { InternalAccount } from '@metamask/keyring-api'; +import { toHex } from '@metamask/controller-utils'; import { toChecksumHexAddress } from '../../../shared/modules/hexstring-utils'; -import { CHAIN_IDS } from '../../../shared/constants/network'; import { CONNECT_HARDWARE_ROUTE } from '../../../ui/helpers/constants/routes'; import { MMIControllerOptions, @@ -759,15 +759,9 @@ export default class MMIController extends EventEmitter { this.custodyController.getAccountDetails(address); const extensionId = this.extension.runtime.id; - const { networkConfigurations: networkConfigurationsById } = - this.networkController.state; - const networkConfigurations = Object.values(networkConfigurationsById); - - const networks = [ - ...networkConfigurations, - { chainId: CHAIN_IDS.MAINNET }, - { chainId: CHAIN_IDS.SEPOLIA }, - ]; + const networks = Object.values( + this.networkController.state.networkConfigurationsByChainId, + ); return handleMmiPortfolio({ keyringAccounts, @@ -853,26 +847,24 @@ export default class MMIController extends EventEmitter { internalAccount.id, ); } - const selectedChainId = parseInt( - getCurrentChainId({ metamask: this.networkController.state }), - 16, - ); - if (selectedChainId !== chainId && chainId === 1) { - await this.networkController.setActiveNetwork('mainnet'); - } else if (selectedChainId !== chainId) { - const { networkConfigurations } = this.networkController.state; - - const foundNetworkConfiguration = Object.values( - networkConfigurations, - ).find( - (networkConfiguration) => - parseInt(networkConfiguration.chainId, 16) === chainId, - ); - if (foundNetworkConfiguration !== undefined) { - await this.networkController.setActiveNetwork( - foundNetworkConfiguration.id, - ); + const selectedChainId = getCurrentChainId({ + metamask: this.networkController.state, + }); + + if (selectedChainId !== toHex(chainId)) { + const networkConfiguration = + this.networkController.state.networkConfigurationsByChainId[ + toHex(chainId) + ]; + + const { networkClientId } = + networkConfiguration?.rpcEndpoints?.[ + networkConfiguration.defaultRpcEndpointIndex + ] ?? {}; + + if (networkClientId) { + await this.networkController.setActiveNetwork(networkClientId); } } diff --git a/app/scripts/controllers/network-order.ts b/app/scripts/controllers/network-order.ts index 8bd8372d05c0..324678682120 100644 --- a/app/scripts/controllers/network-order.ts +++ b/app/scripts/controllers/network-order.ts @@ -6,19 +6,18 @@ import { NetworkControllerStateChangeEvent, NetworkState, } from '@metamask/network-controller'; +import { Hex } from '@metamask/utils'; import type { Patch } from 'immer'; -import { MAINNET_CHAINS } from '../../../shared/constants/network'; +import { TEST_CHAINS } from '../../../shared/constants/network'; // Unique name for the controller const controllerName = 'NetworkOrderController'; /** - * The network ID of a network. + * Information about an ordered network. */ - export type NetworksInfo = { - networkId: string; - networkRpcUrl: string; + networkId: Hex; // The network's chain id }; // State shape for NetworkOrderController @@ -109,51 +108,32 @@ export class NetworkOrderController extends BaseController< * Handles the state change of the network controller and updates the networks list. * * @param networkControllerState - The state of the network controller. + * @param networkControllerState.networkConfigurationsByChainId */ - onNetworkControllerStateChange(networkControllerState: NetworkState) { - // Extract network configurations from the state - const networkConfigurations = Object.values( - networkControllerState.networkConfigurations, - ); - - // Since networkConfigurations doesn't have default or mainnet network configurations we need to combine mainnet chains with network configurations - const combinedNetworks = [...MAINNET_CHAINS, ...networkConfigurations]; - - // Extract unique chainIds from the combined networks - const uniqueChainIds = combinedNetworks.map((item) => ({ - networkId: item.chainId, - networkRpcUrl: item.rpcUrl, - })); - - // Arrays to store reordered and new unique chainIds - let reorderedNetworks: NetworksInfo[] = []; - const newUniqueNetworks: NetworksInfo[] = []; - - // Iterate through uniqueChainIds to reorder existing elements - uniqueChainIds.forEach((newItem) => { - const existingIndex = this.state.orderedNetworkList.findIndex( - (item) => - item.networkId === newItem.networkId && - item.networkRpcUrl === newItem.networkRpcUrl, - ); - // eslint-disable-next-line no-negated-condition - if (existingIndex !== -1) { - // Reorder existing element - reorderedNetworks[existingIndex] = newItem; - } else { - // Add new unique element - newUniqueNetworks.push(newItem); - } - }); - - // Filter out null values and concatenate reordered and new unique networks - reorderedNetworks = reorderedNetworks - .filter((item) => Boolean(item)) - .concat(newUniqueNetworks); - - // Update the state with the new networks list + onNetworkControllerStateChange({ + networkConfigurationsByChainId, + }: NetworkState) { this.update((state) => { - state.orderedNetworkList = reorderedNetworks; + // Filter out testnets, which are in the state but not orderable + const chainIds = Object.keys(networkConfigurationsByChainId).filter( + (chainId) => + !TEST_CHAINS.includes(chainId as (typeof TEST_CHAINS)[number]), + ) as Hex[]; + + const newNetworks = chainIds + .filter( + (chainId) => + !state.orderedNetworkList.some( + ({ networkId }) => networkId === chainId, + ), + ) + .map((chainId) => ({ networkId: chainId })); + + state.orderedNetworkList = state.orderedNetworkList + // Filter out deleted networks + .filter(({ networkId }) => chainIds.includes(networkId)) + // Append new networks to the end + .concat(newNetworks); }); } @@ -163,10 +143,11 @@ export class NetworkOrderController extends BaseController< * @param networkList - The list of networks to update in the state. */ - updateNetworksList(networkList: []) { + updateNetworksList(chainIds: Hex[]) { this.update((state) => { - state.orderedNetworkList = networkList; - return state; + state.orderedNetworkList = chainIds.map((chainId) => ({ + networkId: chainId, + })); }); } } diff --git a/app/scripts/controllers/preferences-controller.test.ts b/app/scripts/controllers/preferences-controller.test.ts index d35a35b24f51..f825c1eb5aee 100644 --- a/app/scripts/controllers/preferences-controller.test.ts +++ b/app/scripts/controllers/preferences-controller.test.ts @@ -11,6 +11,7 @@ import { KeyringControllerAccountRemovedEvent, } from '@metamask/keyring-controller'; import { SnapControllerStateChangeEvent } from '@metamask/snaps-controllers'; +import { Hex } from '@metamask/utils'; import { CHAIN_IDS } from '../../../shared/constants/network'; import { mockNetworkState } from '../../../test/stub/networks'; import { ThemeType } from '../../../shared/constants/preferences'; @@ -27,6 +28,7 @@ const NETWORK_CONFIGURATION_DATA = mockNetworkState( id: 'test-networkConfigurationId-1', rpcUrl: 'https://testrpc.com', chainId: CHAIN_IDS.GOERLI, + blockExplorerUrl: 'https://etherscan.io', nickname: '0X5', }, { @@ -36,7 +38,7 @@ const NETWORK_CONFIGURATION_DATA = mockNetworkState( ticker: 'ETH', nickname: 'Localhost 8545', }, -).networkConfigurations; +).networkConfigurationsByChainId; describe('preferences controller', () => { let controllerMessenger: ControllerMessenger< @@ -94,7 +96,7 @@ describe('preferences controller', () => { preferencesController = new PreferencesController({ initLangCode: 'en_US', - networkConfigurations: NETWORK_CONFIGURATION_DATA, + networkConfigurationsByChainId: NETWORK_CONFIGURATION_DATA, messenger: preferencesMessenger, }); }); @@ -403,7 +405,7 @@ describe('preferences controller', () => { initState: { useTokenDetection: false, }, - networkConfigurations: NETWORK_CONFIGURATION_DATA, + networkConfigurationsByChainId: NETWORK_CONFIGURATION_DATA, }); const state = preferencesControllerExistingUser.store.getState(); expect(state.useTokenDetection).toStrictEqual(false); @@ -520,8 +522,10 @@ describe('preferences controller', () => { expect(state.incomingTransactionsPreferences).toStrictEqual({ [CHAIN_IDS.MAINNET]: true, [CHAIN_IDS.LINEA_MAINNET]: true, - [NETWORK_CONFIGURATION_DATA[addedNonTestNetworks[0]].chainId]: true, - [NETWORK_CONFIGURATION_DATA[addedNonTestNetworks[1]].chainId]: true, + [NETWORK_CONFIGURATION_DATA[addedNonTestNetworks[0] as Hex].chainId]: + true, + [NETWORK_CONFIGURATION_DATA[addedNonTestNetworks[1] as Hex].chainId]: + true, [CHAIN_IDS.GOERLI]: true, [CHAIN_IDS.SEPOLIA]: true, [CHAIN_IDS.LINEA_SEPOLIA]: true, @@ -539,8 +543,10 @@ describe('preferences controller', () => { expect(state.incomingTransactionsPreferences).toStrictEqual({ [CHAIN_IDS.MAINNET]: true, [CHAIN_IDS.LINEA_MAINNET]: false, - [NETWORK_CONFIGURATION_DATA[addedNonTestNetworks[0]].chainId]: true, - [NETWORK_CONFIGURATION_DATA[addedNonTestNetworks[1]].chainId]: true, + [NETWORK_CONFIGURATION_DATA[addedNonTestNetworks[0] as Hex].chainId]: + true, + [NETWORK_CONFIGURATION_DATA[addedNonTestNetworks[1] as Hex].chainId]: + true, [CHAIN_IDS.GOERLI]: true, [CHAIN_IDS.SEPOLIA]: true, [CHAIN_IDS.LINEA_SEPOLIA]: true, diff --git a/app/scripts/controllers/preferences-controller.ts b/app/scripts/controllers/preferences-controller.ts index b06f83739e8f..ab6c3e959215 100644 --- a/app/scripts/controllers/preferences-controller.ts +++ b/app/scripts/controllers/preferences-controller.ts @@ -84,7 +84,7 @@ export type PreferencesControllerMessenger = RestrictedControllerMessenger< >; type PreferencesControllerOptions = { - networkConfigurations?: Record; + networkConfigurationsByChainId?: Record; initState?: Partial; initLangCode?: string; messenger: PreferencesControllerMessenger; @@ -102,6 +102,7 @@ export type Preferences = { redesignedConfirmationsEnabled: boolean; redesignedTransactionsEnabled: boolean; featureNotificationsEnabled: boolean; + showMultiRpcModal: boolean; isRedesignedConfirmationsDeveloperEnabled: boolean; showConfirmationAdvancedDetails: boolean; }; @@ -170,7 +171,7 @@ export default class PreferencesController { */ constructor(opts: PreferencesControllerOptions) { const addedNonMainNetwork: Record = Object.values( - opts.networkConfigurations ?? {}, + opts.networkConfigurationsByChainId ?? {}, ).reduce((acc: Record, element) => { acc[element.chainId] = true; return acc; @@ -228,6 +229,7 @@ export default class PreferencesController { redesignedConfirmationsEnabled: true, redesignedTransactionsEnabled: true, featureNotificationsEnabled: false, + showMultiRpcModal: false, isRedesignedConfirmationsDeveloperEnabled: false, showConfirmationAdvancedDetails: false, }, diff --git a/app/scripts/lib/backup.js b/app/scripts/lib/backup.js index 7fda93995766..7c550c1581ab 100644 --- a/app/scripts/lib/backup.js +++ b/app/scripts/lib/backup.js @@ -57,8 +57,8 @@ export default class Backup { }, addressBook: { ...this.addressBookController.state }, network: { - networkConfigurations: - this.networkController.state.networkConfigurations, + networkConfigurationsByChainId: + this.networkController.state.networkConfigurationsByChainId, }, }; diff --git a/app/scripts/lib/backup.test.js b/app/scripts/lib/backup.test.js index 947761449a36..0d9712ba5be5 100644 --- a/app/scripts/lib/backup.test.js +++ b/app/scripts/lib/backup.test.js @@ -62,11 +62,11 @@ function getMockAddressBookController() { function getMockNetworkController() { const state = { - networkConfigurations: {}, + networkConfigurationsByChainId: {}, }; - const loadBackup = ({ networkConfigurations }) => { - Object.assign(state, { networkConfigurations }); + const loadBackup = ({ networkConfigurationsByChainId }) => { + Object.assign(state, { networkConfigurationsByChainId }); }; return { state, loadBackup }; @@ -169,6 +169,7 @@ const jsonData = JSON.stringify({ showTestNetworks: true, smartTransactionsOptInStatus: false, useNativeCurrencyAsPrimaryCurrency: true, + showMultiRpcModal: false, }, ipfsGateway: 'dweb.link', ledgerTransportType: 'webhid', @@ -221,25 +222,21 @@ describe('Backup', function () { await backup.restoreUserData(jsonData); // check networks backup expect( - backup.networkController.state.networkConfigurations[ - 'network-configuration-id-1' - ].chainId, - ).toStrictEqual('0x539'); + backup.networkController.state.networkConfigurationsByChainId['0x539'] + .rpcEndpoints[0].networkClientId, + ).toStrictEqual('network-configuration-id-1'); expect( - backup.networkController.state.networkConfigurations[ - 'network-configuration-id-2' - ].chainId, - ).toStrictEqual('0x38'); + backup.networkController.state.networkConfigurationsByChainId['0x38'] + .rpcEndpoints[0].networkClientId, + ).toStrictEqual('network-configuration-id-2'); expect( - backup.networkController.state.networkConfigurations[ - 'network-configuration-id-3' - ].chainId, - ).toStrictEqual('0x61'); + backup.networkController.state.networkConfigurationsByChainId['0x61'] + .rpcEndpoints[0].networkClientId, + ).toStrictEqual('network-configuration-id-3'); expect( - backup.networkController.state.networkConfigurations[ - 'network-configuration-id-4' - ].chainId, - ).toStrictEqual('0x89'); + backup.networkController.state.networkConfigurationsByChainId['0x89'] + .rpcEndpoints[0].networkClientId, + ).toStrictEqual('network-configuration-id-4'); // make sure identities are not lost after restore expect( backup.preferencesController.store.identities[ diff --git a/app/scripts/lib/rpc-method-middleware/handlers/add-ethereum-chain.js b/app/scripts/lib/rpc-method-middleware/handlers/add-ethereum-chain.js index 571688688611..adf596824bdd 100644 --- a/app/scripts/lib/rpc-method-middleware/handlers/add-ethereum-chain.js +++ b/app/scripts/lib/rpc-method-middleware/handlers/add-ethereum-chain.js @@ -1,9 +1,10 @@ -import { ethErrors } from 'eth-rpc-errors'; import { ApprovalType } from '@metamask/controller-utils'; - +import * as URI from 'uri-js'; +import { RpcEndpointType } from '@metamask/network-controller'; +import { ethErrors } from 'eth-rpc-errors'; +import { cloneDeep } from 'lodash'; import { MESSAGE_TYPE } from '../../../../../shared/constants/app'; import { - findExistingNetwork, validateAddEthereumChainParams, switchChain, } from './ethereum-chain-utils'; @@ -12,9 +13,9 @@ const addEthereumChain = { methodNames: [MESSAGE_TYPE.ADD_ETHEREUM_CHAIN], implementation: addEthereumChainHandler, hookNames: { - upsertNetworkConfiguration: true, - getCurrentRpcUrl: true, - findNetworkConfigurationBy: true, + addNetwork: true, + updateNetwork: true, + getNetworkConfigurationByChainId: true, setActiveNetwork: true, requestUserApproval: true, startApprovalFlow: true, @@ -34,9 +35,9 @@ async function addEthereumChainHandler( _next, end, { - upsertNetworkConfiguration, - getCurrentRpcUrl, - findNetworkConfigurationBy, + addNetwork, + updateNetwork, + getNetworkConfigurationByChainId, setActiveNetwork, requestUserApproval, startApprovalFlow, @@ -64,20 +65,15 @@ async function addEthereumChainHandler( const { origin } = req; const currentChainIdForDomain = getCurrentChainIdForDomain(origin); - const currentNetworkConfiguration = findExistingNetwork( + const currentNetworkConfiguration = getNetworkConfigurationByChainId( currentChainIdForDomain, - findNetworkConfigurationBy, - ); - - const existingNetwork = findExistingNetwork( - chainId, - findNetworkConfigurationBy, ); + const existingNetwork = getNetworkConfigurationByChainId(chainId); if ( existingNetwork && existingNetwork.chainId === chainId && - existingNetwork.ticker !== ticker + existingNetwork.nativeCurrency !== ticker ) { return end( ethErrors.rpc.invalidParams({ @@ -86,11 +82,26 @@ async function addEthereumChainHandler( ); } - let networkClientId; - let requestData; let approvalFlowId; + let updatedNetwork = existingNetwork; + + let rpcIndex = existingNetwork?.rpcEndpoints.findIndex(({ url }) => + URI.equal(url, firstValidRPCUrl), + ); - if (!existingNetwork || existingNetwork.rpcUrl !== firstValidRPCUrl) { + let blockExplorerIndex = firstValidBlockExplorerUrl + ? existingNetwork?.blockExplorerUrls.findIndex((url) => + URI.equal(url, firstValidBlockExplorerUrl), + ) + : undefined; + + // If there's something to add or update + if ( + !existingNetwork || + rpcIndex !== existingNetwork.defaultRpcEndpointIndex || + (firstValidBlockExplorerUrl && + blockExplorerIndex !== existingNetwork.defaultBlockExplorerUrlIndex) + ) { ({ id: approvalFlowId } = await startApprovalFlow()); try { @@ -106,63 +117,111 @@ async function addEthereumChainHandler( }, }); - networkClientId = await upsertNetworkConfiguration( - { + if (existingNetwork) { + // A network for this chain id already exists. + // Update it with any new information. + + const clonedNetwork = cloneDeep(existingNetwork); + + // If the RPC endpoint doesn't exist, add a new one + if (rpcIndex === -1) { + clonedNetwork.rpcEndpoints = [ + ...clonedNetwork.rpcEndpoints, + { + url: firstValidRPCUrl, + type: RpcEndpointType.Custom, + name: chainName, + }, + ]; + rpcIndex = clonedNetwork.rpcEndpoints.length - 1; + } + + // The provided rpc endpoint becomes the default + clonedNetwork.defaultRpcEndpointIndex = rpcIndex; + + if (firstValidBlockExplorerUrl) { + // If a block explorer was provided and it doesn't exist, add a new one + if (blockExplorerIndex === -1) { + clonedNetwork.blockExplorerUrls = [ + ...clonedNetwork.blockExplorerUrls, + firstValidBlockExplorerUrl, + ]; + blockExplorerIndex = clonedNetwork.blockExplorerUrls.length - 1; + } + + // The provided block explorer becomes the default + clonedNetwork.defaultBlockExplorerUrlIndex = blockExplorerIndex; + } + + updatedNetwork = await updateNetwork( + clonedNetwork.chainId, + clonedNetwork, + currentChainIdForDomain === chainId + ? { + replacementSelectedRpcEndpointIndex: + clonedNetwork.defaultRpcEndpointIndex, + } + : undefined, + ); + } else { + // A network for this chain id does not exist, so add a new network + updatedNetwork = await addNetwork({ + blockExplorerUrls: firstValidBlockExplorerUrl + ? [firstValidBlockExplorerUrl] + : [], + defaultBlockExplorerUrlIndex: firstValidBlockExplorerUrl + ? 0 + : undefined, chainId, - rpcPrefs: { blockExplorerUrl: firstValidBlockExplorerUrl }, - nickname: chainName, - rpcUrl: firstValidRPCUrl, - ticker, - }, - { source: 'dapp', referrer: origin }, - ); + defaultRpcEndpointIndex: 0, + name: chainName, + nativeCurrency: ticker, + rpcEndpoints: [ + { + url: firstValidRPCUrl, + name: chainName, + type: RpcEndpointType.Custom, + }, + ], + }); + } } catch (error) { endApprovalFlow({ id: approvalFlowId }); return end(error); } + } - requestData = { - toNetworkConfiguration: { - rpcUrl: firstValidRPCUrl, - chainId, - nickname: chainName, - ticker, - networkClientId, - }, - fromNetworkConfiguration: currentNetworkConfiguration, - }; - } else { - networkClientId = existingNetwork.id ?? existingNetwork.type; - const currentRpcUrl = getCurrentRpcUrl(); - if ( - currentChainIdForDomain === chainId && - currentRpcUrl === firstValidRPCUrl - ) { - res.result = null; - return end(); - } + // If the added or updated network is not the current chain, prompt the user to switch + if (chainId !== currentChainIdForDomain) { + const { networkClientId } = + updatedNetwork.rpcEndpoints[updatedNetwork.defaultRpcEndpointIndex]; - requestData = { - toNetworkConfiguration: existingNetwork, + const requestData = { + toNetworkConfiguration: updatedNetwork, fromNetworkConfiguration: currentNetworkConfiguration, }; + + return switchChain( + res, + end, + origin, + chainId, + requestData, + networkClientId, + approvalFlowId, + { + getChainPermissionsFeatureFlag, + setActiveNetwork, + requestUserApproval, + getCaveat, + requestPermittedChainsPermission, + endApprovalFlow, + }, + ); + } else if (approvalFlowId) { + endApprovalFlow({ id: approvalFlowId }); } - return switchChain( - res, - end, - origin, - chainId, - requestData, - networkClientId, - approvalFlowId, - { - getChainPermissionsFeatureFlag, - setActiveNetwork, - requestUserApproval, - getCaveat, - requestPermittedChainsPermission, - endApprovalFlow, - }, - ); + res.result = null; + return end(); } diff --git a/app/scripts/lib/rpc-method-middleware/handlers/add-ethereum-chain.test.js b/app/scripts/lib/rpc-method-middleware/handlers/add-ethereum-chain.test.js index bd7434e61481..d04037949e87 100644 --- a/app/scripts/lib/rpc-method-middleware/handlers/add-ethereum-chain.test.js +++ b/app/scripts/lib/rpc-method-middleware/handlers/add-ethereum-chain.test.js @@ -1,41 +1,55 @@ import { ethErrors } from 'eth-rpc-errors'; -import { - CHAIN_IDS, - NETWORK_TYPES, -} from '../../../../../shared/constants/network'; +import { CHAIN_IDS } from '../../../../../shared/constants/network'; import addEthereumChain from './add-ethereum-chain'; const NON_INFURA_CHAIN_ID = '0x123456789'; const createMockMainnetConfiguration = () => ({ chainId: CHAIN_IDS.MAINNET, - nickname: 'Ethereum Mainnet', - rpcUrl: 'https://mainnet.infura.io/v3/', - type: NETWORK_TYPES.MAINNET, - ticker: 'ETH', - rpcPrefs: { - blockExplorerUrl: 'https://etherscan.io', - }, + name: 'Ethereum Mainnet', + defaultRpcEndpointIndex: 0, + rpcEndpoints: [ + { + networkClientId: 'mainnet', + url: 'https://mainnet.infura.io/v3/', + type: 'infura', + }, + ], + nativeCurrency: 'ETH', + blockExplorerUrls: ['https://etherscan.io'], + defaultBlockExplorerUrlIndex: 0, }); const createMockOptimismConfiguration = () => ({ chainId: CHAIN_IDS.OPTIMISM, - nickname: 'Optimism', - rpcUrl: 'https://optimism.llamarpc.com', - rpcPrefs: { - blockExplorerUrl: 'https://optimistic.etherscan.io', - }, - ticker: 'ETH', + name: 'Optimism', + defaultRpcEndpointIndex: 0, + rpcEndpoints: [ + { + networkClientId: 'optimism-network-client-id', + url: 'https://optimism.llamarpc.com', + type: 'custom', + }, + ], + nativeCurrency: 'ETH', + blockExplorerUrls: ['https://optimistic.etherscan.io'], + defaultBlockExplorerUrlIndex: 0, }); const createMockNonInfuraConfiguration = () => ({ chainId: NON_INFURA_CHAIN_ID, - rpcUrl: 'https://custom.network', - ticker: 'CUST', - nickname: 'Custom Network', - rpcPrefs: { - blockExplorerUrl: 'https://custom.blockexplorer', - }, + name: 'Custom Network', + defaultRpcEndpointIndex: 0, + rpcEndpoints: [ + { + name: 'Custom Network', + url: 'https://custom.network', + type: 'custom', + }, + ], + nativeCurrency: 'CUST', + blockExplorerUrls: ['https://custom.blockexplorer'], + defaultBlockExplorerUrlIndex: 0, }); describe('addEthereumChainHandler', () => { @@ -52,19 +66,21 @@ describe('addEthereumChainHandler', () => { .fn() .mockReturnValue(NON_INFURA_CHAIN_ID), setNetworkClientIdForDomain: jest.fn(), - findNetworkConfigurationBy: jest - .fn() - .mockReturnValue(createMockMainnetConfiguration()), + getNetworkConfigurationByChainId: jest.fn(), setActiveNetwork: jest.fn(), - getCurrentRpcUrl: jest - .fn() - .mockReturnValue(createMockMainnetConfiguration().rpcUrl), requestUserApproval: jest.fn().mockResolvedValue(123), requestPermittedChainsPermission: jest.fn(), getCaveat: jest.fn().mockReturnValue({ value: permissionedChainIds }), - upsertNetworkConfiguration: jest.fn().mockResolvedValue(123), startApprovalFlow: () => ({ id: 'approvalFlowId' }), endApprovalFlow: jest.fn(), + addNetwork: jest.fn().mockResolvedValue({ + defaultRpcEndpointIndex: 0, + rpcEndpoints: [{ networkClientId: 123 }], + }), + updateNetwork: jest.fn().mockResolvedValue({ + defaultRpcEndpointIndex: 0, + rpcEndpoints: [{ networkClientId: 123 }], + }), ...overrides, }; }; @@ -103,19 +119,22 @@ describe('addEthereumChainHandler', () => { // called twice, once for the add and once for the switch expect(mocks.requestUserApproval).toHaveBeenCalledTimes(2); - expect(mocks.upsertNetworkConfiguration).toHaveBeenCalledTimes(1); - expect(mocks.upsertNetworkConfiguration).toHaveBeenCalledWith( - { - chainId: CHAIN_IDS.OPTIMISM, - nickname: 'Optimism Mainnet', - rpcUrl: 'https://optimism.llamarpc.com', - ticker: 'ETH', - rpcPrefs: { - blockExplorerUrl: 'https://optimistic.etherscan.io', + expect(mocks.addNetwork).toHaveBeenCalledTimes(1); + expect(mocks.addNetwork).toHaveBeenCalledWith({ + blockExplorerUrls: ['https://optimistic.etherscan.io'], + defaultBlockExplorerUrlIndex: 0, + chainId: '0xa', + defaultRpcEndpointIndex: 0, + name: 'Optimism Mainnet', + nativeCurrency: 'ETH', + rpcEndpoints: [ + { + name: 'Optimism Mainnet', + url: 'https://optimism.llamarpc.com', + type: 'custom', }, - }, - { referrer: 'example.com', source: 'dapp' }, - ); + ], + }); expect(mocks.setActiveNetwork).toHaveBeenCalledTimes(1); expect(mocks.setActiveNetwork).toHaveBeenCalledWith(123); }); @@ -145,18 +164,23 @@ describe('addEthereumChainHandler', () => { jest.fn(), mocks, ); - expect(mocks.upsertNetworkConfiguration).toHaveBeenCalledTimes(1); + expect(mocks.addNetwork).toHaveBeenCalledTimes(1); expect(mocks.setActiveNetwork).toHaveBeenCalledTimes(1); }); describe('if a networkConfiguration for the given chainId already exists', () => { - it('creates a new network configuration for the given chainid and switches to it if proposed networkConfiguration has a different rpcUrl from all existing networkConfigurations', async () => { + it('updates the existing networkConfiguration with the new rpc url if it doesnt already exist', async () => { const mocks = makeMocks({ permissionsFeatureFlagIsActive: false, overrides: { - upsertNetworkConfiguration: jest.fn().mockResolvedValue(123456), + getNetworkConfigurationByChainId: jest + .fn() + // Start with just infura endpoint + .mockReturnValue(createMockMainnetConfiguration()), }, }); + + // Add a custom endpoint await addEthereumChainHandler( { origin: 'example.com', @@ -179,51 +203,133 @@ describe('addEthereumChainHandler', () => { mocks, ); - expect(mocks.upsertNetworkConfiguration).toHaveBeenCalledTimes(1); - expect(mocks.setActiveNetwork).toHaveBeenCalledWith(123456); + expect(mocks.updateNetwork).toHaveBeenCalledTimes(1); + expect(mocks.updateNetwork).toHaveBeenCalledWith( + '0x1', + { + chainId: '0x1', + name: 'Ethereum Mainnet', + // Expect both endpoints + rpcEndpoints: [ + { + networkClientId: 'mainnet', + url: 'https://mainnet.infura.io/v3/', + type: 'infura', + }, + { + name: 'Ethereum Mainnet', + url: 'https://eth.llamarpc.com', + type: 'custom', + }, + ], + // and the new one is the default + defaultRpcEndpointIndex: 1, + nativeCurrency: 'ETH', + blockExplorerUrls: ['https://etherscan.io'], + defaultBlockExplorerUrlIndex: 0, + }, + undefined, + ); }); - it('switches to the existing networkConfiguration if the proposed networkConfiguration has the same rpcUrl as an existing networkConfiguration and the currently selected network doesnt match the requested one', async () => { + it('makes the rpc url the default if it already exists', async () => { + const existingNetwork = { + chainId: '0x1', + name: 'Ethereum Mainnet', + // Start with infura + custom endpoint + rpcEndpoints: [ + { + networkClientId: 'mainnet', + url: 'https://mainnet.infura.io/v3/', + type: 'infura', + }, + { + name: 'Ethereum Mainnet', + url: 'https://eth.llamarpc.com', + type: 'custom', + }, + ], + // Infura is the default + defaultRpcEndpointIndex: 0, + nativeCurrency: 'ETH', + blockExplorerUrls: ['https://etherscan.io'], + defaultBlockExplorerUrlIndex: 0, + }; + const mocks = makeMocks({ permissionsFeatureFlagIsActive: false, overrides: { - getCurrentRpcUrl: jest + getNetworkConfigurationByChainId: jest .fn() - .mockReturnValue(createMockNonInfuraConfiguration().rpcUrl), + .mockReturnValue(existingNetwork), + }, + }); + + // Add the same custom endpoint + await addEthereumChainHandler( + { + origin: 'example.com', + params: [ + { + chainId: CHAIN_IDS.MAINNET, + chainName: 'Ethereum Mainnet', + rpcUrls: ['https://eth.llamarpc.com'], + nativeCurrency: { + symbol: 'ETH', + decimals: 18, + }, + blockExplorerUrls: ['https://etherscan.io'], + }, + ], + }, + {}, + jest.fn(), + jest.fn(), + mocks, + ); + + expect(mocks.updateNetwork).toHaveBeenCalledTimes(1); + expect(mocks.updateNetwork).toHaveBeenCalledWith( + '0x1', + { + ...existingNetwork, + // Verify the custom endpoint becomes the default + defaultRpcEndpointIndex: 1, + }, + undefined, + ); + }); + + it('switches to the network if its not already the currently selected chain id', async () => { + const existingNetwork = createMockMainnetConfiguration(); + + const mocks = makeMocks({ + permissionsFeatureFlagIsActive: false, + overrides: { + // Start on sepolia getCurrentChainIdForDomain: jest .fn() - .mockReturnValue(createMockNonInfuraConfiguration().chainId), - findNetworkConfigurationBy: jest + .mockReturnValue(CHAIN_IDS.SEPOLIA), + getNetworkConfigurationByChainId: jest .fn() - .mockImplementation(({ chainId }) => { - switch (chainId) { - case createMockNonInfuraConfiguration().chainId: - return createMockNonInfuraConfiguration(); - case createMockOptimismConfiguration().chainId: - return createMockOptimismConfiguration(); - default: - return undefined; - } - }), - upsertNetworkConfiguration: jest.fn().mockResolvedValue(123), + .mockReturnValue(existingNetwork), }, }); + // Add with rpc + block explorers that already exist await addEthereumChainHandler( { origin: 'example.com', params: [ { - chainId: createMockOptimismConfiguration().chainId, - chainName: createMockOptimismConfiguration().nickname, - rpcUrls: [createMockOptimismConfiguration().rpcUrl], + chainId: CHAIN_IDS.MAINNET, + chainName: 'Ethereum Mainnet', + rpcUrls: [existingNetwork.rpcEndpoints[0].url], nativeCurrency: { - symbol: createMockOptimismConfiguration().ticker, + symbol: 'ETH', decimals: 18, }, - blockExplorerUrls: [ - createMockOptimismConfiguration().rpcPrefs.blockExplorerUrl, - ], + blockExplorerUrls: ['https://etherscan.io'], }, ], }, @@ -233,27 +339,12 @@ describe('addEthereumChainHandler', () => { mocks, ); - expect(mocks.requestUserApproval).toHaveBeenCalledTimes(1); - expect(mocks.requestUserApproval).toHaveBeenCalledWith({ - origin: 'example.com', - requestData: { - fromNetworkConfiguration: createMockNonInfuraConfiguration(), - toNetworkConfiguration: { - chainId: '0xa', - nickname: 'Optimism', - rpcPrefs: { - blockExplorerUrl: 'https://optimistic.etherscan.io', - }, - rpcUrl: 'https://optimism.llamarpc.com', - ticker: 'ETH', - }, - }, - type: 'wallet_switchEthereumChain', - }); + // No updates, network already had all the info + expect(mocks.updateNetwork).toHaveBeenCalledTimes(0); + + // User should be prompted to switch chains expect(mocks.setActiveNetwork).toHaveBeenCalledTimes(1); - expect(mocks.setActiveNetwork).toHaveBeenCalledWith( - createMockOptimismConfiguration().id, - ); + expect(mocks.setActiveNetwork).toHaveBeenCalledWith('mainnet'); }); it('should return error for invalid chainId', async () => { @@ -284,25 +375,32 @@ describe('addEthereumChainHandler', () => { describe('with `endowment:permitted-chains` permissioning active', () => { it('creates a new network configuration for the given chainid, requests `endowment:permitted-chains` permission and switches to it if no networkConfigurations with the same chainId exist', async () => { + const nonInfuraConfiguration = createMockNonInfuraConfiguration(); + const mocks = makeMocks({ permissionedChainIds: [], permissionsFeatureFlagIsActive: true, + overrides: { + getCurrentChainIdForDomain: jest + .fn() + .mockReturnValue(CHAIN_IDS.MAINNET), + }, }); await addEthereumChainHandler( { origin: 'example.com', params: [ { - chainId: createMockNonInfuraConfiguration().chainId, - chainName: createMockNonInfuraConfiguration().nickname, - rpcUrls: [createMockNonInfuraConfiguration().rpcUrl], + chainId: nonInfuraConfiguration.chainId, + chainName: nonInfuraConfiguration.name, + rpcUrls: nonInfuraConfiguration.rpcEndpoints.map( + (rpc) => rpc.url, + ), nativeCurrency: { - symbol: createMockNonInfuraConfiguration().ticker, + symbol: nonInfuraConfiguration.nativeCurrency, decimals: 18, }, - blockExplorerUrls: [ - createMockNonInfuraConfiguration().rpcPrefs.blockExplorerUrl, - ], + blockExplorerUrls: nonInfuraConfiguration.blockExplorerUrls, }, ], }, @@ -312,10 +410,7 @@ describe('addEthereumChainHandler', () => { mocks, ); - expect(mocks.upsertNetworkConfiguration).toHaveBeenCalledWith( - createMockNonInfuraConfiguration(), - { referrer: 'example.com', source: 'dapp' }, - ); + expect(mocks.addNetwork).toHaveBeenCalledWith(nonInfuraConfiguration); expect(mocks.requestPermittedChainsPermission).toHaveBeenCalledTimes(1); expect(mocks.requestPermittedChainsPermission).toHaveBeenCalledWith([ createMockNonInfuraConfiguration().chainId, @@ -330,6 +425,11 @@ describe('addEthereumChainHandler', () => { const mocks = makeMocks({ permissionedChainIds: [CHAIN_IDS.MAINNET], permissionsFeatureFlagIsActive: true, + overrides: { + getCurrentChainIdForDomain: jest + .fn() + .mockReturnValue(CHAIN_IDS.SEPOLIA), + }, }); await addEthereumChainHandler( @@ -365,7 +465,7 @@ describe('addEthereumChainHandler', () => { permissionsFeatureFlagIsActive: true, permissionedChainIds: [], overrides: { - findNetworkConfigurationBy: jest + getNetworkConfigurationByChainId: jest .fn() .mockReturnValue(createMockNonInfuraConfiguration()), getCurrentChainIdForDomain: jest @@ -396,7 +496,7 @@ describe('addEthereumChainHandler', () => { mocks, ); - expect(mocks.upsertNetworkConfiguration).toHaveBeenCalledTimes(1); + expect(mocks.updateNetwork).toHaveBeenCalledTimes(1); expect(mocks.requestPermittedChainsPermission).toHaveBeenCalledTimes( 1, ); @@ -407,15 +507,18 @@ describe('addEthereumChainHandler', () => { }); }); - it('should switch to the existing networkConfiguration if the proposed networkConfiguration has the same rpcUrl as the one already in state (and is not currently selected)', async () => { + it('should switch to the existing networkConfiguration if one already exsits for the given chain id', async () => { const mocks = makeMocks({ - permissionedChainIds: [createMockOptimismConfiguration().chainId], + permissionedChainIds: [ + createMockOptimismConfiguration().chainId, + CHAIN_IDS.MAINNET, + ], permissionsFeatureFlagIsActive: true, overrides: { - getCurrentRpcUrl: jest + getCurrentChainIdForDomain: jest .fn() - .mockReturnValue('https://eth.llamarpc.com'), - findNetworkConfigurationBy: jest + .mockReturnValue(CHAIN_IDS.MAINNET), + getNetworkConfigurationByChainId: jest .fn() .mockReturnValue(createMockOptimismConfiguration()), }, @@ -427,15 +530,16 @@ describe('addEthereumChainHandler', () => { params: [ { chainId: createMockOptimismConfiguration().chainId, - chainName: createMockOptimismConfiguration().nickname, - rpcUrls: [createMockOptimismConfiguration().rpcUrl], + chainName: createMockOptimismConfiguration().name, + rpcUrls: createMockOptimismConfiguration().rpcEndpoints.map( + (rpc) => rpc.url, + ), nativeCurrency: { - symbol: createMockOptimismConfiguration().ticker, + symbol: createMockOptimismConfiguration().nativeCurrency, decimals: 18, }, - blockExplorerUrls: [ - createMockOptimismConfiguration().rpcPrefs.blockExplorerUrl, - ], + blockExplorerUrls: + createMockOptimismConfiguration().blockExplorerUrls, }, ], }, @@ -445,11 +549,10 @@ describe('addEthereumChainHandler', () => { mocks, ); - expect(mocks.requestUserApproval).not.toHaveBeenCalled(); expect(mocks.requestPermittedChainsPermission).not.toHaveBeenCalled(); expect(mocks.setActiveNetwork).toHaveBeenCalledTimes(1); expect(mocks.setActiveNetwork).toHaveBeenCalledWith( - createMockOptimismConfiguration().id, + createMockOptimismConfiguration().rpcEndpoints[0].networkClientId, ); }); }); @@ -476,7 +579,7 @@ describe('addEthereumChainHandler', () => { decimals: 18, }, blockExplorerUrls: [ - createMockNonInfuraConfiguration().rpcPrefs.blockExplorerUrl, + createMockNonInfuraConfiguration().blockExplorerUrls[0], ], [unexpectedParam]: 'parameter', }, @@ -501,6 +604,9 @@ describe('addEthereumChainHandler', () => { permissionsFeatureFlagIsActive: true, permissionedChainIds: [], overrides: { + getCurrentChainIdForDomain: jest + .fn() + .mockReturnValue(CHAIN_IDS.SEPOLIA), requestPermittedChainsPermission: jest .fn() .mockRejectedValue(mockError), @@ -539,6 +645,11 @@ describe('addEthereumChainHandler', () => { const mocks = makeMocks({ permissionedChainIds: [CHAIN_IDS.MAINNET], permissionsFeatureFlagIsActive: true, + overrides: { + getNetworkConfigurationByChainId: jest + .fn() + .mockReturnValue(createMockMainnetConfiguration()), + }, }); const mockEnd = jest.fn(); @@ -580,10 +691,9 @@ describe('addEthereumChainHandler', () => { getCurrentChainIdForDomain: jest .fn() .mockReturnValue(CURRENT_RPC_CONFIG.chainId), - findNetworkConfigurationBy: jest + getNetworkConfigurationByChainId: jest .fn() .mockReturnValue(CURRENT_RPC_CONFIG), - getCurrentRpcUrl: jest.fn().mockReturnValue(CURRENT_RPC_CONFIG.rpcUrl), }, }); const res = {}; @@ -595,9 +705,9 @@ describe('addEthereumChainHandler', () => { { chainId: CURRENT_RPC_CONFIG.chainId, chainName: 'Custom Network', - rpcUrls: [CURRENT_RPC_CONFIG.rpcUrl], + rpcUrls: [CURRENT_RPC_CONFIG.rpcEndpoints[0].url], nativeCurrency: { - symbol: CURRENT_RPC_CONFIG.ticker, + symbol: CURRENT_RPC_CONFIG.nativeCurrency, decimals: 18, }, blockExplorerUrls: ['https://custom.blockexplorer'], diff --git a/app/scripts/lib/rpc-method-middleware/handlers/ethereum-chain-utils.js b/app/scripts/lib/rpc-method-middleware/handlers/ethereum-chain-utils.js index 3d5e0de38c5b..89415d471468 100644 --- a/app/scripts/lib/rpc-method-middleware/handlers/ethereum-chain-utils.js +++ b/app/scripts/lib/rpc-method-middleware/handlers/ethereum-chain-utils.js @@ -1,13 +1,5 @@ import { errorCodes, ethErrors } from 'eth-rpc-errors'; import { ApprovalType } from '@metamask/controller-utils'; - -import { - BUILT_IN_INFURA_NETWORKS, - CHAIN_ID_TO_RPC_URL_MAP, - CHAIN_ID_TO_TYPE_MAP, - CURRENCY_SYMBOLS, - NETWORK_TO_NAME_MAP, -} from '../../../../../shared/constants/network'; import { isPrefixedFormattedHexString, isSafeChainId, @@ -17,23 +9,6 @@ import { UNKNOWN_TICKER_SYMBOL } from '../../../../../shared/constants/app'; import { PermissionNames } from '../../../controllers/permissions'; import { getValidUrl } from '../../util'; -export function findExistingNetwork(chainId, findNetworkConfigurationBy) { - if ( - Object.values(BUILT_IN_INFURA_NETWORKS) - .map(({ chainId: id }) => id) - .includes(chainId) - ) { - return { - chainId, - ticker: CURRENCY_SYMBOLS.ETH, - nickname: NETWORK_TO_NAME_MAP[chainId], - rpcUrl: CHAIN_ID_TO_RPC_URL_MAP[chainId], - type: CHAIN_ID_TO_TYPE_MAP[chainId], - }; - } - return findNetworkConfigurationBy({ chainId }); -} - export function validateChainId(chainId) { const _chainId = typeof chainId === 'string' && chainId.toLowerCase(); if (!isPrefixedFormattedHexString(_chainId)) { diff --git a/app/scripts/lib/rpc-method-middleware/handlers/switch-ethereum-chain.js b/app/scripts/lib/rpc-method-middleware/handlers/switch-ethereum-chain.js index f701ba06ea6f..847cdf8abe24 100644 --- a/app/scripts/lib/rpc-method-middleware/handlers/switch-ethereum-chain.js +++ b/app/scripts/lib/rpc-method-middleware/handlers/switch-ethereum-chain.js @@ -1,7 +1,6 @@ import { ethErrors } from 'eth-rpc-errors'; import { MESSAGE_TYPE } from '../../../../../shared/constants/app'; import { - findExistingNetwork, validateSwitchEthereumChainParams, switchChain, } from './ethereum-chain-utils'; @@ -10,7 +9,7 @@ const switchEthereumChain = { methodNames: [MESSAGE_TYPE.SWITCH_ETHEREUM_CHAIN], implementation: switchEthereumChainHandler, hookNames: { - findNetworkConfigurationBy: true, + getNetworkConfigurationByChainId: true, setActiveNetwork: true, getCaveat: true, requestPermittedChainsPermission: true, @@ -28,7 +27,7 @@ async function switchEthereumChainHandler( _next, end, { - findNetworkConfigurationBy, + getNetworkConfigurationByChainId, setActiveNetwork, requestPermittedChainsPermission, getCaveat, @@ -51,14 +50,12 @@ async function switchEthereumChainHandler( return end(); } - const networkConfigurationForRequestedChainId = findExistingNetwork( - chainId, - findNetworkConfigurationBy, - ); - + const networkConfigurationForRequestedChainId = + getNetworkConfigurationByChainId(chainId); const networkClientIdToSwitchTo = - networkConfigurationForRequestedChainId?.id ?? - networkConfigurationForRequestedChainId?.type; + networkConfigurationForRequestedChainId?.rpcEndpoints[ + networkConfigurationForRequestedChainId.defaultRpcEndpointIndex + ].networkClientId; if (!networkClientIdToSwitchTo) { return end( @@ -71,9 +68,8 @@ async function switchEthereumChainHandler( const requestData = { toNetworkConfiguration: networkConfigurationForRequestedChainId, - fromNetworkConfiguration: findExistingNetwork( + fromNetworkConfiguration: getNetworkConfigurationByChainId( currentChainIdForOrigin, - findNetworkConfigurationBy, ), }; diff --git a/app/scripts/lib/rpc-method-middleware/handlers/switch-ethereum-chain.test.js b/app/scripts/lib/rpc-method-middleware/handlers/switch-ethereum-chain.test.js index e49964314b5c..30a9f9aa8f8e 100644 --- a/app/scripts/lib/rpc-method-middleware/handlers/switch-ethereum-chain.test.js +++ b/app/scripts/lib/rpc-method-middleware/handlers/switch-ethereum-chain.test.js @@ -11,15 +11,23 @@ const mockRequestUserApproval = ({ requestData }) => { }; const createMockMainnetConfiguration = () => ({ - id: 123, chainId: CHAIN_IDS.MAINNET, - type: NETWORK_TYPES.MAINNET, + defaultRpcEndpointIndex: 0, + rpcEndpoints: [ + { + networkClientId: NETWORK_TYPES.MAINNET, + }, + ], }); const createMockLineaMainnetConfiguration = () => ({ - id: 1234, chainId: CHAIN_IDS.LINEA_MAINNET, - type: NETWORK_TYPES.LINEA_MAINNET, + defaultRpcEndpointIndex: 0, + rpcEndpoints: [ + { + networkClientId: NETWORK_TYPES.LINEA_MAINNET, + }, + ], }); describe('switchEthereumChainHandler', () => { @@ -27,7 +35,7 @@ describe('switchEthereumChainHandler', () => { permissionedChainIds = [], permissionsFeatureFlagIsActive = false, overrides = {}, - mockedFindNetworkConfigurationByReturnValue = createMockMainnetConfiguration(), + mockedGetNetworkConfigurationByChainIdReturnValue = createMockMainnetConfiguration(), mockedGetCurrentChainIdForDomainReturnValue = NON_INFURA_CHAIN_ID, } = {}) => { const mockGetCaveat = jest.fn(); @@ -39,15 +47,15 @@ describe('switchEthereumChainHandler', () => { .fn() .mockReturnValue(mockedGetCurrentChainIdForDomainReturnValue), setNetworkClientIdForDomain: jest.fn(), - findNetworkConfigurationBy: jest - .fn() - .mockReturnValue(mockedFindNetworkConfigurationByReturnValue), setActiveNetwork: jest.fn(), requestUserApproval: jest .fn() .mockImplementation(mockRequestUserApproval), requestPermittedChainsPermission: jest.fn(), getCaveat: mockGetCaveat, + getNetworkConfigurationByChainId: jest + .fn() + .mockReturnValue(mockedGetNetworkConfigurationByChainIdReturnValue), ...overrides, }; }; @@ -63,7 +71,7 @@ describe('switchEthereumChainHandler', () => { const mocks = makeMocks({ permissionsFeatureFlagIsActive, overrides: { - findNetworkConfigurationBy: jest + getNetworkConfigurationByChainId: jest .fn() .mockReturnValue(createMockMainnetConfiguration()), }, @@ -81,7 +89,7 @@ describe('switchEthereumChainHandler', () => { ); expect(mocks.setActiveNetwork).toHaveBeenCalledTimes(1); expect(mocks.setActiveNetwork).toHaveBeenCalledWith( - createMockMainnetConfiguration().type, + createMockMainnetConfiguration().rpcEndpoints[0].networkClientId, ); }); @@ -89,7 +97,7 @@ describe('switchEthereumChainHandler', () => { const mocks = makeMocks({ permissionsFeatureFlagIsActive, overrides: { - findNetworkConfigurationBy: jest + getNetworkConfigurationByChainId: jest .fn() .mockReturnValue(createMockLineaMainnetConfiguration()), }, @@ -107,7 +115,7 @@ describe('switchEthereumChainHandler', () => { ); expect(mocks.setActiveNetwork).toHaveBeenCalledTimes(1); expect(mocks.setActiveNetwork).toHaveBeenCalledWith( - createMockLineaMainnetConfiguration().type, + createMockLineaMainnetConfiguration().rpcEndpoints[0].networkClientId, ); }); @@ -115,7 +123,7 @@ describe('switchEthereumChainHandler', () => { const mocks = makeMocks({ permissionsFeatureFlagIsActive, overrides: { - findNetworkConfigurationBy: jest + getNetworkConfigurationByChainId: jest .fn() .mockReturnValue(createMockLineaMainnetConfiguration()), }, @@ -133,7 +141,7 @@ describe('switchEthereumChainHandler', () => { ); expect(mocks.setActiveNetwork).toHaveBeenCalledTimes(1); expect(mocks.setActiveNetwork).toHaveBeenCalledWith( - createMockLineaMainnetConfiguration().type, + createMockLineaMainnetConfiguration().rpcEndpoints[0].networkClientId, ); }); @@ -159,9 +167,45 @@ describe('switchEthereumChainHandler', () => { ); expect(mocks.setActiveNetwork).toHaveBeenCalledTimes(1); expect(mocks.setActiveNetwork).toHaveBeenCalledWith( - createMockMainnetConfiguration().id, + createMockMainnetConfiguration().rpcEndpoints[0].networkClientId, ); }); + + it('should handle missing networkConfiguration', async () => { + // Mock a network configuration that has an undefined or missing rpcEndpoints + const mockNetworkConfiguration = undefined; + + const mocks = makeMocks({ + overrides: { + getNetworkConfigurationByChainId: jest + .fn() + .mockReturnValue(mockNetworkConfiguration), + }, + }); + + const switchEthereumChainHandler = switchEthereumChain.implementation; + + const mockEnd = jest.fn(); + await switchEthereumChainHandler( + { + origin: 'example.com', + params: [{ chainId: CHAIN_IDS.MAINNET }], + }, + {}, + jest.fn(), + mockEnd, + mocks, + ); + + // Check that the function handled the missing rpcEndpoints and did not attempt to call setActiveNetwork + expect(mockEnd).toHaveBeenCalledWith( + expect.objectContaining({ + code: 4902, + message: expect.stringContaining('Unrecognized chain ID'), + }), + ); + expect(mocks.setActiveNetwork).not.toHaveBeenCalled(); + }); }); describe('with permittedChains permissioning active', () => { @@ -196,7 +240,7 @@ describe('switchEthereumChainHandler', () => { ]); expect(mocks.setActiveNetwork).toHaveBeenCalledTimes(1); expect(mocks.setActiveNetwork).toHaveBeenCalledWith( - createMockMainnetConfiguration().type, + createMockMainnetConfiguration().rpcEndpoints[0].networkClientId, ); }); @@ -220,7 +264,7 @@ describe('switchEthereumChainHandler', () => { expect(mocks.requestPermittedChainsPermission).not.toHaveBeenCalled(); expect(mocks.setActiveNetwork).toHaveBeenCalledTimes(1); expect(mocks.setActiveNetwork).toHaveBeenCalledWith( - createMockMainnetConfiguration().type, + createMockMainnetConfiguration().rpcEndpoints[0].networkClientId, ); }); diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js index c5fd4b834aed..5513b043ce4e 100644 --- a/app/scripts/metamask-controller.js +++ b/app/scripts/metamask-controller.js @@ -56,7 +56,10 @@ import { ControllerMessenger } from '@metamask/base-controller'; import { EnsController } from '@metamask/ens-controller'; import { PhishingController } from '@metamask/phishing-controller'; import { AnnouncementController } from '@metamask/announcement-controller'; -import { NetworkController } from '@metamask/network-controller'; +import { + NetworkController, + getDefaultNetworkControllerState, +} from '@metamask/network-controller'; import { GasFeeController } from '@metamask/gas-fee-controller'; import { PermissionController, @@ -90,6 +93,13 @@ import { buildSnapEndowmentSpecifications, buildSnapRestrictedMethodSpecifications, } from '@metamask/snaps-rpc-methods'; +import { + ApprovalType, + ERC1155, + ERC20, + ERC721, + BlockExplorerUrl, +} from '@metamask/controller-utils'; import { AccountsController } from '@metamask/accounts-controller'; @@ -104,12 +114,6 @@ import { TransactionUpdateController } from '@metamask-institutional/transaction ///: END:ONLY_INCLUDE_IF import { SignatureController } from '@metamask/signature-controller'; import { PPOMController } from '@metamask/ppom-validator'; -import { - ApprovalType, - ERC1155, - ERC20, - ERC721, -} from '@metamask/controller-utils'; import { wordlist } from '@metamask/scure-bip39/dist/wordlists/english'; import { @@ -170,6 +174,7 @@ import { CHAIN_IDS, NETWORK_TYPES, NetworkStatus, + MAINNET_DISPLAY_NAME, } from '../../shared/constants/network'; import { getAllowedSmartTransactionsChainIds } from '../../shared/constants/smartTransactions'; @@ -501,38 +506,59 @@ export default class MetamaskController extends EventEmitter { name: 'NetworkController', }); - let initialNetworkControllerState = {}; - if (initState.NetworkController) { - initialNetworkControllerState = initState.NetworkController; - } else if (process.env.IN_TEST) { - const networkConfig = { - chainId: CHAIN_IDS.LOCALHOST, - nickname: 'Localhost 8545', - rpcPrefs: {}, - rpcUrl: 'http://localhost:8545', - ticker: 'ETH', - id: 'networkConfigurationId', - }; - initialNetworkControllerState = { - selectedNetworkClientId: networkConfig.id, - networkConfigurations: { - [networkConfig.id]: networkConfig, - }, - }; - } else if ( - process.env.METAMASK_DEBUG || - process.env.METAMASK_ENVIRONMENT === 'test' - ) { - initialNetworkControllerState = { - selectedNetworkClientId: NETWORK_TYPES.SEPOLIA, - }; + let initialNetworkControllerState = initState.NetworkController; + if (!initialNetworkControllerState) { + initialNetworkControllerState = getDefaultNetworkControllerState(); + + const networks = + initialNetworkControllerState.networkConfigurationsByChainId; + + // Note: Consider changing `getDefaultNetworkControllerState` + // on the controller side to include some of these tweaks. + networks[CHAIN_IDS.MAINNET].name = MAINNET_DISPLAY_NAME; + delete networks[CHAIN_IDS.GOERLI]; + delete networks[CHAIN_IDS.LINEA_GOERLI]; + + Object.values(networks).forEach((network) => { + const id = network.rpcEndpoints[0].networkClientId; + network.blockExplorerUrls = [BlockExplorerUrl[id]]; + network.defaultBlockExplorerUrlIndex = 0; + }); + + let network; + if (process.env.IN_TEST) { + network = { + chainId: CHAIN_IDS.LOCALHOST, + name: 'Localhost 8545', + nativeCurrency: 'ETH', + blockExplorerUrls: [], + defaultRpcEndpointIndex: 0, + rpcEndpoints: [ + { + networkClientId: 'networkConfigurationId', + url: 'http://localhost:8545', + type: 'custom', + }, + ], + }; + networks[CHAIN_IDS.LOCALHOST] = network; + } else if ( + process.env.METAMASK_DEBUG || + process.env.METAMASK_ENVIRONMENT === 'test' + ) { + network = networks[CHAIN_IDS.SEPOLIA]; + } else { + network = networks[CHAIN_IDS.MAINNET]; + } + + initialNetworkControllerState.selectedNetworkClientId = + network.rpcEndpoints[network.defaultRpcEndpointIndex].networkClientId; } + this.networkController = new NetworkController({ messenger: networkControllerMessenger, state: initialNetworkControllerState, infuraProjectId: opts.infuraProjectId, - trackMetaMetricsEvent: (...args) => - this.metaMetricsController.trackEvent(...args), }); this.networkController.initializeProvider(); this.provider = @@ -575,7 +601,8 @@ export default class MetamaskController extends EventEmitter { initLangCode: opts.initLangCode, messenger: preferencesMessenger, provider: this.provider, - networkConfigurations: this.networkController.state.networkConfigurations, + networkConfigurationsByChainId: + this.networkController.state.networkConfigurationsByChainId, }); const tokenListMessenger = this.controllerMessenger.getRestricted({ @@ -3310,11 +3337,15 @@ export default class MetamaskController extends EventEmitter { }, rollbackToPreviousProvider: networkController.rollbackToPreviousProvider.bind(networkController), - removeNetworkConfiguration: this.removeNetworkConfiguration.bind(this), - upsertNetworkConfiguration: - this.networkController.upsertNetworkConfiguration.bind( - this.networkController, - ), + addNetwork: this.networkController.addNetwork.bind( + this.networkController, + ), + updateNetwork: this.networkController.updateNetwork.bind( + this.networkController, + ), + removeNetwork: this.networkController.removeNetwork.bind( + this.networkController, + ), getCurrentNetworkEIP1559Compatibility: this.networkController.getEIP1559Compatibility.bind( this.networkController, @@ -4764,28 +4795,6 @@ export default class MetamaskController extends EventEmitter { ); } - removeNetworkConfiguration(networkConfigurationId) { - const { networkConfigurations } = this.networkController.state; - const { chainId } = networkConfigurations[networkConfigurationId] ?? {}; - if (!chainId) { - throw new Error('Network configuration not found'); - } - const hasOtherConfigsForChainId = Object.values(networkConfigurations).some( - (config) => - config.chainId === chainId && - config.id !== networkConfigurationId && - config.type !== networkConfigurationId, - ); - - // if this network configuration is only one for a given chainId - // remove all permissions for that chainId - if (!hasOtherConfigsForChainId) { - this.removeAllChainIdPermissions(chainId); - } - - this.networkController.removeNetworkConfiguration(networkConfigurationId); - } - /** * Stops exposing the account with the specified address to all third parties. * Exposed accounts are stored in caveats of the eth_accounts permission. This @@ -5706,15 +5715,7 @@ export default class MetamaskController extends EventEmitter { }, getChainPermissionsFeatureFlag: () => Boolean(process.env.CHAIN_PERMISSIONS), - getCurrentRpcUrl: () => - getProviderConfig({ - metamask: this.networkController.state, - }).rpcUrl, // network configuration-related - upsertNetworkConfiguration: - this.networkController.upsertNetworkConfiguration.bind( - this.networkController, - ), setActiveNetwork: async (networkClientId) => { await this.networkController.setActiveNetwork(networkClientId); // if the origin has the eth_accounts permission @@ -5731,7 +5732,16 @@ export default class MetamaskController extends EventEmitter { ); } }, - findNetworkConfigurationBy: this.findNetworkConfigurationBy.bind(this), + addNetwork: this.networkController.addNetwork.bind( + this.networkController, + ), + updateNetwork: this.networkController.updateNetwork.bind( + this.networkController, + ), + getNetworkConfigurationByChainId: + this.networkController.getNetworkConfigurationByChainId.bind( + this.networkController, + ), getCurrentChainIdForDomain: (domain) => { const networkClientId = this.selectedNetworkController.getNetworkClientIdForDomain(domain); @@ -6383,26 +6393,6 @@ export default class MetamaskController extends EventEmitter { // CONFIG //============================================================================= - /** - * Returns the first network configuration object that matches at least one field of the - * provided search criteria. Returns null if no match is found - * - * @param {object} rpcInfo - The RPC endpoint properties and values to check. - * @returns {object} rpcInfo found in the network configurations list - */ - findNetworkConfigurationBy(rpcInfo) { - const { networkConfigurations } = this.networkController.state; - const networkConfiguration = Object.values(networkConfigurations).find( - (configuration) => { - return Object.keys(rpcInfo).some((key) => { - return configuration[key] === rpcInfo[key]; - }); - }, - ); - - return networkConfiguration || null; - } - /** * Sets the Ledger Live preference to use for Ledger hardware wallet support * @@ -6535,9 +6525,9 @@ export default class MetamaskController extends EventEmitter { } }; - updateNetworksList = (sortedNetworkList) => { + updateNetworksList = (chainIds) => { try { - this.networkOrderController.updateNetworksList(sortedNetworkList); + this.networkOrderController.updateNetworksList(chainIds); } catch (err) { log.error(err.message); throw err; @@ -6686,13 +6676,15 @@ export default class MetamaskController extends EventEmitter { let rpcPrefs = {}; if (chainId) { - const { networkConfigurations } = this.networkController.state; + const networkConfiguration = + this.networkController.state.networkConfigurationsByChainId?.[chainId]; - const matchingNetworkConfig = Object.values(networkConfigurations).find( - (networkConfiguration) => networkConfiguration.chainId === chainId, - ); + const blockExplorerUrl = + networkConfiguration?.blockExplorerUrls?.[ + networkConfiguration?.defaultBlockExplorerUrlIndex + ]; - rpcPrefs = matchingNetworkConfig?.rpcPrefs ?? {}; + rpcPrefs = { blockExplorerUrl }; } try { diff --git a/app/scripts/metamask-controller.test.js b/app/scripts/metamask-controller.test.js index 401f95a21990..4121160a45af 100644 --- a/app/scripts/metamask-controller.test.js +++ b/app/scripts/metamask-controller.test.js @@ -223,11 +223,9 @@ const NOTIFICATION_ID = 'NHL8f2eSSTn9TKBamRLiU'; const ALT_MAINNET_RPC_URL = 'http://localhost:8545'; const POLYGON_RPC_URL = 'https://polygon.llamarpc.com'; -const POLYGON_RPC_URL_2 = 'https://polygon-rpc.com'; const NETWORK_CONFIGURATION_ID_1 = 'networkConfigurationId1'; const NETWORK_CONFIGURATION_ID_2 = 'networkConfigurationId2'; -const NETWORK_CONFIGURATION_ID_3 = 'networkConfigurationId3'; const ETH = 'ETH'; const MATIC = 'MATIC'; @@ -261,14 +259,6 @@ const firstTimeState = { id: NETWORK_CONFIGURATION_ID_2, blockExplorerUrl: undefined, }, - { - rpcUrl: POLYGON_RPC_URL_2, - chainId: POLYGON_CHAIN_ID, - ticker: MATIC, - nickname: 'Alt Polygon', - id: NETWORK_CONFIGURATION_ID_3, - blockExplorerUrl: undefined, - }, ), }, NotificationController: { @@ -2047,87 +2037,6 @@ describe('MetaMaskController', () => { expect(tokenDetails.symbol).toStrictEqual(tokenData.symbol); expect(tokenDetails.balance).toStrictEqual(tokenData.balance); }); - - describe('findNetworkConfigurationBy', () => { - it('returns null if passed an object containing a valid networkConfiguration key but no matching value is found', () => { - expect( - metamaskController.findNetworkConfigurationBy({ - chainId: '0xnone', - }), - ).toStrictEqual(null); - }); - it('returns null if passed an object containing an invalid networkConfiguration key', () => { - expect( - metamaskController.findNetworkConfigurationBy({ - invalidKey: '0xnone', - }), - ).toStrictEqual(null); - }); - - it('returns matching networkConfiguration when passed a chainId that matches an existing configuration', () => { - expect( - metamaskController.findNetworkConfigurationBy({ - chainId: MAINNET_CHAIN_ID, - }), - ).toStrictEqual({ - chainId: MAINNET_CHAIN_ID, - nickname: 'Alt Mainnet', - id: NETWORK_CONFIGURATION_ID_1, - rpcUrl: ALT_MAINNET_RPC_URL, - ticker: ETH, - }); - }); - - it('returns matching networkConfiguration when passed a ticker that matches an existing configuration', () => { - expect( - metamaskController.findNetworkConfigurationBy({ - ticker: MATIC, - }), - ).toStrictEqual({ - rpcUrl: POLYGON_RPC_URL, - chainId: POLYGON_CHAIN_ID, - ticker: MATIC, - nickname: 'Polygon', - id: NETWORK_CONFIGURATION_ID_2, - }); - }); - - it('returns matching networkConfiguration when passed a nickname that matches an existing configuration', () => { - expect( - metamaskController.findNetworkConfigurationBy({ - nickname: 'Alt Mainnet', - }), - ).toStrictEqual({ - chainId: MAINNET_CHAIN_ID, - nickname: 'Alt Mainnet', - id: NETWORK_CONFIGURATION_ID_1, - rpcUrl: ALT_MAINNET_RPC_URL, - ticker: ETH, - }); - }); - - it('returns null if passed an object containing mismatched networkConfiguration key/value combination', () => { - expect( - metamaskController.findNetworkConfigurationBy({ - nickname: MAINNET_CHAIN_ID, - }), - ).toStrictEqual(null); - }); - - it('returns the first networkConfiguration added if passed an key/value combination for which there are multiple matching configurations', () => { - expect( - metamaskController.findNetworkConfigurationBy({ - chainId: POLYGON_CHAIN_ID, - }), - ).toStrictEqual({ - rpcUrl: POLYGON_RPC_URL, - chainId: POLYGON_CHAIN_ID, - ticker: MATIC, - nickname: 'Polygon', - id: NETWORK_CONFIGURATION_ID_2, - }); - }); - }); }); describe('getTokenSymbol', () => { diff --git a/app/scripts/migrations/127.test.ts b/app/scripts/migrations/127.test.ts new file mode 100644 index 000000000000..b7735de831af --- /dev/null +++ b/app/scripts/migrations/127.test.ts @@ -0,0 +1,1263 @@ +import { migrate, version } from './127'; + +const oldVersion = 126; + +const sentryCaptureExceptionMock = jest.fn(); +global.sentry = { + captureException: sentryCaptureExceptionMock, +}; + +describe(`migration #${version}`, () => { + afterEach(() => jest.resetAllMocks()); + + it('updates the version metadata', async () => { + const oldState = { + meta: { version: oldVersion }, + data: {}, + }; + + const newState = await migrate(oldState); + expect(newState.meta).toStrictEqual({ version }); + }); + + it('captures an exception if the network controller state is not defined', async () => { + const oldState = { + meta: { version: oldVersion }, + data: {}, + }; + + await migrate(oldState); + expect(sentryCaptureExceptionMock).toHaveBeenCalledTimes(1); + expect(sentryCaptureExceptionMock).toHaveBeenCalledWith( + new Error(`state.NetworkController is not defined`), + ); + }); + + it('captures an exception if the network controller state is not an object', async () => { + for (const NetworkController of [undefined, null, 1, 'foo']) { + const oldState = { + meta: { version: oldVersion }, + data: { NetworkController }, + }; + + await migrate(oldState); + expect(sentryCaptureExceptionMock).toHaveBeenCalledTimes(1); + expect(sentryCaptureExceptionMock).toHaveBeenCalledWith( + new Error( + `typeof state.NetworkController is ${typeof NetworkController}`, + ), + ); + sentryCaptureExceptionMock.mockClear(); + } + }); + + it('captures an exception if the transaction controller state is not defined', async () => { + const oldState = { + meta: { version: oldVersion }, + data: { NetworkController: {} }, + }; + + await migrate(oldState); + expect(sentryCaptureExceptionMock).toHaveBeenCalledTimes(1); + expect(sentryCaptureExceptionMock).toHaveBeenCalledWith( + new Error(`state.TransactionController is not defined`), + ); + }); + + it('captures an exception if the transaction controller state is not an object', async () => { + for (const TransactionController of [undefined, null, 1, 'foo']) { + const oldState = { + meta: { version: oldVersion }, + data: { NetworkController: {}, TransactionController }, + }; + + await migrate(oldState); + expect(sentryCaptureExceptionMock).toHaveBeenCalledTimes(1); + expect(sentryCaptureExceptionMock).toHaveBeenCalledWith( + new Error( + `typeof state.TransactionController is ${typeof TransactionController}`, + ), + ); + sentryCaptureExceptionMock.mockClear(); + } + }); + + it('migrates a custom network on a built-in chain', async () => { + const customNetwork = { + id: 'network-configuration-id', + chainId: '0x1', + nickname: 'My Local Node', + ticker: 'ETH', + rpcUrl: 'https://localhost/rpc', + rpcPrefs: { + blockExplorerUrl: 'https://localhost/explorer', + }, + }; + + const oldState = { + meta: { version: oldVersion }, + data: { + TransactionController: {}, + NetworkController: { + selectedNetworkClientId: 'mainnet', + networkConfigurations: { + [customNetwork.id]: customNetwork, + }, + }, + }, + }; + + const defaultStateToExpect = defaultPostMigrationState(); + const expectedNetwork = { + ...defaultStateToExpect.networkConfigurationsByChainId[ + customNetwork.chainId + ], + }; + + // The custom network's rpc url should be added to the existing network + expectedNetwork.rpcEndpoints.push({ + networkClientId: customNetwork.id, + name: customNetwork.nickname, + url: customNetwork.rpcUrl, + type: 'custom', + }); + + // The custom network's block explorer should be added to the existing network + expectedNetwork.blockExplorerUrls.push( + customNetwork.rpcPrefs.blockExplorerUrl, + ); + + const expectedState = { + ...defaultStateToExpect, + networkConfigurationsByChainId: { + ...defaultStateToExpect.networkConfigurationsByChainId, + [customNetwork.chainId]: expectedNetwork, + }, + }; + + const newState = await migrate(oldState); + expect(newState.data.NetworkController).toStrictEqual(expectedState); + }); + + it('migrates a custom network on a not built-in chain', async () => { + const customNetwork = { + id: 'network-configuration-id', + chainId: '0x123456789', + nickname: 'My Random Network', + ticker: 'FOO', + rpcUrl: 'https://localhost/rpc', + rpcPrefs: { + blockExplorerUrl: 'https://localhost/explorer', + }, + }; + + const oldState = { + meta: { version: oldVersion }, + data: { + TransactionController: {}, + NetworkController: { + selectedNetworkClientId: 'mainnet', + networkConfigurations: { + [customNetwork.id]: customNetwork, + }, + }, + }, + }; + + const expectedState = defaultPostMigrationState(); + + // A new network should be added + expectedState.networkConfigurationsByChainId[customNetwork.chainId] = { + chainId: customNetwork.chainId, + name: customNetwork.nickname, + nativeCurrency: customNetwork.ticker, + rpcEndpoints: [ + { + name: customNetwork.nickname, + networkClientId: customNetwork.id, + url: customNetwork.rpcUrl, + type: 'custom', + }, + ], + defaultRpcEndpointIndex: 0, + blockExplorerUrls: [customNetwork.rpcPrefs.blockExplorerUrl], + defaultBlockExplorerUrlIndex: 0, + }; + + const newState = await migrate(oldState); + expect(newState.data.NetworkController).toStrictEqual(expectedState); + }); + + it('tie breaks with the globally selected network', async () => { + const customNetwork = { + id: 'network-configuration-id', + chainId: '0x1', + nickname: 'My Local Node', + ticker: 'FOO', + rpcUrl: 'https://localhost/rpc', + rpcPrefs: { + blockExplorerUrl: 'https://localhost/explorer', + }, + }; + + const oldState = { + meta: { version: oldVersion }, + data: { + TransactionController: {}, + NetworkController: { + selectedNetworkClientId: customNetwork.id, // make it the selected network + networkConfigurations: { + [customNetwork.id]: customNetwork, + }, + }, + }, + }; + + const defaultStateToExpect = defaultPostMigrationState(); + const expectedNetwork = { + ...defaultStateToExpect.networkConfigurationsByChainId[ + customNetwork.chainId + ], + }; + + // The custom network should become the default RPC url + expectedNetwork.defaultRpcEndpointIndex = + expectedNetwork.rpcEndpoints.push({ + networkClientId: customNetwork.id, + name: customNetwork.nickname, + url: customNetwork.rpcUrl, + type: 'custom', + }) - 1; + + // The custom network's block explorer should be added to + // the existing network, and it should become the default. + expectedNetwork.defaultBlockExplorerUrlIndex = + expectedNetwork.blockExplorerUrls.push( + customNetwork.rpcPrefs.blockExplorerUrl, + ) - 1; + + const expectedState = { + ...defaultStateToExpect, + // The custom network should remain selected + selectedNetworkClientId: customNetwork.id, + networkConfigurationsByChainId: { + ...defaultStateToExpect.networkConfigurationsByChainId, + [customNetwork.chainId]: expectedNetwork, + }, + }; + + const newState = await migrate(oldState); + expect(newState.data.NetworkController).toStrictEqual(expectedState); + }); + + it('tie breaks with the most recently transacted network', async () => { + const customNetwork = { + id: 'network-configuration-id', + chainId: '0x1', + nickname: 'My Local Node', + ticker: 'FOO', + rpcUrl: 'https://localhost/rpc', + rpcPrefs: { + blockExplorerUrl: 'https://localhost/explorer', + }, + }; + + const oldState = { + meta: { version: oldVersion }, + data: { + TransactionController: { + transactions: [ + { + chainId: customNetwork.chainId, + time: 1, + networkClientId: 'mainnet', + }, + { + chainId: customNetwork.chainId, + time: 2, + networkClientId: customNetwork.id, + }, + ], + }, + NetworkController: { + selectedNetworkClientId: 'sepolia', + networkConfigurations: { + [customNetwork.id]: customNetwork, + }, + }, + }, + }; + + const defaultStateToExpect = defaultPostMigrationState(); + const expectedNetwork = { + ...defaultStateToExpect.networkConfigurationsByChainId[ + customNetwork.chainId + ], + }; + + // The custom network's rpc url should be added to the + // existing network, and become the default RPC url + expectedNetwork.defaultRpcEndpointIndex = + expectedNetwork.rpcEndpoints.push({ + networkClientId: customNetwork.id, + name: customNetwork.nickname, + url: customNetwork.rpcUrl, + type: 'custom', + }) - 1; + + // The custom network's block explorer should be added to + // the existing network, and it should become the default. + expectedNetwork.defaultBlockExplorerUrlIndex = + expectedNetwork.blockExplorerUrls.push( + customNetwork.rpcPrefs.blockExplorerUrl, + ) - 1; + + const expectedState = { + ...defaultStateToExpect, + // Selected network shouldn't change + selectedNetworkClientId: + oldState.data.NetworkController.selectedNetworkClientId, + networkConfigurationsByChainId: { + ...defaultStateToExpect.networkConfigurationsByChainId, + [customNetwork.chainId]: expectedNetwork, + }, + }; + + const newState = await migrate(oldState); + expect(newState.data.NetworkController).toStrictEqual(expectedState); + }); + + it('tie breaks with the custom network that is not built in infura', async () => { + const customNetwork = { + id: 'network-configuration-id', + chainId: '0x1', + nickname: 'My Local Node', + ticker: 'FOO', + rpcUrl: 'https://localhost/rpc', + rpcPrefs: { + blockExplorerUrl: 'https://localhost/explorer', + }, + }; + + const oldState = { + meta: { version: oldVersion }, + data: { + TransactionController: {}, + NetworkController: { + selectedNetworkClientId: 'sepolia', + networkConfigurations: { + [customNetwork.id]: customNetwork, + }, + }, + }, + }; + + const defaultStateToExpect = defaultPostMigrationState(); + const expectedNetwork = { + ...defaultStateToExpect.networkConfigurationsByChainId[ + customNetwork.chainId + ], + }; + + // The custom network should become the default RPC url + expectedNetwork.defaultRpcEndpointIndex = + expectedNetwork.rpcEndpoints.push({ + networkClientId: customNetwork.id, + name: customNetwork.nickname, + url: customNetwork.rpcUrl, + type: 'custom', + }) - 1; + + // The custom network's block explorer should be added to + // the existing network, and it should become the default. + expectedNetwork.defaultBlockExplorerUrlIndex = + expectedNetwork.blockExplorerUrls.push( + customNetwork.rpcPrefs.blockExplorerUrl, + ) - 1; + + const expectedState = { + ...defaultStateToExpect, + selectedNetworkClientId: + oldState.data.NetworkController.selectedNetworkClientId, + networkConfigurationsByChainId: { + ...defaultStateToExpect.networkConfigurationsByChainId, + [customNetwork.chainId]: expectedNetwork, + }, + }; + + const newState = await migrate(oldState); + expect(newState.data.NetworkController).toStrictEqual(expectedState); + }); + + it('dedupes if there are multiple block explorers within a chain id', async () => { + const randomChainId = '0x123456'; + + const oldState = { + meta: { version: oldVersion }, + data: { + TransactionController: {}, + NetworkController: { + selectedNetworkClientId: 'sepolia', + networkConfigurations: { + 'network-id-1': { + id: 'network-id-1', + chainId: randomChainId, + nickname: 'Random Network', + ticker: 'FOO', + rpcUrl: 'https://localhost/rpc/1', + rpcPrefs: { + blockExplorerUrl: 'https://localhost/explorer', + }, + }, + 'network-id-2': { + id: 'network-id-2', + chainId: randomChainId, + nickname: 'Random Network', + ticker: 'FOO', + rpcUrl: 'https://localhost/rpc/2', + rpcPrefs: { + blockExplorerUrl: 'https://localhost/explorer', + }, + }, + }, + }, + }, + }; + + const newState = await migrate(oldState); + + const { networkConfigurationsByChainId } = newState.data + .NetworkController as { + networkConfigurationsByChainId: Record< + string, + { + defaultBlockExplorerUrlIndex: number; + blockExplorerUrls: string[]; + } + >; + }; + + const networkConfiguration = networkConfigurationsByChainId[randomChainId]; + expect(networkConfiguration.defaultBlockExplorerUrlIndex).toStrictEqual(0); + expect(networkConfiguration.blockExplorerUrls).toStrictEqual([ + 'https://localhost/explorer', + ]); + }); + + it('dedupes if there are duplicate rpc urls within a chain id, and none are the selected network', async () => { + for (const [url1, url2] of [ + ['http://test.endpoint/bar', 'http://test.endpoint/bar'], + // Check case insensitivity (network controller requires this) + ['http://test.endpoint/bar', 'HTTP://TEST.ENDPOINT/bar'], + ]) { + const randomChainId = '0x123456'; + + const oldState = { + meta: { version: oldVersion }, + data: { + TransactionController: {}, + NetworkController: { + selectedNetworkClientId: 'sepolia', + networkConfigurations: { + 'network-id-1': { + id: 'network-id-1', + chainId: randomChainId, + nickname: 'Random Network', + ticker: 'FOO', + rpcUrl: url1, + }, + 'network-id-2': { + id: 'network-id-2', + chainId: randomChainId, + nickname: 'Random Network', + ticker: 'FOO', + rpcUrl: url2, + }, + }, + }, + }, + }; + + const newState = await migrate(oldState); + + const { networkConfigurationsByChainId } = newState.data + .NetworkController as { + networkConfigurationsByChainId: Record< + string, + { + defaultRpcEndpointIndex: number; + rpcEndpoints: { + url: string; + type: string; + name: string; + networkClientId: string; + }[]; + } + >; + }; + + const networkConfiguration = + networkConfigurationsByChainId[randomChainId]; + expect(networkConfiguration.defaultRpcEndpointIndex).toStrictEqual(0); + + // The first duplicate encountered should be used to tie break + // duplicate endpoints, since none were the selected network + expect(networkConfiguration.rpcEndpoints).toStrictEqual([ + { + url: url1, + type: 'custom', + name: 'Random Network', + networkClientId: 'network-id-1', + }, + ]); + } + }); + + it('dedupes if there are duplicate rpc urls within a chain id, and one is the selected network', async () => { + for (const [url1, url2] of [ + ['http://test.endpoint/bar', 'http://test.endpoint/bar'], + // Check case insensitivity (network controller requires this) + ['http://test.endpoint/bar', 'HTTP://TEST.ENDPOINT/bar'], + ]) { + const randomChainId = '0x123456'; + + const oldState = { + meta: { version: oldVersion }, + data: { + TransactionController: {}, + NetworkController: { + selectedNetworkClientId: 'network-id-2', + networkConfigurations: { + 'network-id-1': { + id: 'network-id-1', + chainId: randomChainId, + nickname: 'Random Network', + ticker: 'FOO', + rpcUrl: url1, + }, + // I'm the selected network and should be + // used to tie break duplicate endpoints + 'network-id-2': { + id: 'network-id-2', + chainId: randomChainId, + nickname: 'Random Network', + ticker: 'FOO', + rpcUrl: url2, + }, + }, + }, + }, + }; + + const newState = await migrate(oldState); + + const { networkConfigurationsByChainId } = newState.data + .NetworkController as { + networkConfigurationsByChainId: Record< + string, + { + defaultRpcEndpointIndex: number; + rpcEndpoints: { + url: string; + type: string; + name: string; + networkClientId: string; + }[]; + } + >; + }; + + const networkConfiguration = + networkConfigurationsByChainId[randomChainId]; + expect(networkConfiguration.defaultRpcEndpointIndex).toStrictEqual(0); + expect(networkConfiguration.rpcEndpoints).toStrictEqual([ + { + url: url2, + type: 'custom', + name: 'Random Network', + networkClientId: 'network-id-2', + }, + ]); + } + }); + + it('dedupes if there are duplicate rpc urls across chain ids and none are the selected network', async () => { + const randomChainId1 = '0x123456'; + const randomChainId2 = '0x123456789'; + + const oldState = { + meta: { version: oldVersion }, + data: { + TransactionController: {}, + NetworkController: { + selectedNetworkClientId: 'mainnet', + networkConfigurations: { + // I'm the first encountered duplicate endpoint and should + // be used to tie break, since none are the selected network + 'network-id-1': { + id: 'network-id-1', + chainId: randomChainId1, + nickname: 'Random Network', + ticker: 'FOO', + rpcUrl: 'http://localhost/rpc', + rpcPrefs: { + blockExplorerUrl: 'https://localhost/explorer', + }, + }, + // I'm the duplicate endpoint that lost the tie break and should be omitted + 'network-id-2': { + id: 'network-id-2', + chainId: randomChainId2, + nickname: 'Random Network', + ticker: 'FOO', + rpcUrl: 'http://localhost/rpc', + rpcPrefs: { + blockExplorerUrl: 'https://localhost/explorer', + }, + }, + 'network-id-3': { + id: 'network-id-3', + chainId: randomChainId2, + nickname: 'Random Network', + ticker: 'FOO', + rpcUrl: 'http://localhost/rpc/different', + rpcPrefs: { + blockExplorerUrl: 'https://localhost/explorer', + }, + }, + }, + }, + }, + }; + + const newState = await migrate(oldState); + const expectedState = defaultPostMigrationState(); + expectedState.networkConfigurationsByChainId[randomChainId1] = { + chainId: randomChainId1, + rpcEndpoints: [ + { + networkClientId: 'network-id-1', + url: 'http://localhost/rpc', + type: 'custom', + name: 'Random Network', + }, + ], + defaultRpcEndpointIndex: 0, + blockExplorerUrls: ['https://localhost/explorer'], + defaultBlockExplorerUrlIndex: 0, + name: 'Random Network', + nativeCurrency: 'FOO', + }; + + expectedState.networkConfigurationsByChainId[randomChainId2] = { + blockExplorerUrls: ['https://localhost/explorer'], + defaultBlockExplorerUrlIndex: 0, + chainId: '0x123456789', + defaultRpcEndpointIndex: 0, + name: 'Random Network', + nativeCurrency: 'FOO', + rpcEndpoints: [ + { + name: 'Random Network', + networkClientId: 'network-id-3', + type: 'custom', + url: 'http://localhost/rpc/different', + }, + ], + }; + + expect(newState.data.NetworkController).toStrictEqual(expectedState); + }); + + it('dedupes if there are duplicate rpc urls across chain ids and one is the selected network', async () => { + const randomChainId1 = '0x123456'; + const randomChainId2 = '0x123456789'; + + const oldState = { + meta: { version: oldVersion }, + data: { + TransactionController: {}, + NetworkController: { + selectedNetworkClientId: 'network-id-2', + networkConfigurations: { + // This endpoint is duplicated but not the selected network, and should be omitted + 'network-id-1': { + id: 'network-id-1', + chainId: randomChainId1, + nickname: 'Random Network', + ticker: 'FOO', + rpcUrl: 'http://localhost/rpc', + rpcPrefs: { + blockExplorerUrl: 'https://localhost/explorer', + }, + }, + // This is the selected network and should tie break duplicate endpoints + 'network-id-2': { + id: 'network-id-2', + chainId: randomChainId2, + nickname: 'Random Network', + ticker: 'FOO', + rpcUrl: 'http://localhost/rpc', + rpcPrefs: { + blockExplorerUrl: 'https://localhost/explorer', + }, + }, + // I'm just an extra unique endpoint that should stay + 'network-id-3': { + id: 'network-id-3', + chainId: randomChainId2, + nickname: 'Random Network', + ticker: 'FOO', + rpcUrl: 'http://localhost/rpc/different', + rpcPrefs: { + blockExplorerUrl: 'https://localhost/explorer', + }, + }, + }, + }, + }, + }; + + const newState = await migrate(oldState); + const expectedState = defaultPostMigrationState(); + expectedState.selectedNetworkClientId = + oldState.data.NetworkController.selectedNetworkClientId; + expectedState.networkConfigurationsByChainId[randomChainId2] = { + chainId: randomChainId2, + rpcEndpoints: [ + { + networkClientId: 'network-id-2', + url: 'http://localhost/rpc', + type: 'custom', + name: 'Random Network', + }, + { + networkClientId: 'network-id-3', + url: 'http://localhost/rpc/different', + type: 'custom', + name: 'Random Network', + }, + ], + defaultRpcEndpointIndex: 0, + blockExplorerUrls: ['https://localhost/explorer'], + defaultBlockExplorerUrlIndex: 0, + name: 'Random Network', + nativeCurrency: 'FOO', + }; + + expect(newState.data.NetworkController).toStrictEqual(expectedState); + }); + + it('handles not well formed rpc urls', async () => { + const randomChainId = '0x123456'; + + const oldState = { + meta: { version: oldVersion }, + data: { + TransactionController: {}, + NetworkController: { + selectedNetworkClientId: 'sepolia', + networkConfigurations: { + 'network-id-1': { + id: 'network-id-1', + chainId: randomChainId, + nickname: 'Random Network', + ticker: 'FOO', + rpcUrl: 'http://test.endpoint/bar', + }, + // This RPC url is not well formed and should be omitted + 'network-id-2': { + id: 'network-id-2', + chainId: randomChainId, + nickname: 'Random Network', + ticker: 'FOO', + rpcUrl: 'not_well_formed', + }, + }, + }, + }, + }; + + const newState = await migrate(oldState); + + const { networkConfigurationsByChainId } = newState.data + .NetworkController as { + networkConfigurationsByChainId: Record< + string, + { + defaultRpcEndpointIndex: number; + rpcEndpoints: { + url: string; + type: string; + name: string; + networkClientId: string; + }[]; + } + >; + }; + + const networkConfiguration = networkConfigurationsByChainId[randomChainId]; + expect(networkConfiguration.defaultRpcEndpointIndex).toStrictEqual(0); + expect(networkConfiguration.rpcEndpoints).toStrictEqual([ + { + url: 'http://test.endpoint/bar', + type: 'custom', + name: 'Random Network', + networkClientId: 'network-id-1', + }, + ]); + }); + + it('handles the case where no rpc url is well formed', async () => { + const randomChainId = '0x123456'; + + const oldState = { + meta: { version: oldVersion }, + data: { + TransactionController: {}, + NetworkController: { + selectedNetworkClientId: 'mainnet', + networkConfigurations: { + 'network-id-1': { + id: 'network-id-1', + chainId: randomChainId, + nickname: 'Random Network', + ticker: 'FOO', + rpcUrl: 'not_well_formed', + }, + 'network-id-2': { + id: 'network-id-2', + chainId: randomChainId, + nickname: 'Random Network', + ticker: 'FOO', + rpcUrl: 'also_not_well_formed', + }, + }, + }, + }, + }; + + const newState = await migrate(oldState); + + // `randomChainId` had no well formed urls, so it should be omitted + expect(newState.data.NetworkController).toStrictEqual( + defaultPostMigrationState(), + ); + }); + + it('handles the case where selectedNetworkClientId doesnt point to any endpoint', async () => { + const oldState = { + meta: { version: oldVersion }, + data: { + TransactionController: {}, + NetworkController: { + selectedNetworkClientId: 'dont-point-to-anything', + }, + }, + }; + + const newState = await migrate(oldState); + + // selectedNetworkClientId should fall back to mainnet + expect(newState.data.NetworkController).toStrictEqual( + defaultPostMigrationState(), + ); + }); + + it('handles the case where selectedNetworkClientId doesnt point to any endpoint and a custom endpoint is the default', async () => { + const oldState = { + meta: { version: oldVersion }, + data: { + NetworkController: { + selectedNetworkClientId: 'dont-point-to-anything', + networkConfigurations: { + 'custom-mainnet': { + id: 'custom-mainnet', + chainId: '0x1', + nickname: 'Custom Mainnet', + ticker: 'ETH', + rpcUrl: 'http://localhost/rpc', + }, + }, + }, + TransactionController: { + transactions: [ + { + chainId: '0x1', + time: 1, + networkClientId: 'custom-mainnet', + }, + ], + }, + }, + }; + + const newState = await migrate(oldState); + + // selectedNetworkClientId should fall back to custom mainnet + expect( + (newState.data.NetworkController as { selectedNetworkClientId: string }) + .selectedNetworkClientId, + ).toStrictEqual('custom-mainnet'); + }); + + it('handles the case where selectedNetworkClientId doesnt point to a valid endpoint and theres no fallback', async () => { + const randomChainId = '0x123456'; + + const oldState = { + meta: { version: oldVersion }, + data: { + NetworkController: { + selectedNetworkClientId: 'invalid-url', + networkConfigurations: + // The selected network client has an invaid url + { + 'invalid-url': { + id: 'invalid-url', + chainId: randomChainId, + nickname: 'Random Chain', + ticker: 'ETH', + rpcUrl: 'foobar', + }, + // And there are no other configurations on the same chain to fall back to + }, + }, + TransactionController: {}, + }, + }; + + const newState = await migrate(oldState); + + // Fall back to mainnet + expect( + (newState.data.NetworkController as { selectedNetworkClientId: string }) + .selectedNetworkClientId, + ).toStrictEqual('mainnet'); + }); + + it('handles the case where selectedNetworkClientId doesnt point to a valid endpoint but theres a fallback', async () => { + const randomChainId = '0x123456'; + + const oldState = { + meta: { version: oldVersion }, + data: { + NetworkController: { + selectedNetworkClientId: 'invalid-url', + networkConfigurations: + // The selected network client has an invaid url + { + 'invalid-url': { + id: 'invalid-url', + chainId: randomChainId, + nickname: 'Random Chain', + ticker: 'ETH', + rpcUrl: 'foobar', + }, + // So it should fall back to me, on the same chain + 'pick-me': { + id: 'pick-me', + chainId: randomChainId, + nickname: 'Random Chain', + ticker: 'ETH', + rpcUrl: 'http://localhost/rpc', + }, + }, + }, + TransactionController: {}, + }, + }; + + const newState = await migrate(oldState); + + expect( + (newState.data.NetworkController as { selectedNetworkClientId: string }) + .selectedNetworkClientId, + ).toStrictEqual('pick-me'); + }); + + it('migrates the netork order controller', async () => { + const oldState = { + meta: { version: oldVersion }, + data: { + NetworkController: {}, + TransactionController: {}, + NetworkOrderController: { + orderedNetworkList: [ + { + networkId: '0x1', + networkRpcUrl: 'http://localhost/a', + }, + { + networkId: '0x2', + networkRpcUrl: 'http://localhost/b', + }, + { + networkId: '0x3', + networkRpcUrl: 'http://localhost/c', + }, + { + networkId: '0x2', + networkRpcUrl: 'http://localhost/d', + }, + { + networkId: '0x1', + networkRpcUrl: 'http://localhost/e', + }, + ], + }, + }, + }; + + // Expect chain IDs to maintain order, but deduped and with `networkRpcUrl` removed + const newState = await migrate(oldState); + expect(newState.data.NetworkOrderController).toStrictEqual({ + orderedNetworkList: [ + { networkId: '0x1' }, + { networkId: '0x2' }, + { networkId: '0x3' }, + ], + }); + }); + + it('sets `preferences.showMultiRpcModal` to false when there are no networks with multiple endpoints', async () => { + const randomChainId = '0x123456'; + + const oldState = { + meta: { version: oldVersion }, + data: { + TransactionController: {}, + PreferencesController: { preferences: {} }, + NetworkController: { + selectedNetworkClientId: 'mainnet', + networkConfigurations: { + 'network-id-1': { + id: 'network-id-1', + chainId: randomChainId, + nickname: 'Random Network', + ticker: 'FOO', + rpcUrl: 'https://localhost/rpc', + }, + }, + }, + }, + }; + + const newState = await migrate(oldState); + expect(newState.data.PreferencesController).toStrictEqual({ + preferences: { showMultiRpcModal: false }, + }); + }); + + it('sets `preferences.showMultiRpcModal` to true when there are networks with multiple endpoints', async () => { + const randomChainId = '0x123456'; + + const oldState = { + meta: { version: oldVersion }, + data: { + TransactionController: {}, + PreferencesController: { preferences: {} }, + NetworkController: { + selectedNetworkClientId: 'mainnet', + networkConfigurations: { + 'network-id-1': { + id: 'network-id-1', + chainId: randomChainId, + nickname: 'Ethereum Network', + ticker: 'ETH', + rpcUrl: 'https://localhost/rpc/1', + }, + 'network-id-2': { + id: 'network-id-2', + chainId: randomChainId, + nickname: 'Random Network', + ticker: 'FOO', + rpcUrl: 'https://localhost/rpc/2', + }, + }, + }, + }, + }; + + const newState = await migrate(oldState); + expect(newState.data.PreferencesController).toStrictEqual({ + preferences: { showMultiRpcModal: true }, + }); + }); + + it('updates the selected network controller to remove stale network client ids', async () => { + const randomChainId = '0x123456'; + + const oldState = { + meta: { version: oldVersion }, + data: { + TransactionController: {}, + SelectedNetworkController: { + domains: { + // I should stay in the selected network controller + 'normal.com': 'normal-network-id', + // I should be removed, as I never pointed to a network + 'neverexisted.com': 'never-existed-network-id', + }, + }, + NetworkController: { + selectedNetworkClientId: 'mainnet', + networkConfigurations: { + 'normal-network-id': { + id: 'normal-network-id', + chainId: randomChainId, + nickname: 'Normal Network', + ticker: 'TICK', + rpcUrl: 'https://localhost/rpc', + }, + }, + }, + }, + }; + + const newState = await migrate(oldState); + expect(newState.data.SelectedNetworkController).toStrictEqual({ + domains: { 'normal.com': 'normal-network-id' }, + }); + }); +}); + +it('updates the selected network controller to point domains to the default RPC endpoint', async () => { + const untouchedChainId = '0x123'; + const redirectedChainId = '0x456'; + + const oldState = { + meta: { version: oldVersion }, + data: { + TransactionController: {}, + SelectedNetworkController: { + domains: { + 'untouched.com': 'untouched-network-id', + 'already-default.com': 'already-default-network-id', + 'redirected.com': 'redirected-network-id', + // Test the case where it pointed to a built in + // network, which would not have been in state before + 'mainnet.com': 'mainnet', + }, + }, + NetworkController: { + selectedNetworkClientId: 'already-default-network-id', + networkConfigurations: { + 'untouched-network-id': { + id: 'untouched-network-id', + chainId: untouchedChainId, + nickname: 'Untouched Network', + ticker: 'TICK', + rpcUrl: 'https://localhost/rpc/1', + }, + 'already-default-network-id': { + id: 'already-default-network-id', + chainId: redirectedChainId, + nickname: 'Default Network', + ticker: 'TICK', + rpcUrl: 'https://localhost/rpc/2', + }, + 'redirected-network-id': { + id: 'redirected-network-id', + chainId: redirectedChainId, + nickname: 'Redirected Network', + ticker: 'TICK', + rpcUrl: 'https://localhost/rpc/3', + }, + }, + }, + }, + }; + + const newState = await migrate(oldState); + expect(newState.data.SelectedNetworkController).toStrictEqual({ + domains: { + 'untouched.com': 'untouched-network-id', + 'already-default.com': 'already-default-network-id', + 'redirected.com': 'already-default-network-id', + 'mainnet.com': 'mainnet', + }, + }); +}); + +// The state of the network controller post migration for just the +// built-in networks. As if there were no custom networks defined. +function defaultPostMigrationState() { + const state = { + selectedNetworkClientId: 'mainnet', + networksMetadata: {}, + networkConfigurationsByChainId: { + '0x1': { + chainId: '0x1', + rpcEndpoints: [ + { + networkClientId: 'mainnet', + url: 'https://mainnet.infura.io/v3/{infuraProjectId}', + type: 'infura', + }, + ], + defaultRpcEndpointIndex: 0, + blockExplorerUrls: ['https://etherscan.io'], + defaultBlockExplorerUrlIndex: 0, + name: 'Ethereum Mainnet', + nativeCurrency: 'ETH', + }, + '0xaa36a7': { + chainId: '0xaa36a7', + rpcEndpoints: [ + { + networkClientId: 'sepolia', + url: 'https://sepolia.infura.io/v3/{infuraProjectId}', + type: 'infura', + }, + ], + defaultRpcEndpointIndex: 0, + blockExplorerUrls: ['https://sepolia.etherscan.io'], + defaultBlockExplorerUrlIndex: 0, + name: 'Sepolia', + nativeCurrency: 'SepoliaETH', + }, + '0xe705': { + chainId: '0xe705', + rpcEndpoints: [ + { + networkClientId: 'linea-sepolia', + url: 'https://linea-sepolia.infura.io/v3/{infuraProjectId}', + type: 'infura', + }, + ], + defaultRpcEndpointIndex: 0, + blockExplorerUrls: ['https://sepolia.lineascan.build'], + defaultBlockExplorerUrlIndex: 0, + name: 'Linea Sepolia', + nativeCurrency: 'LineaETH', + }, + '0xe708': { + chainId: '0xe708', + rpcEndpoints: [ + { + networkClientId: 'linea-mainnet', + url: 'https://linea-mainnet.infura.io/v3/{infuraProjectId}', + type: 'infura', + }, + ], + defaultRpcEndpointIndex: 0, + blockExplorerUrls: ['https://lineascan.build'], + defaultBlockExplorerUrlIndex: 0, + name: 'Linea Mainnet', + nativeCurrency: 'ETH', + }, + }, + }; + + // Expand types to include optional fields that + // aren't defined on the above built-in networks + type Networks = typeof state.networkConfigurationsByChainId; + type Network = Networks[keyof Networks]; + return state as typeof state & { + networkConfigurationsByChainId: { + [key: string]: Network & { + rpcEndpoints: (Network['rpcEndpoints'][number] & { name?: string })[]; + }; + }; + }; +} diff --git a/app/scripts/migrations/127.ts b/app/scripts/migrations/127.ts new file mode 100644 index 000000000000..fa5c380c6619 --- /dev/null +++ b/app/scripts/migrations/127.ts @@ -0,0 +1,453 @@ +import { hasProperty, isObject, RuntimeObject } from '@metamask/utils'; +import { cloneDeep } from 'lodash'; +// Note: This is the library the network controller uses for URL +// validity / equality. Using here to ensure we match its validations. +import * as URI from 'uri-js'; +import { + CHAIN_ID_TO_CURRENCY_SYMBOL_MAP, + LINEA_MAINNET_DISPLAY_NAME, + LINEA_SEPOLIA_DISPLAY_NAME, + MAINNET_DISPLAY_NAME, + NETWORK_TO_NAME_MAP, + SEPOLIA_DISPLAY_NAME, +} from '../../../shared/constants/network'; + +type VersionedData = { + meta: { version: number }; + data: Record; +}; + +export const version = 127; + +/** + * This migration converts the network controller's + * `networkConfigurations` to a new field `networkConfigurationsByChainId`. + * + * Built-in Infura network configurations are now represented in this state, + * where they weren't before. These Infura configurations are merged with the user's + * custom configurations. Then all configurations are grouped by chain id, + * and merged to produce one network configuration per chain id. + * + * The `SelectedNetworkController` is also migrated, so that dapp domains + * point to the new default RPC endpoint for the chain they were on. + * + * The `NetworkOrderController` is also migrated, which manages + * the user's drag + drop preference order for the network menu. + * + * @param originalVersionedData - Versioned MetaMask extension state, exactly what we persist to dist. + * @param originalVersionedData.meta - State metadata. + * @param originalVersionedData.meta.version - The current state version. + * @param originalVersionedData.data - The persisted MetaMask state, keyed by controller. + * @returns Updated versioned MetaMask extension state. + */ +export async function migrate( + originalVersionedData: VersionedData, +): Promise { + const versionedData = cloneDeep(originalVersionedData); + versionedData.meta.version = version; + transformState(versionedData.data); + return versionedData; +} + +function transformState( + state: Record, +): Record { + if (!hasProperty(state, 'NetworkController')) { + global.sentry?.captureException?.( + new Error(`state.NetworkController is not defined`), + ); + return state; + } else if (!isObject(state.NetworkController)) { + global.sentry?.captureException?.( + new Error( + `typeof state.NetworkController is ${typeof state.NetworkController}`, + ), + ); + return state; + } else if (!hasProperty(state, 'TransactionController')) { + global.sentry?.captureException?.( + new Error(`state.TransactionController is not defined`), + ); + return state; + } else if (!isObject(state.TransactionController)) { + global.sentry?.captureException?.( + new Error( + `typeof state.TransactionController is ${typeof state.TransactionController}`, + ), + ); + return state; + } + + const networkState = state.NetworkController; + + // Get the existing custom network configurations + let networkConfigurations = isObject(networkState.networkConfigurations) + ? Object.values(networkState.networkConfigurations) + : []; + + // Prepend the built-in Infura network configurations, + // since they are now included in the network controller state + networkConfigurations = [ + { + type: 'infura', + id: 'mainnet', + chainId: '0x1', + ticker: 'ETH', + nickname: MAINNET_DISPLAY_NAME, + rpcUrl: 'https://mainnet.infura.io/v3/{infuraProjectId}', + rpcPrefs: { blockExplorerUrl: 'https://etherscan.io' }, + }, + { + type: 'infura', + id: 'sepolia', + chainId: '0xaa36a7', + ticker: 'SepoliaETH', + nickname: SEPOLIA_DISPLAY_NAME, + rpcUrl: 'https://sepolia.infura.io/v3/{infuraProjectId}', + rpcPrefs: { blockExplorerUrl: 'https://sepolia.etherscan.io' }, + }, + { + type: 'infura', + id: 'linea-sepolia', + chainId: '0xe705', + ticker: 'LineaETH', + nickname: LINEA_SEPOLIA_DISPLAY_NAME, + rpcUrl: 'https://linea-sepolia.infura.io/v3/{infuraProjectId}', + rpcPrefs: { blockExplorerUrl: 'https://sepolia.lineascan.build' }, + }, + { + type: 'infura', + id: 'linea-mainnet', + chainId: '0xe708', + ticker: 'ETH', + nickname: LINEA_MAINNET_DISPLAY_NAME, + rpcUrl: 'https://linea-mainnet.infura.io/v3/{infuraProjectId}', + rpcPrefs: { blockExplorerUrl: 'https://lineascan.build' }, + }, + ...networkConfigurations, + ]; + + // Group the network configurations by by chain id, producing + // a mapping from chain id to an array of network configurations + const networkConfigurationArraysByChainId = networkConfigurations.reduce( + (acc: Record, networkConfiguration) => { + if ( + isObject(networkConfiguration) && + typeof networkConfiguration.chainId === 'string' + ) { + (acc[networkConfiguration.chainId] ??= []).push(networkConfiguration); + } + return acc; + }, + {}, + ); + + // Get transaction history in reverse chronological order to help with tie breaks + const transactions: RuntimeObject[] = Array.isArray( + state.TransactionController.transactions, + ) + ? state.TransactionController.transactions + .filter( + (tx) => + isObject(tx) && + typeof tx.time === 'number' && + typeof tx.networkClientId === 'string', + ) + .sort((a, b) => b.time - a.time) + : []; + + // For each chain id, merge the array of network configurations + const networkConfigurationsByChainId = Object.entries( + networkConfigurationArraysByChainId, + ).reduce((acc: Record, [chainId, networks]) => { + // + // Calculate the tie breaker network, whose values will be preferred + let tieBreaker: RuntimeObject | undefined; + + // If one of the networks is the globally selected network, use that + tieBreaker = networks.find( + (network) => network.id === networkState.selectedNetworkClientId, + ); + + // Otherwise use the network that was most recently transacted on + if (!tieBreaker) { + transactions + .filter((tx) => tx.chainId === chainId) + .some( + (tx) => + (tieBreaker = networks.find( + (network) => network.id === tx.networkClientId, + )), + ); + } + + // If no transactions were found for the chain id, fall back + // to an arbitrary custom network that is not built in infura + if (!tieBreaker) { + tieBreaker = networks.find((network) => network.type !== 'infura'); + } + + // Calculate the unique set of valid rpc endpoints for this chain id + const rpcEndpoints = networks.reduce( + (endpoints: RuntimeObject[], network) => { + if ( + network.id && + network.rpcUrl && + typeof network.rpcUrl === 'string' && + isValidUrl(network.rpcUrl) + ) { + // Check if there's a different duplicate that's also the selected + // network. If so, it will be the preferred one we'll take. + const duplicateAndSelected = networkConfigurations.some( + (otherNetwork) => + isObject(otherNetwork) && + typeof otherNetwork.rpcUrl === 'string' && + typeof network.rpcUrl === 'string' && + otherNetwork.id !== network.id && // A different endpoint + URI.equal(otherNetwork.rpcUrl, network.rpcUrl) && // With the same URL + otherNetwork.id === networkState.selectedNetworkClientId, // That's currently selected + ); + + // Check if there's a duplicate that we've already processed. If none of + // the duplicates are the selected network, we'll take the first one seen. + const duplicateAlreadyAdded = [ + // Chains we've already proccessed + ...Object.values(acc).flatMap((n) => + isObject(n) ? n.rpcEndpoints : [], + ), + // Or the current chain we're processing + ...endpoints, + ].some( + (existingEndpoint) => + isObject(existingEndpoint) && + typeof existingEndpoint.url === 'string' && + typeof network.rpcUrl === 'string' && + URI.equal(existingEndpoint.url, network.rpcUrl), + ); + + if (!duplicateAndSelected && !duplicateAlreadyAdded) { + // The endpoint is unique and valid, so add it to the list + endpoints.push({ + networkClientId: network.id, + url: network.rpcUrl, + type: network.type === 'infura' ? 'infura' : 'custom', + ...(network.type !== 'infura' && + typeof network.nickname === 'string' && + // The old network name becomes the endpoint name + network.nickname && { name: network.nickname }), + }); + } + } + return endpoints; + }, + [], + ); + + // If there were no valid unique endpoints, then omit the network + // configuration for this chain id. The network controller requires + // configurations to have at least 1 endpoint. + if (rpcEndpoints.length === 0) { + return acc; + } + + // Use the tie breaker network as the default rpc endpoint + const defaultRpcEndpointIndex = Math.max( + rpcEndpoints.findIndex( + (endpoint) => endpoint.networkClientId === tieBreaker?.id, + ), + // Or arbitrarily default to the first endpoint if we don't have a tie breaker + 0, + ); + + // Calculate the unique array of non-empty block explorer urls + const blockExplorerUrls = [ + ...networks.reduce((urls, network) => { + if ( + isObject(network.rpcPrefs) && + typeof network.rpcPrefs.blockExplorerUrl === 'string' && + network.rpcPrefs.blockExplorerUrl + ) { + urls.add(network.rpcPrefs.blockExplorerUrl); + } + return urls; + }, new Set()), + ]; + + // Use the tie breaker network as the default block explorer, if it has one + const defaultBlockExplorerUrlIndex = + blockExplorerUrls.length === 0 + ? undefined + : Math.max( + blockExplorerUrls.findIndex( + (url) => + isObject(tieBreaker?.rpcPrefs) && + url === tieBreaker.rpcPrefs.blockExplorerUrl, + ), + // Or arbitrarily default to the first url + 0, + ); + + // Use the cononical network name and currency, if we have constants for them. + // Otherwise prefer the tie breaker's name + currency, if it defines them. + // Otherwise fall back to the name + currency from arbitrary networks that define them. + const name = + NETWORK_TO_NAME_MAP[chainId as keyof typeof NETWORK_TO_NAME_MAP] ?? + tieBreaker?.nickname ?? + networks.find((n) => n.nickname)?.nickname; + + const nativeCurrency = + CHAIN_ID_TO_CURRENCY_SYMBOL_MAP[ + chainId as keyof typeof CHAIN_ID_TO_CURRENCY_SYMBOL_MAP + ] ?? + tieBreaker?.ticker ?? + networks.find((n) => n.ticker)?.ticker; + + acc[chainId] = { + chainId, + rpcEndpoints, + defaultRpcEndpointIndex, + blockExplorerUrls, + ...(defaultBlockExplorerUrlIndex !== undefined && { + defaultBlockExplorerUrlIndex, + }), + name, + nativeCurrency, + }; + return acc; + }, {}); + + // Given a network client id, returns the chain id it used to point to + const networkClientIdToChainId = (networkClientId: unknown) => { + const networkConfiguration = networkConfigurations.find( + (n) => isObject(n) && n.id === networkClientId, + ); + + return isObject(networkConfiguration) && + typeof networkConfiguration?.chainId === 'string' + ? networkConfiguration?.chainId + : undefined; + }; + + // Ensure that selectedNetworkClientId points to + // some endpoint of some network configuration. + let selectedNetworkClientId = Object.values(networkConfigurationsByChainId) + .flatMap((n) => + isObject(n) && Array.isArray(n.rpcEndpoints) ? n.rpcEndpoints : [], + ) + .find( + (e) => e.networkClientId === networkState.selectedNetworkClientId, + )?.networkClientId; + + // It may not, if it's endpoint was not well formed. + if (!selectedNetworkClientId) { + // + // In that case, try to fallback to the default endpoint for the same chain + const chainId = networkClientIdToChainId( + networkState.selectedNetworkClientId, + ); + + // Or mainnet, if the entire chain had to be omitted due to invalid URLs + const networkConfiguration = + networkConfigurationsByChainId[chainId ?? '0x1']; + + selectedNetworkClientId = + isObject(networkConfiguration) && + Array.isArray(networkConfiguration.rpcEndpoints) && + typeof networkConfiguration.defaultRpcEndpointIndex === 'number' + ? networkConfiguration.rpcEndpoints[ + networkConfiguration.defaultRpcEndpointIndex + ].networkClientId + : 'mainnet'; + } + + // Redirect domains in the selected network controller to + // point to the default RPC endpoint for the corresponding chain + if ( + hasProperty(state, 'SelectedNetworkController') && + isObject(state.SelectedNetworkController) && + hasProperty(state.SelectedNetworkController, 'domains') && + isObject(state.SelectedNetworkController.domains) + ) { + for (const [domain, networkClientId] of Object.entries( + state.SelectedNetworkController.domains, + )) { + let newNetworkClientId; + + // Fetch the chain id associated with the domain's network client + const chainId = networkClientIdToChainId(networkClientId); + + if (chainId) { + // Fetch the default rpc endpoint associated with that chain id + const networkConfiguration = networkConfigurationsByChainId[chainId]; + if ( + isObject(networkConfiguration) && + Array.isArray(networkConfiguration.rpcEndpoints) && + typeof networkConfiguration.defaultRpcEndpointIndex === 'number' + ) { + newNetworkClientId = + networkConfiguration.rpcEndpoints[ + networkConfiguration.defaultRpcEndpointIndex + ].networkClientId; + } + } + + // Point the domain to the chain's default rpc endpoint, or remove the + // entry if the whole chain had to be deleted due to duplicates/invalidity. + if (newNetworkClientId) { + state.SelectedNetworkController.domains[domain] = newNetworkClientId; + } else { + delete state.SelectedNetworkController.domains[domain]; + } + } + } + + state.NetworkController = { + selectedNetworkClientId, + networkConfigurationsByChainId, + networksMetadata: networkState.networksMetadata ?? {}, + }; + + // Set `showMultiRpcModal` based on whether there are any networks with multiple rpc endpoints + if ( + hasProperty(state, 'PreferencesController') && + isObject(state.PreferencesController) && + hasProperty(state.PreferencesController, 'preferences') && + isObject(state.PreferencesController.preferences) + ) { + state.PreferencesController.preferences.showMultiRpcModal = Object.values( + networkConfigurationsByChainId, + ).some( + (networkConfiguration) => + isObject(networkConfiguration) && + Array.isArray(networkConfiguration.rpcEndpoints) && + networkConfiguration.rpcEndpoints.length > 1, + ); + } + + // Migrate the user's drag + drop preference order for the network menu + if ( + hasProperty(state, 'NetworkOrderController') && + isObject(state.NetworkOrderController) && + Array.isArray(state.NetworkOrderController.orderedNetworkList) + ) { + // Dedupe the list by chain id, and remove `networkRpcUrl` + // since it's no longer needed to distinguish networks + state.NetworkOrderController.orderedNetworkList = [ + ...new Set( + state.NetworkOrderController.orderedNetworkList.map( + (network) => network.networkId, + ), + ), + ].map((networkId) => ({ networkId })); + } + + return state; +} + +// Matches network controller validation +function isValidUrl(url: string) { + const uri = URI.parse(url); + return ( + uri.error === undefined && (uri.scheme === 'http' || uri.scheme === 'https') + ); +} diff --git a/app/scripts/migrations/index.js b/app/scripts/migrations/index.js index e5cfb6218019..80407ecf232e 100644 --- a/app/scripts/migrations/index.js +++ b/app/scripts/migrations/index.js @@ -146,6 +146,7 @@ const migrations = [ require('./125'), require('./125.1'), require('./126'), + require('./127'), ]; export default migrations; diff --git a/builds.yml b/builds.yml index 89d41923540c..acee49063822 100644 --- a/builds.yml +++ b/builds.yml @@ -268,8 +268,6 @@ env: - CHAIN_PERMISSIONS: '' # Enables use of test gas fee flow to debug gas fee estimation - TEST_GAS_FEE_FLOWS: false - # Determines if feature flagged network ui new design - - ENABLE_NETWORK_UI_REDESIGN: '' # Temporary mechanism to enable security alerts API prior to release - SECURITY_ALERTS_API_ENABLED: '' # URL of security alerts API used to validate dApp requests diff --git a/lavamoat/browserify/beta/policy.json b/lavamoat/browserify/beta/policy.json index 0e13938c6111..86253b3fa63c 100644 --- a/lavamoat/browserify/beta/policy.json +++ b/lavamoat/browserify/beta/policy.json @@ -1539,33 +1539,55 @@ }, "@metamask/network-controller": { "globals": { - "URL": true, "btoa": true, "fetch": true, "setTimeout": true }, "packages": { + "@metamask/base-controller": true, "@metamask/controller-utils": true, "@metamask/eth-query": true, - "@metamask/eth-token-tracker>@metamask/eth-block-tracker": true, - "@metamask/network-controller>@metamask/base-controller": true, + "@metamask/network-controller>@metamask/eth-block-tracker": true, "@metamask/network-controller>@metamask/eth-json-rpc-infura": true, "@metamask/network-controller>@metamask/eth-json-rpc-middleware": true, "@metamask/network-controller>@metamask/eth-json-rpc-provider": true, "@metamask/network-controller>@metamask/swappable-obj-proxy": true, + "@metamask/network-controller>reselect": true, "@metamask/rpc-errors": true, "@metamask/snaps-controllers>@metamask/json-rpc-engine": true, "@metamask/utils": true, "browserify>assert": true, + "browserify>util": true, + "uri-js": true, "uuid": true } }, - "@metamask/network-controller>@metamask/base-controller": { + "@metamask/network-controller>@metamask/eth-block-tracker": { "globals": { + "clearTimeout": true, + "console.error": true, "setTimeout": true }, "packages": { - "immer": true + "@metamask/eth-query>json-rpc-random-id": true, + "@metamask/network-controller>@metamask/eth-block-tracker>@metamask/utils": true, + "@metamask/safe-event-emitter": true, + "pify": true + } + }, + "@metamask/network-controller>@metamask/eth-block-tracker>@metamask/utils": { + "globals": { + "TextDecoder": true, + "TextEncoder": true + }, + "packages": { + "@metamask/utils>@metamask/superstruct": true, + "@metamask/utils>@scure/base": true, + "@metamask/utils>pony-cause": true, + "@noble/hashes": true, + "browserify>buffer": true, + "nock>debug": true, + "semver": true } }, "@metamask/network-controller>@metamask/eth-json-rpc-infura": { @@ -1618,19 +1640,13 @@ "@metamask/eth-json-rpc-middleware>klona": true, "@metamask/eth-json-rpc-middleware>safe-stable-stringify": true, "@metamask/eth-sig-util": true, - "@metamask/network-controller>@metamask/eth-json-rpc-middleware>@metamask/json-rpc-engine": true, "@metamask/network-controller>@metamask/eth-json-rpc-middleware>@metamask/utils": true, "@metamask/rpc-errors": true, + "@metamask/snaps-controllers>@metamask/json-rpc-engine": true, + "bn.js": true, "pify": true } }, - "@metamask/network-controller>@metamask/eth-json-rpc-middleware>@metamask/json-rpc-engine": { - "packages": { - "@metamask/network-controller>@metamask/eth-json-rpc-middleware>@metamask/utils": true, - "@metamask/rpc-errors": true, - "@metamask/safe-event-emitter": true - } - }, "@metamask/network-controller>@metamask/eth-json-rpc-middleware>@metamask/utils": { "globals": { "TextDecoder": true, @@ -1654,6 +1670,13 @@ "uuid": true } }, + "@metamask/network-controller>reselect": { + "globals": { + "WeakRef": true, + "console.warn": true, + "unstable_autotrackMemoize": true + } + }, "@metamask/notification-controller": { "packages": { "@metamask/notification-controller>@metamask/base-controller": true, @@ -2213,16 +2236,8 @@ }, "@metamask/selected-network-controller": { "packages": { - "@metamask/network-controller>@metamask/swappable-obj-proxy": true, - "@metamask/selected-network-controller>@metamask/base-controller": true - } - }, - "@metamask/selected-network-controller>@metamask/base-controller": { - "globals": { - "setTimeout": true - }, - "packages": { - "immer": true + "@metamask/base-controller": true, + "@metamask/network-controller>@metamask/swappable-obj-proxy": true } }, "@metamask/signature-controller": { @@ -5469,6 +5484,11 @@ "browserify>buffer": true } }, + "uri-js": { + "globals": { + "define": true + } + }, "uuid": { "globals": { "crypto": true, diff --git a/lavamoat/browserify/flask/policy.json b/lavamoat/browserify/flask/policy.json index 0e13938c6111..86253b3fa63c 100644 --- a/lavamoat/browserify/flask/policy.json +++ b/lavamoat/browserify/flask/policy.json @@ -1539,33 +1539,55 @@ }, "@metamask/network-controller": { "globals": { - "URL": true, "btoa": true, "fetch": true, "setTimeout": true }, "packages": { + "@metamask/base-controller": true, "@metamask/controller-utils": true, "@metamask/eth-query": true, - "@metamask/eth-token-tracker>@metamask/eth-block-tracker": true, - "@metamask/network-controller>@metamask/base-controller": true, + "@metamask/network-controller>@metamask/eth-block-tracker": true, "@metamask/network-controller>@metamask/eth-json-rpc-infura": true, "@metamask/network-controller>@metamask/eth-json-rpc-middleware": true, "@metamask/network-controller>@metamask/eth-json-rpc-provider": true, "@metamask/network-controller>@metamask/swappable-obj-proxy": true, + "@metamask/network-controller>reselect": true, "@metamask/rpc-errors": true, "@metamask/snaps-controllers>@metamask/json-rpc-engine": true, "@metamask/utils": true, "browserify>assert": true, + "browserify>util": true, + "uri-js": true, "uuid": true } }, - "@metamask/network-controller>@metamask/base-controller": { + "@metamask/network-controller>@metamask/eth-block-tracker": { "globals": { + "clearTimeout": true, + "console.error": true, "setTimeout": true }, "packages": { - "immer": true + "@metamask/eth-query>json-rpc-random-id": true, + "@metamask/network-controller>@metamask/eth-block-tracker>@metamask/utils": true, + "@metamask/safe-event-emitter": true, + "pify": true + } + }, + "@metamask/network-controller>@metamask/eth-block-tracker>@metamask/utils": { + "globals": { + "TextDecoder": true, + "TextEncoder": true + }, + "packages": { + "@metamask/utils>@metamask/superstruct": true, + "@metamask/utils>@scure/base": true, + "@metamask/utils>pony-cause": true, + "@noble/hashes": true, + "browserify>buffer": true, + "nock>debug": true, + "semver": true } }, "@metamask/network-controller>@metamask/eth-json-rpc-infura": { @@ -1618,19 +1640,13 @@ "@metamask/eth-json-rpc-middleware>klona": true, "@metamask/eth-json-rpc-middleware>safe-stable-stringify": true, "@metamask/eth-sig-util": true, - "@metamask/network-controller>@metamask/eth-json-rpc-middleware>@metamask/json-rpc-engine": true, "@metamask/network-controller>@metamask/eth-json-rpc-middleware>@metamask/utils": true, "@metamask/rpc-errors": true, + "@metamask/snaps-controllers>@metamask/json-rpc-engine": true, + "bn.js": true, "pify": true } }, - "@metamask/network-controller>@metamask/eth-json-rpc-middleware>@metamask/json-rpc-engine": { - "packages": { - "@metamask/network-controller>@metamask/eth-json-rpc-middleware>@metamask/utils": true, - "@metamask/rpc-errors": true, - "@metamask/safe-event-emitter": true - } - }, "@metamask/network-controller>@metamask/eth-json-rpc-middleware>@metamask/utils": { "globals": { "TextDecoder": true, @@ -1654,6 +1670,13 @@ "uuid": true } }, + "@metamask/network-controller>reselect": { + "globals": { + "WeakRef": true, + "console.warn": true, + "unstable_autotrackMemoize": true + } + }, "@metamask/notification-controller": { "packages": { "@metamask/notification-controller>@metamask/base-controller": true, @@ -2213,16 +2236,8 @@ }, "@metamask/selected-network-controller": { "packages": { - "@metamask/network-controller>@metamask/swappable-obj-proxy": true, - "@metamask/selected-network-controller>@metamask/base-controller": true - } - }, - "@metamask/selected-network-controller>@metamask/base-controller": { - "globals": { - "setTimeout": true - }, - "packages": { - "immer": true + "@metamask/base-controller": true, + "@metamask/network-controller>@metamask/swappable-obj-proxy": true } }, "@metamask/signature-controller": { @@ -5469,6 +5484,11 @@ "browserify>buffer": true } }, + "uri-js": { + "globals": { + "define": true + } + }, "uuid": { "globals": { "crypto": true, diff --git a/lavamoat/browserify/main/policy.json b/lavamoat/browserify/main/policy.json index 0e13938c6111..86253b3fa63c 100644 --- a/lavamoat/browserify/main/policy.json +++ b/lavamoat/browserify/main/policy.json @@ -1539,33 +1539,55 @@ }, "@metamask/network-controller": { "globals": { - "URL": true, "btoa": true, "fetch": true, "setTimeout": true }, "packages": { + "@metamask/base-controller": true, "@metamask/controller-utils": true, "@metamask/eth-query": true, - "@metamask/eth-token-tracker>@metamask/eth-block-tracker": true, - "@metamask/network-controller>@metamask/base-controller": true, + "@metamask/network-controller>@metamask/eth-block-tracker": true, "@metamask/network-controller>@metamask/eth-json-rpc-infura": true, "@metamask/network-controller>@metamask/eth-json-rpc-middleware": true, "@metamask/network-controller>@metamask/eth-json-rpc-provider": true, "@metamask/network-controller>@metamask/swappable-obj-proxy": true, + "@metamask/network-controller>reselect": true, "@metamask/rpc-errors": true, "@metamask/snaps-controllers>@metamask/json-rpc-engine": true, "@metamask/utils": true, "browserify>assert": true, + "browserify>util": true, + "uri-js": true, "uuid": true } }, - "@metamask/network-controller>@metamask/base-controller": { + "@metamask/network-controller>@metamask/eth-block-tracker": { "globals": { + "clearTimeout": true, + "console.error": true, "setTimeout": true }, "packages": { - "immer": true + "@metamask/eth-query>json-rpc-random-id": true, + "@metamask/network-controller>@metamask/eth-block-tracker>@metamask/utils": true, + "@metamask/safe-event-emitter": true, + "pify": true + } + }, + "@metamask/network-controller>@metamask/eth-block-tracker>@metamask/utils": { + "globals": { + "TextDecoder": true, + "TextEncoder": true + }, + "packages": { + "@metamask/utils>@metamask/superstruct": true, + "@metamask/utils>@scure/base": true, + "@metamask/utils>pony-cause": true, + "@noble/hashes": true, + "browserify>buffer": true, + "nock>debug": true, + "semver": true } }, "@metamask/network-controller>@metamask/eth-json-rpc-infura": { @@ -1618,19 +1640,13 @@ "@metamask/eth-json-rpc-middleware>klona": true, "@metamask/eth-json-rpc-middleware>safe-stable-stringify": true, "@metamask/eth-sig-util": true, - "@metamask/network-controller>@metamask/eth-json-rpc-middleware>@metamask/json-rpc-engine": true, "@metamask/network-controller>@metamask/eth-json-rpc-middleware>@metamask/utils": true, "@metamask/rpc-errors": true, + "@metamask/snaps-controllers>@metamask/json-rpc-engine": true, + "bn.js": true, "pify": true } }, - "@metamask/network-controller>@metamask/eth-json-rpc-middleware>@metamask/json-rpc-engine": { - "packages": { - "@metamask/network-controller>@metamask/eth-json-rpc-middleware>@metamask/utils": true, - "@metamask/rpc-errors": true, - "@metamask/safe-event-emitter": true - } - }, "@metamask/network-controller>@metamask/eth-json-rpc-middleware>@metamask/utils": { "globals": { "TextDecoder": true, @@ -1654,6 +1670,13 @@ "uuid": true } }, + "@metamask/network-controller>reselect": { + "globals": { + "WeakRef": true, + "console.warn": true, + "unstable_autotrackMemoize": true + } + }, "@metamask/notification-controller": { "packages": { "@metamask/notification-controller>@metamask/base-controller": true, @@ -2213,16 +2236,8 @@ }, "@metamask/selected-network-controller": { "packages": { - "@metamask/network-controller>@metamask/swappable-obj-proxy": true, - "@metamask/selected-network-controller>@metamask/base-controller": true - } - }, - "@metamask/selected-network-controller>@metamask/base-controller": { - "globals": { - "setTimeout": true - }, - "packages": { - "immer": true + "@metamask/base-controller": true, + "@metamask/network-controller>@metamask/swappable-obj-proxy": true } }, "@metamask/signature-controller": { @@ -5469,6 +5484,11 @@ "browserify>buffer": true } }, + "uri-js": { + "globals": { + "define": true + } + }, "uuid": { "globals": { "crypto": true, diff --git a/lavamoat/browserify/mmi/policy.json b/lavamoat/browserify/mmi/policy.json index e5913a27f248..032906bee80b 100644 --- a/lavamoat/browserify/mmi/policy.json +++ b/lavamoat/browserify/mmi/policy.json @@ -1631,33 +1631,55 @@ }, "@metamask/network-controller": { "globals": { - "URL": true, "btoa": true, "fetch": true, "setTimeout": true }, "packages": { + "@metamask/base-controller": true, "@metamask/controller-utils": true, "@metamask/eth-query": true, - "@metamask/eth-token-tracker>@metamask/eth-block-tracker": true, - "@metamask/network-controller>@metamask/base-controller": true, + "@metamask/network-controller>@metamask/eth-block-tracker": true, "@metamask/network-controller>@metamask/eth-json-rpc-infura": true, "@metamask/network-controller>@metamask/eth-json-rpc-middleware": true, "@metamask/network-controller>@metamask/eth-json-rpc-provider": true, "@metamask/network-controller>@metamask/swappable-obj-proxy": true, + "@metamask/network-controller>reselect": true, "@metamask/rpc-errors": true, "@metamask/snaps-controllers>@metamask/json-rpc-engine": true, "@metamask/utils": true, "browserify>assert": true, + "browserify>util": true, + "uri-js": true, "uuid": true } }, - "@metamask/network-controller>@metamask/base-controller": { + "@metamask/network-controller>@metamask/eth-block-tracker": { "globals": { + "clearTimeout": true, + "console.error": true, "setTimeout": true }, "packages": { - "immer": true + "@metamask/eth-query>json-rpc-random-id": true, + "@metamask/network-controller>@metamask/eth-block-tracker>@metamask/utils": true, + "@metamask/safe-event-emitter": true, + "pify": true + } + }, + "@metamask/network-controller>@metamask/eth-block-tracker>@metamask/utils": { + "globals": { + "TextDecoder": true, + "TextEncoder": true + }, + "packages": { + "@metamask/utils>@metamask/superstruct": true, + "@metamask/utils>@scure/base": true, + "@metamask/utils>pony-cause": true, + "@noble/hashes": true, + "browserify>buffer": true, + "nock>debug": true, + "semver": true } }, "@metamask/network-controller>@metamask/eth-json-rpc-infura": { @@ -1710,19 +1732,13 @@ "@metamask/eth-json-rpc-middleware>klona": true, "@metamask/eth-json-rpc-middleware>safe-stable-stringify": true, "@metamask/eth-sig-util": true, - "@metamask/network-controller>@metamask/eth-json-rpc-middleware>@metamask/json-rpc-engine": true, "@metamask/network-controller>@metamask/eth-json-rpc-middleware>@metamask/utils": true, "@metamask/rpc-errors": true, + "@metamask/snaps-controllers>@metamask/json-rpc-engine": true, + "bn.js": true, "pify": true } }, - "@metamask/network-controller>@metamask/eth-json-rpc-middleware>@metamask/json-rpc-engine": { - "packages": { - "@metamask/network-controller>@metamask/eth-json-rpc-middleware>@metamask/utils": true, - "@metamask/rpc-errors": true, - "@metamask/safe-event-emitter": true - } - }, "@metamask/network-controller>@metamask/eth-json-rpc-middleware>@metamask/utils": { "globals": { "TextDecoder": true, @@ -1746,6 +1762,13 @@ "uuid": true } }, + "@metamask/network-controller>reselect": { + "globals": { + "WeakRef": true, + "console.warn": true, + "unstable_autotrackMemoize": true + } + }, "@metamask/notification-controller": { "packages": { "@metamask/notification-controller>@metamask/base-controller": true, @@ -2305,16 +2328,8 @@ }, "@metamask/selected-network-controller": { "packages": { - "@metamask/network-controller>@metamask/swappable-obj-proxy": true, - "@metamask/selected-network-controller>@metamask/base-controller": true - } - }, - "@metamask/selected-network-controller>@metamask/base-controller": { - "globals": { - "setTimeout": true - }, - "packages": { - "immer": true + "@metamask/base-controller": true, + "@metamask/network-controller>@metamask/swappable-obj-proxy": true } }, "@metamask/signature-controller": { @@ -5537,6 +5552,11 @@ "browserify>buffer": true } }, + "uri-js": { + "globals": { + "define": true + } + }, "uuid": { "globals": { "crypto": true, diff --git a/lavamoat/build-system/policy.json b/lavamoat/build-system/policy.json index f4927e63f48c..9bb4675d14c9 100644 --- a/lavamoat/build-system/policy.json +++ b/lavamoat/build-system/policy.json @@ -3115,8 +3115,8 @@ "packages": { "@metamask/snaps-utils>fast-json-stable-stringify": true, "eslint>@eslint/eslintrc>ajv>json-schema-traverse": true, - "eslint>ajv>uri-js": true, - "eslint>fast-deep-equal": true + "eslint>fast-deep-equal": true, + "uri-js": true } }, "eslint>@eslint/eslintrc>import-fresh": { @@ -3212,13 +3212,8 @@ "packages": { "@metamask/snaps-utils>fast-json-stable-stringify": true, "eslint>ajv>json-schema-traverse": true, - "eslint>ajv>uri-js": true, - "eslint>fast-deep-equal": true - } - }, - "eslint>ajv>uri-js": { - "globals": { - "define": true + "eslint>fast-deep-equal": true, + "uri-js": true } }, "eslint>doctrine": { @@ -8926,6 +8921,11 @@ "terser>source-map-support": true } }, + "uri-js": { + "globals": { + "define": true + } + }, "vinyl": { "builtin": { "buffer.Buffer.isBuffer": true, diff --git a/package.json b/package.json index a4cbaf938aec..c6889c6fec0e 100644 --- a/package.json +++ b/package.json @@ -257,13 +257,14 @@ "sucrase@npm:3.34.0": "^3.35.0", "@expo/config/glob": "^10.3.10", "@expo/config-plugins/glob": "^10.3.10", - "@metamask/network-controller": "patch:@metamask/network-controller@npm%3A20.2.0#~/.yarn/patches/@metamask-network-controller-npm-20.2.0-98b1a5ae59.patch", "@solana/web3.js/rpc-websockets": "^8.0.1", "@metamask/message-manager": "^10.1.0", - "@metamask/network-controller@npm:^19.0.0": "patch:@metamask/network-controller@npm%3A20.2.0#~/.yarn/patches/@metamask-network-controller-npm-20.2.0-98b1a5ae59.patch", "@metamask/gas-fee-controller@npm:^15.1.1": "patch:@metamask/gas-fee-controller@npm%3A15.1.2#~/.yarn/patches/@metamask-gas-fee-controller-npm-15.1.2-db4d2976aa.patch", "@metamask/nonce-tracker@npm:^5.0.0": "patch:@metamask/nonce-tracker@npm%3A5.0.0#~/.yarn/patches/@metamask-nonce-tracker-npm-5.0.0-d81478218e.patch", "@trezor/connect-web@npm:^9.1.11": "patch:@trezor/connect-web@npm%3A9.3.0#~/.yarn/patches/@trezor-connect-web-npm-9.3.0-040ab10d9a.patch", + "@metamask/network-controller@npm:^17.0.0": "patch:@metamask/network-controller@npm%3A21.0.0#~/.yarn/patches/@metamask-network-controller-npm-21.0.0-559aa8e395.patch", + "@metamask/network-controller@npm:^19.0.0": "patch:@metamask/network-controller@npm%3A21.0.0#~/.yarn/patches/@metamask-network-controller-npm-21.0.0-559aa8e395.patch", + "@metamask/network-controller@npm:^20.0.0": "patch:@metamask/network-controller@npm%3A21.0.0#~/.yarn/patches/@metamask-network-controller-npm-21.0.0-559aa8e395.patch", "path-to-regexp": "1.9.0" }, "dependencies": { @@ -331,7 +332,7 @@ "@metamask/message-signing-snap": "^0.3.3", "@metamask/metamask-eth-abis": "^3.1.1", "@metamask/name-controller": "^8.0.0", - "@metamask/network-controller": "patch:@metamask/network-controller@npm%3A20.2.0#~/.yarn/patches/@metamask-network-controller-npm-20.2.0-98b1a5ae59.patch", + "@metamask/network-controller": "patch:@metamask/network-controller@npm%3A21.0.0#~/.yarn/patches/@metamask-network-controller-npm-21.0.0-559aa8e395.patch", "@metamask/notification-controller": "^6.0.0", "@metamask/notification-services-controller": "^0.7.0", "@metamask/object-multiplex": "^2.0.0", @@ -348,7 +349,7 @@ "@metamask/rpc-errors": "^6.2.1", "@metamask/safe-event-emitter": "^3.1.1", "@metamask/scure-bip39": "^2.0.3", - "@metamask/selected-network-controller": "^15.0.2", + "@metamask/selected-network-controller": "^18.0.1", "@metamask/signature-controller": "^19.0.0", "@metamask/smart-transactions-controller": "^13.0.0", "@metamask/snaps-controllers": "^9.7.0", @@ -438,6 +439,7 @@ "single-call-balance-checker-abi": "^1.0.0", "ts-mixer": "patch:ts-mixer@npm%3A6.0.4#~/.yarn/patches/ts-mixer-npm-6.0.4-5d9747bdf5.patch", "unicode-confusables": "^0.1.1", + "uri-js": "^4.4.1", "uuid": "^8.3.2", "web3-stream-provider": "^5.0.0", "zxcvbn": "^4.4.2" diff --git a/shared/constants/network.test.ts b/shared/constants/network.test.ts index ac427914fbaa..20a13ccfb273 100644 --- a/shared/constants/network.test.ts +++ b/shared/constants/network.test.ts @@ -30,7 +30,7 @@ describe('NetworkConstants', () => { const expectedChainIds: { [key: string]: string } = { 'Arbitrum One': CHAIN_IDS.ARBITRUM, 'Avalanche Network C-Chain': CHAIN_IDS.AVALANCHE, - 'BNB Chain': CHAIN_IDS.BSC, + 'Binance Smart Chain': CHAIN_IDS.BSC, 'OP Mainnet': CHAIN_IDS.OPTIMISM, 'Polygon Mainnet': CHAIN_IDS.POLYGON, 'zkSync Era Mainnet': CHAIN_IDS.ZKSYNC_ERA, @@ -38,57 +38,59 @@ describe('NetworkConstants', () => { }; FEATURED_RPCS.forEach((rpc) => { - expect(rpc.chainId).toBe(expectedChainIds[rpc.nickname]); + expect(rpc.chainId).toBe(expectedChainIds[rpc.name]); }); }); }); describe('FEATURED_RPCS Infura Usage Tests', () => { it('arbitrum entry should use Infura', () => { - const arbitrumRpc = FEATURED_RPCS.find( + const [arbitrumRpc] = FEATURED_RPCS.filter( (rpc) => rpc.chainId === CHAIN_IDS.ARBITRUM, ); - expect(arbitrumRpc?.rpcUrl).toContain('infura.io'); + expect(arbitrumRpc.rpcEndpoints[0].url).toContain('infura.io'); }); it('avalanche entry should use Infura', () => { - const avalancheRpc = FEATURED_RPCS.find( + const [avalancheRpc] = FEATURED_RPCS.filter( (rpc) => rpc.chainId === CHAIN_IDS.AVALANCHE, ); - expect(avalancheRpc?.rpcUrl).toContain('infura.io'); + expect(avalancheRpc.rpcEndpoints[0].url).toContain('infura.io'); }); it('bsc entry should not use Infura', () => { - const bscRpc = FEATURED_RPCS.find((rpc) => rpc.chainId === CHAIN_IDS.BSC); - expect(bscRpc?.rpcUrl).not.toContain('infura.io'); + const [bscRpc] = FEATURED_RPCS.filter( + (rpc) => rpc.chainId === CHAIN_IDS.BSC, + ); + expect(bscRpc.rpcEndpoints[0].url).not.toContain('infura.io'); }); it('optimism entry should use Infura', () => { - const optimismRpc = FEATURED_RPCS.find( + const [optimismRpc] = FEATURED_RPCS.filter( (rpc) => rpc.chainId === CHAIN_IDS.OPTIMISM, ); - expect(optimismRpc?.rpcUrl).toContain('infura.io'); + expect(optimismRpc.rpcEndpoints[0].url).toContain('infura.io'); }); it('polygon entry should use Infura', () => { - const polygonRpc = FEATURED_RPCS.find( + const [polygonRpc] = FEATURED_RPCS.filter( (rpc) => rpc.chainId === CHAIN_IDS.POLYGON, ); - expect(polygonRpc?.rpcUrl).toContain('infura.io'); + expect(polygonRpc.rpcEndpoints[0].url).toContain('infura.io'); }); it('zkSync Era entry should not use Infura', () => { - const zksyncEraRpc = FEATURED_RPCS.find( + const [zksyncEraRpc] = FEATURED_RPCS.filter( (rpc) => rpc.chainId === CHAIN_IDS.ZKSYNC_ERA, ); - expect(zksyncEraRpc?.rpcUrl).not.toContain('infura.io'); + expect(zksyncEraRpc.rpcEndpoints[0].url).not.toContain('infura.io'); }); it('base entry should not use Infura', () => { - const baseRpc = FEATURED_RPCS.find( + const [baseRpc] = FEATURED_RPCS.filter( (rpc) => rpc.chainId === CHAIN_IDS.BASE, ); - expect(baseRpc?.rpcUrl).not.toContain('infura.io'); + expect(baseRpc.rpcEndpoints[0].url).not.toContain('infura.io'); }); }); }); diff --git a/shared/constants/network.ts b/shared/constants/network.ts index 641e310517cb..b79c4a27d8cd 100644 --- a/shared/constants/network.ts +++ b/shared/constants/network.ts @@ -1,3 +1,7 @@ +import { + AddNetworkFields, + RpcEndpointType, +} from '@metamask/network-controller'; import { capitalize, pick } from 'lodash'; /** * A type representing built-in network types, used as an identifier. @@ -724,6 +728,7 @@ export const CHAIN_ID_TO_NETWORK_IMAGE_URL_MAP = { [CHAIN_IDS.PALM]: PALM_TOKEN_IMAGE_URL, [CHAIN_IDS.CELO]: CELO_TOKEN_IMAGE_URL, [CHAIN_IDS.GNOSIS]: GNOSIS_TOKEN_IMAGE_URL, + [CHAIN_IDS.ZKSYNC_ERA]: ZK_SYNC_ERA_TOKEN_IMAGE_URL, [CHAIN_IDS.NEAR]: NEAR_IMAGE_URL, [CHAIN_IDS.NEAR_TESTNET]: NEAR_IMAGE_URL, [CHAINLIST_CHAIN_IDS_MAP.ACALA_NETWORK]: ACALA_TOKEN_IMAGE_URL, @@ -923,76 +928,104 @@ export const UNSUPPORTED_RPC_METHODS = new Set([ export const IPFS_DEFAULT_GATEWAY_URL = 'dweb.link'; -export const FEATURED_RPCS: RPCDefinition[] = [ +export const FEATURED_RPCS: AddNetworkFields[] = [ { chainId: CHAIN_IDS.ARBITRUM, - nickname: ARBITRUM_DISPLAY_NAME, - rpcUrl: `https://arbitrum-mainnet.infura.io/v3/${infuraProjectId}`, - ticker: CURRENCY_SYMBOLS.ARBITRUM, - rpcPrefs: { - blockExplorerUrl: 'https://explorer.arbitrum.io', - imageUrl: AETH_TOKEN_IMAGE_URL, - }, + name: ARBITRUM_DISPLAY_NAME, + nativeCurrency: CURRENCY_SYMBOLS.ARBITRUM, + rpcEndpoints: [ + { + url: `https://arbitrum-mainnet.infura.io/v3/${infuraProjectId}`, + type: RpcEndpointType.Custom, + }, + ], + defaultRpcEndpointIndex: 0, + blockExplorerUrls: ['https://explorer.arbitrum.io'], + defaultBlockExplorerUrlIndex: 0, }, { chainId: CHAIN_IDS.AVALANCHE, - nickname: AVALANCHE_DISPLAY_NAME, - rpcUrl: `https://avalanche-mainnet.infura.io/v3/${infuraProjectId}`, - ticker: CURRENCY_SYMBOLS.AVALANCHE, - rpcPrefs: { - blockExplorerUrl: 'https://snowtrace.io/', - imageUrl: AVAX_TOKEN_IMAGE_URL, - }, + name: AVALANCHE_DISPLAY_NAME, + nativeCurrency: CURRENCY_SYMBOLS.AVALANCHE, + rpcEndpoints: [ + { + url: `https://avalanche-mainnet.infura.io/v3/${infuraProjectId}`, + type: RpcEndpointType.Custom, + }, + ], + defaultRpcEndpointIndex: 0, + blockExplorerUrls: ['https://snowtrace.io/'], + defaultBlockExplorerUrlIndex: 0, }, { chainId: CHAIN_IDS.BSC, - nickname: BNB_DISPLAY_NAME, - rpcUrl: 'https://bsc-dataseed.binance.org/', - ticker: CURRENCY_SYMBOLS.BNB, - rpcPrefs: { - blockExplorerUrl: 'https://bscscan.com/', - imageUrl: BNB_TOKEN_IMAGE_URL, - }, + name: BSC_DISPLAY_NAME, + nativeCurrency: CURRENCY_SYMBOLS.BNB, + rpcEndpoints: [ + { + url: 'https://bsc-dataseed.binance.org/', + type: RpcEndpointType.Custom, + }, + ], + defaultRpcEndpointIndex: 0, + blockExplorerUrls: ['https://bscscan.com/'], + defaultBlockExplorerUrlIndex: 0, }, { chainId: CHAIN_IDS.OPTIMISM, - nickname: OPTIMISM_DISPLAY_NAME, - rpcUrl: `https://optimism-mainnet.infura.io/v3/${infuraProjectId}`, - ticker: CURRENCY_SYMBOLS.ETH, - rpcPrefs: { - blockExplorerUrl: 'https://optimistic.etherscan.io/', - imageUrl: OPTIMISM_TOKEN_IMAGE_URL, - }, + name: OPTIMISM_DISPLAY_NAME, + nativeCurrency: CURRENCY_SYMBOLS.ETH, + rpcEndpoints: [ + { + url: `https://optimism-mainnet.infura.io/v3/${infuraProjectId}`, + type: RpcEndpointType.Custom, + }, + ], + defaultRpcEndpointIndex: 0, + blockExplorerUrls: ['https://optimistic.etherscan.io/'], + defaultBlockExplorerUrlIndex: 0, }, { chainId: CHAIN_IDS.POLYGON, - nickname: `${POLYGON_DISPLAY_NAME} ${capitalize(NETWORK_TYPES.MAINNET)}`, - rpcUrl: `https://polygon-mainnet.infura.io/v3/${infuraProjectId}`, - ticker: CURRENCY_SYMBOLS.POL, - rpcPrefs: { - blockExplorerUrl: 'https://polygonscan.com/', - imageUrl: POL_TOKEN_IMAGE_URL, - }, + name: `${POLYGON_DISPLAY_NAME} ${capitalize(NETWORK_TYPES.MAINNET)}`, + nativeCurrency: CURRENCY_SYMBOLS.POL, + rpcEndpoints: [ + { + url: `https://polygon-mainnet.infura.io/v3/${infuraProjectId}`, + type: RpcEndpointType.Custom, + }, + ], + defaultRpcEndpointIndex: 0, + blockExplorerUrls: ['https://polygonscan.com/'], + defaultBlockExplorerUrlIndex: 0, }, { chainId: CHAIN_IDS.ZKSYNC_ERA, - nickname: ZK_SYNC_ERA_DISPLAY_NAME, - rpcUrl: `https://mainnet.era.zksync.io`, - ticker: CURRENCY_SYMBOLS.ETH, - rpcPrefs: { - blockExplorerUrl: 'https://explorer.zksync.io/', - imageUrl: ZK_SYNC_ERA_TOKEN_IMAGE_URL, - }, + name: ZK_SYNC_ERA_DISPLAY_NAME, + nativeCurrency: CURRENCY_SYMBOLS.ETH, + rpcEndpoints: [ + { + url: `https://mainnet.era.zksync.io`, + type: RpcEndpointType.Custom, + }, + ], + defaultRpcEndpointIndex: 0, + blockExplorerUrls: ['https://explorer.zksync.io/'], + defaultBlockExplorerUrlIndex: 0, }, { chainId: CHAIN_IDS.BASE, - nickname: BASE_DISPLAY_NAME, - rpcUrl: `https://mainnet.base.org`, - ticker: CURRENCY_SYMBOLS.ETH, - rpcPrefs: { - blockExplorerUrl: 'https://basescan.org', - imageUrl: BASE_TOKEN_IMAGE_URL, - }, + name: BASE_DISPLAY_NAME, + nativeCurrency: CURRENCY_SYMBOLS.ETH, + rpcEndpoints: [ + { + url: `https://mainnet.base.org`, + type: RpcEndpointType.Custom, + }, + ], + defaultRpcEndpointIndex: 0, + blockExplorerUrls: ['https://basescan.org'], + defaultBlockExplorerUrlIndex: 0, }, ]; diff --git a/shared/constants/swaps.ts b/shared/constants/swaps.ts index db58e82c4048..3868c7b6e2f0 100644 --- a/shared/constants/swaps.ts +++ b/shared/constants/swaps.ts @@ -175,14 +175,14 @@ export const GAS_API_BASE_URL = 'https://gas.api.cx.metamask.io'; export const GAS_DEV_API_BASE_URL = 'https://gas.uat-api.cx.metamask.io'; const BSC_DEFAULT_BLOCK_EXPLORER_URL = 'https://bscscan.com/'; -const MAINNET_DEFAULT_BLOCK_EXPLORER_URL = 'https://etherscan.io/'; +export const MAINNET_DEFAULT_BLOCK_EXPLORER_URL = 'https://etherscan.io/'; const GOERLI_DEFAULT_BLOCK_EXPLORER_URL = 'https://goerli.etherscan.io/'; const POLYGON_DEFAULT_BLOCK_EXPLORER_URL = 'https://polygonscan.com/'; const AVALANCHE_DEFAULT_BLOCK_EXPLORER_URL = 'https://snowtrace.io/'; const OPTIMISM_DEFAULT_BLOCK_EXPLORER_URL = 'https://optimistic.etherscan.io/'; const ARBITRUM_DEFAULT_BLOCK_EXPLORER_URL = 'https://arbiscan.io/'; const ZKSYNC_DEFAULT_BLOCK_EXPLORER_URL = 'https://explorer.zksync.io/'; -const LINEA_DEFAULT_BLOCK_EXPLORER_URL = 'https://lineascan.build/'; +export const LINEA_DEFAULT_BLOCK_EXPLORER_URL = 'https://lineascan.build/'; const BASE_DEFAULT_BLOCK_EXPLORER_URL = 'https://basescan.org/'; export const ALLOWED_PROD_SWAPS_CHAIN_IDS = [ diff --git a/shared/modules/selectors/smart-transactions.ts b/shared/modules/selectors/smart-transactions.ts index 81c480f94977..0de20511db49 100644 --- a/shared/modules/selectors/smart-transactions.ts +++ b/shared/modules/selectors/smart-transactions.ts @@ -1,4 +1,3 @@ -import type { Hex } from '@metamask/utils'; import { getAllowedSmartTransactionsChainIds, SKIP_STX_RPC_URL_CHECK_CHAIN_IDS, @@ -50,13 +49,6 @@ type SmartTransactionsMetaMaskState = { smartTransactionsState: { liveness: boolean; }; - selectedNetworkClientId: string; - networkConfigurations?: { - [key: string]: { - chainId: Hex; - rpcUrl: string; - }; - }; }; }; diff --git a/test/data/confirmations/helper.ts b/test/data/confirmations/helper.ts index 014734aba0aa..c542ee92feab 100644 --- a/test/data/confirmations/helper.ts +++ b/test/data/confirmations/helper.ts @@ -6,6 +6,7 @@ import { SignatureRequestType, } from '../../../ui/pages/confirmations/types/confirm'; import mockState from '../mock-state.json'; +import { CHAIN_IDS } from '../../../shared/constants/network'; import { genUnapprovedApproveConfirmation, genUnapprovedContractInteractionConfirmation, @@ -165,7 +166,7 @@ export const getMockContractInteractionConfirmState = ( args: RootState = { metamask: {} }, ) => { const contractInteraction = genUnapprovedContractInteractionConfirmation({ - chainId: mockState.metamask.networkConfigurations.goerli.chainId, + chainId: CHAIN_IDS.GOERLI, }); return getMockConfirmStateForTransaction(contractInteraction, args); }; diff --git a/test/data/mock-send-state.json b/test/data/mock-send-state.json index 09b9cad15757..59d24a1f5f54 100644 --- a/test/data/mock-send-state.json +++ b/test/data/mock-send-state.json @@ -144,17 +144,24 @@ "0x539": true }, "showTestnetMessageInDropdown": true, - "networkConfigurations": { - "goerli": { - "id": "goerli", - "chainId": "0x5" - } - }, "alertEnabledness": { "unconnectedAccount": true }, "featureFlags": {}, "network": "5", + + "networkConfigurationsByChainId": { + "0x5": { + "nativeCurrency": "ETH", + "chainId": "0x5", + "defaultRpcEndpointIndex": 0, + "rpcEndpoints": [ + { + "networkClientId": "goerli" + } + ] + } + }, "internalAccounts": { "accounts": { "cf8dace4-9439-4bd4-b3a8-88c821c8fcb3": { diff --git a/test/data/mock-state.json b/test/data/mock-state.json index c15e9b121965..5a86bbb4970b 100644 --- a/test/data/mock-state.json +++ b/test/data/mock-state.json @@ -380,20 +380,32 @@ "unconnectedAccount": true }, "featureFlags": {}, - "networkConfigurations": { - "testNetworkConfigurationId": { - "rpcUrl": "https://testrpc.com", + "networkConfigurationsByChainId": { + "0x1": { "chainId": "0x1", - "nickname": "Custom Mainnet RPC", - "type": "rpc", - "id": "testNetworkConfigurationId" + "name": "Custom Mainnet RPC", + "nativeCurrency": "ETH", + "defaultRpcEndpointIndex": 0, + "rpcEndpoints": [ + { + "type": "custom", + "url": "https://testrpc.com", + "networkClientId": "testNetworkConfigurationId" + } + ] }, - "goerli": { - "type": "rpc", + "0x5": { "chainId": "0x5", - "ticker": "ETH", - "nickname": "Chain 5", - "id": "goerli" + "name": "Goerli", + "nativeCurrency": "ETH", + "defaultRpcEndpointIndex": 0, + "rpcEndpoints": [ + { + "type": "custom", + "url": "https://goerli.com", + "networkClientId": "goerli" + } + ] } }, "internalAccounts": { diff --git a/test/e2e/default-fixture.js b/test/e2e/default-fixture.js index 3b8ebd46de35..470e260ff959 100644 --- a/test/e2e/default-fixture.js +++ b/test/e2e/default-fixture.js @@ -1,7 +1,11 @@ -const { mockNetworkState } = require('../stub/networks'); +const { mockNetworkStateOld } = require('../stub/networks'); const { CHAIN_IDS } = require('../../shared/constants/network'); const { FirstTimeFlowType } = require('../../shared/constants/onboarding'); +// TODO: Should we bump this? +// The e2e tests currently configure state in the schema of migration 74. +// This requires us to specify network state in the old schema, so it can run through the migrations. +// We could bump this to latest, but it breaks too many other things to handle right now. const FIXTURE_STATE_METADATA_VERSION = 74; const E2E_SRP = @@ -158,7 +162,7 @@ function defaultFixture(inputChainId = CHAIN_IDS.LOCALHOST) { metaMetricsDataDeletionTimestamp: 0, }, NetworkController: { - ...mockNetworkState({ + ...mockNetworkStateOld({ id: 'networkConfigurationId', chainId: inputChainId, nickname: 'Localhost 8545', @@ -204,6 +208,7 @@ function defaultFixture(inputChainId = CHAIN_IDS.LOCALHOST) { smartTransactionsOptInStatus: false, useNativeCurrencyAsPrimaryCurrency: true, petnamesEnabled: true, + showMultiRpcModal: false, isRedesignedConfirmationsDeveloperEnabled: false, showConfirmationAdvancedDetails: false, }, diff --git a/test/e2e/fixture-builder.js b/test/e2e/fixture-builder.js index 1d9401bf227f..2c977816e6fe 100644 --- a/test/e2e/fixture-builder.js +++ b/test/e2e/fixture-builder.js @@ -4,7 +4,7 @@ const { } = require('@metamask/snaps-utils'); const { merge, mergeWith } = require('lodash'); const { toHex } = require('@metamask/controller-utils'); -const { mockNetworkState } = require('../stub/networks'); +const { mockNetworkStateOld } = require('../stub/networks'); const { CHAIN_IDS } = require('../../shared/constants/network'); const { SMART_CONTRACTS } = require('./seeder/smart-contracts'); @@ -44,7 +44,7 @@ function onboardingFixture() { }, }, NetworkController: { - ...mockNetworkState({ + ...mockNetworkStateOld({ id: 'networkConfigurationId', chainId: CHAIN_IDS.LOCALHOST, nickname: 'Localhost 8545', @@ -55,7 +55,7 @@ function onboardingFixture() { providerConfig: { id: 'networkConfigurationId' }, }, PreferencesController: { - advancedGasFee: null, + advancedGasFee: {}, currentLocale: 'en', dismissSeedBackUpReminder: false, featureFlags: {}, @@ -74,6 +74,7 @@ function onboardingFixture() { smartTransactionsOptInStatus: false, useNativeCurrencyAsPrimaryCurrency: true, petnamesEnabled: true, + showMultiRpcModal: false, isRedesignedConfirmationsDeveloperEnabled: false, showConfirmationAdvancedDetails: false, }, @@ -111,6 +112,7 @@ function onboardingFixture() { ignoredTokens: [], tokens: [], }, + TransactionController: {}, config: {}, firstTimeInfo: { date: 1665507600000, @@ -255,37 +257,29 @@ class FixtureBuilder { } withNetworkControllerDoubleGanache() { - const ganacheNetworks = mockNetworkState( - { - chainId: CHAIN_IDS.LOCALHOST, - nickname: 'Localhost 8545', - rpcUrl: 'http://localhost:8545', - ticker: 'ETH', - }, - { - id: '76e9cd59-d8e2-47e7-b369-9c205ccb602c', - rpcUrl: 'http://localhost:8546', - chainId: '0x53a', - ticker: 'ETH', - nickname: 'Localhost 8546', - }, - ); + const ganacheNetworks = mockNetworkStateOld({ + id: '76e9cd59-d8e2-47e7-b369-9c205ccb602c', + rpcUrl: 'http://localhost:8546', + chainId: '0x53a', + ticker: 'ETH', + nickname: 'Localhost 8546', + }); delete ganacheNetworks.selectedNetworkClientId; return this.withNetworkController(ganacheNetworks); } withNetworkControllerTripleGanache() { this.withNetworkControllerDoubleGanache(); - merge( - this.fixture.data.NetworkController, - mockNetworkState({ - rpcUrl: 'http://localhost:7777', - chainId: '0x3e8', - ticker: 'ETH', - nickname: 'Localhost 7777', - blockExplorerUrl: undefined, - }), - ); + const thirdGanache = mockNetworkStateOld({ + rpcUrl: 'http://localhost:7777', + chainId: '0x3e8', + ticker: 'ETH', + nickname: 'Localhost 7777', + blockExplorerUrl: undefined, + }); + + delete thirdGanache.selectedNetworkClientId; + merge(this.fixture.data.NetworkController, thirdGanache); return this; } diff --git a/test/e2e/tests/dapp-interactions/block-explorer.spec.js b/test/e2e/tests/dapp-interactions/block-explorer.spec.js index bde8eb0cf485..d9d21e92ee87 100644 --- a/test/e2e/tests/dapp-interactions/block-explorer.spec.js +++ b/test/e2e/tests/dapp-interactions/block-explorer.spec.js @@ -1,5 +1,5 @@ const { strict: assert } = require('assert'); -const { mockNetworkState } = require('../../../stub/networks'); +const { mockNetworkStateOld } = require('../../../stub/networks'); const { defaultGanacheOptions, @@ -15,7 +15,7 @@ describe('Block Explorer', function () { { fixtures: new FixtureBuilder() .withNetworkController( - mockNetworkState({ + mockNetworkStateOld({ chainId: '0x539', nickname: 'Localhost 8545', rpcUrl: 'http://localhost:8545', @@ -60,15 +60,15 @@ describe('Block Explorer', function () { { dapp: true, fixtures: new FixtureBuilder() - .withNetworkController( - mockNetworkState({ + .withNetworkController({ + ...mockNetworkStateOld({ chainId: '0x539', nickname: 'Localhost 8545', rpcUrl: 'http://localhost:8545', ticker: 'ETH', blockExplorerUrl: 'https://etherscan.io/', }), - ) + }) .withTokensControllerERC20() .build(), ganacheOptions: defaultGanacheOptions, @@ -114,8 +114,8 @@ describe('Block Explorer', function () { await withFixtures( { fixtures: new FixtureBuilder() - .withNetworkController( - mockNetworkState({ + .withNetworkController({ + ...mockNetworkStateOld({ id: 'localhost-client-id', chainId: '0x539', nickname: 'Localhost 8545', @@ -123,7 +123,7 @@ describe('Block Explorer', function () { ticker: 'ETH', blockExplorerUrl: 'https://etherscan.io', }), - ) + }) .withTransactionControllerCompletedTransaction() .build(), ganacheOptions: defaultGanacheOptions, diff --git a/test/e2e/tests/metrics/state-snapshots/errors-after-init-opt-in-background-state.json b/test/e2e/tests/metrics/state-snapshots/errors-after-init-opt-in-background-state.json index 9a2c76210b4d..c133de6128ca 100644 --- a/test/e2e/tests/metrics/state-snapshots/errors-after-init-opt-in-background-state.json +++ b/test/e2e/tests/metrics/state-snapshots/errors-after-init-opt-in-background-state.json @@ -143,10 +143,10 @@ "status": "available" } }, - "networkConfigurations": "object" + "networkConfigurationsByChainId": "object" }, "NetworkOrderController": { - "orderedNetworkList": { "0": "object", "1": "object", "2": "object" } + "orderedNetworkList": { "0": "object", "1": "object" } }, "NftController": { "allNftContracts": "object", @@ -215,7 +215,8 @@ "petnamesEnabled": true, "isRedesignedConfirmationsDeveloperEnabled": "boolean", "redesignedConfirmationsEnabled": true, - "redesignedTransactionsEnabled": "boolean" + "redesignedTransactionsEnabled": "boolean", + "showMultiRpcModal": "boolean" }, "ipfsGateway": "string", "isIpfsGatewayEnabled": "boolean", diff --git a/test/e2e/tests/metrics/state-snapshots/errors-after-init-opt-in-ui-state.json b/test/e2e/tests/metrics/state-snapshots/errors-after-init-opt-in-ui-state.json index f474b2492ba4..dfee54fbd6cb 100644 --- a/test/e2e/tests/metrics/state-snapshots/errors-after-init-opt-in-ui-state.json +++ b/test/e2e/tests/metrics/state-snapshots/errors-after-init-opt-in-ui-state.json @@ -17,6 +17,7 @@ "internalAccounts": { "accounts": "object", "selectedAccount": "string" }, "transactions": "object", "networkConfigurations": "object", + "networkConfigurationsByChainId": "object", "addressBook": "object", "confirmationExchangeRates": {}, "pendingTokens": "object", @@ -35,7 +36,8 @@ "petnamesEnabled": true, "isRedesignedConfirmationsDeveloperEnabled": "boolean", "redesignedConfirmationsEnabled": true, - "redesignedTransactionsEnabled": "boolean" + "redesignedTransactionsEnabled": "boolean", + "showMultiRpcModal": "boolean" }, "firstTimeFlowType": "import", "completedOnboarding": true, @@ -146,7 +148,7 @@ "permissionActivityLog": "object", "subjectMetadata": "object", "announcements": "object", - "orderedNetworkList": { "0": "object", "1": "object", "2": "object" }, + "orderedNetworkList": { "0": "object", "1": "object" }, "pinnedAccountList": {}, "hiddenAccountList": {}, "gasFeeEstimatesByChainId": {}, diff --git a/test/e2e/tests/metrics/state-snapshots/errors-before-init-opt-in-background-state.json b/test/e2e/tests/metrics/state-snapshots/errors-before-init-opt-in-background-state.json index 6d3608c22960..b6354922add0 100644 --- a/test/e2e/tests/metrics/state-snapshots/errors-before-init-opt-in-background-state.json +++ b/test/e2e/tests/metrics/state-snapshots/errors-before-init-opt-in-background-state.json @@ -115,7 +115,8 @@ "useNativeCurrencyAsPrimaryCurrency": true, "petnamesEnabled": true, "showConfirmationAdvancedDetails": false, - "isRedesignedConfirmationsDeveloperEnabled": "boolean" + "isRedesignedConfirmationsDeveloperEnabled": "boolean", + "showMultiRpcModal": "boolean" }, "selectedAddress": "string", "theme": "light", diff --git a/test/e2e/tests/metrics/state-snapshots/errors-before-init-opt-in-ui-state.json b/test/e2e/tests/metrics/state-snapshots/errors-before-init-opt-in-ui-state.json index 1f607a7c9d46..51910b2057a7 100644 --- a/test/e2e/tests/metrics/state-snapshots/errors-before-init-opt-in-ui-state.json +++ b/test/e2e/tests/metrics/state-snapshots/errors-before-init-opt-in-ui-state.json @@ -115,7 +115,8 @@ "useNativeCurrencyAsPrimaryCurrency": true, "petnamesEnabled": true, "showConfirmationAdvancedDetails": false, - "isRedesignedConfirmationsDeveloperEnabled": "boolean" + "isRedesignedConfirmationsDeveloperEnabled": "boolean", + "showMultiRpcModal": "boolean" }, "selectedAddress": "string", "theme": "light", diff --git a/test/e2e/tests/network/add-custom-network.spec.js b/test/e2e/tests/network/add-custom-network.spec.js index df87c915a742..70325cb5155b 100644 --- a/test/e2e/tests/network/add-custom-network.spec.js +++ b/test/e2e/tests/network/add-custom-network.spec.js @@ -1,6 +1,5 @@ const { strict: assert } = require('assert'); const { toHex } = require('@metamask/controller-utils'); -const { mockNetworkState } = require('../../../stub/networks'); const FixtureBuilder = require('../../fixture-builder'); const { defaultGanacheOptions, @@ -10,6 +9,7 @@ const { regularDelayMs, unlockWallet, WINDOW_TITLES, + tinyDelayMs, } = require('../../helpers'); const TEST_CHAIN_ID = toHex(100); @@ -90,14 +90,14 @@ const selectors = { tickerWarning: '[data-testid="network-form-ticker-warning"]', suggestedTickerForXDAI: { css: '[data-testid="network-form-ticker-suggestion"]', - text: 'Suggested ticker symbol: XDAI', + text: 'Suggested currency symbol: XDAI', }, tickerWarningTokenSymbol: { css: '[data-testid="network-form-ticker-warning"]', - text: "This token symbol doesn't match the network name or chain ID entered.", + text: "This token symbol doesn't match the network name or chain ID entered. Many popular tokens use similar symbols, which scammers can use to trick you into sending them a more valuable token in return. Verify everything before you continue.", }, tickerButton: { text: 'PETH', tag: 'button' }, - networkAdded: { text: 'Network added successfully!', tag: 'h4' }, + networkAdded: { text: 'Network added successfully!' }, networkNameInputField: '[data-testid="network-form-network-name"]', networkNameInputFieldSetToEthereumMainnet: { @@ -111,15 +111,6 @@ const selectors = { errorContainer: '.settings-tab__error', }; -async function navigateToAddNetwork(driver) { - await openMenuSafe(driver); - - await driver.clickElement(selectors.settingsOption); - await driver.clickElement(selectors.networkOption); - await driver.clickElement(selectors.addNetwork); - await driver.clickElement(selectors.addNetworkManually); -} - const inputData = { networkName: 'Collision network', rpcUrl: 'https://responsive-rpc.test/', @@ -467,7 +458,6 @@ describe('Custom network', function () { await driver.clickElement('[data-testid="network-display"]'); - await driver.clickElement({ tag: 'button', text: 'Add network' }); await driver.clickElement({ tag: 'button', text: 'Add', @@ -475,7 +465,7 @@ describe('Custom network', function () { // verify network details const title = await driver.findElement({ - tag: 'h6', + tag: 'span', text: 'Arbitrum One', }); @@ -520,64 +510,11 @@ describe('Custom network', function () { await driver.clickElement({ tag: 'button', text: 'Close' }); await driver.clickElement({ tag: 'button', text: 'Approve' }); - await driver.clickElement({ - tag: 'h6', - text: 'Switch to Arbitrum One', - }); - // verify network switched - const networkDisplayed = await driver.findElement({ - tag: 'span', - text: 'Arbitrum One', - }); - assert.equal( - await networkDisplayed.getText(), - 'Arbitrum One', - 'You have not switched to Arbitrum Network', - ); - }, - ); - }); - - it('add custom network and not switch the network', async function () { - await withFixtures( - { - fixtures: new FixtureBuilder().build(), - ganacheOptions: defaultGanacheOptions, - title: this.test.fullTitle(), - }, - async ({ driver }) => { - await unlockWallet(driver); - - // Avoid a stale element error - await driver.delay(regularDelayMs); - - await driver.clickElement('[data-testid="network-display"]'); - await driver.clickElement({ tag: 'button', text: 'Add network' }); - - // had to put all Add elements in list since list is changing and networks are not always in same order - await driver.clickElement({ - tag: 'button', - text: 'Add', - }); - - await driver.clickElement({ tag: 'button', text: 'Approve' }); - - await driver.clickElement({ - tag: 'h6', - text: 'Dismiss', - }); - // verify if added network is in list of networks - const networkDisplay = await driver.findElement( - '[data-testid="network-display"]', + // verify network switched + await driver.waitForSelector( + 'button[data-testid="network-display"][aria-label="Network Menu Arbitrum One"]', ); - await networkDisplay.click(); - - const arbitrumNetwork = await driver.findElements({ - text: 'Arbitrum One', - tag: 'p', - }); - assert.ok(arbitrumNetwork.length, 1); }, ); }); @@ -587,13 +524,27 @@ describe('Custom network', function () { { fixtures: new FixtureBuilder() .withNetworkController({ - ...mockNetworkState({ - rpcUrl: networkURL, - chainId: chainID, - nickname: networkNAME, - ticker: currencySYMBOL, - }), - selectedNetworkClientId: 'mainnet', + providerConfig: { + rpcPrefs: { blockExplorerUrl: 'https://etherscan.io/' }, + }, + networkConfigurations: { + networkConfigurationId: { + chainId: '0x539', + nickname: 'Localhost 8545', + rpcUrl: 'http://localhost:8545', + ticker: 'ETH', + rpcPrefs: { blockExplorerUrl: 'https://etherscan.io/' }, + }, + '2ce66016-8aab-47df-b27f-318c80865eb0': { + chainId: '0xa4b1', + id: '2ce66016-8aab-47df-b27f-318c80865eb0', + nickname: 'Arbitrum mainnet', + rpcPrefs: {}, + rpcUrl: 'https://arbitrum-mainnet.infura.io', + ticker: 'ETH', + }, + }, + selectedNetworkClientId: 'networkConfigurationId', }) .build(), ganacheOptions: defaultGanacheOptions, @@ -601,26 +552,37 @@ describe('Custom network', function () { }, async ({ driver }) => { await unlockWallet(driver); + // Avoid a stale element error + await driver.delay(regularDelayMs); + await driver.clickElement('[data-testid="network-display"]'); + // ===========================================================> + + // Go to Edit Menu + const networkMenu = await driver.findElement( + '[data-testid="network-list-item-options-button-0xa4b1"]', + ); - await openMenuSafe(driver); + await networkMenu.click(); - await driver.clickElement('[data-testid="global-menu-settings"]'); - await driver.clickElement({ text: 'Networks', tag: 'div' }); + const deleteButton = await driver.findElement( + '[data-testid="network-list-item-options-delete"]', + ); + deleteButton.click(); - const arbitrumNetwork = await driver.clickElement({ - text: 'Arbitrum One', - tag: 'div', + await driver.clickElement({ + tag: 'button', + text: 'Delete', }); - // Click first Delete button - await driver.clickElement('button.btn-danger'); + await driver.clickElement('[data-testid="network-display"]'); - // Click modal Delete button - await driver.clickElement('button.btn-danger-primary'); + // check if arbitrum is on the list of popular network + const popularNetworkArbitrum = await driver.findElement( + '[data-testid="popular-network-0xa4b1"]', + ); - // Checks if Arbitrum is deleted - const existNetwork = await driver.isElementPresent(arbitrumNetwork); - assert.equal(existNetwork, false, 'Network is not deleted'); + const existNetwork = popularNetworkArbitrum !== undefined; + assert.equal(existNetwork, true, 'Network is not deleted'); }, ); }); @@ -727,25 +689,76 @@ describe('Custom network', function () { async ({ driver }) => { await unlockWallet(driver); - await navigateToAddNetwork(driver); - await driver.fill( - selectors.networkNameInputField, - 'Ethereum mainnet', - ); - await driver.fill( - selectors.rpcUrlInputField, - 'https://responsive-rpc.test', - ); + await driver.clickElement('[data-testid="network-display"]'); + await driver.clickElement({ + text: 'Add a custom network', + tag: 'button', + }); + + await driver.fill(selectors.networkNameInputField, 'Gnosis'); await driver.fill(selectors.chainIdInputField, TEST_CHAIN_ID); await driver.fill(selectors.tickerInputField, 'XDAI'); - await driver.fill(selectors.explorerInputField, 'https://test.com'); + + // Add rpc url + const rpcUrlInputDropDown = await driver.waitForSelector( + '[data-testid="test-add-rpc-drop-down"]', + ); + await rpcUrlInputDropDown.click(); + await driver.delay(tinyDelayMs); + await driver.clickElement({ + text: 'Add RPC URL', + tag: 'button', + }); + + const rpcUrlInput = await driver.waitForSelector( + '[data-testid="rpc-url-input-test"]', + ); + await rpcUrlInput.clear(); + await rpcUrlInput.sendKeys('https://responsive-rpc.test'); + + const rpcNameInput = await driver.waitForSelector( + '[data-testid="rpc-name-input-test"]', + ); + await rpcNameInput.sendKeys('testName'); + + await driver.clickElement({ + text: 'Add URL', + tag: 'button', + }); + + // Add explorer URL + const explorerUrlInputDropDown = await driver.waitForSelector( + '[data-testid="test-explorer-drop-down"]', + ); + + await driver.scrollToElement(explorerUrlInputDropDown); + await driver.delay(tinyDelayMs); + + await explorerUrlInputDropDown.click(); + await driver.delay(tinyDelayMs); + + await driver.clickElement({ + text: 'Add a block explorer URL', + tag: 'button', + }); + + const blockExplorerInput = await driver.waitForSelector( + '[data-testid="explorer-url-input"]', + ); + await blockExplorerInput.clear(); + await blockExplorerInput.sendKeys('https://test.com'); + + await driver.clickElement({ + text: 'Add URL', + tag: 'button', + }); const suggestedTicker = await driver.isElementPresent( - selectors.suggestedTickerForXDAI, + selectors.suggestedTickerForXDAI.css, ); const tickerWarning = await driver.isElementPresent( - selectors.tickerWarningTokenSymbol, + selectors.tickerWarningTokenSymbol.css, ); assert.equal(suggestedTicker, false); @@ -754,10 +767,10 @@ describe('Custom network', function () { await driver.clickElement(selectors.saveButton); // Validate the network was added - const networkAdded = await driver.isElementPresent( - selectors.networkAdded, - ); - assert.equal(networkAdded, true, 'Network added successfully!'); + const networkAdded = await driver.isElementPresent({ + text: '“Gnosis” was successfully added!', + }); + assert.equal(networkAdded, true, '“Gnosis” was successfully added!'); }, ); }); @@ -788,32 +801,78 @@ describe('Custom network', function () { async ({ driver }) => { await unlockWallet(driver); - await navigateToAddNetwork(driver); + + await driver.clickElement('[data-testid="network-display"]'); + await driver.clickElement({ + text: 'Add a custom network', + tag: 'button', + }); + await driver.fill( selectors.networkNameInputField, 'Ethereum mainnet', ); - await driver.fill( - selectors.rpcUrlInputField, - 'https://responsive-rpc.test', - ); + await driver.fill(selectors.chainIdInputField, '1'); await driver.fill(selectors.tickerInputField, 'TST'); - // fix flaky test - await driver.delay(regularDelayMs); - await driver.fill(selectors.explorerInputField, 'https://test.com'); - const suggestedTicker = await driver.isElementPresent( - selectors.suggestedTicker, + // Add rpc url + const rpcUrlInputDropDown = await driver.waitForSelector( + '[data-testid="test-add-rpc-drop-down"]', ); + await rpcUrlInputDropDown.click(); + await driver.delay(tinyDelayMs); + await driver.clickElement({ + text: 'Add RPC URL', + tag: 'button', + }); - const tickerWarning = await driver.isElementPresent( - selectors.tickerWarning, + const rpcUrlInput = await driver.waitForSelector( + '[data-testid="rpc-url-input-test"]', ); + await rpcUrlInput.clear(); + await rpcUrlInput.sendKeys('https://responsive-rpc.test'); + + const rpcNameInput = await driver.waitForSelector( + '[data-testid="rpc-name-input-test"]', + ); + await rpcNameInput.sendKeys('testName'); + + await driver.clickElement({ + text: 'Add URL', + tag: 'button', + }); // suggestion and warning ticker should be displayed - assert.equal(suggestedTicker, true); - assert.equal(tickerWarning, true); + await driver.waitForSelector(selectors.suggestedTicker); + await driver.waitForSelector(selectors.tickerWarning); + + // Add explorer URL + const explorerUrlInputDropDown = await driver.waitForSelector( + '[data-testid="test-explorer-drop-down"]', + ); + + await driver.scrollToElement(explorerUrlInputDropDown); + await driver.delay(tinyDelayMs); + + await explorerUrlInputDropDown.click(); + await driver.delay(tinyDelayMs); + + await driver.clickElement({ + text: 'Add a block explorer URL', + tag: 'button', + }); + + const blockExplorerInput = await driver.waitForSelector( + '[data-testid="explorer-url-input"]', + ); + await blockExplorerInput.clear(); + await blockExplorerInput.sendKeys('https://test.com'); + + await driver.clickElement({ + text: 'Add URL', + tag: 'button', + }); }, ); }); @@ -842,18 +901,48 @@ describe('Custom network', function () { async ({ driver }) => { await unlockWallet(driver); - await navigateToAddNetwork(driver); + + await driver.clickElement('[data-testid="network-display"]'); + await driver.clickElement({ + text: 'Add a custom network', + tag: 'button', + }); + await driver.fill( selectors.networkNameInputField, inputData.networkName, ); - await driver.fill(selectors.rpcUrlInputField, inputData.rpcUrl); - // fix flaky test - await driver.delay(regularDelayMs); await driver.fill(selectors.chainIdInputField, inputData.chainId); await driver.fill(selectors.tickerInputField, inputData.ticker); + // Add rpc url + const rpcUrlInputDropDown = await driver.waitForSelector( + '[data-testid="test-add-rpc-drop-down"]', + ); + await rpcUrlInputDropDown.click(); + await driver.delay(tinyDelayMs); + await driver.clickElement({ + text: 'Add RPC URL', + tag: 'button', + }); + + const rpcUrlInput = await driver.waitForSelector( + '[data-testid="rpc-url-input-test"]', + ); + await rpcUrlInput.clear(); + await rpcUrlInput.sendKeys(inputData.rpcUrl); + + const rpcNameInput = await driver.waitForSelector( + '[data-testid="rpc-name-input-test"]', + ); + await rpcNameInput.sendKeys('testName'); + + await driver.clickElement({ + text: 'Add URL', + tag: 'button', + }); + const suggestedTicker = await driver.isElementPresent( selectors.suggestedTicker, ); @@ -865,14 +954,19 @@ describe('Custom network', function () { assert.equal(suggestedTicker, true); assert.equal(tickerWarning, true); - await driver.clickElement(selectors.tickerButton); - await driver.clickElement(selectors.saveButton); + driver.clickElement(selectors.tickerButton); + driver.clickElement(selectors.saveButton); // Validate the network was added - const networkAdded = await driver.isElementPresent( - selectors.networkAdded, + const networkAdded = await driver.isElementPresent({ + text: `“${inputData.networkName}” was successfully added!`, + }); + + assert.equal( + networkAdded, + true, + `“${inputData.networkName}” was successfully added!`, ); - assert.equal(networkAdded, true, 'Network added successfully!'); }, ); }); @@ -921,35 +1015,76 @@ async function failCandidateNetworkValidation(driver) { await driver.waitForSelector(networkMenuSelector); await driver.clickElement(networkMenuSelector); - await driver.clickElement({ text: 'Add network', tag: 'button' }); - - const addNetworkManuallyButtonSelector = - '[data-testid="add-network-manually"]'; - await driver.waitForSelector(addNetworkManuallyButtonSelector); - - await driver.clickElement(`${addNetworkManuallyButtonSelector} > h6`); + await driver.clickElement({ text: 'Add a custom network', tag: 'button' }); const [ - , // first element is the search input that we don't need to fill networkNameInputEl, - newRPCURLInputEl, - chainIDInputEl, , - blockExplorerURLInputEl, + chainIDInputEl, ] = await driver.findElements('input'); await networkNameInputEl.fill('cheapETH'); - await newRPCURLInputEl.fill('https://unresponsive-rpc.test'); await chainIDInputEl.fill(toHex(777)); await driver.fill('[data-testid="network-form-ticker-input"]', 'cTH'); - await blockExplorerURLInputEl.fill('https://block-explorer.url'); + + // Add rpc URL + const rpcUrlInputDropDown = await driver.waitForSelector( + '[data-testid="test-add-rpc-drop-down"]', + ); + await rpcUrlInputDropDown.click(); + await driver.delay(tinyDelayMs); + await driver.clickElement({ + text: 'Add RPC URL', + tag: 'button', + }); + + const rpcUrlInput = await driver.waitForSelector( + '[data-testid="rpc-url-input-test"]', + ); + await rpcUrlInput.clear(); + await rpcUrlInput.sendKeys('https://unresponsive-rpc.test'); + + const rpcNameInput = await driver.waitForSelector( + '[data-testid="rpc-name-input-test"]', + ); + await rpcNameInput.sendKeys('testName'); + + await driver.clickElement({ + text: 'Add URL', + tag: 'button', + }); + + // Add explorer URL + const explorerUrlInputDropDown = await driver.waitForSelector( + '[data-testid="test-explorer-drop-down"]', + ); + + await driver.scrollToElement(explorerUrlInputDropDown); + await explorerUrlInputDropDown.click(); + await driver.delay(tinyDelayMs); + + await driver.clickElement({ + text: 'Add a block explorer URL', + tag: 'button', + }); + + const blockExplorerInput = await driver.waitForSelector( + '[data-testid="explorer-url-input"]', + ); + blockExplorerInput.clear(); + await blockExplorerInput.sendKeys('https://block-explorer.url'); + + await driver.clickElement({ + text: 'Add URL', + tag: 'button', + }); const chainIdValidationMessageRawLocator = { text: 'Could not fetch chain ID. Is your RPC URL correct?', }; + await driver.waitForSelector(chainIdValidationMessageRawLocator); - await driver.waitForSelector('[data-testid="network-form-ticker-warning"]'); const saveButtonRawLocator = { text: 'Save', @@ -1012,7 +1147,7 @@ async function toggleOffSafeChainsListValidation(driver) { 'Safe chains list validation toggle is ON', ); - await driver.delay(regularDelayMs); + driver.delay(regularDelayMs); // return to the home screen const appHeaderSelector = '[data-testid="app-header-logo"]'; @@ -1025,28 +1160,70 @@ async function candidateNetworkIsNotValidated(driver) { await driver.waitForSelector(networkMenuSelector); await driver.clickElement(networkMenuSelector); - await driver.clickElement({ text: 'Add network', tag: 'button' }); - - const addNetworkManuallyButtonSelector = - '[data-testid="add-network-manually"]'; - await driver.waitForSelector(addNetworkManuallyButtonSelector); - await driver.clickElement(`${addNetworkManuallyButtonSelector} > h6`); + await driver.clickElement({ text: 'Add a custom network', tag: 'button' }); const [ - , // first element is the search input that we don't need to fill networkNameInputEl, - newRPCURLInputEl, - chainIDInputEl, , - blockExplorerURLInputEl, + chainIDInputEl, ] = await driver.findElements('input'); await networkNameInputEl.fill('cheapETH'); - await newRPCURLInputEl.fill('https://responsive-rpc.test/'); await chainIDInputEl.fill(TEST_CHAIN_ID); await driver.fill('[data-testid="network-form-ticker-input"]', 'cTH'); - await blockExplorerURLInputEl.fill('https://block-explorer.url'); + + // Add rpc URL + const rpcUrlInputDropDown = await driver.waitForSelector( + '[data-testid="test-add-rpc-drop-down"]', + ); + await rpcUrlInputDropDown.click(); + await driver.delay(tinyDelayMs); + await driver.clickElement({ + text: 'Add RPC URL', + tag: 'button', + }); + + const rpcUrlInput = await driver.waitForSelector( + '[data-testid="rpc-url-input-test"]', + ); + await rpcUrlInput.clear(); + await rpcUrlInput.sendKeys('https://responsive-rpc.test'); + + const rpcNameInput = await driver.waitForSelector( + '[data-testid="rpc-name-input-test"]', + ); + await rpcNameInput.sendKeys('testName'); + + await driver.clickElement({ + text: 'Add URL', + tag: 'button', + }); + + // Add explorer URL + const explorerUrlInputDropDown = await driver.waitForSelector( + '[data-testid="test-explorer-drop-down"]', + ); + + await driver.scrollToElement(explorerUrlInputDropDown); + await explorerUrlInputDropDown.click(); + await driver.delay(tinyDelayMs); + + await driver.clickElement({ + text: 'Add a block explorer URL', + tag: 'button', + }); + + const blockExplorerInput = await driver.waitForSelector( + '[data-testid="explorer-url-input"]', + ); + blockExplorerInput.clear(); + await blockExplorerInput.sendKeys('https://block-explorer.url'); + + await driver.clickElement({ + text: 'Add URL', + tag: 'button', + }); // fix flaky test await driver.delay(regularDelayMs); diff --git a/test/e2e/tests/network/custom-rpc-history.spec.js b/test/e2e/tests/network/custom-rpc-history.spec.js index b8bda1a2f14f..6e92f532698f 100644 --- a/test/e2e/tests/network/custom-rpc-history.spec.js +++ b/test/e2e/tests/network/custom-rpc-history.spec.js @@ -1,5 +1,5 @@ const { strict: assert } = require('assert'); -const { mockNetworkState } = require('../../../stub/networks'); +const { mockNetworkStateOld } = require('../../../stub/networks'); const { defaultGanacheOptions, @@ -7,6 +7,7 @@ const { withFixtures, regularDelayMs, unlockWallet, + tinyDelayMs, } = require('../../helpers'); const FixtureBuilder = require('../../fixture-builder'); @@ -15,6 +16,7 @@ describe('Custom RPC history', function () { const port = 8546; const chainId = 1338; const symbol = 'TEST'; + await withFixtures( { fixtures: new FixtureBuilder().build(), @@ -29,43 +31,62 @@ describe('Custom RPC history', function () { const rpcUrl = `http://127.0.0.1:${port}`; const networkName = 'Secondary Ganache Testnet'; - await driver.assertElementNotPresent('.loading-overlay'); await driver.clickElement('[data-testid="network-display"]'); - - await driver.clickElement({ text: 'Add network', tag: 'button' }); - - await driver.findElement('.add-network__networks-container'); - await driver.clickElement({ - text: 'Add a network manually', - tag: 'h6', + text: 'Add a custom network', + tag: 'button', }); - await driver.findElement('.networks-tab__subheader'); - - const customRpcInputs = await driver.findElements('input[type="text"]'); - const networkNameInput = customRpcInputs[1]; - const rpcUrlInput = customRpcInputs[2]; - const chainIdInput = customRpcInputs[3]; - const symbolInput = customRpcInputs[4]; + await driver.fill( + '[data-testid="network-form-network-name"]', + networkName, + ); + await driver.fill( + '[data-testid="network-form-chain-id"]', + chainId.toString(), + ); + await driver.fill('[data-testid="network-form-ticker-input"]', symbol); - await networkNameInput.clear(); - await networkNameInput.sendKeys(networkName); + // Add rpc url + const rpcUrlInputDropDown = await driver.waitForSelector( + '[data-testid="test-add-rpc-drop-down"]', + ); + await rpcUrlInputDropDown.click(); + await driver.delay(tinyDelayMs); + await driver.clickElement({ + text: 'Add RPC URL', + tag: 'button', + }); + const rpcUrlInput = await driver.waitForSelector( + '[data-testid="rpc-url-input-test"]', + ); await rpcUrlInput.clear(); await rpcUrlInput.sendKeys(rpcUrl); - await chainIdInput.clear(); - await chainIdInput.sendKeys(chainId.toString()); + const rpcNameInput = await driver.waitForSelector( + '[data-testid="rpc-name-input-test"]', + ); + await rpcNameInput.sendKeys('test-name'); - await symbolInput.clear(); - await symbolInput.sendKeys(symbol); + await driver.clickElement({ + text: 'Add URL', + tag: 'button', + }); - await driver.clickElement( - '.networks-tab__add-network-form-footer .btn-primary', - ); + await driver.clickElement({ text: 'Save', tag: 'button' }); await driver.findElement({ text: networkName, tag: 'h6' }); + + // Validate the network was added + const networkAdded = await driver.isElementPresent({ + text: '“Secondary Ganache Testnet” was successfully added!', + }); + assert.equal( + networkAdded, + true, + '“Secondary Ganache Testnet” was successfully added!', + ); }, ); }); @@ -86,24 +107,42 @@ describe('Custom RPC history', function () { await driver.assertElementNotPresent('.loading-overlay'); await driver.clickElement('[data-testid="network-display"]'); - await driver.clickElement({ text: 'Add network', tag: 'button' }); - - await driver.findElement('.add-network__networks-container'); - await driver.clickElement({ - text: 'Add a network manually', - tag: 'h6', + text: 'Add a custom network', + tag: 'button', }); - await driver.findElement('.networks-tab__subheader'); - - const customRpcInputs = await driver.findElements('input[type="text"]'); - const rpcUrlInput = customRpcInputs[2]; + // Add rpc url + const rpcUrlInputDropDown = await driver.waitForSelector( + '[data-testid="test-add-rpc-drop-down"]', + ); + await rpcUrlInputDropDown.click(); + await driver.delay(tinyDelayMs); + await driver.clickElement({ + text: 'Add RPC URL', + tag: 'button', + }); + const rpcUrlInput = await driver.waitForSelector( + '[data-testid="rpc-url-input-test"]', + ); await rpcUrlInput.clear(); await rpcUrlInput.sendKeys(duplicateRpcUrl); + + const rpcNameInput = await driver.waitForSelector( + '[data-testid="rpc-name-input-test"]', + ); + await rpcNameInput.sendKeys('test-name'); + + await driver.clickElement({ + text: 'Add URL', + tag: 'button', + }); + + await driver.fill('[data-testid="network-form-chain-id"]', '1'); + await driver.findElement({ - text: 'This URL is currently used by the mainnet network.', + text: 'This Chain ID is currently used by the Ethereum Mainnet network.', }); }, ); @@ -120,46 +159,49 @@ describe('Custom RPC history', function () { await unlockWallet(driver); // duplicate network - const newRpcUrl = 'http://localhost:8544'; const duplicateChainId = '1'; await driver.assertElementNotPresent('.loading-overlay'); await driver.clickElement('[data-testid="network-display"]'); - await driver.clickElement({ text: 'Add network', tag: 'button' }); - - await driver.findElement('.add-network__networks-container'); - await driver.clickElement({ - text: 'Add a network manually', - tag: 'h6', + text: 'Add a custom network', + tag: 'button', }); - await driver.findElement('.networks-tab__subheader'); - - const customRpcInputs = await driver.findElements('input[type="text"]'); - const rpcUrlInput = customRpcInputs[2]; - const chainIdInput = customRpcInputs[3]; + await driver.fill( + '[data-testid="network-form-chain-id"]', + duplicateChainId, + ); - await chainIdInput.clear(); - await chainIdInput.sendKeys(duplicateChainId); await driver.findElement({ - text: 'This Chain ID is currently used by the mainnet network.', + text: 'This Chain ID is currently used by the Ethereum Mainnet network.', + }); + + // Add invalid rcp url + const rpcUrlInputDropDown = await driver.waitForSelector( + '[data-testid="test-add-rpc-drop-down"]', + ); + await rpcUrlInputDropDown.click(); + await driver.delay(tinyDelayMs); + await driver.clickElement({ + text: 'Add RPC URL', + tag: 'button', }); + const rpcUrlInput = await driver.waitForSelector( + '[data-testid="rpc-url-input-test"]', + ); await rpcUrlInput.clear(); + await rpcUrlInput.sendKeys('test'); - // We cannot use sendKeys() here, because a network request will be fired after each - // keypress, and the privacy snapshot will show: - // `New hosts found: l,lo,loc,loca,local,localh,localho,localhos` - // In the longer term, we may want to debounce this - await driver.pasteIntoField( - '.form-field:nth-of-type(2) input[type="text"]', - newRpcUrl, + const rpcNameInput = await driver.waitForSelector( + '[data-testid="rpc-name-input-test"]', ); + await rpcNameInput.sendKeys('test-name'); await driver.findElement({ - text: 'Could not fetch chain ID. Is your RPC URL correct?', + text: 'URLs require the appropriate HTTP/HTTPS prefix.', }); }, ); @@ -184,7 +226,7 @@ describe('Custom RPC history', function () { }); it('finds all recent RPCs in history', async function () { - const networkState = mockNetworkState( + const networkState = mockNetworkStateOld( { rpcUrl: 'http://127.0.0.1:8545/1', chainId: '0x539', @@ -220,20 +262,21 @@ describe('Custom RPC history', function () { // only recent 3 are found and in correct order (most recent at the top) const customRpcs = await driver.findElements({ - text: 'http://127.0.0.1:8545/', - tag: 'div', + text: 'Localhost 8545', + tag: 'p', }); // click Mainnet to dismiss network dropdown await driver.clickElement({ text: 'Ethereum Mainnet', tag: 'p' }); - assert.equal(customRpcs.length, 2); + // custom rpcs length is 1 because networks has been merged + assert.equal(customRpcs.length, 1); }, ); }); it('deletes a custom RPC', async function () { - const networkState = mockNetworkState( + const networkState = mockNetworkStateOld( { rpcUrl: 'http://127.0.0.1:8545/1', chainId: '0x539', @@ -242,7 +285,7 @@ describe('Custom RPC history', function () { }, { rpcUrl: 'http://127.0.0.1:8545/2', - chainId: '0x539', + chainId: '0x540', ticker: 'ETH', nickname: 'http://127.0.0.1:8545/2', }, @@ -263,42 +306,34 @@ describe('Custom RPC history', function () { await driver.assertElementNotPresent('.loading-overlay'); // Click add network from network options await driver.clickElement('[data-testid="network-display"]'); - await driver.clickElement({ text: 'Add network', tag: 'button' }); - // Open network settings page - await driver.findElement('.add-network__networks-container'); - // Click Add network manually to trigger form - await driver.clickElement({ - text: 'Add a network manually', - tag: 'h6', - }); - // cancel new custom rpc - await driver.clickElement( - '.networks-tab__add-network-form-footer button.btn-secondary', - ); - // find custom network http://127.0.0.1:8545/2 - const networkItemClassName = '.networks-tab__networks-list-name'; + const customNetworkName = 'http://127.0.0.1:8545/2'; + const networkItemClassName = '.multichain-network-list-item'; + const networkListItems = await driver.findClickableElements( networkItemClassName, ); - const lastNetworkListItem = - networkListItems[networkListItems.length - 1]; - await lastNetworkListItem.click(); - await driver.waitForSelector({ - css: '.form-field .form-field__input:nth-of-type(1)', - value: customNetworkName, - }); - // delete custom network in a modal + + // click on menu button await driver.clickElement( - '.networks-tab__network-form-footer .btn-danger', + '[data-testid="network-list-item-options-button-0x540"]', ); - await driver.findVisibleElement( - '[data-testid="confirm-delete-network-modal"]', + + // click on delere button + await driver.clickElement( + '[data-testid="network-list-item-options-delete"]', ); - await driver.clickElement({ text: 'Delete', tag: 'button' }); + + // click on delete button + await driver.clickElement({ + text: 'Delete', + tag: 'button', + }); + await driver.assertElementNotPresent( '[data-testid="confirm-delete-network-modal"]', ); + // There's a short slot to process deleting the network, // hence there's a need to wait for the element to be removed to guarantee the action is executed completely await driver.assertElementNotPresent({ @@ -306,6 +341,9 @@ describe('Custom RPC history', function () { text: customNetworkName, }); + // Click add network from network options + await driver.clickElement('[data-testid="network-display"]'); + // custom network http://127.0.0.1:8545/2 is removed from network list const newNetworkListItems = await driver.findElements( networkItemClassName, diff --git a/test/e2e/tests/network/update-network.spec.ts b/test/e2e/tests/network/update-network.spec.ts index 4242dfe1533f..54ee7a0a3afe 100644 --- a/test/e2e/tests/network/update-network.spec.ts +++ b/test/e2e/tests/network/update-network.spec.ts @@ -3,6 +3,7 @@ import { Suite } from 'mocha'; import FixtureBuilder from '../../fixture-builder'; import { defaultGanacheOptions, + tinyDelayMs, unlockWallet, withFixtures, } from '../../helpers'; @@ -42,9 +43,11 @@ const inputData = { }; async function navigateToEditNetwork(driver: Driver) { - await driver.clickElement(selectors.accountOptionsMenuButton); - await driver.clickElement(selectors.settingsOption); - await driver.clickElement(selectors.networkOption); + await driver.clickElement('.mm-picker-network'); + await driver.clickElement( + '[data-testid="network-list-item-options-button-0x539"]', + ); + await driver.clickElement('[data-testid="network-list-item-options-edit"]'); } describe('Update Network:', function (this: Suite) { @@ -59,21 +62,25 @@ describe('Update Network:', function (this: Suite) { async ({ driver }: { driver: Driver }) => { await unlockWallet(driver); await navigateToEditNetwork(driver); + + // Verify chain id is not editable when updating a network + const chainIdInput = await driver.findElement( + selectors.chainIdInputField, + ); + assert.equal( + await chainIdInput.isEnabled(), + false, + 'chain id input should be disabled', + ); + + // Update the network name await driver.fill( selectors.networkNameInputField, inputData.networkName, ); - // We fill in the chain ID in two steps, allowing the error message time to disappear once the field is correctly completed. - await driver.fill(selectors.chainIdInputField, inputData.chainId_part1); - const chainIdInputField = await driver.findElement( - selectors.chainIdInputField, - ); - await chainIdInputField.sendKeys(inputData.chainId_part2); - + // Save, and verify the new network name is visible await driver.clickElement(selectors.saveButton); - - // Validate the network name is updated const updatedNetworkNamePresent = await driver.isElementPresent( selectors.updatedNetworkDropDown, ); @@ -83,8 +90,23 @@ describe('Update Network:', function (this: Suite) { 'Network name is not updated', ); + // Start another edit await navigateToEditNetwork(driver); - await driver.fill(selectors.rpcUrlInputField, inputData.rpcUrl); + + // Edit the RPC URL to something invalid + const rpcUrlInputDropDown = await driver.waitForSelector( + '[data-testid="test-add-rpc-drop-down"]', + ); + await rpcUrlInputDropDown.click(); + await driver.delay(tinyDelayMs); + await driver.clickElement({ + text: 'Add RPC URL', + tag: 'button', + }); + const rpcUrlInput = await driver.waitForSelector( + '[data-testid="rpc-url-input-test"]', + ); + await rpcUrlInput.sendKeys(inputData.rpcUrl); // Validate the error message that appears for the invalid url format const errorMessage = await driver.isElementPresent( @@ -97,35 +119,15 @@ describe('Update Network:', function (this: Suite) { ); // Validate the Save button is disabled for the invalid url format - const saveButton = await driver.findElement(selectors.saveButton); - const saveButtonEnabled = await saveButton.isEnabled(); - assert.equal(saveButtonEnabled, false, 'Save button is enabled'); - - // Validate the information symbol appears for chain id - const informationSymbolAppears = await driver.isElementPresent( - selectors.informationSymbol, - ); + const addUrlButton = await driver.findElement({ + text: 'Add URL', + tag: 'button', + }); assert.equal( - informationSymbolAppears, - true, - 'Information symbol did not appear for chain id', + await addUrlButton.isEnabled(), + false, + 'Add url button should not be enabled', ); - - await driver.clickElement(selectors.ethereumNetwork); - - // Validate the Save, Cancel, and Delete buttons are not present for the default network - await driver.assertElementNotPresent(selectors.deleteButton, { - findElementGuard: selectors.networkNameInputFieldSetToEthereumMainnet, // Wait for the network selection to complete - }); - // The findElementGuard above is sufficient for the next two assertions - await driver.assertElementNotPresent(selectors.cancelButton); - await driver.assertElementNotPresent(selectors.saveButton); - - // Validate the error does not appear on the General tab - await driver.clickElement(selectors.generalOption); - await driver.assertElementNotPresent(selectors.errorContainer, { - findElementGuard: selectors.generalTabHeader, // Wait for the General tab to load - }); }, ); }); diff --git a/test/e2e/tests/onboarding/onboarding.spec.js b/test/e2e/tests/onboarding/onboarding.spec.js index c9cb594f403d..1aa716953703 100644 --- a/test/e2e/tests/onboarding/onboarding.spec.js +++ b/test/e2e/tests/onboarding/onboarding.spec.js @@ -1,4 +1,5 @@ const { strict: assert } = require('assert'); +const { toHex } = require('@metamask/controller-utils'); const { By } = require('selenium-webdriver'); const { TEST_SEED_PHRASE, @@ -19,6 +20,7 @@ const { onboardingCompleteWalletCreation, regularDelayMs, unlockWallet, + tinyDelayMs, } = require('../../helpers'); const FixtureBuilder = require('../../fixture-builder'); const { @@ -277,29 +279,54 @@ describe('MetaMask onboarding @no-mmi', function () { // Add custom network localhost 8546 during onboarding await driver.clickElement({ text: 'Advanced configuration', tag: 'a' }); - await driver.clickElement('.mm-picker-network'); + await driver.clickElement({ text: 'Add a network' }); + await driver.waitForSelector( + '.multichain-network-list-menu-content-wrapper__dialog', + ); + + await driver.fill( + '[data-testid="network-form-network-name"]', + networkName, + ); + await driver.fill( + '[data-testid="network-form-chain-id"]', + chainId.toString(), + ); + await driver.fill( + '[data-testid="network-form-ticker-input"]', + currencySymbol, + ); + + // Add rpc url + const rpcUrlInputDropDown = await driver.waitForSelector( + '[data-testid="test-add-rpc-drop-down"]', + ); + await rpcUrlInputDropDown.click(); + await driver.delay(tinyDelayMs); await driver.clickElement({ - text: 'Add network', + text: 'Add RPC URL', + tag: 'button', + }); + const rpcUrlInput = await driver.waitForSelector( + '[data-testid="rpc-url-input-test"]', + ); + await rpcUrlInput.clear(); + await rpcUrlInput.sendKeys(networkUrl); + await driver.clickElement({ + text: 'Add URL', tag: 'button', }); - - await driver.waitForSelector('[data-testid="add-network-modal"]'); - const [ - networkNameField, - networkUrlField, - chainIdField, - currencySymbolField, - ] = await driver.findElements('input[type="text"]'); - await networkNameField.sendKeys(networkName); - await networkUrlField.sendKeys(networkUrl); - await chainIdField.sendKeys(chainId.toString()); - await currencySymbolField.sendKeys(currencySymbol); await driver.clickElement({ text: 'Save', tag: 'button' }); - await driver.assertElementNotPresent( - '[data-testid="add-network-modal"]', + await driver.clickElement({ + text: 'Done', + tag: 'button', + }); + + await driver.clickElement('.mm-picker-network'); + await driver.clickElement( + `[data-rbd-draggable-id="${toHex(chainId)}"]`, ); - await driver.clickElement({ text: 'Done', tag: 'button' }); // Check localhost 8546 is selected and its balance value is correct await driver.findElement({ diff --git a/test/e2e/tests/request-queuing/ui.spec.js b/test/e2e/tests/request-queuing/ui.spec.js index 5da270427ca5..cb7b2320286f 100644 --- a/test/e2e/tests/request-queuing/ui.spec.js +++ b/test/e2e/tests/request-queuing/ui.spec.js @@ -1,8 +1,6 @@ const { strict: assert } = require('assert'); const { Browser, until } = require('selenium-webdriver'); -const { - BUILT_IN_INFURA_NETWORKS, -} = require('../../../../shared/constants/network'); +const { CHAIN_IDS } = require('../../../../shared/constants/network'); const FixtureBuilder = require('../../fixture-builder'); const { withFixtures, @@ -108,12 +106,15 @@ async function switchToDialogPopoverValidateDetails(driver, expectedDetails) { ); const { - metamask: { selectedNetworkClientId, networkConfigurations }, + metamask: { selectedNetworkClientId, networkConfigurationsByChainId }, } = notificationWindowState; - const { chainId } = - BUILT_IN_INFURA_NETWORKS[selectedNetworkClientId] ?? - networkConfigurations[selectedNetworkClientId]; + const { chainId } = Object.values(networkConfigurationsByChainId).find( + ({ rpcEndpoints }) => + rpcEndpoints.some( + ({ networkClientId }) => networkClientId === selectedNetworkClientId, + ), + ); assert.equal(chainId, expectedDetails.chainId); } @@ -371,6 +372,9 @@ describe('Request-queue UI changes', function () { dapp: true, fixtures: new FixtureBuilder() .withNetworkControllerDoubleGanache() + .withPreferencesController({ + preferences: { showTestNetworks: true }, + }) .withPreferencesControllerUseRequestQueueEnabled() .withSelectedNetworkControllerPerDomain() .build(), @@ -408,24 +412,24 @@ describe('Request-queue UI changes', function () { text: 'Ethereum Mainnet', }); - // Go to Settings, delete the first dapp's network - await driver.clickElement( - '[data-testid="account-options-menu-button"]', - ); - await driver.clickElement('[data-testid="global-menu-settings"]'); - await driver.clickElement({ - css: '.tab-bar__tab__content__title', - text: 'Networks', - }); - await driver.clickElement({ - css: '.networks-tab__networks-list-name', + await driver.clickElement('[data-testid="network-display"]'); + + const networkRow = await driver.findElement({ + css: '.multichain-network-list-item', text: 'Localhost 8545', }); - await driver.clickElement({ css: '.btn-danger', text: 'Delete' }); - await driver.clickElement({ - css: '.modal-container__footer-button', - text: 'Delete', - }); + + const networkMenu = await driver.findNestedElement( + networkRow, + `[data-testid="network-list-item-options-button-${CHAIN_IDS.LOCALHOST}"]`, + ); + + await networkMenu.click(); + await driver.clickElement( + '[data-testid="network-list-item-options-delete"]', + ); + + await driver.clickElement({ tag: 'button', text: 'Delete' }); // Go back to first dapp, try an action, ensure deleted network doesn't block UI // The current globally selected network, Ethereum Mainnet, should be used diff --git a/test/e2e/tests/settings/backup-restore.spec.js b/test/e2e/tests/settings/backup-restore.spec.js index 5d50d6030c90..02a36b638884 100644 --- a/test/e2e/tests/settings/backup-restore.spec.js +++ b/test/e2e/tests/settings/backup-restore.spec.js @@ -72,7 +72,7 @@ describe('Backup and Restore', function () { assert.notEqual(info, null); // Verify Json assert.equal( - Object.values(info?.network?.networkConfigurations)?.[0].chainId, + info?.network?.networkConfigurationsByChainId?.['0x539']?.chainId, '0x539', ); }, diff --git a/test/e2e/tests/settings/settings-search.spec.js b/test/e2e/tests/settings/settings-search.spec.js index 9e7dceafabfa..7a9207dcbf9f 100644 --- a/test/e2e/tests/settings/settings-search.spec.js +++ b/test/e2e/tests/settings/settings-search.spec.js @@ -148,32 +148,6 @@ describe('Settings Search', function () { }, ); }); - it('should find element inside the Networks tab', async function () { - await withFixtures( - { - fixtures: new FixtureBuilder().build(), - ganacheOptions: defaultGanacheOptions, - title: this.test.fullTitle(), - }, - async ({ driver }) => { - await unlockWallet(driver); - - await openMenuSafe(driver); - - await driver.clickElement({ text: 'Settings', tag: 'div' }); - await driver.fill('#search-settings', settingsSearch.networks); - - // Check if element redirects to the correct page - const page = 'Networks'; - await driver.clickElement({ text: page, tag: 'span' }); - assert.equal( - await driver.isElementPresent({ text: page, tag: 'div' }), - true, - `${settingsSearch.networks} item does not redirect to ${page} view`, - ); - }, - ); - }); it('should find element inside the Experimental tab', async function () { await withFixtures( { diff --git a/test/integration/data/integration-init-state.json b/test/integration/data/integration-init-state.json index 212ea5702868..b031611a06ea 100644 --- a/test/integration/data/integration-init-state.json +++ b/test/integration/data/integration-init-state.json @@ -655,28 +655,54 @@ } } }, - "networkConfigurations": { - "testNetworkConfigurationId": { + "networkConfigurationsByChainId": { + "0x1": { "chainId": "0x1", - "id": "testNetworkConfigurationId", - "nickname": "Custom Mainnet RPC", - "rpcUrl": "https://testrpc.com", - "ticker": "ETH", - "type": "rpc" + "rpcEndpoints": [ + { + "networkClientId": "testNetworkConfigurationId", + "url": "https://testrpc.com", + "type": "custom", + "name": "Custom Mainnet RPC" + } + ], + "defaultRpcEndpointIndex": 0, + "blockExplorerUrls": [], + "defaultBlockExplorerUrlIndex": 0, + "name": "Custom Mainnet RPC", + "nativeCurrency": "ETH" }, - "goerli-network-id": { + "0x5": { "chainId": "0x5", - "id": "goerli-network-id", - "nickname": "Chain 5", - "ticker": "ETH", - "type": "rpc" + "rpcEndpoints": [ + { + "networkClientId": "goerli-network-id", + "url": "https://testrpc2.com", + "type": "custom", + "name": "Chain 5" + } + ], + "defaultRpcEndpointIndex": 0, + "blockExplorerUrls": [], + "defaultBlockExplorerUrlIndex": 0, + "name": "Chain 5", + "nativeCurrency": "ETH" }, - "sepolia": { - "type": "rpc", + "0xaa36a7": { "chainId": "0xaa36a7", - "ticker": "ETH", - "nickname": "Sepolia", - "id": "sepolia" + "rpcEndpoints": [ + { + "networkClientId": "sepolia", + "url": "https://sepolia.infura.io/v3/{infuraProjectId}", + "type": "infura", + "name": "Sepolia" + } + ], + "defaultRpcEndpointIndex": 0, + "blockExplorerUrls": ["https://sepolia.etherscan.io"], + "defaultBlockExplorerUrlIndex": 0, + "name": "Sepolia", + "nativeCurrency": "SepoliaETH" } }, "networksMetadata": { @@ -763,13 +789,6 @@ "preventPollingOnNetworkRestart": true, "previousAppVersion": "11.14.4", "previousMigrationVersion": 112, - "providerConfig": { - "type": "sepolia", - "nickname": "sepolia", - "chainId": "0xaa36a7", - "ticker": "ETH", - "id": "sepolia" - }, "securityAlertsEnabled": true, "seedPhraseBackedUp": true, "selectedAddress": "0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc", @@ -2038,7 +2057,7 @@ "useTransactionSimulations": true, "usedNetworks": { "0xaa36a7": { - "rpcUrl": "https://sepolia.infura.io/v3/8f8f7f9f6f4c4f3e8f8f7f9f6f4c4f3e", + "rpcUrl": "https://sepolia.infura.io/v3/dummy_key", "chainId": "0xaa36a7", "nickname": "Sepolia Test Network", "ticker": "ETH", diff --git a/test/integration/data/onboarding-completion-route.json b/test/integration/data/onboarding-completion-route.json index 1b2379af3a47..06d85e298409 100644 --- a/test/integration/data/onboarding-completion-route.json +++ b/test/integration/data/onboarding-completion-route.json @@ -182,7 +182,24 @@ } } }, - "networkConfigurations": {}, + "networkConfigurationsByChainId": { + "0xaa36a7": { + "chainId": "0xaa36a7", + "rpcEndpoints": [ + { + "networkClientId": "sepolia", + "url": "https://sepolia.infura.io/v3/{infuraProjectId}", + "type": "infura", + "name": "Sepolia" + } + ], + "defaultRpcEndpointIndex": 0, + "blockExplorerUrls": ["https://sepolia.etherscan.io"], + "defaultBlockExplorerUrlIndex": 0, + "name": "Sepolia", + "nativeCurrency": "SepoliaETH" + } + }, "networksMetadata": { "sepolia": { "status": "unknown", "EIPS": {} } }, "nextNonce": null, "nftsDetectionNoticeDismissed": false, diff --git a/test/jest/mock-store.js b/test/jest/mock-store.js index e61ae0fdce81..625b6dcf6c83 100644 --- a/test/jest/mock-store.js +++ b/test/jest/mock-store.js @@ -138,6 +138,7 @@ export const createSwapsMockStore = () => { preferences: { showFiatInTestnets: true, smartTransactionsOptInStatus: true, + showMultiRpcModal: false, }, transactions: [ { @@ -364,7 +365,9 @@ export const createSwapsMockStore = () => { ticker: CURRENCY_SYMBOLS.ETH, rpcUrl: 'https://mainnet.infura.io/v3/', blockExplorerUrl: 'https://etherscan.io', + id: 'mainnet', }), + selectedNetworkClientId: 'mainnet', tokens: [ { erc20: true, @@ -674,6 +677,10 @@ export const createBridgeMockStore = ( ...featureFlagOverrides, }, }, + ...mockNetworkState( + { chainId: CHAIN_IDS.MAINNET }, + { chainId: CHAIN_IDS.LINEA_MAINNET }, + ), }, }; }; diff --git a/test/stub/networks.ts b/test/stub/networks.ts index fe58a0dfe285..bae4798d001f 100644 --- a/test/stub/networks.ts +++ b/test/stub/networks.ts @@ -2,6 +2,7 @@ import { NetworkMetadata, NetworkState, NetworkStatus, + RpcEndpointType, } from '@metamask/network-controller'; import { v4 as uuidv4 } from 'uuid'; import { Hex } from '@metamask/utils'; @@ -10,7 +11,9 @@ import { CHAIN_ID_TO_CURRENCY_SYMBOL_MAP, } from '../../shared/constants/network'; -export const mockNetworkState = ( +// TODO: This is intentionally the old network state, and could be +// removed if the e2e tests bump `FIXTURE_STATE_METADATA_VERSION` to >= 127 +export const mockNetworkStateOld = ( ...networks: { id?: string; type?: string; @@ -21,7 +24,7 @@ export const mockNetworkState = ( blockExplorerUrl?: string; metadata?: NetworkMetadata; }[] -): NetworkState => { +) => { const networkConfigurations = networks.map((network) => ({ id: network.id ?? uuidv4(), chainId: network.chainId, @@ -68,3 +71,80 @@ export const mockNetworkState = ( networksMetadata, }; }; + +export const mockNetworkState = ( + ...networks: { + id?: string; + chainId: Hex; + rpcUrl?: string; + nickname?: string; + ticker?: string; + blockExplorerUrl?: string; + metadata?: NetworkMetadata; + }[] +): NetworkState => { + if ( + new Set(networks.map((network) => network.chainId)).size !== networks.length + ) { + throw 'mockNetworkState doesnt currently support multiple rpc urls per chain id'; + } + + const networkConfigurations = networks.map((network) => { + const blockExplorer = + !('blockExplorerUrl' in network) || network.blockExplorerUrl + ? network.blockExplorerUrl ?? + `https://localhost/blockExplorer/${network.chainId}` + : undefined; + + const rpc = + 'rpcUrl' in network + ? network.rpcUrl + : `https://localhost/rpc/${network.chainId}`; + + return { + chainId: network.chainId, + blockExplorerUrls: blockExplorer ? [blockExplorer] : [], + defaultBlockExplorerUrlIndex: blockExplorer ? 0 : undefined, + rpcEndpoints: [ + { + networkClientId: network.id ?? uuidv4(), + type: RpcEndpointType.Custom, + url: rpc, + }, + ], + defaultRpcEndpointIndex: 0, + name: + 'nickname' in network + ? network.nickname + : (NETWORK_TO_NAME_MAP as Record)[network.chainId], + nativeCurrency: + 'ticker' in network + ? network.ticker + : (CHAIN_ID_TO_CURRENCY_SYMBOL_MAP as Record)[ + network.chainId + ], + }; + }); + + const networksMetadata = networks.reduce( + (acc, network, i) => ({ + ...acc, + [networkConfigurations[i].rpcEndpoints[0].networkClientId]: + network.metadata ?? { + EIPS: {}, + status: NetworkStatus.Available, + }, + }), + {}, + ); + + return { + selectedNetworkClientId: + networkConfigurations[0].rpcEndpoints[0].networkClientId, + networkConfigurationsByChainId: networkConfigurations.reduce( + (acc, network) => ({ ...acc, [network.chainId]: network }), + {}, + ), + networksMetadata, + }; +}; diff --git a/ui/components/app/add-network/add-network.js b/ui/components/app/add-network/add-network.js deleted file mode 100644 index a8a2bd5dc7bf..000000000000 --- a/ui/components/app/add-network/add-network.js +++ /dev/null @@ -1,324 +0,0 @@ -import React, { useContext, useEffect, useState } from 'react'; -import { useDispatch, useSelector } from 'react-redux'; -import { useHistory } from 'react-router-dom'; -import { ApprovalType } from '@metamask/controller-utils'; -import { I18nContext } from '../../../contexts/i18n'; -import Box from '../../ui/box'; -import { - AlignItems, - Display, - FlexDirection, - TextVariant, - JustifyContent, - BorderRadius, - BackgroundColor, - TextColor, - IconColor, -} from '../../../helpers/constants/design-system'; -import Button from '../../ui/button'; -import Tooltip from '../../ui/tooltip'; -import { - getNetworkConfigurations, - getUnapprovedConfirmations, -} from '../../../selectors'; - -import { - ENVIRONMENT_TYPE_FULLSCREEN, - ENVIRONMENT_TYPE_POPUP, - ORIGIN_METAMASK, -} from '../../../../shared/constants/app'; -import { requestUserApproval } from '../../../store/actions'; -import Popover from '../../ui/popover'; -import ConfirmationPage from '../../../pages/confirmations/confirmation/confirmation'; -import { FEATURED_RPCS } from '../../../../shared/constants/network'; -import { ADD_NETWORK_ROUTE } from '../../../helpers/constants/routes'; -import { getEnvironmentType } from '../../../../app/scripts/lib/util'; -import ZENDESK_URLS from '../../../helpers/constants/zendesk-url'; -import { - Icon, - IconName, - IconSize, - AvatarNetwork, - AvatarNetworkSize, - Text, -} from '../../component-library'; -import { MetaMetricsNetworkEventSource } from '../../../../shared/constants/metametrics'; - -const AddNetwork = () => { - const t = useContext(I18nContext); - const dispatch = useDispatch(); - const history = useHistory(); - const networkConfigurations = useSelector(getNetworkConfigurations); - - const networkConfigurationChainIds = Object.values(networkConfigurations).map( - (net) => net.chainId, - ); - - const infuraRegex = /infura.io/u; - - const nets = FEATURED_RPCS.sort((a, b) => - a.nickname > b.nickname ? 1 : -1, - ).slice(0, FEATURED_RPCS.length); - - const notExistingNetworkConfigurations = nets.filter( - (net) => networkConfigurationChainIds.indexOf(net.chainId) === -1, - ); - const unapprovedConfirmations = useSelector(getUnapprovedConfirmations); - const [showPopover, setShowPopover] = useState(false); - - useEffect(() => { - const anAddNetworkConfirmationFromMetaMaskExists = - unapprovedConfirmations?.find((confirmation) => { - return ( - confirmation.origin === 'metamask' && - confirmation.type === ApprovalType.AddEthereumChain - ); - }); - if (!showPopover && anAddNetworkConfirmationFromMetaMaskExists) { - setShowPopover(true); - } - - if (showPopover && !anAddNetworkConfirmationFromMetaMaskExists) { - setShowPopover(false); - } - }, [unapprovedConfirmations, showPopover]); - - return ( - <> - {Object.keys(notExistingNetworkConfigurations).length === 0 ? ( - - - - - - - {t('youHaveAddedAll', [ - - {t('here')}. - , - , - ])} - - - - ) : ( - - {getEnvironmentType() === ENVIRONMENT_TYPE_FULLSCREEN && ( - - - {t('networks')} - - {' > '} - - {t('addANetwork')} - - - )} - - - {t('addFromAListOfPopularNetworks')} - - - {t('popularCustomNetworks')} - - {notExistingNetworkConfigurations.map((item, index) => ( - - - - - - {item.nickname} - - - - - { - // Warning for the networks that doesn't use infura.io as the RPC - !infuraRegex.test(item.rpcUrl) && ( - - {t('addNetworkTooltipWarning', [ - - {t('learnMoreUpperCase')} - , - ])} - - } - trigger="mouseenter" - > - - - ) - } - - - - ))} - - - - - - )} - {showPopover && ( - - - - )} - - ); -}; - -export default AddNetwork; diff --git a/ui/components/app/add-network/add-network.stories.js b/ui/components/app/add-network/add-network.stories.js deleted file mode 100644 index 76d10b569d23..000000000000 --- a/ui/components/app/add-network/add-network.stories.js +++ /dev/null @@ -1,115 +0,0 @@ -import React from 'react'; -import AddNetwork from './add-network'; - -const POL_TOKEN_IMAGE_URL = './images/pol-token.svg'; -const ARBITRUM_IMAGE_URL = './images/arbitrum.svg'; -const OPTIMISM_IMAGE_URL = './images/optimism.svg'; -const AVALANCHE_IMAGE_URL = './images/avax-token.svg'; -const PALM_IMAGE_URL = './images/palm.svg'; -const BSC_IMAGE_URL = './images/bsc-filled.svg'; - -export default { - title: 'Components/App/AddNetwork', - argTypes: { - onBackClick: { - action: 'onBackClick', - }, - onAddNetworkClick: { - action: 'onAddNetworkClick', - }, - onAddNetworkManuallyClick: { - action: 'onAddNetworkManuallyClick', - }, - featuredRPCS: { - control: 'array', - }, - }, - args: { - featuredRPCS: [ - { - chainId: '42161', - nickname: 'Arbitrum One', - rpcUrl: 'https://arbitrum-mainnet.infura.io/v3/{INFURA_API_KEY}', - ticker: 'AETH', - rpcPrefs: { - blockExplorerUrl: 'https://explorer.arbitrum.io', - imageUrl: ARBITRUM_IMAGE_URL, - }, - }, - { - chainId: '43114', - nickname: 'Avalanche Mainnet C-Chain', - rpcUrl: 'https://api.avax.network/ext/bc/C/rpc', - ticker: 'AVAX', - rpcPrefs: { - blockExplorerUrl: 'https://snowtrace.io/', - imageUrl: AVALANCHE_IMAGE_URL, - }, - }, - { - chainId: '56', - nickname: 'BNB Smart Chain', - rpcUrl: 'https://bsc-dataseed.binance.org/', - ticker: 'BNB', - rpcPrefs: { - blockExplorerUrl: 'https://bscscan.com/', - imageUrl: BSC_IMAGE_URL, - }, - }, - { - chainId: '250', - nickname: 'Fantom Opera', - rpcUrl: 'https://rpc.ftm.tools/', - ticker: 'FTM', - rpcPrefs: { - blockExplorerUrl: 'https://ftmscan.com/', - imageUrl: '', - }, - }, - { - chainId: '1666600000', - nickname: 'Harmony Mainnet Shard 0', - rpcUrl: 'https://api.harmony.one/', - ticker: 'ONE', - rpcPrefs: { - blockExplorerUrl: 'https://explorer.harmony.one/', - imageUrl: '', - }, - }, - { - chainId: '10', - nickname: 'Optimism', - rpcUrl: 'https://optimism-mainnet.infura.io/v3/{INFURA_API_KEY}', - ticker: 'KOR', - rpcPrefs: { - blockExplorerUrl: 'https://optimistic.etherscan.io/', - imageUrl: OPTIMISM_IMAGE_URL, - }, - }, - { - chainId: '137', - nickname: 'Polygon Mainnet', - rpcUrl: 'https://polygon-mainnet.infura.io/v3/{INFURA_API_KEY}', - ticker: 'MATIC', - rpcPrefs: { - blockExplorerUrl: 'https://polygonscan.com/', - imageUrl: POL_TOKEN_IMAGE_URL, - }, - }, - { - chainId: '11297108109', - nickname: 'Palm', - rpcUrl: 'https://palm-mainnet.infura.io/v3/{INFURA_API_KEY}', - ticker: 'PALM', - rpcPrefs: { - blockExplorerUrl: 'https://explorer.palm.io/', - imageUrl: PALM_IMAGE_URL, - }, - }, - ], - }, -}; - -export const DefaultStory = (args) => ; - -DefaultStory.storyName = 'Default'; diff --git a/ui/components/app/add-network/add-network.test.js b/ui/components/app/add-network/add-network.test.js deleted file mode 100644 index f3084b1db065..000000000000 --- a/ui/components/app/add-network/add-network.test.js +++ /dev/null @@ -1,66 +0,0 @@ -import React from 'react'; -import { screen } from '@testing-library/react'; -import { renderWithProvider } from '../../../../test/jest'; -import configureStore from '../../../store/store'; -import mockState from '../../../../test/data/mock-state.json'; -import AddNetwork from './add-network'; - -jest.mock('../../../selectors', () => ({ - ...jest.requireActual('../../../selectors'), - getNetworkConfigurations: () => ({ - networkConfigurationId: { - chainId: '0x539', - nickname: 'Localhost 8545', - rpcPrefs: {}, - rpcUrl: 'http://localhost:8545', - ticker: 'ETH', - }, - networkConfigurationId2: { - chainId: '0xA4B1', - nickname: 'Arbitrum One', - rpcPrefs: { blockExplorerUrl: 'https://explorer.arbitrum.io' }, - rpcUrl: - 'https://arbitrum-mainnet.infura.io/v3/7e127583378c4732a858df2550aff333', - ticker: 'AETH', - }, - }), - getUnapprovedConfirmations: jest.fn(), - getTheme: () => 'light', -})); - -jest.mock( - '../../../pages/confirmations/components/simulation-details/useBalanceChanges', - () => ({ - useBalanceChanges: jest.fn(), - }), -); - -const render = () => { - const store = configureStore({ - metamask: { - ...mockState.metamask, - }, - }); - return renderWithProvider(, store); -}; - -describe('AddNetwork', () => { - it('should show Add from a list.. text', () => { - render(); - expect( - screen.getByText( - 'Add from a list of popular networks or add a network manually. Only interact with the entities you trust.', - ), - ).toBeInTheDocument(); - }); - - it('should show Popular custom networks text', () => { - render(); - expect(screen.getByText('Popular custom networks')).toBeInTheDocument(); - }); - - it('should show Arbitrum One network nickname', () => { - render(); - expect(screen.getByText('Arbitrum One')).toBeInTheDocument(); - }); -}); diff --git a/ui/components/app/add-network/index.js b/ui/components/app/add-network/index.js deleted file mode 100644 index 8727c8809582..000000000000 --- a/ui/components/app/add-network/index.js +++ /dev/null @@ -1 +0,0 @@ -export { default } from './add-network'; diff --git a/ui/components/app/add-network/index.scss b/ui/components/app/add-network/index.scss deleted file mode 100644 index 35b620d8e2bf..000000000000 --- a/ui/components/app/add-network/index.scss +++ /dev/null @@ -1,94 +0,0 @@ -@use "design-system"; - -.add-network { - &__networks-container { - padding-inline-end: 24px; - - @include design-system.screen-sm-max { - padding: 0; - } - } - - &__header { - border-bottom: 1px solid var(--color-border-default); - - @include design-system.screen-sm-max { - padding-inline-start: 24px; - padding-inline-end: 24px; - } - - &__subtitle { - margin-inline-start: 10px; - margin-inline-end: 10px; - } - } - - &__main-container { - @include design-system.screen-sm-max { - padding-inline-start: 24px; - padding-inline-end: 24px; - } - } - - &__list-of-networks { - @include design-system.screen-sm-min { - width: 75%; - } - } - - &__warning-tooltip { - color: var(--color-text-alternative); - width: 180px; - - a { - color: var(--color-primary-default); - } - } - - &__add-icon { - color: var(--color-text-alternative); - margin-inline-start: auto; - margin-inline-end: 0; - cursor: pointer; - } - - &__add-button.button { - color: var(--color-primary-default); - font-size: design-system.$font-size-h7; - margin-inline-start: 24px; - } - - &__footer { - border-top: 1px solid var(--color-border-muted); - width: 100%; - padding-bottom: 8px; - - @include design-system.screen-sm-max { - padding-inline-start: 24px !important; - } - - & .btn-link { - display: initial; - padding: 0; - } - - &__link { - color: var(--color-primary-default); - } - - & .actionable-message--warning .actionable-message__message, - .actionable-message--warning .actionable-message__action { - color: var(--color-text-alternative); - } - } - - &__edge-case-box { - border: 1px solid var(--color-border-muted); - - &__link { - color: var(--color-info-default); - display: inline; - padding: 0; - } - } -} diff --git a/ui/components/app/app-components.scss b/ui/components/app/app-components.scss index c5083af45104..d7d07b9afb55 100644 --- a/ui/components/app/app-components.scss +++ b/ui/components/app/app-components.scss @@ -1,6 +1,5 @@ /** Please import your files in alphabetical order **/ @import 'account-list-item/index'; -@import 'add-network/index'; @import 'app-loading-spinner/index'; @import 'alerts/alerts'; @import 'beta-header/index'; diff --git a/ui/components/app/assets/nfts/nft-details/__snapshots__/nft-details.test.js.snap b/ui/components/app/assets/nfts/nft-details/__snapshots__/nft-details.test.js.snap index 0a025bc47ff0..22c5342d2026 100644 --- a/ui/components/app/assets/nfts/nft-details/__snapshots__/nft-details.test.js.snap +++ b/ui/components/app/assets/nfts/nft-details/__snapshots__/nft-details.test.js.snap @@ -69,7 +69,7 @@ exports[`NFT Details should match minimal props and state snapshot 1`] = ` class="mm-box mm-text mm-avatar-base mm-avatar-base--size-sm mm-avatar-network nft-item__network-badge mm-text--body-sm mm-text--text-transform-uppercase mm-box--display-flex mm-box--justify-content-center mm-box--align-items-center mm-box--color-text-default mm-box--background-color-background-alternative mm-box--rounded-full mm-box--border-color-background-default mm-box--border-width-2 box--border-style-solid" data-testid="nft-network-badge" > - C + G @@ -247,7 +247,7 @@ exports[`NFT Details should match minimal props and state snapshot 2`] = ` class="mm-box mm-text mm-avatar-base mm-avatar-base--size-sm mm-avatar-network nft-item__network-badge mm-text--body-sm mm-text--text-transform-uppercase mm-box--display-flex mm-box--justify-content-center mm-box--align-items-center mm-box--color-text-default mm-box--background-color-background-alternative mm-box--rounded-full mm-box--border-color-background-default mm-box--border-width-2 box--border-style-solid" data-testid="nft-network-badge" > - C + G diff --git a/ui/components/app/assets/nfts/nft-details/__snapshots__/nft-full-image.test.js.snap b/ui/components/app/assets/nfts/nft-details/__snapshots__/nft-full-image.test.js.snap index dfedee737c93..086754f9b489 100644 --- a/ui/components/app/assets/nfts/nft-details/__snapshots__/nft-full-image.test.js.snap +++ b/ui/components/app/assets/nfts/nft-details/__snapshots__/nft-full-image.test.js.snap @@ -67,7 +67,7 @@ exports[`NFT full image should match snapshot 1`] = ` class="mm-box mm-text mm-avatar-base mm-avatar-base--size-sm mm-avatar-network nft-item__network-badge mm-text--body-sm mm-text--text-transform-uppercase mm-box--display-flex mm-box--justify-content-center mm-box--align-items-center mm-box--color-text-default mm-box--background-color-background-alternative mm-box--rounded-full mm-box--border-color-background-default mm-box--border-width-2 box--border-style-solid" data-testid="nft-network-badge" > - C + G diff --git a/ui/components/app/assets/nfts/nfts-items/nfts-items.stories.tsx b/ui/components/app/assets/nfts/nfts-items/nfts-items.stories.tsx index 62aa3b1bf906..f13af8c13ea4 100644 --- a/ui/components/app/assets/nfts/nfts-items/nfts-items.stories.tsx +++ b/ui/components/app/assets/nfts/nfts-items/nfts-items.stories.tsx @@ -4,6 +4,9 @@ import configureStore from 'redux-mock-store'; import thunk from 'redux-thunk'; import type { Meta, StoryObj } from '@storybook/react'; import NftsItems from './nfts-items'; +import { mockNetworkState } from '../../../../../../test/stub/networks'; +import { CHAIN_IDS } from '../../../../../../shared/constants/network'; + // Custom middleware to ensure actions are plain objects const ensurePlainObjectMiddleware = () => (next) => (action) => { @@ -73,30 +76,7 @@ const createMockState = () => ({ network: '1', nftContracts: [], nfts: [], - providerConfig: { - type: 'mainnet', - chainId: '0x1', - nickname: 'Ethereum Mainnet', - ticker: 'ETH', - rpcUrl: 'https://mainnet.infura.io/v3/', - rpcPrefs: { - blockExplorerUrl: 'https://etherscan.io', - }, - }, - networksMetadata: { - '1': { - status: 'available', - }, - }, - selectedNetworkClientId: '1', - networkConfigurations: { - '1': { - chainId: '0x1', - nickname: 'Ethereum Mainnet', - ticker: 'ETH', - rpcUrl: 'https://mainnet.infura.io/v3/', - }, - }, + ...mockNetworkState({ chainId: CHAIN_IDS.MAINNET }), useRequestQueue: true, }, appState: { diff --git a/ui/components/app/incoming-trasaction-toggle/__snapshots__/incoming-transaction-toggle.test.js.snap b/ui/components/app/incoming-trasaction-toggle/__snapshots__/incoming-transaction-toggle.test.js.snap index faf8faf6dedf..27ee8bbf6b69 100644 --- a/ui/components/app/incoming-trasaction-toggle/__snapshots__/incoming-transaction-toggle.test.js.snap +++ b/ui/components/app/incoming-trasaction-toggle/__snapshots__/incoming-transaction-toggle.test.js.snap @@ -199,7 +199,11 @@ exports[`IncomingTransactionToggle should render existing incoming transaction p

- F + FANTOM logo
= () => { setIncomingTransactionsPreferences={(chainId, value) => { console.log(chainId, value); }} - allNetworks={ALL_NETWORKS_DATA} + networkConfigurations={ + ALL_NETWORKS_DATA as unknown as Record + } incomingTransactionsPreferences={INCOMING_DATA} /> ); diff --git a/ui/components/app/incoming-trasaction-toggle/incoming-transaction-toggle.test.js b/ui/components/app/incoming-trasaction-toggle/incoming-transaction-toggle.test.js index a0f8e4ed4f69..eab43bcc7113 100644 --- a/ui/components/app/incoming-trasaction-toggle/incoming-transaction-toggle.test.js +++ b/ui/components/app/incoming-trasaction-toggle/incoming-transaction-toggle.test.js @@ -25,7 +25,7 @@ describe('IncomingTransactionToggle', () => { setIncomingTransactionsPreferences={ setIncomingTransactionsPreferencesStub } - allNetworks={ALL_NETWORKS_DATA} + networkConfigurations={ALL_NETWORKS_DATA} incomingTransactionsPreferences={INCOMING_DATA} /> , @@ -34,31 +34,31 @@ describe('IncomingTransactionToggle', () => { expect(container).toMatchSnapshot(); const ethMainnetCheckbox = within( - getByTestId(`network-toggle-${ALL_NETWORKS_DATA[0].chainId}`), + getByTestId(`network-toggle-${ALL_NETWORKS_DATA['0x1'].chainId}`), ).getByRole('checkbox'); expect(ethMainnetCheckbox.value).toStrictEqual('true'); const lineaMainnetCheckbox = within( - getByTestId(`network-toggle-${ALL_NETWORKS_DATA[1].chainId}`), + getByTestId(`network-toggle-${ALL_NETWORKS_DATA['0xe708'].chainId}`), ).getByRole('checkbox'); expect(lineaMainnetCheckbox.value).toStrictEqual('false'); const fantomCheckbox = within( - getByTestId(`network-toggle-${ALL_NETWORKS_DATA[2].chainId}`), + getByTestId(`network-toggle-${ALL_NETWORKS_DATA['0xfa'].chainId}`), ).getByRole('checkbox'); expect(fantomCheckbox.value).toStrictEqual('true'); const goerliCheckbox = within( - getByTestId(`network-toggle-${ALL_NETWORKS_DATA[3].chainId}`), + getByTestId(`network-toggle-${ALL_NETWORKS_DATA['0x5'].chainId}`), ).getByRole('checkbox'); expect(goerliCheckbox.value).toStrictEqual('false'); const sepoliaCheckbox = within( - getByTestId(`network-toggle-${ALL_NETWORKS_DATA[4].chainId}`), + getByTestId(`network-toggle-${ALL_NETWORKS_DATA['0xaa36a7'].chainId}`), ).getByRole('checkbox'); expect(sepoliaCheckbox.value).toStrictEqual('true'); const lineaGoerliCheckbox = within( - getByTestId(`network-toggle-${ALL_NETWORKS_DATA[5].chainId}`), + getByTestId(`network-toggle-${ALL_NETWORKS_DATA['0xe704'].chainId}`), ).getByRole('checkbox'); expect(lineaGoerliCheckbox.value).toStrictEqual('true'); const lineaSepoliaCheckbox = within( - getByTestId(`network-toggle-${ALL_NETWORKS_DATA[6].chainId}`), + getByTestId(`network-toggle-${ALL_NETWORKS_DATA['0xe705'].chainId}`), ).getByRole('checkbox'); expect(lineaSepoliaCheckbox.value).toStrictEqual('true'); }); @@ -70,14 +70,14 @@ describe('IncomingTransactionToggle', () => { setIncomingTransactionsPreferences={ setIncomingTransactionsPreferencesStub } - allNetworks={ALL_NETWORKS_DATA} + networkConfigurations={ALL_NETWORKS_DATA} incomingTransactionsPreferences={INCOMING_DATA} /> , mockStore, ); const lineaMainnetCheckbox = within( - getByTestId(`network-toggle-${ALL_NETWORKS_DATA[1].chainId}`), + getByTestId(`network-toggle-${ALL_NETWORKS_DATA['0xe708'].chainId}`), ).getByRole('checkbox'); fireEvent.click(lineaMainnetCheckbox); // set 1 false to true @@ -91,7 +91,7 @@ describe('IncomingTransactionToggle', () => { // set 1 false to true const goerliCheckbox = within( - getByTestId(`network-toggle-${ALL_NETWORKS_DATA[3].chainId}`), + getByTestId(`network-toggle-${ALL_NETWORKS_DATA['0x5'].chainId}`), ).getByRole('checkbox'); fireEvent.click(goerliCheckbox); expect( diff --git a/ui/components/app/incoming-trasaction-toggle/incoming-transaction-toggle.tsx b/ui/components/app/incoming-trasaction-toggle/incoming-transaction-toggle.tsx index 3b44a56b262f..d1274075d056 100644 --- a/ui/components/app/incoming-trasaction-toggle/incoming-transaction-toggle.tsx +++ b/ui/components/app/incoming-trasaction-toggle/incoming-transaction-toggle.tsx @@ -1,6 +1,8 @@ import React, { useContext, useEffect, useState } from 'react'; import PropTypes from 'prop-types'; +import { NetworkConfiguration } from '@metamask/network-controller'; +import { Hex } from '@metamask/utils'; import { I18nContext } from '../../../contexts/i18n'; import { Box, Text } from '../../component-library'; @@ -10,7 +12,10 @@ import { } from '../../../helpers/constants/design-system'; import { PolymorphicRef } from '../../component-library/box'; -import { TEST_CHAINS } from '../../../../shared/constants/network'; +import { + CHAIN_ID_TO_NETWORK_IMAGE_URL_MAP, + TEST_CHAINS, +} from '../../../../shared/constants/network'; import NetworkToggle from './network-toggle'; type IncomingTransactionToggleProps = { @@ -18,9 +23,7 @@ type IncomingTransactionToggleProps = { // eslint-disable-next-line @typescript-eslint/no-explicit-any wrapperRef?: PolymorphicRef; incomingTransactionsPreferences: Record; - // TODO: Replace `any` with type - // eslint-disable-next-line @typescript-eslint/no-explicit-any - allNetworks: Record[]; + networkConfigurations: Record; setIncomingTransactionsPreferences: ( chainId: string, isAllEnabledValue: boolean, @@ -30,7 +33,7 @@ type IncomingTransactionToggleProps = { const IncomingTransactionToggle = ({ wrapperRef, incomingTransactionsPreferences, - allNetworks, + networkConfigurations, setIncomingTransactionsPreferences, }: IncomingTransactionToggleProps) => { const t = useContext(I18nContext); @@ -38,7 +41,7 @@ const IncomingTransactionToggle = ({ const [networkPreferences, setNetworkPreferences] = useState( generateIncomingNetworkPreferences( incomingTransactionsPreferences, - allNetworks, + networkConfigurations, ), ); @@ -46,10 +49,10 @@ const IncomingTransactionToggle = ({ setNetworkPreferences( generateIncomingNetworkPreferences( incomingTransactionsPreferences, - allNetworks, + networkConfigurations, ), ); - }, [incomingTransactionsPreferences, allNetworks]); + }, [incomingTransactionsPreferences, networkConfigurations]); const toggleSingleNetwork = (chainId: string, value: boolean): void => { setIncomingTransactionsPreferences(chainId, value); @@ -80,15 +83,13 @@ export default IncomingTransactionToggle; IncomingTransactionToggle.propTypes = { wrapperRef: PropTypes.object, incomingTransactionsPreferences: PropTypes.object.isRequired, - allNetworks: PropTypes.array.isRequired, + networkConfigurations: PropTypes.object.isRequired, setIncomingTransactionsPreferences: PropTypes.func.isRequired, }; function generateIncomingNetworkPreferences( incomingTransactionsPreferences: Record, - // TODO: Replace `any` with type - // eslint-disable-next-line @typescript-eslint/no-explicit-any - allNetworks: Record, + networkConfigurations: Record, // TODO: Replace `any` with type // eslint-disable-next-line @typescript-eslint/no-explicit-any ): Record { @@ -96,13 +97,18 @@ function generateIncomingNetworkPreferences( // eslint-disable-next-line @typescript-eslint/no-explicit-any const incomingTxnPreferences: Record = {}; - Object.keys(allNetworks).forEach((id) => { - const { chainId } = allNetworks[id]; - incomingTxnPreferences[chainId] = { - isShowIncomingTransactions: incomingTransactionsPreferences[chainId], - isATestNetwork: TEST_CHAINS.includes(chainId), - label: allNetworks[id].nickname, - imageUrl: allNetworks[id].rpcPrefs?.imageUrl, + Object.values(networkConfigurations).forEach((network) => { + incomingTxnPreferences[network.chainId] = { + isShowIncomingTransactions: + incomingTransactionsPreferences[network.chainId], + isATestNetwork: TEST_CHAINS.includes( + network.chainId as (typeof TEST_CHAINS)[number], + ), + label: network.name, + imageUrl: + CHAIN_ID_TO_NETWORK_IMAGE_URL_MAP[ + network.chainId as keyof typeof CHAIN_ID_TO_NETWORK_IMAGE_URL_MAP + ], }; }); diff --git a/ui/components/app/incoming-trasaction-toggle/mock-data.ts b/ui/components/app/incoming-trasaction-toggle/mock-data.ts index 3e048c9c026e..29a704c7ce3c 100644 --- a/ui/components/app/incoming-trasaction-toggle/mock-data.ts +++ b/ui/components/app/incoming-trasaction-toggle/mock-data.ts @@ -1,80 +1,89 @@ -export const ALL_NETWORKS_DATA = [ - { +export const ALL_NETWORKS_DATA = { + '0x1': { + nativeCurrency: 'ETH', chainId: '0x1', - nickname: 'Ethereum Mainnet', - rpcUrl: 'https://mainnet.infura.io/v3/6c21df2a8dcb4a77b9bbcc1b65ee9ded', - rpcPrefs: { - imageUrl: './images/eth_logo.svg', - }, - providerType: 'mainnet', - ticker: 'ETH', - id: 'mainnet', - removable: false, + defaultRpcEndpointIndex: 0, + name: 'Ethereum Mainnet', + blockExplorerUrls: [], + rpcEndpoints: [ + { + networkClientId: 'mainnet', + }, + ], }, - { + '0xe708': { + nativeCurrency: 'ETH', chainId: '0xe708', - nickname: 'Linea Mainnet', - rpcUrl: - 'https://linea-mainnet.infura.io/v3/6c21df2a8dcb4a77b9bbcc1b65ee9ded', - rpcPrefs: { - imageUrl: './images/linea-logo-mainnet.svg', - }, - providerType: 'linea-mainnet', - id: 'linea-mainnet', - removable: false, + defaultRpcEndpointIndex: 0, + name: 'Linea Mainnet', + blockExplorerUrls: [], + rpcEndpoints: [ + { + networkClientId: 'linea-mainnet', + }, + ], }, - { + '0xfa': { + nativeCurrency: 'FTM', chainId: '0xfa', - nickname: 'FANTOM', - rpcPrefs: {}, - rpcUrl: 'http://ftmscan.com5', - ticker: 'FTM', + defaultRpcEndpointIndex: 0, + name: 'FANTOM', + blockExplorerUrls: [], + rpcEndpoints: [ + { + networkClientId: 'fantom-network-client-id', + }, + ], }, - { + '0x5': { + nativeCurrency: 'GoerliETH', chainId: '0x5', - nickname: 'Goerli', - rpcUrl: 'https://goerli.infura.io/v3/6c21df2a8dcb4a77b9bbcc1b65ee9ded', - providerType: 'goerli', - ticker: 'GoerliETH', - id: 'goerli', - removable: false, + defaultRpcEndpointIndex: 0, + name: 'Goerli', + blockExplorerUrls: [], + rpcEndpoints: [ + { + networkClientId: 'goerli', + }, + ], }, - { + '0xaa36a7': { + nativeCurrency: 'SepoliaETH', chainId: '0xaa36a7', - nickname: 'Sepolia', - rpcUrl: 'https://sepolia.infura.io/v3/6c21df2a8dcb4a77b9bbcc1b65ee9ded', - providerType: 'sepolia', - ticker: 'SepoliaETH', - id: 'sepolia', - removable: false, + name: 'Sepolia', + blockExplorerUrls: [], + defaultRpcEndpointIndex: 0, + rpcEndpoints: [ + { + networkClientId: 'sepolia', + }, + ], }, - { + '0xe704': { + nativeCurrency: 'LineaETH', chainId: '0xe704', - nickname: 'Linea Goerli', - rpcUrl: - 'https://linea-goerli.infura.io/v3/6c21df2a8dcb4a77b9bbcc1b65ee9ded', - rpcPrefs: { - imageUrl: './images/linea-logo-testnet.png', - }, - providerType: 'linea-goerli', - ticker: 'LineaETH', - id: 'linea-goerli', - removable: false, + name: 'Linea Goerli', + blockExplorerUrls: [], + defaultRpcEndpointIndex: 0, + rpcEndpoints: [ + { + networkClientId: 'linea-goerli', + }, + ], }, - { + '0xe705': { + nativeCurrency: 'LineaETH', chainId: '0xe705', - nickname: 'Linea Sepolia', - rpcUrl: - 'https://linea-sepolia.infura.io/v3/6c21df2a8dcb4a77b9bbcc1b65ee9ded', - rpcPrefs: { - imageUrl: './images/linea-logo-testnet.png', - }, - providerType: 'linea-sepolia', - ticker: 'LineaETH', - id: 'linea-sepolia', - removable: false, + name: 'Linea Sepolia', + blockExplorerUrls: [], + defaultRpcEndpointIndex: 0, + rpcEndpoints: [ + { + networkClientId: 'linea-sepolia', + }, + ], }, -]; +}; export const INCOMING_DATA = { '0x1': true, diff --git a/ui/components/app/loading-network-screen/loading-network-screen.container.js b/ui/components/app/loading-network-screen/loading-network-screen.container.js index dd671f8d3261..34a626bc1b5e 100644 --- a/ui/components/app/loading-network-screen/loading-network-screen.container.js +++ b/ui/components/app/loading-network-screen/loading-network-screen.container.js @@ -30,11 +30,9 @@ const mapStateToProps = (state) => { let networkName = nickname; if (networkName === undefined) { const networks = getAllEnabledNetworks(state); - const desiredNetwork = networks.find( - (network) => network.chainId === chainId, - ); + const desiredNetwork = networks[chainId]; if (desiredNetwork) { - networkName = desiredNetwork.nickname; + networkName = desiredNetwork.name; } } diff --git a/ui/components/app/modals/confirm-delete-network/confirm-delete-network.component.js b/ui/components/app/modals/confirm-delete-network/confirm-delete-network.component.js index a898488591e7..341e9a29f2c6 100644 --- a/ui/components/app/modals/confirm-delete-network/confirm-delete-network.component.js +++ b/ui/components/app/modals/confirm-delete-network/confirm-delete-network.component.js @@ -5,10 +5,10 @@ import Modal, { ModalContent } from '../../modal'; export default class ConfirmDeleteNetwork extends PureComponent { static propTypes = { hideModal: PropTypes.func.isRequired, - removeNetworkConfiguration: PropTypes.func.isRequired, + removeNetwork: PropTypes.func.isRequired, onConfirm: PropTypes.func.isRequired, - target: PropTypes.string.isRequired, networkNickname: PropTypes.string.isRequired, + chainId: PropTypes.string.isRequired, }; static contextTypes = { @@ -16,7 +16,7 @@ export default class ConfirmDeleteNetwork extends PureComponent { }; handleDelete = async () => { - await this.props.removeNetworkConfiguration(this.props.target); + await this.props.removeNetwork(this.props.chainId); this.props.onConfirm(); this.props.hideModal(); }; diff --git a/ui/components/app/modals/confirm-delete-network/confirm-delete-network.container.js b/ui/components/app/modals/confirm-delete-network/confirm-delete-network.container.js index 5ee9ff4e2087..ac4c444692d2 100644 --- a/ui/components/app/modals/confirm-delete-network/confirm-delete-network.container.js +++ b/ui/components/app/modals/confirm-delete-network/confirm-delete-network.container.js @@ -1,21 +1,21 @@ import { connect } from 'react-redux'; import { compose } from 'redux'; import withModalProps from '../../../../helpers/higher-order-components/with-modal-props'; -import { removeNetworkConfiguration } from '../../../../store/actions'; -import { getNetworkConfigurations } from '../../../../selectors'; +import { removeNetwork } from '../../../../store/actions'; +import { getNetworkConfigurationsByChainId } from '../../../../selectors'; import ConfirmDeleteNetwork from './confirm-delete-network.component'; const mapStateToProps = (state, ownProps) => { - const networkConfigurations = getNetworkConfigurations(state); - const networkNickname = networkConfigurations[ownProps.target].nickname; - - return { networkNickname }; + const networks = getNetworkConfigurationsByChainId(state); + const { chainId, name: networkNickname } = networks[ownProps.target]; + return { chainId, networkNickname }; }; const mapDispatchToProps = (dispatch) => { return { - removeNetworkConfiguration: (target) => - dispatch(removeNetworkConfiguration(target)), + removeNetwork: (chainId) => { + dispatch(removeNetwork(chainId)); + }, }; }; diff --git a/ui/components/app/modals/confirm-delete-network/confirm-delete-network.test.js b/ui/components/app/modals/confirm-delete-network/confirm-delete-network.test.js index 467171181dac..7bae50d2b188 100644 --- a/ui/components/app/modals/confirm-delete-network/confirm-delete-network.test.js +++ b/ui/components/app/modals/confirm-delete-network/confirm-delete-network.test.js @@ -9,8 +9,8 @@ describe('Confirm Delete Network', () => { const props = { hideModal: jest.fn(), onConfirm: jest.fn(), - removeNetworkConfiguration: jest.fn().mockResolvedValue(), - target: 'testNetworkConfigurationId', + removeNetwork: jest.fn().mockResolvedValue(), + target: '0x1', }; it('should match snapshot', () => { @@ -41,7 +41,7 @@ describe('Confirm Delete Network', () => { fireEvent.click(queryByText('[cancel]')); - expect(props.removeNetworkConfiguration).not.toHaveBeenCalled(); + expect(props.removeNetwork).not.toHaveBeenCalled(); expect(props.onConfirm).not.toHaveBeenCalled(); expect(props.hideModal).toHaveBeenCalled(); @@ -55,7 +55,7 @@ describe('Confirm Delete Network', () => { fireEvent.click(queryByText('[delete]')); await waitFor(() => { - expect(props.removeNetworkConfiguration).toHaveBeenCalled(); + expect(props.removeNetwork).toHaveBeenCalled(); expect(props.onConfirm).toHaveBeenCalled(); expect(props.hideModal).toHaveBeenCalled(); }); diff --git a/ui/components/app/modals/confirm-delete-rpc-url-modal/confirm-delete-rpc-url-modal.tsx b/ui/components/app/modals/confirm-delete-rpc-url-modal/confirm-delete-rpc-url-modal.tsx deleted file mode 100644 index 3eb9a9323048..000000000000 --- a/ui/components/app/modals/confirm-delete-rpc-url-modal/confirm-delete-rpc-url-modal.tsx +++ /dev/null @@ -1,72 +0,0 @@ -import React from 'react'; -import { useDispatch } from 'react-redux'; -import { - BlockSize, - Display, -} from '../../../../helpers/constants/design-system'; -import { - Box, - ButtonPrimary, - ButtonPrimarySize, - ButtonSecondary, - ButtonSecondarySize, - Modal, - ModalBody, - ModalContent, - ModalHeader, - ModalOverlay, -} from '../../../component-library'; -import { useI18nContext } from '../../../../hooks/useI18nContext'; -import { - hideModal, - setEditedNetwork, - toggleNetworkMenu, -} from '../../../../store/actions'; - -const ConfirmDeleteRpcUrlModal = () => { - const t = useI18nContext(); - const dispatch = useDispatch(); - return ( - { - dispatch(setEditedNetwork()); - dispatch(hideModal()); - }} - > - - - {t('confirmDeletion')} - - {t('confirmRpcUrlDeletionMessage')} - - { - dispatch(hideModal()); - dispatch(toggleNetworkMenu()); - }} - > - {t('back')} - - { - console.log('TODO: Delete RPc URL'); - }} - > - {t('deleteRpcUrl')} - - - - - - ); -}; - -export default ConfirmDeleteRpcUrlModal; diff --git a/ui/components/app/modals/modal.js b/ui/components/app/modals/modal.js index a093b969c8ff..ecae704a2270 100644 --- a/ui/components/app/modals/modal.js +++ b/ui/components/app/modals/modal.js @@ -10,8 +10,6 @@ import * as actions from '../../../store/actions'; import { mmiActionsFactory } from '../../../store/institutional/institution-background'; ///: END:ONLY_INCLUDE_IF -// Modal Components -import AddNetworkModal from '../../../pages/onboarding-flow/add-network-modal'; ///: BEGIN:ONLY_INCLUDE_IF(build-mmi) import ConfirmRemoveJWT from '../../institutional/confirm-remove-jwt-modal'; import CustodyConfirmLink from '../../institutional/custody-confirm-link-modal'; @@ -37,7 +35,6 @@ import TransactionAlreadyConfirmed from './transaction-already-confirmed'; // Metamask Notifications import ConfirmTurnOffProfileSyncing from './confirm-turn-off-profile-syncing'; import TurnOnMetamaskNotifications from './turn-on-metamask-notifications/turn-on-metamask-notifications'; -import ConfirmDeleteRpcUrlModal from './confirm-delete-rpc-url-modal/confirm-delete-rpc-url-modal'; const modalContainerBaseStyle = { transform: 'translate3d(-50%, 0, 0px)', @@ -59,34 +56,6 @@ const modalContainerMobileStyle = { top: '12.5%', }; -const accountModalStyle = { - mobileModalStyle: { - width: '95%', - // top: isPopupOrNotification() === 'popup' ? '52vh' : '36.5vh', - boxShadow: 'var(--shadow-size-xs) var(--color-shadow-default)', - borderRadius: '4px', - top: '10%', - transform: 'none', - left: '0', - right: '0', - margin: '0 auto', - }, - laptopModalStyle: { - width: '335px', - // top: 'calc(33% + 45px)', - boxShadow: 'var(--shadow-size-xs) var(--color-shadow-default)', - borderRadius: '4px', - top: '10%', - transform: 'none', - left: '0', - right: '0', - margin: '0 auto', - }, - contentStyle: { - borderRadius: '4px', - }, -}; - ///: BEGIN:ONLY_INCLUDE_IF(build-mmi) const custodyConfirmModalStyle = { mobileModalStyle: { @@ -116,11 +85,6 @@ const custodyConfirmModalStyle = { ///: END:ONLY_INCLUDE_IF const MODALS = { - ONBOARDING_ADD_NETWORK: { - contents: , - testId: 'add-network-modal', - ...accountModalStyle, - }, NEW_ACCOUNT: { contents: , mobileModalStyle: { @@ -218,19 +182,6 @@ const MODALS = { }, }, - CONFIRM_DELETE_RPC_URL: { - contents: , - mobileModalStyle: { - ...modalContainerMobileStyle, - }, - laptopModalStyle: { - ...modalContainerLaptopStyle, - }, - contentStyle: { - borderRadius: '8px', - }, - }, - EDIT_APPROVAL_PERMISSION: { contents: , mobileModalStyle: { diff --git a/ui/components/app/multi-rpc-edit-modal/__snapshots__/multi-rpc-edit-modal.test.tsx.snap b/ui/components/app/multi-rpc-edit-modal/__snapshots__/multi-rpc-edit-modal.test.tsx.snap index 7c77aff77a3e..9aa4f875431b 100644 --- a/ui/components/app/multi-rpc-edit-modal/__snapshots__/multi-rpc-edit-modal.test.tsx.snap +++ b/ui/components/app/multi-rpc-edit-modal/__snapshots__/multi-rpc-edit-modal.test.tsx.snap @@ -55,7 +55,58 @@ exports[`MultiRpcEditModal renders correctly with required props 1`] = ` >
+ > +
+
+
+ Ethereum Mainnet logo +
+
+
+

+ Ethereum Mainnet +

+
+
+ +
+
+
+
+ +
+
+
{ }); expect(screen.getByTestId('multi-rpc-edit-modal')).toBeInTheDocument(); - // TODO: enable with network controller v21 upgrade after `getNetworkConfigurationsByChainId` is implemented - // expect(screen.getByText('Ethereum Mainnet')).toBeInTheDocument(); + expect(screen.getByText('Ethereum Mainnet')).toBeInTheDocument(); expect(screen.getByText('supportMultiRpcInformation')).toBeInTheDocument(); }); }); diff --git a/ui/components/app/multi-rpc-edit-modal/multi-rpc-edit-modal.tsx b/ui/components/app/multi-rpc-edit-modal/multi-rpc-edit-modal.tsx index 7dab45d4a9d7..6df73c0b86d8 100644 --- a/ui/components/app/multi-rpc-edit-modal/multi-rpc-edit-modal.tsx +++ b/ui/components/app/multi-rpc-edit-modal/multi-rpc-edit-modal.tsx @@ -1,6 +1,6 @@ import React from 'react'; -import { useDispatch } from 'react-redux'; -import { Hex } from '@metamask/utils'; +import { useDispatch, useSelector } from 'react-redux'; +import { NetworkConfiguration } from '@metamask/network-controller'; import { Modal, ModalContent, @@ -22,6 +22,7 @@ import { } from '../../../helpers/constants/design-system'; import { setShowMultiRpcModal } from '../../../store/actions'; import { getEnvironmentType } from '../../../../app/scripts/lib/util'; +import { getNetworkConfigurationsByChainId } from '../../../selectors'; import { ENVIRONMENT_TYPE_POPUP } from '../../../../shared/constants/app'; import NetworkListItem from './network-list-item/network-list-item'; @@ -29,10 +30,7 @@ function MultiRpcEditModal() { const t = useI18nContext(); const dispatch = useDispatch(); const isPopUp = getEnvironmentType() === ENVIRONMENT_TYPE_POPUP; - - // TODO: useSelector(getNetworkConfigurationsByChainId) with network controller v21 upgrade - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const networkConfigurations = {} as Record; + const networkConfigurations = useSelector(getNetworkConfigurationsByChainId); return ( {Object.values(networkConfigurations).map( - (networkConfiguration) => + (networkConfiguration: NetworkConfiguration) => networkConfiguration.rpcEndpoints.length > 1 ? ( { rpcEndpoints: [ { name: 'Infura Mainnet', + type: RpcEndpointType.Infura, url: 'https://mainnet.infura.io/v3/YOUR_INFURA_KEY', }, ], diff --git a/ui/components/app/multi-rpc-edit-modal/network-list-item/network-list-item.tsx b/ui/components/app/multi-rpc-edit-modal/network-list-item/network-list-item.tsx index 551d34d70643..e90aac3a25d8 100644 --- a/ui/components/app/multi-rpc-edit-modal/network-list-item/network-list-item.tsx +++ b/ui/components/app/multi-rpc-edit-modal/network-list-item/network-list-item.tsx @@ -1,5 +1,9 @@ import React, { useState } from 'react'; import { useDispatch } from 'react-redux'; +import { + NetworkConfiguration, + RpcEndpointType, +} from '@metamask/network-controller'; import { Box, Text, @@ -25,18 +29,10 @@ import { useI18nContext } from '../../../../hooks/useI18nContext'; import { setEditedNetwork, toggleNetworkMenu } from '../../../../store/actions'; import { CHAIN_ID_TO_NETWORK_IMAGE_URL_MAP } from '../../../../../shared/constants/network'; -// TODO: Use version from network controller with v21 upgrade -enum RpcEndpointType { - Custom = 'custom', - Infura = 'infura', -} - const NetworkListItem = ({ networkConfiguration, }: { - // TODO: `NetworkConfiguration` with network controller v21 upgrade - // eslint-disable-next-line @typescript-eslint/no-explicit-any - networkConfiguration: any; + networkConfiguration: NetworkConfiguration; }) => { const rpcEndpoint = networkConfiguration.rpcEndpoints[ diff --git a/ui/components/app/network-display/network-display.js b/ui/components/app/network-display/network-display.js index 11c56a60fcb7..e69ff57b2bed 100644 --- a/ui/components/app/network-display/network-display.js +++ b/ui/components/app/network-display/network-display.js @@ -10,6 +10,7 @@ import { PickerNetwork, AvatarNetworkSize } from '../../component-library'; export default function NetworkDisplay() { const currentNetwork = useSelector(getCurrentNetwork); + return ( + +
+`; diff --git a/ui/components/app/selected-account/selected-account-component.test.js b/ui/components/app/selected-account/selected-account-component.test.js index 6097ab7f6bc9..290e737c0808 100644 --- a/ui/components/app/selected-account/selected-account-component.test.js +++ b/ui/components/app/selected-account/selected-account-component.test.js @@ -1,7 +1,7 @@ import React from 'react'; import configureMockStore from 'redux-mock-store'; import copyToClipboard from 'copy-to-clipboard'; -import { fireEvent } from '@testing-library/react'; +import { fireEvent, waitFor } from '@testing-library/react'; import { renderWithProvider } from '../../../../test/lib/render-helpers'; import mockState from '../../../../test/data/mock-state.json'; import { COPY_OPTIONS } from '../../../../shared/constants/copy'; @@ -49,24 +49,35 @@ jest.mock('../../../selectors', () => { const mockGetSelectedAccount = jest.fn(() => mockSelectedAccount); return { - ...jest.requireActual('../../../selectors'), getAccountType: mockGetAccountType, getSelectedInternalAccount: mockGetSelectedAccount, - getCurrentChainId: jest.fn(() => '0x1'), + getCurrentChainId: jest.fn(() => '0x5'), + getSelectedNetworkClientId: jest.fn(() => 'goerli'), + getNetworkConfigurationsByChainId: jest.fn(() => ({ + '0x5': { + chainId: '0x5', + rpcEndpoints: [{ networkClientId: 'goerli' }], + }, + })), }; }); describe('SelectedAccount Component', () => { const mockStore = configureMockStore()(mockState); - it('should render correctly', () => { + it('should match snapshot', () => { + const { container } = renderWithProvider(, mockStore); + expect(container).toMatchSnapshot(); + }); + + it('should render correctly', async () => { const { container, getByText, getByTestId } = renderWithProvider( , mockStore, ); - const tooltipTitle = container.querySelector( - '[data-original-title="Copy to clipboard"]', + const tooltipTitle = await waitFor(() => + container.querySelector('[data-original-title="Copy to clipboard"]'), ); expect(tooltipTitle).toBeInTheDocument(); @@ -90,7 +101,7 @@ describe('SelectedAccount Component', () => { ); }); - it('should render correctly if isCustodianSupportedChain to false', () => { + it('should render correctly if isCustodianSupportedChain to false', async () => { getIsCustodianSupportedChain.mockReturnValue(false); const { container, queryByTestId } = renderWithProvider( @@ -98,8 +109,10 @@ describe('SelectedAccount Component', () => { mockStore, ); - const tooltipTitle = container.querySelector( - '[data-original-title="This account is not set up for use with Chain 5"]', + const tooltipTitle = await waitFor(() => + container.querySelector( + '[data-original-title="This account is not set up for use with goerli"]', + ), ); const button = queryByTestId('selected-account-click'); diff --git a/ui/components/app/snaps/keyring-snap-removal-warning/keyring-snap-removal-warning.tsx b/ui/components/app/snaps/keyring-snap-removal-warning/keyring-snap-removal-warning.tsx index d2a7335178bc..2377076690b0 100644 --- a/ui/components/app/snaps/keyring-snap-removal-warning/keyring-snap-removal-warning.tsx +++ b/ui/components/app/snaps/keyring-snap-removal-warning/keyring-snap-removal-warning.tsx @@ -25,7 +25,7 @@ import { } from '../../../../helpers/constants/design-system'; import { useI18nContext } from '../../../../hooks/useI18nContext'; import InfoTooltip from '../../../ui/info-tooltip'; -import { getProviderConfig } from '../../../../ducks/metamask/metamask'; +import { getCurrentChainId } from '../../../../selectors'; import { KeyringAccountListItem } from './keyring-account-list-item'; export default function KeyringRemovalSnapWarning({ @@ -50,7 +50,7 @@ export default function KeyringRemovalSnapWarning({ const [confirmedRemoval, setConfirmedRemoval] = useState(false); const [confirmationInput, setConfirmationInput] = useState(''); const [error, setError] = useState(false); - const { chainId } = useSelector(getProviderConfig); + const chainId = useSelector(getCurrentChainId); useEffect(() => { setShowConfirmation(keyringAccounts.length === 0); diff --git a/ui/components/app/snaps/snap-permission-adapter/snap-permission-adapter.test.js b/ui/components/app/snaps/snap-permission-adapter/snap-permission-adapter.test.js index 47703de424d7..4ae5f59a7ab7 100644 --- a/ui/components/app/snaps/snap-permission-adapter/snap-permission-adapter.test.js +++ b/ui/components/app/snaps/snap-permission-adapter/snap-permission-adapter.test.js @@ -2,6 +2,8 @@ import React from 'react'; import { screen } from '@testing-library/react'; import { renderWithProvider } from '../../../../../test/jest'; import configureStore from '../../../../store/store'; +import { mockNetworkState } from '../../../../../test/stub/networks'; +import { CHAIN_IDS } from '../../../../../shared/constants/network'; import SnapPermissionAdapter from './snap-permission-adapter'; describe('Snap Permission Adapter', () => { @@ -17,6 +19,7 @@ describe('Snap Permission Adapter', () => { }; const mockState = { metamask: { + ...mockNetworkState({ chainId: CHAIN_IDS.MAINNET }), subjectMetadata: { 'npm:@metamask/notifications-example-snap': { name: 'Notifications Example Snap', diff --git a/ui/components/app/snaps/snap-permissions-list/snap-permissions-list.test.js b/ui/components/app/snaps/snap-permissions-list/snap-permissions-list.test.js index ddfdc33970a4..c8529a5be9e9 100644 --- a/ui/components/app/snaps/snap-permissions-list/snap-permissions-list.test.js +++ b/ui/components/app/snaps/snap-permissions-list/snap-permissions-list.test.js @@ -1,5 +1,6 @@ import React from 'react'; import { screen } from '@testing-library/react'; +import { mockNetworkState } from '../../../../../test/stub/networks'; import { renderWithProvider } from '../../../../../test/jest'; import configureStore from '../../../../store/store'; import SnapPermissionsList from './snap-permissions-list'; @@ -43,6 +44,7 @@ describe('Snap Permission List', () => { }, }, }, + ...mockNetworkState({}), }, }; diff --git a/ui/components/institutional/wrong-network-notification/wrong-network-notification.tsx b/ui/components/institutional/wrong-network-notification/wrong-network-notification.tsx index 4de11e4c153b..217ce2e575c0 100644 --- a/ui/components/institutional/wrong-network-notification/wrong-network-notification.tsx +++ b/ui/components/institutional/wrong-network-notification/wrong-network-notification.tsx @@ -18,13 +18,13 @@ const WrongNetworkNotification: React.FC = () => { const t = useI18nContext(); const providerConfig = useSelector< object, - { nickname: string; type: string } + { nickname?: string; type: string } | undefined >(getProviderConfig); - const balance = useSelector(getSelectedAccountCachedBalance); + const balance = useSelector(getSelectedAccountCachedBalance); const isCustodianSupportedChain = useSelector(getIsCustodianSupportedChain); - const network = providerConfig.nickname || providerConfig.type; + const network = providerConfig?.nickname || providerConfig?.type; return !isCustodianSupportedChain && balance ? ( +
+
+ +
+
+ +`; diff --git a/ui/components/multichain/address-copy-button/address-copy-button.test.js b/ui/components/multichain/address-copy-button/address-copy-button.test.js index 62158712753a..c7d7c869ff5b 100644 --- a/ui/components/multichain/address-copy-button/address-copy-button.test.js +++ b/ui/components/multichain/address-copy-button/address-copy-button.test.js @@ -32,6 +32,18 @@ const SAMPLE_ADDRESS = '0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc'; describe('AccountListItem', () => { const mockStore = configureMockStore()(mockState); + afterEach(() => { + jest.clearAllMocks(); // Clear mocks to ensure no test interference + }); + + it('should match snapshot', () => { + const { container } = renderWithProvider( + , + mockStore, + ); + expect(container).toMatchSnapshot(); + }); + it('renders the full address by default', () => { renderWithProvider( , @@ -103,7 +115,7 @@ describe('AccountListItem', () => { ); const tooltipTitle = container.querySelector( - '[data-original-title="This account is not set up for use with Chain 5"]', + '[data-original-title="This account is not set up for use with Goerli"]', ); const button = queryByTestId('address-copy-button-text'); diff --git a/ui/components/multichain/app-header/app-header.test.js b/ui/components/multichain/app-header/app-header.test.js index 025bbb81e255..0d1f5a8a1034 100644 --- a/ui/components/multichain/app-header/app-header.test.js +++ b/ui/components/multichain/app-header/app-header.test.js @@ -198,7 +198,7 @@ describe('App Header', () => { const mockProviderConfig = { chainId: '0x1', rpcUrl: 'https://localhost:8545', - nickname: null, + nickname: undefined, }; const { getByText } = render({ diff --git a/ui/components/multichain/edit-networks-modal/edit-networks-modal.js b/ui/components/multichain/edit-networks-modal/edit-networks-modal.js index 3cce3266ad5e..efb50fe8baee 100644 --- a/ui/components/multichain/edit-networks-modal/edit-networks-modal.js +++ b/ui/components/multichain/edit-networks-modal/edit-networks-modal.js @@ -1,9 +1,9 @@ import PropTypes from 'prop-types'; -import React from 'react'; +import React, { useMemo } from 'react'; import { useSelector } from 'react-redux'; import { TextVariant } from '../../../helpers/constants/design-system'; import { useI18nContext } from '../../../hooks/useI18nContext'; -import { getNonTestNetworks, getTestNetworks } from '../../../selectors'; +import { getNetworkConfigurationsByChainId } from '../../../selectors'; import { Modal, ModalOverlay, @@ -14,11 +14,28 @@ import { Box, } from '../../component-library'; import { NetworkListItem } from '..'; +import { + CHAIN_ID_TO_NETWORK_IMAGE_URL_MAP, + TEST_CHAINS, +} from '../../../../shared/constants/network'; export const EditNetworksModal = ({ onClose }) => { const t = useI18nContext(); - const nonTestNetworks = useSelector(getNonTestNetworks); - const testNetworks = useSelector(getTestNetworks); + + const networkConfigurations = useSelector(getNetworkConfigurationsByChainId); + const [nonTestNetworks, testNetworks] = useMemo( + () => + Object.entries(networkConfigurations).reduce( + ([nonTestNetworksList, testNetworksList], [chainId, network]) => { + const isTest = TEST_CHAINS.includes(chainId); + (isTest ? testNetworksList : nonTestNetworksList).push(network); + return [nonTestNetworksList, testNetworksList]; + }, + [[], []], + ), + [networkConfigurations], + ); + return ( {
{nonTestNetworks.map((network) => ( { - console.log(network.id); + console.log(network.chainId); }} startAccessory={} /> @@ -61,11 +78,11 @@ export const EditNetworksModal = ({ onClose }) => {
{testNetworks.map((network) => ( { - console.log(network.id); + console.log(network.chainId); }} startAccessory={} showEndAccessory={false} diff --git a/ui/components/multichain/network-list-item-menu/network-list-item-menu.js b/ui/components/multichain/network-list-item-menu/network-list-item-menu.js index 32b648eebaab..124be1999f1f 100644 --- a/ui/components/multichain/network-list-item-menu/network-list-item-menu.js +++ b/ui/components/multichain/network-list-item-menu/network-list-item-menu.js @@ -28,8 +28,8 @@ export const NetworkListItemMenu = ({ onClickOutside={onClose} referenceElement={anchorElement} role={PopoverRole.Dialog} - position={PopoverPosition.Bottom} - offset={[0, 0]} + position={PopoverPosition.BottomEnd} + offset={[8, 0]} padding={0} isOpen={isOpen} isPortal @@ -43,8 +43,6 @@ export const NetworkListItemMenu = ({ iconName={IconName.Edit} onClick={(e) => { e.stopPropagation(); - - // Pass network info? onEditClick(); }} data-testid="network-list-item-options-edit" @@ -58,8 +56,6 @@ export const NetworkListItemMenu = ({ iconColor={IconColor.errorDefault} onClick={(e) => { e.stopPropagation(); - - // Pass network info? onDeleteClick(); }} data-testid="network-list-item-options-delete" diff --git a/ui/components/multichain/network-list-item/__snapshots__/network-list-item.test.js.snap b/ui/components/multichain/network-list-item/__snapshots__/network-list-item.test.js.snap index 755b6b7fad80..fdf65d6d9337 100644 --- a/ui/components/multichain/network-list-item/__snapshots__/network-list-item.test.js.snap +++ b/ui/components/multichain/network-list-item/__snapshots__/network-list-item.test.js.snap @@ -3,10 +3,10 @@ exports[`NetworkListItem renders properly 1`] = `
Polygon logo
-

- Polygon -

+

+ Polygon +

+
diff --git a/ui/components/multichain/network-list-item/index.scss b/ui/components/multichain/network-list-item/index.scss index a7a1e6aa158e..6597487c9cf6 100644 --- a/ui/components/multichain/network-list-item/index.scss +++ b/ui/components/multichain/network-list-item/index.scss @@ -22,17 +22,6 @@ } } - &__network-name { - width: 100%; - flex: 1; - overflow: hidden; - text-align: start; - - button:hover { - opacity: 1; - } - } - &__tooltip { display: inline; } diff --git a/ui/components/multichain/network-list-item/network-list-item.test.js b/ui/components/multichain/network-list-item/network-list-item.test.js index 924148b36244..4219aab9590d 100644 --- a/ui/components/multichain/network-list-item/network-list-item.test.js +++ b/ui/components/multichain/network-list-item/network-list-item.test.js @@ -1,16 +1,15 @@ /* eslint-disable jest/require-top-level-describe */ import React from 'react'; import { fireEvent, render } from '@testing-library/react'; -import { useSelector } from 'react-redux'; import { POL_TOKEN_IMAGE_URL, POLYGON_DISPLAY_NAME, } from '../../../../shared/constants/network'; -import { getLocalNetworkMenuRedesignFeatureFlag } from '../../../helpers/utils/feature-flags'; import { NetworkListItem } from '.'; const DEFAULT_PROPS = { name: POLYGON_DISPLAY_NAME, + chainId: '0x1', iconSrc: POL_TOKEN_IMAGE_URL, selected: false, onClick: () => undefined, @@ -22,30 +21,13 @@ jest.mock('react-redux', () => ({ useSelector: jest.fn(), })); -const generateUseSelectorRouter = (opts) => (selector) => { - if (selector === getLocalNetworkMenuRedesignFeatureFlag) { - return opts.networkMenuRedesign ?? false; - } - return undefined; -}; - describe('NetworkListItem', () => { it('renders properly', () => { - useSelector.mockImplementation( - generateUseSelectorRouter({ - networkMenuRedesign: false, - }), - ); const { container } = render(); expect(container).toMatchSnapshot(); }); it('does not render the delete icon when no onDeleteClick is clicked', () => { - useSelector.mockImplementation( - generateUseSelectorRouter({ - networkMenuRedesign: false, - }), - ); const { container } = render( , ); @@ -55,11 +37,6 @@ describe('NetworkListItem', () => { }); it('shows as selected when selected', () => { - useSelector.mockImplementation( - generateUseSelectorRouter({ - networkMenuRedesign: false, - }), - ); const { container } = render( , ); @@ -71,11 +48,6 @@ describe('NetworkListItem', () => { }); it('renders a tooltip when the network name is very long', () => { - useSelector.mockImplementation( - generateUseSelectorRouter({ - networkMenuRedesign: false, - }), - ); const { container } = render( { }); it('executes onClick when the item is clicked', () => { - useSelector.mockImplementation( - generateUseSelectorRouter({ - networkMenuRedesign: false, - }), - ); const onClick = jest.fn(); const { container } = render( , @@ -102,11 +69,6 @@ describe('NetworkListItem', () => { }); it('executes onDeleteClick when the delete button is clicked', () => { - useSelector.mockImplementation( - generateUseSelectorRouter({ - networkMenuRedesign: true, - }), - ); const onDeleteClick = jest.fn(); const onClick = jest.fn(); @@ -118,7 +80,7 @@ describe('NetworkListItem', () => { />, ); - fireEvent.click(getByTestId('network-list-item-options-button')); + fireEvent.click(getByTestId('network-list-item-options-button-0x1')); fireEvent.click(getByTestId('network-list-item-options-delete')); expect(onDeleteClick).toHaveBeenCalledTimes(1); diff --git a/ui/components/multichain/network-list-item/network-list-item.js b/ui/components/multichain/network-list-item/network-list-item.tsx similarity index 50% rename from ui/components/multichain/network-list-item/network-list-item.js rename to ui/components/multichain/network-list-item/network-list-item.tsx index 5f52fcd19832..f80572eb1e4a 100644 --- a/ui/components/multichain/network-list-item/network-list-item.js +++ b/ui/components/multichain/network-list-item/network-list-item.tsx @@ -1,18 +1,18 @@ -import React, { useEffect, useRef, useState } from 'react'; +import React, { ReactNode, useEffect, useRef, useState } from 'react'; import classnames from 'classnames'; import PropTypes from 'prop-types'; -import { useSelector } from 'react-redux'; import { AlignItems, BackgroundColor, BlockSize, BorderRadius, - Color, Display, JustifyContent, TextColor, - Size, IconColor, + FlexDirection, + TextVariant, + BorderColor, } from '../../../helpers/constants/design-system'; import { AvatarNetwork, @@ -20,70 +20,74 @@ import { Box, ButtonIcon, ButtonIconSize, + Icon, IconName, + IconSize, Text, } from '../../component-library'; import { useI18nContext } from '../../../hooks/useI18nContext'; import { getAvatarNetworkColor } from '../../../helpers/utils/accounts'; import Tooltip from '../../ui/tooltip/tooltip'; import { NetworkListItemMenu } from '../network-list-item-menu'; -import { getLocalNetworkMenuRedesignFeatureFlag } from '../../../helpers/utils/feature-flags'; +// TODO: Consider increasing this. This tooltip is +// rendering when it has enough room to see everything const MAXIMUM_CHARACTERS_WITHOUT_TOOLTIP = 20; export const NetworkListItem = ({ name, iconSrc, iconSize = AvatarNetworkSize.Md, + rpcEndpoint, + chainId, selected = false, focus = true, onClick, onDeleteClick, onEditClick, + onRpcEndpointClick, startAccessory, showEndAccessory = true, +}: { + name: string; + iconSrc?: string; + iconSize?: AvatarNetworkSize; + rpcEndpoint?: { name?: string; url: string }; + chainId?: string; + selected?: boolean; + onClick: () => void; + onRpcEndpointClick?: () => void; + onDeleteClick?: () => void; + onEditClick?: () => void; + focus?: boolean; + startAccessory?: ReactNode; + showEndAccessory?: boolean; }) => { const t = useI18nContext(); - const networkRef = useRef(); + const networkRef = useRef(null); const [networkListItemMenuElement, setNetworkListItemMenuElement] = useState(); - const setNetworkListItemMenuRef = (ref) => { + + // I can't find a type that satisfies this. + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const setNetworkListItemMenuRef = (ref: any) => { setNetworkListItemMenuElement(ref); }; const [networkOptionsMenuOpen, setNetworkOptionsMenuOpen] = useState(false); - const networkMenuRedesign = useSelector( - getLocalNetworkMenuRedesignFeatureFlag, - ); const renderButton = () => { - if (networkMenuRedesign) { - return onDeleteClick || onEditClick ? ( - { - e.stopPropagation(); - setNetworkOptionsMenuOpen(true); - }} - size={ButtonIconSize.Sm} - /> - ) : null; - } - - return onDeleteClick ? ( + return onDeleteClick || onEditClick ? ( { + iconName={IconName.MoreVertical} + ref={setNetworkListItemMenuRef} + data-testid={`network-list-item-options-button-${chainId}`} + ariaLabel={t('networkOptions')} + onClick={(e: React.MouseEvent) => { e.stopPropagation(); - onDeleteClick(); + setNetworkOptionsMenuOpen(true); }} + size={ButtonIconSize.Sm} /> ) : null; }; @@ -93,7 +97,7 @@ export const NetworkListItem = ({ } }, [networkRef, focus]); - const handleKeyPress = (e) => { + const handleKeyPress = (e: React.KeyboardEvent) => { if (e.key === 'Enter') { e.stopPropagation(); // Prevent the event from reaching the parent container onClick(); @@ -102,9 +106,14 @@ export const NetworkListItem = ({ return ( )} - - {name.length > MAXIMUM_CHARACTERS_WITHOUT_TOOLTIP ? ( - + {name?.length > MAXIMUM_CHARACTERS_WITHOUT_TOOLTIP ? ( + + {name} + + ) : ( + name + )} + + + {rpcEndpoint && ( + { + e.stopPropagation(); + onRpcEndpointClick?.(); + }} + > + - {name} - - ) : ( - name - )} - + {rpcEndpoint.name ?? new URL(rpcEndpoint.url).host} + + + + )} + {renderButton()} {showEndAccessory ? ( setUrl(e.target.value)} + autoFocus /> {error && ( {error} diff --git a/ui/components/multichain/network-list-menu/add-rpc-url-modal/__snapshots__/add-rpc-url-modal.test.tsx.snap b/ui/components/multichain/network-list-menu/add-rpc-url-modal/__snapshots__/add-rpc-url-modal.test.tsx.snap index 6f151cfe0c0e..3450ef1c5eeb 100644 --- a/ui/components/multichain/network-list-menu/add-rpc-url-modal/__snapshots__/add-rpc-url-modal.test.tsx.snap +++ b/ui/components/multichain/network-list-menu/add-rpc-url-modal/__snapshots__/add-rpc-url-modal.test.tsx.snap @@ -18,13 +18,13 @@ exports[`AddRpcUrlModal should render correctly 1`] = ` rpcUrl
setUrl(e.target.value)} + autoFocus /> {error && ( {error} diff --git a/ui/components/multichain/network-list-menu/index.scss b/ui/components/multichain/network-list-menu/index.scss index 32a7c394e6f7..33e4c2b6caae 100644 --- a/ui/components/multichain/network-list-menu/index.scss +++ b/ui/components/multichain/network-list-menu/index.scss @@ -1,10 +1,19 @@ .multichain-network-list-menu-content-wrapper { &__dialog { + height: 100vh; max-height: 100%; } } .multichain-network-list-menu { - max-height: 100%; + height: 100%; overflow: auto; } + +.rpc-list-item { + overflow: hidden; +} + +.rpc-list-item button { + text-align: start; +} diff --git a/ui/components/multichain/network-list-menu/network-list-menu.js b/ui/components/multichain/network-list-menu/network-list-menu.js deleted file mode 100644 index 3900ba4a067a..000000000000 --- a/ui/components/multichain/network-list-menu/network-list-menu.js +++ /dev/null @@ -1,647 +0,0 @@ -import React, { useContext, useEffect, useMemo, useState } from 'react'; -import PropTypes from 'prop-types'; -import { DragDropContext, Droppable, Draggable } from 'react-beautiful-dnd'; -import { useDispatch, useSelector } from 'react-redux'; -import { useHistory } from 'react-router-dom'; -import Fuse from 'fuse.js'; -import { useI18nContext } from '../../../hooks/useI18nContext'; -import { NetworkListItem } from '../network-list-item'; -import { - hideNetworkBanner, - setActiveNetwork, - setShowTestNetworks, - showModal, - toggleNetworkMenu, - updateNetworksList, - setNetworkClientIdForDomain, - setEditedNetwork, -} from '../../../store/actions'; -import { - FEATURED_RPCS, - TEST_CHAINS, -} from '../../../../shared/constants/network'; -import { - getCurrentChainId, - getCurrentNetwork, - getNonTestNetworks, - getShowTestNetworks, - getTestNetworks, - getOrderedNetworksList, - getOnboardedInThisUISession, - getShowNetworkBanner, - getOriginOfCurrentTab, - getUseRequestQueue, - getNetworkConfigurations, - getEditedNetwork, - getAllDomains, -} from '../../../selectors'; -import ToggleButton from '../../ui/toggle-button'; -import { - AlignItems, - BackgroundColor, - Display, - FlexDirection, - JustifyContent, - TextColor, -} from '../../../helpers/constants/design-system'; -import { - Box, - ButtonSecondary, - ButtonSecondarySize, - Modal, - ModalOverlay, - Text, - BannerBase, - IconName, - ModalContent, - ModalHeader, - AvatarNetworkSize, -} from '../../component-library'; -import { ADD_POPULAR_CUSTOM_NETWORK } from '../../../helpers/constants/routes'; -import { getEnvironmentType } from '../../../../app/scripts/lib/util'; -import { ENVIRONMENT_TYPE_FULLSCREEN } from '../../../../shared/constants/app'; -import { MetaMetricsContext } from '../../../contexts/metametrics'; -import { - MetaMetricsEventCategory, - MetaMetricsEventName, -} from '../../../../shared/constants/metametrics'; -import { - getCompletedOnboarding, - getIsUnlocked, -} from '../../../ducks/metamask/metamask'; -import { getLocalNetworkMenuRedesignFeatureFlag } from '../../../helpers/utils/feature-flags'; -import AddNetworkModal from '../../../pages/onboarding-flow/add-network-modal'; -import PopularNetworkList from './popular-network-list/popular-network-list'; -import NetworkListSearch from './network-list-search/network-list-search'; -import AddRpcUrlModal from './add-rpc-url-modal/add-rpc-url-modal'; - -export const ACTION_MODES = { - // Displays the search box and network list - LIST: 'list', - // Displays the Add form - ADD: 'add', - // Displays the Edit form - EDIT: 'edit', - // Displays the page for adding an additional RPC URL - ADD_RPC: 'add_rpc', -}; - -export const NetworkListMenu = ({ onClose }) => { - const t = useI18nContext(); - - const nonTestNetworks = useSelector(getNonTestNetworks); - const testNetworks = useSelector(getTestNetworks); - const showTestNetworks = useSelector(getShowTestNetworks); - const currentChainId = useSelector(getCurrentChainId); - const networkMenuRedesign = useSelector( - getLocalNetworkMenuRedesignFeatureFlag, - ); - - const selectedTabOrigin = useSelector(getOriginOfCurrentTab); - const useRequestQueue = useSelector(getUseRequestQueue); - const networkConfigurations = useSelector(getNetworkConfigurations); - const domains = useSelector(getAllDomains); - - const dispatch = useDispatch(); - const history = useHistory(); - const trackEvent = useContext(MetaMetricsContext); - - const currentNetwork = useSelector(getCurrentNetwork); - const currentlyOnTestNetwork = TEST_CHAINS.includes(currentChainId); - - const environmentType = getEnvironmentType(); - const isFullScreen = environmentType === ENVIRONMENT_TYPE_FULLSCREEN; - - const completedOnboarding = useSelector(getCompletedOnboarding); - - const isUnlocked = useSelector(getIsUnlocked); - - const orderedNetworksList = useSelector(getOrderedNetworksList); - - const editedNetwork = useSelector(getEditedNetwork); - - const [actionMode, setActionMode] = useState( - editedNetwork ? ACTION_MODES.EDIT : ACTION_MODES.LIST, - ); - const [networkFormInformation, setNetworkFormInformation] = useState({ - networkNameForm: '', - networkChainIdForm: '', - networkTickerForm: '', - }); - - const [prevActionMode, setPrevActionMode] = useState(null); - - const networkToEdit = useMemo(() => { - const network = [...nonTestNetworks, ...testNetworks].find( - (n) => n.id === editedNetwork?.networkConfigurationId, - ); - return network ? { ...network, label: network.nickname } : undefined; - }, [editedNetwork, nonTestNetworks, testNetworks]); - - const networkConfigurationChainIds = Object.values(networkConfigurations).map( - (net) => net.chainId, - ); - - const sortedFeaturedNetworks = FEATURED_RPCS.sort((a, b) => - a.nickname > b.nickname ? 1 : -1, - ).slice(0, FEATURED_RPCS.length); - - const notExistingNetworkConfigurations = sortedFeaturedNetworks.filter( - ({ chainId }) => !networkConfigurationChainIds.includes(chainId), - ); - - const newOrderNetworks = () => { - if (!orderedNetworksList || orderedNetworksList.length === 0) { - return nonTestNetworks; - } - - // Create a mapping of chainId to index in orderedNetworksList - const orderedIndexMap = {}; - orderedNetworksList.forEach((network, index) => { - orderedIndexMap[`${network.networkId}_${network.networkRpcUrl}`] = index; - }); - - // Sort nonTestNetworks based on the order in orderedNetworksList - const sortedNonTestNetworks = nonTestNetworks.sort((a, b) => { - const keyA = `${a.chainId}_${a.rpcUrl}`; - const keyB = `${b.chainId}_${b.rpcUrl}`; - return orderedIndexMap[keyA] - orderedIndexMap[keyB]; - }); - - return sortedNonTestNetworks; - }; - - const networksList = newOrderNetworks(); - const [items, setItems] = useState([...networksList]); - - useEffect(() => { - setActionMode(ACTION_MODES.LIST); - setPrevActionMode(null); - if (currentlyOnTestNetwork) { - dispatch(setShowTestNetworks(currentlyOnTestNetwork)); - } - }, [dispatch, currentlyOnTestNetwork]); - - const [searchQuery, setSearchQuery] = useState(''); - const [focusSearch, setFocusSearch] = useState(false); - const onboardedInThisUISession = useSelector(getOnboardedInThisUISession); - const showNetworkBanner = useSelector(getShowNetworkBanner); - const showBanner = - completedOnboarding && !onboardedInThisUISession && showNetworkBanner; - - const onDragEnd = (result) => { - if (!result.destination) { - return; - } - - const newItems = [...items]; - const [removed] = newItems.splice(result.source.index, 1); - newItems.splice(result.destination.index, 0, removed); - - // Convert the updated array back to NetworksInfo format - const orderedArray = newItems.map((obj) => ({ - networkId: obj.chainId, // Assuming chainId is the networkId - networkRpcUrl: obj.rpcUrl, - })); - - dispatch(updateNetworksList(orderedArray)); - - setItems(newItems); - }; - - let searchResults = - [...networksList].length === items.length ? items : [...networksList]; - - let searchAddNetworkResults = - [...notExistingNetworkConfigurations].length === items.length - ? items - : [...notExistingNetworkConfigurations]; - - let searchTestNetworkResults = [...testNetworks]; - - if (focusSearch && searchQuery !== '') { - const fuse = new Fuse(searchResults, { - threshold: 0.2, - location: 0, - distance: 100, - maxPatternLength: 32, - minMatchCharLength: 1, - shouldSort: true, - keys: ['nickname', 'chainId', 'ticker'], - }); - const fuseForPopularNetworks = new Fuse(searchAddNetworkResults, { - threshold: 0.2, - location: 0, - distance: 100, - maxPatternLength: 32, - minMatchCharLength: 1, - shouldSort: true, - keys: ['nickname', 'chainId', 'ticker'], - }); - - const fuseForTestsNetworks = new Fuse(searchTestNetworkResults, { - threshold: 0.2, - location: 0, - distance: 100, - maxPatternLength: 32, - minMatchCharLength: 1, - shouldSort: true, - keys: ['nickname', 'chainId', 'ticker'], - }); - - fuse.setCollection(searchResults); - fuseForPopularNetworks.setCollection(searchAddNetworkResults); - fuseForTestsNetworks.setCollection(searchTestNetworkResults); - - const fuseResults = fuse.search(searchQuery); - const fuseForPopularNetworksResults = - fuseForPopularNetworks.search(searchQuery); - const fuseForTestsNetworksResults = - fuseForTestsNetworks.search(searchQuery); - - searchResults = searchResults.filter((network) => - fuseResults.includes(network), - ); - searchAddNetworkResults = searchAddNetworkResults.filter((network) => - fuseForPopularNetworksResults.includes(network), - ); - searchTestNetworkResults = searchTestNetworkResults.filter((network) => - fuseForTestsNetworksResults.includes(network), - ); - } - - const getOnEditCallback = (network) => { - dispatch( - setEditedNetwork({ - networkConfigurationId: network.id, - nickname: network.nickname, - }), - ); - setActionMode(ACTION_MODES.EDIT); - setPrevActionMode(ACTION_MODES.LIST); - }; - - const getOnEdit = (network) => { - return () => getOnEditCallback(network); - }; - - const generateNetworkListItem = ({ - network, - isCurrentNetwork, - canDeleteNetwork, - }) => { - return ( - { - dispatch(toggleNetworkMenu()); - dispatch(setActiveNetwork(network.providerType || network.id)); - - // If presently on and connected to a dapp, communicate a change to - // the dapp via silent switchEthereumChain that the network has - // changed due to user action - if ( - useRequestQueue && - selectedTabOrigin && - domains[selectedTabOrigin] - ) { - setNetworkClientIdForDomain(selectedTabOrigin, network.id); - } - - trackEvent({ - event: MetaMetricsEventName.NavNetworkSwitched, - category: MetaMetricsEventCategory.Network, - properties: { - location: 'Network Menu', - chain_id: currentChainId, - from_network: currentChainId, - to_network: network.chainId, - }, - }); - }} - onDeleteClick={ - canDeleteNetwork - ? () => { - dispatch(toggleNetworkMenu()); - dispatch( - showModal({ - name: 'CONFIRM_DELETE_NETWORK', - target: network.id, - onConfirm: () => undefined, - }), - ); - } - : null - } - onEditClick={() => getOnEditCallback(network)} - /> - ); - }; - - const generateMenuItems = (desiredNetworks) => { - return desiredNetworks.map((network) => { - const isCurrentNetwork = - currentNetwork.id === network.id && - currentNetwork.rpcUrl === network.rpcUrl; - - const canDeleteNetwork = - isUnlocked && !isCurrentNetwork && network.removable; - - return generateNetworkListItem({ - network, - isCurrentNetwork, - canDeleteNetwork, - }); - }); - }; - - const handleToggle = (value) => { - const shouldShowTestNetworks = !value; - dispatch(setShowTestNetworks(shouldShowTestNetworks)); - if (shouldShowTestNetworks) { - trackEvent({ - event: MetaMetricsEventName.TestNetworksDisplayed, - category: MetaMetricsEventCategory.Network, - }); - } - }; - - const goToRpcFormEdit = () => { - setActionMode(ACTION_MODES.ADD_RPC); - setPrevActionMode(ACTION_MODES.EDIT); - }; - const goToRpcFormAdd = () => { - setActionMode(ACTION_MODES.ADD_RPC); - setPrevActionMode(ACTION_MODES.ADD); - }; - - const renderListNetworks = () => { - if (actionMode === ACTION_MODES.LIST) { - return ( - <> - - - - {showBanner ? ( - - drag-and-drop - - } - onClose={() => hideNetworkBanner()} - description={t('dragAndDropBanner')} - /> - ) : null} - - {searchResults.length > 0 ? ( - - - {t('enabledNetworks')} - - - ) : null} - - {searchResults.length === 0 && - searchAddNetworkResults.length === 0 && - searchTestNetworkResults.length === 0 && - focusSearch ? ( - - {t('noNetworksFound')} - - ) : ( - - - {(provided) => ( - - {searchResults.map((network, index) => { - const isCurrentNetwork = - currentNetwork.id === network.id; - - const canDeleteNetwork = - isUnlocked && - !isCurrentNetwork && - network.removable; - - const networkListItem = generateNetworkListItem({ - network, - isCurrentNetwork, - canDeleteNetwork, - }); - - return ( - - {(providedDrag) => ( - - {networkListItem} - - )} - - ); - })} - {provided.placeholder} - - )} - - - )} - {networkMenuRedesign ? ( - - ) : null} - - {searchTestNetworkResults.length > 0 ? ( - - - {t('showTestnetNetworks')} - - - - ) : null} - - {showTestNetworks || currentlyOnTestNetwork ? ( - - {generateMenuItems(searchTestNetworkResults)} - - ) : null} - - - - - { - if (!networkMenuRedesign) { - if (isFullScreen) { - if (completedOnboarding) { - history.push(ADD_POPULAR_CUSTOM_NETWORK); - } else { - dispatch(showModal({ name: 'ONBOARDING_ADD_NETWORK' })); - } - } else { - global.platform.openExtensionInBrowser( - ADD_POPULAR_CUSTOM_NETWORK, - ); - } - dispatch(toggleNetworkMenu()); - return; - } - trackEvent({ - event: MetaMetricsEventName.AddNetworkButtonClick, - category: MetaMetricsEventCategory.Network, - }); - setActionMode(ACTION_MODES.ADD); - setPrevActionMode(ACTION_MODES.LIST); - }} - > - {networkMenuRedesign ? t('addCustomNetwork') : t('addNetwork')} - - - - ); - } else if (actionMode === ACTION_MODES.ADD) { - return ( - - ); - } else if (actionMode === ACTION_MODES.EDIT) { - return ( - - ); - } else if (actionMode === ACTION_MODES.ADD_RPC) { - return ; - } - return null; // Unreachable, but satisfies linter - }; - - // Modal back button - let onBack; - if (actionMode === ACTION_MODES.EDIT || actionMode === ACTION_MODES.ADD) { - onBack = () => setActionMode(ACTION_MODES.LIST); - } else if ( - actionMode === ACTION_MODES.ADD_RPC && - prevActionMode === ACTION_MODES.EDIT - ) { - onBack = () => setActionMode(ACTION_MODES.EDIT); - } else if ( - actionMode === ACTION_MODES.ADD_RPC && - prevActionMode === ACTION_MODES.ADD - ) { - onBack = () => setActionMode(ACTION_MODES.ADD); - } - - // Modal title - let title; - if (actionMode === ACTION_MODES.LIST) { - title = t('networkMenuHeading'); - } else if (actionMode === ACTION_MODES.ADD) { - title = t('addCustomNetwork'); - } else if (actionMode === ACTION_MODES.ADD_RPC) { - title = t('addRpcUrl'); - } else { - title = editedNetwork?.nickname ?? ''; - } - - return ( - - - - - {title} - - {renderListNetworks()} - - - ); -}; - -NetworkListMenu.propTypes = { - /** - * Executes when the menu should be closed - */ - onClose: PropTypes.func.isRequired, -}; diff --git a/ui/components/multichain/network-list-menu/network-list-menu.test.js b/ui/components/multichain/network-list-menu/network-list-menu.test.js index f7c346fb2070..702f5b00bf75 100644 --- a/ui/components/multichain/network-list-menu/network-list-menu.test.js +++ b/ui/components/multichain/network-list-menu/network-list-menu.test.js @@ -8,6 +8,9 @@ import { MAINNET_DISPLAY_NAME, SEPOLIA_DISPLAY_NAME, NETWORK_TYPES, + LINEA_MAINNET_DISPLAY_NAME, + BNB_DISPLAY_NAME, + LINEA_SEPOLIA_DISPLAY_NAME, } from '../../../../shared/constants/network'; import { NetworkListMenu } from '.'; @@ -36,8 +39,77 @@ const render = ({ const state = { metamask: { ...mockState.metamask, + // this could use the network controllers default state instead + networkConfigurationsByChainId: { + '0x1': { + nativeCurrency: 'ETH', + chainId: '0x1', + name: MAINNET_DISPLAY_NAME, + defaultRpcEndpointIndex: 0, + rpcEndpoints: [ + { + networkClientId: NETWORK_TYPES.MAINNET, + }, + ], + }, + '0xe708': { + nativeCurrency: 'ETH', + chainId: '0xe708', + name: LINEA_MAINNET_DISPLAY_NAME, + defaultRpcEndpointIndex: 0, + rpcEndpoints: [ + { + networkClientId: 'linea-mainnet', + }, + ], + }, + '0x38': { + nativeCurrency: 'BNB', + chainId: '0x38', + name: BNB_DISPLAY_NAME, + defaultRpcEndpointIndex: 0, + rpcEndpoints: [ + { + networkClientId: 'bnb-network', + }, + ], + }, + '0x5': { + nativeCurrency: 'ETH', + chainId: '0x5', + name: 'Chain 5', + defaultRpcEndpointIndex: 0, + rpcEndpoints: [ + { + networkClientId: 'goerli', + }, + ], + }, + '0x539': { + nativeCurrency: 'ETH', + chainId: '0x539', + name: SEPOLIA_DISPLAY_NAME, + defaultRpcEndpointIndex: 0, + rpcEndpoints: [ + { + networkClientId: 'sepolia', + }, + ], + }, + '0xe705': { + nativeCurrency: 'ETH', + chainId: '0xe705', + name: LINEA_SEPOLIA_DISPLAY_NAME, + defaultRpcEndpointIndex: 0, + rpcEndpoints: [ + { + networkClientId: 'linea-sepolia', + }, + ], + }, + }, isUnlocked, - selectedNetworkClientId, + selectedNetworkClientId: NETWORK_TYPES.MAINNET, preferences: { showTestNetworks, }, @@ -49,7 +121,7 @@ const render = ({ }, }, activeTab: { - origin, + origin: selectedTabOriginInDomainsState ? origin : undefined, }, }; @@ -59,7 +131,6 @@ const render = ({ describe('NetworkListMenu', () => { beforeEach(() => { - process.env.ENABLE_NETWORK_UI_REDESIGN = 'false'; jest.clearAllMocks(); }); @@ -70,7 +141,7 @@ describe('NetworkListMenu', () => { it('displays important controls', () => { const { getByText, getByPlaceholderText } = render(); - expect(getByText('Add network')).toBeInTheDocument(); + expect(getByText('Add a custom network')).toBeInTheDocument(); expect(getByText('Show test networks')).toBeInTheDocument(); expect(getByPlaceholderText('Search')).toBeInTheDocument(); }); @@ -106,7 +177,7 @@ describe('NetworkListMenu', () => { it('shows the correct selected network when networks share the same chain ID', () => { // Mainnet and Custom Mainnet RPC both use chain ID 0x1 - render({ + const { queryByText } = render({ showTestNetworks: false, currentChainId: CHAIN_IDS.MAINNET, selectedNetworkClientId: 'testNetworkConfigurationId', @@ -123,10 +194,7 @@ describe('NetworkListMenu', () => { ); expect(selectedNodes).toHaveLength(1); - const selectedNodeText = selectedNodes[0].querySelector( - '.multichain-network-list-item__network-name', - ).textContent; - expect(selectedNodeText).toStrictEqual('Custom Mainnet RPC'); + expect(queryByText('Ethereum Mainnet')).toBeInTheDocument(); }); it('narrows down search results', () => { @@ -141,14 +209,14 @@ describe('NetworkListMenu', () => { expect(queryByText('Chain 5')).not.toBeInTheDocument(); }); - it('enables the "Add Network" button when MetaMask is locked', () => { + it('enables the "Add a custom network" button when MetaMask is locked', () => { const { queryByText } = render({ isUnlocked: false }); - expect(queryByText('Add network')).toBeEnabled(); + expect(queryByText('Add a custom network')).toBeEnabled(); }); - it('enables the "Add Network" button when MetaMask is true', () => { + it('enables the "AAdd a custom network" button when MetaMask is true', () => { const { queryByText } = render({ isUnlocked: true }); - expect(queryByText('Add network')).toBeEnabled(); + expect(queryByText('Add a custom network')).toBeEnabled(); }); it('does not allow deleting networks when locked', () => { @@ -187,20 +255,6 @@ describe('NetworkListMenu', () => { }); describe('NetworkListMenu with ENABLE_NETWORK_UI_REDESIGN', () => { - // Set the environment variable before tests run - beforeEach(() => { - window.metamaskFeatureFlags = { - networkMenuRedesign: true, - }; - }); - - // Reset the environment variable after tests complete - afterEach(() => { - window.metamaskFeatureFlags = { - networkMenuRedesign: false, - }; - }); - it('should display "Arbitrum" when ENABLE_NETWORK_UI_REDESIGN is true', async () => { const { queryByText, getByPlaceholderText } = render(); diff --git a/ui/components/multichain/network-list-menu/network-list-menu.tsx b/ui/components/multichain/network-list-menu/network-list-menu.tsx new file mode 100644 index 000000000000..3e9892a9a9f3 --- /dev/null +++ b/ui/components/multichain/network-list-menu/network-list-menu.tsx @@ -0,0 +1,601 @@ +import React, { useContext, useEffect, useMemo, useState } from 'react'; +import { + DragDropContext, + Droppable, + Draggable, + DropResult, +} from 'react-beautiful-dnd'; +import { useDispatch, useSelector } from 'react-redux'; +import Fuse from 'fuse.js'; +import { + NetworkConfiguration, + RpcEndpointType, +} from '@metamask/network-controller'; +import { Hex } from '@metamask/utils'; +import { useI18nContext } from '../../../hooks/useI18nContext'; +import { NetworkListItem } from '../network-list-item'; +import { + hideNetworkBanner, + setActiveNetwork, + setShowTestNetworks, + showModal, + toggleNetworkMenu, + updateNetworksList, + setNetworkClientIdForDomain, + setEditedNetwork, +} from '../../../store/actions'; +import { + CHAIN_ID_TO_NETWORK_IMAGE_URL_MAP, + CHAIN_IDS, + FEATURED_RPCS, + TEST_CHAINS, +} from '../../../../shared/constants/network'; +import { + getCurrentChainId, + getShowTestNetworks, + getOnboardedInThisUISession, + getShowNetworkBanner, + getOriginOfCurrentTab, + getUseRequestQueue, + getEditedNetwork, + getNetworkConfigurationsByChainId, + getOrderedNetworksList, + getIsAddingNewNetwork, + getIsMultiRpcOnboarding, + getAllDomains, +} from '../../../selectors'; +import ToggleButton from '../../ui/toggle-button'; +import { + AlignItems, + BackgroundColor, + BorderRadius, + Display, + FlexDirection, + JustifyContent, + TextAlign, + TextColor, + TextVariant, +} from '../../../helpers/constants/design-system'; +import { + Box, + ButtonSecondary, + ButtonSecondarySize, + Modal, + ModalOverlay, + Text, + BannerBase, + IconName, + ModalContent, + ModalHeader, + AvatarNetworkSize, +} from '../../component-library'; +import { MetaMetricsContext } from '../../../contexts/metametrics'; +import { + MetaMetricsEventCategory, + MetaMetricsEventName, +} from '../../../../shared/constants/metametrics'; +import { + getCompletedOnboarding, + getIsUnlocked, +} from '../../../ducks/metamask/metamask'; +import NetworksForm from '../../../pages/settings/networks-tab/networks-form'; +import { useNetworkFormState } from '../../../pages/settings/networks-tab/networks-form/networks-form-state'; +import PopularNetworkList from './popular-network-list/popular-network-list'; +import NetworkListSearch from './network-list-search/network-list-search'; +import AddRpcUrlModal from './add-rpc-url-modal/add-rpc-url-modal'; +import { SelectRpcUrlModal } from './select-rpc-url-modal/select-rpc-url-modal'; +import AddBlockExplorerModal from './add-block-explorer-modal/add-block-explorer-modal'; + +export enum ACTION_MODES { + // Displays the search box and network list + LIST, + // Displays the form to add or edit a network + ADD_EDIT, + // Displays the page for adding an additional RPC URL + ADD_RPC, + // Displays the page for adding an additional explorer URL + ADD_EXPLORER_URL, + // Displays the page for selecting an RPC URL + SELECT_RPC, +} + +export const NetworkListMenu = ({ onClose }: { onClose: () => void }) => { + const t = useI18nContext(); + const dispatch = useDispatch(); + const trackEvent = useContext(MetaMetricsContext); + + const showTestNetworks = useSelector(getShowTestNetworks); + const currentChainId = useSelector(getCurrentChainId); + const selectedTabOrigin = useSelector(getOriginOfCurrentTab); + const useRequestQueue = useSelector(getUseRequestQueue); + const isUnlocked = useSelector(getIsUnlocked); + const domains = useSelector(getAllDomains); + const orderedNetworksList = useSelector(getOrderedNetworksList); + const isAddingNewNetwork = useSelector(getIsAddingNewNetwork); + const isMultiRpcOnboarding = useSelector(getIsMultiRpcOnboarding); + const completedOnboarding = useSelector(getCompletedOnboarding); + const onboardedInThisUISession = useSelector(getOnboardedInThisUISession); + const showNetworkBanner = useSelector(getShowNetworkBanner); + const networkConfigurations = useSelector(getNetworkConfigurationsByChainId); + const { chainId: editingChainId, editCompleted } = + useSelector(getEditedNetwork) ?? {}; + + const currentlyOnTestNetwork = (TEST_CHAINS as Hex[]).includes( + currentChainId, + ); + + const [nonTestNetworks, testNetworks] = useMemo( + () => + Object.entries(networkConfigurations).reduce( + ([nonTestNetworksList, testNetworksList], [chainId, network]) => { + const isTest = (TEST_CHAINS as string[]).includes(chainId); + (isTest ? testNetworksList : nonTestNetworksList)[chainId] = network; + return [nonTestNetworksList, testNetworksList]; + }, + [ + {} as Record, + {} as Record, + ], + ), + [networkConfigurations], + ); + + // The network currently being edited, or undefined + // if the user is not currently editing a network. + const editedNetwork = useMemo( + () => + !editingChainId || editCompleted + ? undefined + : Object.entries(networkConfigurations).find( + ([chainId]) => chainId === editingChainId, + )?.[1], + [editingChainId, editCompleted, networkConfigurations], + ); + + // Tracks which page the user is on + const [actionMode, setActionMode] = useState( + isAddingNewNetwork || editedNetwork + ? ACTION_MODES.ADD_EDIT + : ACTION_MODES.LIST, + ); + + const networkFormState = useNetworkFormState(editedNetwork); + const { rpcUrls, setRpcUrls, blockExplorers, setBlockExplorers } = + networkFormState; + + const sortNetworks = (networks: Record) => + Object.values(networks).sort( + (a, b) => + orderedNetworksList.findIndex( + ({ networkId }) => networkId === a.chainId, + ) - + orderedNetworksList.findIndex( + ({ networkId }) => networkId === b.chainId, + ), + ); + + const [orderedNetworks, setOrderedNetworks] = useState( + sortNetworks(nonTestNetworks), + ); + useEffect( + () => setOrderedNetworks(sortNetworks(nonTestNetworks)), + [nonTestNetworks, orderedNetworksList], + ); + + // Re-orders networks when the user drag + drops them + const onDragEnd = (result: DropResult) => { + if (result.destination) { + const newOrderedNetworks = [...orderedNetworks]; + const [removed] = newOrderedNetworks.splice(result.source.index, 1); + newOrderedNetworks.splice(result.destination.index, 0, removed); + dispatch(updateNetworksList(newOrderedNetworks.map((n) => n.chainId))); + setOrderedNetworks(newOrderedNetworks); + } + }; + + const featuredNetworksNotYetEnabled = useMemo( + () => + FEATURED_RPCS.filter( + ({ chainId }) => !networkConfigurations[chainId], + ).sort((a, b) => a.name.localeCompare(b.name)), + [networkConfigurations], + ); + + // Searches networks by user input + const [searchQuery, setSearchQuery] = useState(''); + const [focusSearch, setFocusSearch] = useState(false); + + const searchNetworks = (networks: T[], query: string) => + searchQuery === '' + ? networks + : new Fuse(networks, { + threshold: 0.2, + location: 0, + distance: 100, + maxPatternLength: 32, + minMatchCharLength: 1, + shouldSort: false, // Maintain network order instead of ordering by search score + keys: ['name', 'chainId', 'nativeCrrency'], + }).search(query); + + const searchedEnabledNetworks = searchNetworks(orderedNetworks, searchQuery); + const searchedFeaturedNetworks = searchNetworks( + featuredNetworksNotYetEnabled, + searchQuery, + ); + const searchedTestNetworks = searchNetworks( + Object.values(testNetworks), + searchQuery, + ); + + // If any network has multiple RPC endpoints, show multi-rpc selectors for all networks + const showMultiRpcSelectors = [ + ...searchedEnabledNetworks, + ...searchedTestNetworks, + ].some((network) => network.rpcEndpoints.length > 1); + + // Renders a network in the network list + const generateNetworkListItem = (network: NetworkConfiguration) => { + const isCurrentNetwork = network.chainId === currentChainId; + const canDeleteNetwork = + isUnlocked && + !isCurrentNetwork && + network.chainId !== CHAIN_IDS.MAINNET && + network.chainId !== CHAIN_IDS.LINEA_MAINNET; + + return ( + { + const { networkClientId } = + network.rpcEndpoints[network.defaultRpcEndpointIndex]; + dispatch(setActiveNetwork(networkClientId)); + dispatch(toggleNetworkMenu()); + + // If presently on a dapp, communicate a change to + // the dapp via silent switchEthereumChain that the + // network has changed due to user action + if ( + useRequestQueue && + selectedTabOrigin && + domains[selectedTabOrigin] + ) { + setNetworkClientIdForDomain(selectedTabOrigin, networkClientId); + } + + trackEvent({ + event: MetaMetricsEventName.NavNetworkSwitched, + category: MetaMetricsEventCategory.Network, + properties: { + location: 'Network Menu', + chain_id: currentChainId, + from_network: currentChainId, + to_network: network.chainId, + }, + }); + }} + onDeleteClick={ + canDeleteNetwork + ? () => { + dispatch(toggleNetworkMenu()); + dispatch( + showModal({ + name: 'CONFIRM_DELETE_NETWORK', + target: network.chainId, + onConfirm: () => undefined, + }), + ); + } + : undefined + } + onEditClick={() => { + dispatch( + setEditedNetwork({ + chainId: network.chainId, + nickname: network.name, + }), + ); + setActionMode(ACTION_MODES.ADD_EDIT); + }} + onRpcEndpointClick={() => { + setActionMode(ACTION_MODES.SELECT_RPC); + dispatch(setEditedNetwork({ chainId: network.chainId })); + }} + /> + ); + }; + + const render = () => { + if (actionMode === ACTION_MODES.LIST) { + return ( + <> + + + {completedOnboarding && + !onboardedInThisUISession && + showNetworkBanner && + !searchQuery && ( + + drag-and-drop + + } + onClose={() => hideNetworkBanner()} + description={t('dragAndDropBanner')} + /> + )} + + {searchedEnabledNetworks.length > 0 && ( + + + {t('enabledNetworks')} + + + )} + + {searchedEnabledNetworks.length === 0 && + searchedFeaturedNetworks.length === 0 && + searchedTestNetworks.length === 0 && + focusSearch ? ( + + {t('noNetworksFound')} + + ) : ( + + + {(provided) => ( + + {searchedEnabledNetworks.map((network, index) => { + return ( + + {(providedDrag) => ( + + {generateNetworkListItem(network)} + + )} + + ); + })} + {provided.placeholder} + + )} + + + )} + + + {searchedTestNetworks.length > 0 ? ( + + + {t('showTestnetNetworks')} + + { + dispatch(setShowTestNetworks(!value)); + if (!value) { + trackEvent({ + event: MetaMetricsEventName.TestNetworksDisplayed, + category: MetaMetricsEventCategory.Network, + }); + } + }} + /> + + ) : null} + + {showTestNetworks || currentlyOnTestNetwork ? ( + + {searchedTestNetworks.map((network) => + generateNetworkListItem(network), + )} + + ) : null} + + + + + { + trackEvent({ + event: MetaMetricsEventName.AddNetworkButtonClick, + category: MetaMetricsEventCategory.Network, + }); + setActionMode(ACTION_MODES.ADD_EDIT); + }} + > + {t('addACustomNetwork')} + + + + ); + } else if (actionMode === ACTION_MODES.ADD_EDIT) { + return ( + setActionMode(ACTION_MODES.ADD_RPC)} + onBlockExplorerAdd={() => + setActionMode(ACTION_MODES.ADD_EXPLORER_URL) + } + /> + ); + } else if (actionMode === ACTION_MODES.ADD_RPC) { + return ( + { + // Note: We could choose to rename the URL if it already exists with a different name + if (rpcUrls.rpcEndpoints?.every((e) => e.url !== url)) { + setRpcUrls({ + rpcEndpoints: [ + ...rpcUrls.rpcEndpoints, + { url, name, type: RpcEndpointType.Custom }, + ], + defaultRpcEndpointIndex: rpcUrls.rpcEndpoints.length, + }); + } + setActionMode(ACTION_MODES.ADD_EDIT); + }} + /> + ); + } else if (actionMode === ACTION_MODES.ADD_EXPLORER_URL) { + return ( + { + if (blockExplorers.blockExplorerUrls?.every((u) => u !== url)) { + setBlockExplorers({ + blockExplorerUrls: [...blockExplorers.blockExplorerUrls, url], + defaultBlockExplorerUrlIndex: + blockExplorers.blockExplorerUrls.length, + }); + } + setActionMode(ACTION_MODES.ADD_EDIT); + }} + /> + ); + } else if (actionMode === ACTION_MODES.SELECT_RPC && editedNetwork) { + return ( + + ); + } + return null; // Should not be reachable + }; + + let title; + if (actionMode === ACTION_MODES.LIST) { + title = t('networkMenuHeading'); + } else if (actionMode === ACTION_MODES.ADD_EDIT && !editedNetwork) { + title = t('addACustomNetwork'); + } else if (actionMode === ACTION_MODES.ADD_RPC) { + title = t('addRpcUrl'); + } else if (actionMode === ACTION_MODES.ADD_EXPLORER_URL) { + title = t('addBlockExplorerUrl'); + } else if (actionMode === ACTION_MODES.SELECT_RPC) { + title = t('selectRpcUrl'); + } else { + title = editedNetwork?.name ?? ''; + } + + let onBack; + if (actionMode === ACTION_MODES.ADD_EDIT) { + onBack = () => { + editedNetwork ? dispatch(setEditedNetwork()) : networkFormState.clear(); + + setActionMode(ACTION_MODES.LIST); + }; + } else if ( + actionMode === ACTION_MODES.ADD_RPC || + actionMode === ACTION_MODES.ADD_EXPLORER_URL + ) { + onBack = () => setActionMode(ACTION_MODES.ADD_EDIT); + } + + if (isMultiRpcOnboarding) { + onBack = onClose; + } + + return ( + + + + + + {title} + + + {render()} + + + ); +}; diff --git a/ui/components/multichain/network-list-menu/popular-network-list/popular-network-list.test.tsx b/ui/components/multichain/network-list-menu/popular-network-list/popular-network-list.test.tsx index 468563214c6d..e67444d1eece 100644 --- a/ui/components/multichain/network-list-menu/popular-network-list/popular-network-list.test.tsx +++ b/ui/components/multichain/network-list-menu/popular-network-list/popular-network-list.test.tsx @@ -3,12 +3,10 @@ import { render, screen, fireEvent } from '@testing-library/react'; import '@testing-library/jest-dom/extend-expect'; import { useDispatch, useSelector } from 'react-redux'; import configureStore from 'redux-mock-store'; +import { RpcEndpointType } from '@metamask/network-controller'; import { renderWithProvider } from '../../../../../test/lib/render-helpers'; import { getUnapprovedConfirmations } from '../../../../selectors'; -import { - CHAIN_IDS, - RPCDefinition, -} from '../../../../../shared/constants/network'; +import { CHAIN_IDS } from '../../../../../shared/constants/network'; import PopularNetworkList from './popular-network-list'; jest.mock('react-redux', () => ({ @@ -57,26 +55,36 @@ describe('PopularNetworkList', () => { ...defaultProps, searchAddNetworkResults: [ { + blockExplorerUrls: [], chainId: CHAIN_IDS.MAINNET, - nickname: 'Network 1', - rpcPrefs: { - blockExplorerUrl: 'https://etherscan.com/', - imageUrl: 'https://example.com/image1.png', - }, - ticker: 'ETH', - rpcUrl: 'https://exampleEth.org/', + defaultBlockExplorerUrlIndex: 0, + defaultRpcEndpointIndex: 0, + name: 'Network 1', + nativeCurrency: 'ETH', + rpcEndpoints: [ + { + url: 'https://exampleEth.org/', + type: RpcEndpointType.Custom as const, + networkClientId: 'network1', + }, + ], }, { + blockExplorerUrls: [], chainId: CHAIN_IDS.BSC_TESTNET, - nickname: 'Network 2', - rpcPrefs: { - blockExplorerUrl: 'https://examplescan.com/', - imageUrl: 'https://example.com/image2.png', - }, - ticker: 'TST', - rpcUrl: 'https://example.org/', + defaultBlockExplorerUrlIndex: 0, + defaultRpcEndpointIndex: 0, + name: 'Network 2', + nativeCurrency: 'TST', + rpcEndpoints: [ + { + url: 'https://example.org/', + type: RpcEndpointType.Custom as const, + networkClientId: 'network2', + }, + ], }, - ] as RPCDefinition[], + ], }; render(); @@ -88,16 +96,21 @@ describe('PopularNetworkList', () => { ...defaultProps, searchAddNetworkResults: [ { + blockExplorerUrls: [], chainId: CHAIN_IDS.BSC_TESTNET, - nickname: 'Network 2', - rpcPrefs: { - blockExplorerUrl: 'https://examplescan.com/', - imageUrl: 'https://example.com/image2.png', - }, - ticker: 'TST', - rpcUrl: 'https://example.org/', + defaultBlockExplorerUrlIndex: 0, + defaultRpcEndpointIndex: 0, + name: 'Network 2', + nativeCurrency: 'TST', + rpcEndpoints: [ + { + url: 'https://example.org/', + type: RpcEndpointType.Custom as const, + networkClientId: 'network2', + }, + ], }, - ] as RPCDefinition[], + ], }; render(); diff --git a/ui/components/multichain/network-list-menu/popular-network-list/popular-network-list.tsx b/ui/components/multichain/network-list-menu/popular-network-list/popular-network-list.tsx index 62560c1866bd..99d2774659d8 100644 --- a/ui/components/multichain/network-list-menu/popular-network-list/popular-network-list.tsx +++ b/ui/components/multichain/network-list-menu/popular-network-list/popular-network-list.tsx @@ -1,6 +1,7 @@ -import React, { useState } from 'react'; +import React, { useState, useMemo } from 'react'; import { ApprovalType } from '@metamask/controller-utils'; import { useDispatch } from 'react-redux'; +import { AddNetworkFields } from '@metamask/network-controller'; import { useI18nContext } from '../../../../hooks/useI18nContext'; import { Box, @@ -35,14 +36,15 @@ import { TextColor, IconColor, TextVariant, + BorderColor, } from '../../../../helpers/constants/design-system'; -import { RPCDefinition } from '../../../../../shared/constants/network'; +import { CHAIN_ID_TO_NETWORK_IMAGE_URL_MAP } from '../../../../../shared/constants/network'; import ZENDESK_URLS from '../../../../helpers/constants/zendesk-url'; const PopularNetworkList = ({ searchAddNetworkResults, }: { - searchAddNetworkResults: RPCDefinition[]; + searchAddNetworkResults: AddNetworkFields[]; }) => { const t = useI18nContext(); const isPopUp = getEnvironmentType() === ENVIRONMENT_TYPE_POPUP; @@ -64,6 +66,64 @@ const PopularNetworkList = ({ setReferenceElement(ref); }; + // Memoize the popover content so it only updates when searchAddNetworkResults changes + const popoverContent = useMemo(() => { + if (Object.keys(searchAddNetworkResults).length === 0) { + return null; + } + + return ( + + + + {t('additionalNetworks')} + + + + + + {t('popularNetworkAddToolTip', [ + + { + global.platform.openTab({ + url: ZENDESK_URLS.UNKNOWN_NETWORK, + }); + }} + > + {t('learnMoreUpperCase')} + + , + ])} + + + + + ); + }, [searchAddNetworkResults, referenceElement, isOpen]); + return ( - {Object.keys(searchAddNetworkResults).length === 0 ? null : ( - - - {t('additionalNetworks')} - - - - {t('popularNetworkAddToolTip', [ - - { - global.platform.openTab({ - url: ZENDESK_URLS.UNKNOWN_NETWORK, - }); - }} - > - {t('learnMoreUpperCase')} - - , - ])} - - - - - )} - {searchAddNetworkResults.map((item: RPCDefinition, index: number) => ( + {popoverContent} + {searchAddNetworkResults.map((network) => ( - {item.nickname} + {network.name} @@ -169,12 +184,24 @@ const PopularNetworkList = ({ origin: ORIGIN_METAMASK, type: ApprovalType.AddEthereumChain, requestData: { - chainId: item.chainId, - rpcUrl: item.rpcUrl, - ticker: item.ticker, - rpcPrefs: item.rpcPrefs, - imageUrl: item.rpcPrefs?.imageUrl, - chainName: item.nickname, + chainId: network.chainId, + rpcUrl: + network.rpcEndpoints[network.defaultRpcEndpointIndex] + .url, + ticker: network.nativeCurrency, + rpcPrefs: { + blockExplorerUrl: + network.defaultBlockExplorerUrlIndex === undefined + ? undefined + : network.blockExplorerUrls[ + network.defaultBlockExplorerUrlIndex + ], + }, + imageUrl: + CHAIN_ID_TO_NETWORK_IMAGE_URL_MAP[ + network.chainId as keyof typeof CHAIN_ID_TO_NETWORK_IMAGE_URL_MAP + ], + chainName: network.name, referrer: ORIGIN_METAMASK, source: MetaMetricsNetworkEventSource.NewAddNetworkFlow, }, diff --git a/ui/components/multichain/network-list-menu/rpc-list-item.tsx b/ui/components/multichain/network-list-menu/rpc-list-item.tsx index 086f9838d142..f6297d32145f 100644 --- a/ui/components/multichain/network-list-menu/rpc-list-item.tsx +++ b/ui/components/multichain/network-list-menu/rpc-list-item.tsx @@ -1,3 +1,4 @@ +import { RpcEndpointType } from '@metamask/network-controller'; import React from 'react'; import { infuraProjectId } from '../../../../shared/constants/network'; import { Box, Text } from '../../component-library'; @@ -12,12 +13,6 @@ import { BlockSize, } from '../../../helpers/constants/design-system'; -// TODO: Use version from network controller with v21 upgrade -enum RpcEndpointType { - Custom = 'custom', - Infura = 'infura', -} - export const stripKeyFromInfuraUrl = (endpoint: string) => { let modifiedEndpoint = endpoint; diff --git a/ui/components/multichain/network-list-menu/select-rpc-url-modal/select-rpc-url-modal.test.tsx b/ui/components/multichain/network-list-menu/select-rpc-url-modal/select-rpc-url-modal.test.tsx index 8f3de3d488f9..69e88f88f372 100644 --- a/ui/components/multichain/network-list-menu/select-rpc-url-modal/select-rpc-url-modal.test.tsx +++ b/ui/components/multichain/network-list-menu/select-rpc-url-modal/select-rpc-url-modal.test.tsx @@ -1,10 +1,10 @@ import React from 'react'; import { fireEvent, screen } from '@testing-library/react'; import configureMockStore from 'redux-mock-store'; +import { NetworkConfiguration } from '@metamask/network-controller'; import { renderWithProvider } from '../../../../../test/lib/render-helpers'; import { - // TODO: Add this API with network controller v21 upgrade - // updateNetwork, + updateNetwork, setActiveNetwork, setEditedNetwork, toggleNetworkMenu, @@ -20,8 +20,7 @@ jest.mock('react-redux', () => ({ })); jest.mock('../../../../store/actions', () => ({ - // TODO: Add this API with network controller v21 upgrade - // updateNetwork: jest.fn(), + updateNetwork: jest.fn(), setActiveNetwork: jest.fn(), setEditedNetwork: jest.fn(), toggleNetworkMenu: jest.fn(), @@ -36,7 +35,7 @@ const networkConfiguration = { { url: 'https://rpc.flashbots.net/', networkClientId: 'flashbots' }, ], defaultRpcEndpointIndex: 0, -}; +} as unknown as NetworkConfiguration; const store = mockStore({ metamask: { @@ -104,13 +103,12 @@ describe('SelectRpcUrlModal Component', () => { ); fireEvent.click(rpcEndpoint); - // TODO: Add this API with network controller v21 upgrade - // expect(mockDispatch).toHaveBeenCalledWith( - // updateNetwork({ - // ...networkConfiguration, - // defaultRpcEndpointIndex: 1, - // }), - // ); + expect(mockDispatch).toHaveBeenCalledWith( + updateNetwork({ + ...networkConfiguration, + defaultRpcEndpointIndex: 1, + }), + ); expect(mockDispatch).toHaveBeenCalledWith(setActiveNetwork('flashbots')); expect(mockDispatch).toHaveBeenCalledWith(setEditedNetwork()); expect(mockDispatch).toHaveBeenCalledWith(toggleNetworkMenu()); @@ -154,13 +152,12 @@ describe('SelectRpcUrlModal Component', () => { screen.getByText(stripProtocol(networkConfiguration.rpcEndpoints[1].url)), ); - // TODO: Add this API with network controller v21 upgrade - // expect(mockDispatch).toHaveBeenCalledWith( - // updateNetwork({ - // ...networkConfiguration, - // defaultRpcEndpointIndex: 1, - // }), - // ); + expect(mockDispatch).toHaveBeenCalledWith( + updateNetwork({ + ...networkConfiguration, + defaultRpcEndpointIndex: 1, + }), + ); expect(mockDispatch).toHaveBeenCalledWith( setActiveNetwork(networkConfiguration.rpcEndpoints[1].networkClientId), ); diff --git a/ui/components/multichain/network-list-menu/select-rpc-url-modal/select-rpc-url-modal.tsx b/ui/components/multichain/network-list-menu/select-rpc-url-modal/select-rpc-url-modal.tsx index b16dddf5f86e..7fc8e5e6fe3e 100644 --- a/ui/components/multichain/network-list-menu/select-rpc-url-modal/select-rpc-url-modal.tsx +++ b/ui/components/multichain/network-list-menu/select-rpc-url-modal/select-rpc-url-modal.tsx @@ -1,4 +1,5 @@ import React from 'react'; +import { NetworkConfiguration } from '@metamask/network-controller'; import classnames from 'classnames'; import { useDispatch } from 'react-redux'; import { @@ -20,15 +21,14 @@ import { setActiveNetwork, setEditedNetwork, toggleNetworkMenu, + updateNetwork, } from '../../../../store/actions'; import RpcListItem from '../rpc-list-item'; export const SelectRpcUrlModal = ({ networkConfiguration, }: { - // TODO: `NetworkConfiguration` with network controller v21 upgrade - // eslint-disable-next-line @typescript-eslint/no-explicit-any - networkConfiguration: any; + networkConfiguration: NetworkConfiguration; }) => { const dispatch = useDispatch(); @@ -61,44 +61,39 @@ export const SelectRpcUrlModal = ({ - {networkConfiguration.rpcEndpoints.map( - // TODO: types will be inferred with network controller v21 upgrade - // eslint-disable-next-line @typescript-eslint/no-explicit-any - (rpcEndpoint: any, index: number) => ( - { - // TODO: When this API becomes available with network controller v21 upgrade - // dispatch( - // updateNetwork({ - // ...networkConfiguration, - // defaultRpcEndpointIndex: index, - // }), - // ); - dispatch(setActiveNetwork(rpcEndpoint.networkClientId)); - dispatch(setEditedNetwork()); - dispatch(toggleNetworkMenu()); - }} - className={classnames('select-rpc-url__item', { - 'select-rpc-url__item--selected': - index === networkConfiguration.defaultRpcEndpointIndex, - })} - > - {index === networkConfiguration.defaultRpcEndpointIndex && ( - - )} - - - ), - )} + {networkConfiguration.rpcEndpoints.map((rpcEndpoint, index) => ( + { + dispatch( + updateNetwork({ + ...networkConfiguration, + defaultRpcEndpointIndex: index, + }), + ); + dispatch(setActiveNetwork(rpcEndpoint.networkClientId)); + dispatch(setEditedNetwork()); + dispatch(toggleNetworkMenu()); + }} + className={classnames('select-rpc-url__item', { + 'select-rpc-url__item--selected': + index === networkConfiguration.defaultRpcEndpointIndex, + })} + > + {index === networkConfiguration.defaultRpcEndpointIndex && ( + + )} + + + ))} ); }; diff --git a/ui/components/multichain/notification-detail-block-explorer-button/notification-detail-block-explorer-button.tsx b/ui/components/multichain/notification-detail-block-explorer-button/notification-detail-block-explorer-button.tsx index 02250c4ec36b..6ca6e27c491f 100644 --- a/ui/components/multichain/notification-detail-block-explorer-button/notification-detail-block-explorer-button.tsx +++ b/ui/components/multichain/notification-detail-block-explorer-button/notification-detail-block-explorer-button.tsx @@ -1,11 +1,10 @@ -import React, { useMemo } from 'react'; +import React from 'react'; import { useSelector } from 'react-redux'; -import type { NetworkConfiguration } from '@metamask/network-controller'; import type { NotificationServicesController } from '@metamask/notification-services-controller'; -import { getAllNetworks } from '../../../selectors'; +import { toHex } from '@metamask/controller-utils'; +import { getNetworkConfigurationsByChainId } from '../../../selectors'; import { CHAIN_IDS } from '../../../../shared/constants/network'; import { ButtonVariant } from '../../component-library'; -import { decimalToHex } from '../../../../shared/modules/conversion.utils'; import { useI18nContext } from '../../../hooks/useI18nContext'; import { getNetworkDetailsByChainId } from '../../../helpers/utils/notification.util'; import { NotificationDetailButton } from '../notification-detail-button'; @@ -27,21 +26,22 @@ export const NotificationDetailBlockExplorerButton = ({ }: NotificationDetailBlockExplorerButtonProps) => { const t = useI18nContext(); - const chainIdHex = decimalToHex(chainId); + const chainIdHex = toHex(chainId); const { blockExplorerConfig } = getNetworkDetailsByChainId( - `0x${chainIdHex}` as keyof typeof CHAIN_IDS, + chainIdHex as keyof typeof CHAIN_IDS, ); - const defaultNetworks: NetworkConfiguration[] = useSelector(getAllNetworks); - const defaultNetwork = useMemo(() => { - return defaultNetworks.find((n) => n.chainId === chainIdHex); - }, [defaultNetworks]); + const networkConfigurations = useSelector(getNetworkConfigurationsByChainId); + const networkConfiguration = networkConfigurations[chainIdHex]; + const configuredBlockExplorer = + networkConfiguration?.blockExplorerUrls?.[ + networkConfiguration.defaultBlockExplorerUrlIndex ?? -1 + ]; - const blockExplorerUrl = - defaultNetwork?.rpcPrefs?.blockExplorerUrl ?? blockExplorerConfig?.url; + const blockExplorerUrl = configuredBlockExplorer ?? blockExplorerConfig?.url; const getBlockExplorerButtonText = () => { - if (defaultNetwork?.rpcPrefs?.blockExplorerUrl) { + if (configuredBlockExplorer) { return t('notificationItemCheckBlockExplorer'); } if (blockExplorerConfig?.name) { diff --git a/ui/components/multichain/pages/permissions-page/permissions-page.test.js b/ui/components/multichain/pages/permissions-page/permissions-page.test.js index dacdda2f25d3..026cddeff34d 100644 --- a/ui/components/multichain/pages/permissions-page/permissions-page.test.js +++ b/ui/components/multichain/pages/permissions-page/permissions-page.test.js @@ -2,6 +2,8 @@ import React from 'react'; import configureStore from '../../../../store/store'; import mockState from '../../../../../test/data/mock-state.json'; import { renderWithProvider } from '../../../../../test/lib/render-helpers'; +import { mockNetworkState } from '../../../../../test/stub/networks'; +import { CHAIN_IDS } from '../../../../../shared/constants/network'; import { PermissionsPage } from './permissions-page'; mockState.metamask.subjectMetadata = { @@ -86,7 +88,13 @@ mockState.metamask.domains = { 'npm:@metamask/testSnap3': 'mainnet', }; -let store = configureStore(mockState); +let store = configureStore({ + ...mockState, + metamask: { + ...mockState.metamask, + ...mockNetworkState({ chainId: CHAIN_IDS.MAINNET, id: 'mainnet' }), + }, +}); describe('All Connections', () => { describe('render', () => { diff --git a/ui/components/multichain/pages/send/components/__snapshots__/network-picker.test.tsx.snap b/ui/components/multichain/pages/send/components/__snapshots__/network-picker.test.tsx.snap index aaf424f4ee44..37ca306bc436 100644 --- a/ui/components/multichain/pages/send/components/__snapshots__/network-picker.test.tsx.snap +++ b/ui/components/multichain/pages/send/components/__snapshots__/network-picker.test.tsx.snap @@ -12,12 +12,12 @@ exports[`SendPageNetworkPicker render renders correctly 1`] = `
- C + G
- Chain 5 + Goerli { }, }, }; - const store = configureStore()(mockState); + const store = configureStore()({ + ...mockState, + metamask: { ...mockNetworkState({ chainId: CHAIN_IDS.MAINNET }) }, + }); const onClick = jest.fn(); const args = { diff --git a/ui/components/multichain/token-list-item/token-list-item.tsx b/ui/components/multichain/token-list-item/token-list-item.tsx index c227a1806245..5c6fb0f56799 100644 --- a/ui/components/multichain/token-list-item/token-list-item.tsx +++ b/ui/components/multichain/token-list-item/token-list-item.tsx @@ -58,10 +58,7 @@ import { import { CURRENCY_SYMBOLS } from '../../../../shared/constants/network'; import { NETWORKS_ROUTE } from '../../../helpers/constants/routes'; -import { setSelectedNetworkConfigurationId } from '../../../store/actions'; -import { ENVIRONMENT_TYPE_FULLSCREEN } from '../../../../shared/constants/app'; -import { getEnvironmentType } from '../../../../app/scripts/lib/util'; -import { getProviderConfig } from '../../../ducks/metamask/metamask'; +import { setEditedNetwork } from '../../../store/actions'; import { getPortfolioUrl } from '../../../helpers/utils/portfolio'; import { PercentageChange } from './price/percentage-change/percentage-change'; @@ -110,9 +107,6 @@ export const TokenListItem = ({ const dispatch = useDispatch(); const [showScamWarningModal, setShowScamWarningModal] = useState(false); - const environmentType = getEnvironmentType(); - const providerConfig = useSelector(getProviderConfig); - const isFullScreen = environmentType === ENVIRONMENT_TYPE_FULLSCREEN; const history = useHistory(); const getTokenTitle = () => { @@ -416,14 +410,8 @@ export const TokenListItem = ({ { - dispatch( - setSelectedNetworkConfigurationId(providerConfig.id), - ); - if (isFullScreen) { - history.push(NETWORKS_ROUTE); - } else { - global.platform.openExtensionInBrowser?.(NETWORKS_ROUTE); - } + dispatch(setEditedNetwork({ chainId })); + history.push(NETWORKS_ROUTE); }} block > diff --git a/ui/components/ui/deprecated-networks/deprecated-networks.js b/ui/components/ui/deprecated-networks/deprecated-networks.js index a67f8258317e..736b5badb6a0 100644 --- a/ui/components/ui/deprecated-networks/deprecated-networks.js +++ b/ui/components/ui/deprecated-networks/deprecated-networks.js @@ -7,21 +7,21 @@ import { Severity, } from '../../../helpers/constants/design-system'; -import { getCurrentNetwork } from '../../../selectors'; +import { + getCurrentNetwork, + getNetworkConfigurationsByChainId, +} from '../../../selectors'; import { getCompletedOnboarding } from '../../../ducks/metamask/metamask'; import { BannerAlert, Box } from '../../component-library'; import { - AURORA_DISPLAY_NAME, CHAIN_IDS, - CURRENCY_SYMBOLS, DEPRECATED_NETWORKS, - NEAR_AURORA_MAINNET_IMAGE_URL, } from '../../../../shared/constants/network'; -import { upsertNetworkConfiguration } from '../../../store/actions'; -import { MetaMetricsNetworkEventSource } from '../../../../shared/constants/metametrics'; +import { updateNetwork } from '../../../store/actions'; export default function DeprecatedNetworks() { - const { id, chainId, rpcUrl } = useSelector(getCurrentNetwork) ?? {}; + const { chainId, rpcUrl } = useSelector(getCurrentNetwork) ?? {}; + const networkConfigurations = useSelector(getNetworkConfigurationsByChainId); const [isClosed, setIsClosed] = useState(false); const completedOnboarding = useSelector(getCompletedOnboarding); const t = useI18nContext(); @@ -58,25 +58,13 @@ export default function DeprecatedNetworks() { actionButtonLabel: t('switchToNetwork', ['mainnet.aurora.dev']), actionButtonOnClick: async () => { setIsClosed(true); - await dispatch( - upsertNetworkConfiguration( - { - id, - chainId: CHAIN_IDS.AURORA, - nickname: AURORA_DISPLAY_NAME, - rpcUrl: 'https://mainnet.aurora.dev', - ticker: CURRENCY_SYMBOLS.ETH, - rpcPrefs: { - imageUrl: NEAR_AURORA_MAINNET_IMAGE_URL, - blockExplorerUrl: 'https://aurorascan.dev', - }, - }, - { - source: MetaMetricsNetworkEventSource.DeprecatedNetworkModal, - setActive: true, - }, - ), - ); + + const networkConfiguration = networkConfigurations[chainId]; + networkConfiguration.rpcEndpoints[ + networkConfiguration.defaultRpcEndpointIndex + ].url = 'https://mainnet.aurora.dev'; + + await dispatch(updateNetwork(networkConfiguration)); }, }; } diff --git a/ui/components/ui/new-network-info/new-network-info.test.js b/ui/components/ui/new-network-info/new-network-info.test.js index 027c0e2721a5..59d98ab358fd 100644 --- a/ui/components/ui/new-network-info/new-network-info.test.js +++ b/ui/components/ui/new-network-info/new-network-info.test.js @@ -108,7 +108,12 @@ describe('NewNetworkInfo', () => { .get('/tokens/0x3?occurrenceFloor=100&includeNativeAssets=false') .reply(200, '{"error":"ChainId 0x3 is not supported"}'); - const store = configureMockStore()(state); + const store = configureMockStore()({ + metamask: { + ...state.metamask, + ...mockNetworkState({ chainId: '0x3', ticker: undefined }), + }, + }); const { container, getByTestId } = renderWithProvider( , store, diff --git a/ui/ducks/app/app.ts b/ui/ducks/app/app.ts index d053b32e4e6e..fd74618b5330 100644 --- a/ui/ducks/app/app.ts +++ b/ui/ducks/app/app.ts @@ -84,9 +84,10 @@ type AppState = { newNetworkAddedName: string; editedNetwork: | { - networkConfigurationId: string; - nickname: string; - editCompleted: boolean; + chainId: string; + nickname?: string; + editCompleted?: boolean; + newNetwork?: boolean; } | undefined; newNetworkAddedConfigurationId: string; diff --git a/ui/ducks/bridge/selectors.test.ts b/ui/ducks/bridge/selectors.test.ts index 0962ea4bcde9..50a5ad4beb33 100644 --- a/ui/ducks/bridge/selectors.test.ts +++ b/ui/ducks/bridge/selectors.test.ts @@ -63,12 +63,22 @@ describe('Bridge selectors', () => { it('uses config from allNetworks if network is in both FEATURED_RPCS and allNetworks', () => { const addedFeaturedNetwork = { ...FEATURED_RPCS[FEATURED_RPCS.length - 1], - id: 'testid', }; + const state = { ...createBridgeMockStore(), metamask: { networkConfigurations: [addedFeaturedNetwork], + ...mockNetworkState( + { chainId: CHAIN_IDS.MAINNET }, + { chainId: CHAIN_IDS.LINEA_MAINNET }, + { + ...FEATURED_RPCS[FEATURED_RPCS.length - 1], + id: 'testid', + blockExplorerUrl: 'https://basescan.org', + rpcUrl: 'https://mainnet.base.org', + }, + ), }, }; const result = getAllBridgeableNetworks(state as never); @@ -81,28 +91,31 @@ describe('Bridge selectors', () => { expect.objectContaining({ chainId: CHAIN_IDS.LINEA_MAINNET }), ); expect(result[2]).toStrictEqual({ - ...addedFeaturedNetwork, - removable: true, - blockExplorerUrl: 'https://basescan.org', + blockExplorerUrls: addedFeaturedNetwork.blockExplorerUrls, + chainId: addedFeaturedNetwork.chainId, + defaultBlockExplorerUrlIndex: + addedFeaturedNetwork.defaultBlockExplorerUrlIndex, + defaultRpcEndpointIndex: addedFeaturedNetwork.defaultRpcEndpointIndex, + name: addedFeaturedNetwork.name, + nativeCurrency: addedFeaturedNetwork.nativeCurrency, + rpcEndpoints: [ + { + networkClientId: 'testid', + ...addedFeaturedNetwork.rpcEndpoints[0], + }, + ], }); expect(result.slice(3)).toStrictEqual(FEATURED_RPCS.slice(0, -1)); }); it('returns network if included in ALLOWED_BRIDGE_CHAIN_IDS', () => { - const addedFeaturedNetwork = { - chainId: '0x11212131241523151', - nickname: 'scroll', - rpcUrl: 'https://a', - ticker: 'ETH', - rpcPrefs: { - blockExplorerUrl: 'https://a', - imageUrl: 'https://a', - }, - }; const state = { ...createBridgeMockStore(), metamask: { - networkConfigurations: [addedFeaturedNetwork], + ...mockNetworkState( + { chainId: CHAIN_IDS.MAINNET }, + { chainId: CHAIN_IDS.LINEA_MAINNET }, + ), }, }; const result = getAllBridgeableNetworks(state as never); diff --git a/ui/ducks/bridge/selectors.ts b/ui/ducks/bridge/selectors.ts index 9a5cdc18151f..9b355bd0df74 100644 --- a/ui/ducks/bridge/selectors.ts +++ b/ui/ducks/bridge/selectors.ts @@ -1,15 +1,15 @@ import { NetworkState } from '@metamask/network-controller'; import { uniqBy } from 'lodash'; -import { getAllNetworks, getIsBridgeEnabled } from '../../selectors'; +import { + getIsBridgeEnabled, + getNetworkConfigurationsByChainId, +} from '../../selectors'; import { ALLOWED_BRIDGE_CHAIN_IDS } from '../../../shared/constants/bridge'; import { BridgeControllerState, BridgeFeatureFlagsKey, } from '../../../app/scripts/controllers/bridge/types'; -import { - FEATURED_RPCS, - RPCDefinition, -} from '../../../shared/constants/network'; +import { FEATURED_RPCS } from '../../../shared/constants/network'; import { createDeepEqualSelector } from '../../selectors/util'; import { getProviderConfig } from '../metamask/metamask'; import { BridgeState } from './bridge'; @@ -26,21 +26,22 @@ export const getFromChain = (state: BridgeAppState) => getProviderConfig(state); export const getToChain = (state: BridgeAppState) => state.bridge.toChain; export const getAllBridgeableNetworks = createDeepEqualSelector( - (state: BridgeAppState) => - // includes networks user has added - getAllNetworks({ - metamask: { networkConfigurations: state.metamask.networkConfigurations }, - }), - (allNetworks): RPCDefinition[] => { - return uniqBy([...allNetworks, ...FEATURED_RPCS], 'chainId').filter( - ({ chainId }) => ALLOWED_BRIDGE_CHAIN_IDS.includes(chainId), + getNetworkConfigurationsByChainId, + (networkConfigurationsByChainId) => { + return uniqBy( + [...Object.values(networkConfigurationsByChainId), ...FEATURED_RPCS], + 'chainId', + ).filter(({ chainId }) => + ALLOWED_BRIDGE_CHAIN_IDS.includes( + chainId as (typeof ALLOWED_BRIDGE_CHAIN_IDS)[number], + ), ); }, ); export const getFromChains = createDeepEqualSelector( getAllBridgeableNetworks, (state: BridgeAppState) => state.metamask.bridgeState?.bridgeFeatureFlags, - (allBridgeableNetworks, bridgeFeatureFlags): RPCDefinition[] => + (allBridgeableNetworks, bridgeFeatureFlags) => allBridgeableNetworks.filter(({ chainId }) => bridgeFeatureFlags[BridgeFeatureFlagsKey.NETWORK_SRC_ALLOWLIST].includes( chainId, @@ -50,7 +51,7 @@ export const getFromChains = createDeepEqualSelector( export const getToChains = createDeepEqualSelector( getAllBridgeableNetworks, (state: BridgeAppState) => state.metamask.bridgeState?.bridgeFeatureFlags, - (allBridgeableNetworks, bridgeFeatureFlags): RPCDefinition[] => + (allBridgeableNetworks, bridgeFeatureFlags) => allBridgeableNetworks.filter(({ chainId }) => bridgeFeatureFlags[BridgeFeatureFlagsKey.NETWORK_DEST_ALLOWLIST].includes( chainId, @@ -65,5 +66,6 @@ export const getIsBridgeTx = createDeepEqualSelector( (fromChain, toChain, isBridgeEnabled: boolean) => isBridgeEnabled && toChain !== null && + fromChain !== undefined && fromChain.chainId !== toChain.chainId, ); diff --git a/ui/ducks/metamask/metamask.js b/ui/ducks/metamask/metamask.js index e3d16b6fa78d..4765a87df61d 100644 --- a/ui/ducks/metamask/metamask.js +++ b/ui/ducks/metamask/metamask.js @@ -1,6 +1,7 @@ import { addHexPrefix, isHexString } from 'ethereumjs-util'; import { createSelector } from 'reselect'; import { mergeGasFeeEstimates } from '@metamask/transaction-controller'; +import { RpcEndpointType } from '@metamask/network-controller'; import { AlertTypes } from '../../../shared/constants/alerts'; import { GasEstimateTypes, @@ -17,15 +18,11 @@ import { getAddressBook, getSelectedNetworkClientId, getSelectedInternalAccount, - getNetworkConfigurations, + getNetworkConfigurationsByChainId, } from '../../selectors'; import * as actionConstants from '../../store/actionConstants'; import { updateTransactionGasFees } from '../../store/actions'; import { setCustomGasLimit, setCustomGasPrice } from '../gas/gas.duck'; -import { - BUILT_IN_INFURA_NETWORKS, - NETWORK_TYPES, -} from '../../../shared/constants/network'; const initialState = { isInitialized: false, @@ -54,6 +51,7 @@ const initialState = { useNativeCurrencyAsPrimaryCurrency: true, petnamesEnabled: true, featureNotificationsEnabled: false, + showMultiRpcModal: false, }, firstTimeFlowType: null, completedOnboarding: false, @@ -281,20 +279,36 @@ export const getAlertEnabledness = (state) => state.metamask.alertEnabledness; * * @param {object} state - Redux state object. */ -export function getProviderConfig(state) { - const networkClientId = getSelectedNetworkClientId(state); - const builtInNetwork = BUILT_IN_INFURA_NETWORKS[networkClientId]; - return builtInNetwork - ? { - ...builtInNetwork, - type: networkClientId, - rpcPrefs: { blockExplorerUrl: builtInNetwork.blockExplorerUrl }, +export const getProviderConfig = createSelector( + (state) => getNetworkConfigurationsByChainId(state), + (state) => getSelectedNetworkClientId(state), + (networkConfigurationsByChainId, selectedNetworkClientId) => { + for (const network of Object.values(networkConfigurationsByChainId)) { + for (const rpcEndpoint of network.rpcEndpoints) { + if (rpcEndpoint.networkClientId === selectedNetworkClientId) { + const blockExplorerUrl = + network.blockExplorerUrls?.[network.defaultBlockExplorerUrlIndex]; + + return { + chainId: network.chainId, + ticker: network.nativeCurrency, + rpcPrefs: { ...(blockExplorerUrl && { blockExplorerUrl }) }, + type: + rpcEndpoint.type === RpcEndpointType.Custom + ? 'rpc' + : rpcEndpoint.networkClientId, + ...(rpcEndpoint.type === RpcEndpointType.Custom && { + id: rpcEndpoint.networkClientId, + nickname: network.name, + rpcUrl: rpcEndpoint.url, + }), + }; + } } - : { - ...getNetworkConfigurations(state)[networkClientId], - type: NETWORK_TYPES.RPC, - }; -} + } + return undefined; // should not be reachable + }, +); export const getUnconnectedAccountAlertEnabledness = (state) => getAlertEnabledness(state)[AlertTypes.unconnectedAccount]; diff --git a/ui/ducks/send/helpers.test.js b/ui/ducks/send/helpers.test.js index 7129ffca8194..74f660991cd7 100644 --- a/ui/ducks/send/helpers.test.js +++ b/ui/ducks/send/helpers.test.js @@ -64,6 +64,7 @@ jest.mock('../metamask/metamask', () => ({ ...jest.requireActual('../metamask/metamask'), getGasFeeEstimates: jest.fn(), getNativeCurrency: jest.fn(), + getProviderConfig: jest.fn(), })); jest.mock('../swaps/swaps', () => ({ diff --git a/ui/ducks/send/send.js b/ui/ducks/send/send.js index 09cc2412d995..cdbe7d2daa86 100644 --- a/ui/ducks/send/send.js +++ b/ui/ducks/send/send.js @@ -3546,7 +3546,7 @@ export const getIsSwapAndSendDisabledForNetwork = createSelector( ); export const getSendAnalyticProperties = createSelector( - getProviderConfig, + (state) => getProviderConfig(state), getCurrentDraftTransaction, getBestQuote, ({ chainId, ticker: nativeCurrencySymbol }, draftTransaction, bestQuote) => { diff --git a/ui/helpers/constants/zendesk-url.js b/ui/helpers/constants/zendesk-url.js index 790f2894fcc7..882d5232a473 100644 --- a/ui/helpers/constants/zendesk-url.js +++ b/ui/helpers/constants/zendesk-url.js @@ -35,7 +35,7 @@ const ZENDESK_URLS = { TOKEN_SAFETY_PRACTICES: 'https://support.metamask.io/managing-my-tokens/token-safety-practices/', UNKNOWN_NETWORK: - 'https://support.metamask.io/nl/networks-and-sidechains/managing-networks/the-risks-of-connecting-to-an-unknown-network/', + 'https://support.metamask.io/networks-and-sidechains/managing-networks/the-risks-of-connecting-to-an-unknown-network/', USER_GUIDE_CUSTOM_NETWORKS: 'https://support.metamask.io/networks-and-sidechains/managing-networks/user-guide-custom-networks-and-sidechains/', USER_GUIDE_DAPPS: diff --git a/ui/helpers/utils/feature-flags.js b/ui/helpers/utils/feature-flags.js deleted file mode 100644 index 1956ee75c4bc..000000000000 --- a/ui/helpers/utils/feature-flags.js +++ /dev/null @@ -1,3 +0,0 @@ -export function getLocalNetworkMenuRedesignFeatureFlag() { - return window.metamaskFeatureFlags?.networkMenuRedesign; -} diff --git a/ui/helpers/utils/notification.util.ts b/ui/helpers/utils/notification.util.ts index b48893ee8e0e..489f1ca2f272 100644 --- a/ui/helpers/utils/notification.util.ts +++ b/ui/helpers/utils/notification.util.ts @@ -381,7 +381,7 @@ export function getRpcUrlByChainId(chainId: HexChainId): string { // If rpc is found, return its URL. Otherwise, return a default URL based on the chainId. if (rpc) { - return rpc.rpcUrl; + return rpc.rpcEndpoints[0].url; } // Fallback RPC URLs based on the chainId switch (chainId) { diff --git a/ui/hooks/ramps/useRamps/useRamps.test.tsx b/ui/hooks/ramps/useRamps/useRamps.test.tsx index 2f1739fd36e8..0b0b8124666b 100644 --- a/ui/hooks/ramps/useRamps/useRamps.test.tsx +++ b/ui/hooks/ramps/useRamps/useRamps.test.tsx @@ -38,6 +38,7 @@ describe('useRamps', () => { ...mockStoreState, metamask: { ...mockStoreState.metamask, + ...mockNetworkState({ chainId: mockChainId }), }, }; @@ -60,6 +61,7 @@ describe('useRamps', () => { ...mockStoreState, metamask: { ...mockStoreState.metamask, + ...mockNetworkState({ chainId: mockChainId }), }, }; diff --git a/ui/hooks/useTokenTracker.js b/ui/hooks/useTokenTracker.js index 93b8fa08214e..0ce2c9cbcac2 100644 --- a/ui/hooks/useTokenTracker.js +++ b/ui/hooks/useTokenTracker.js @@ -1,9 +1,10 @@ import { useState, useEffect, useRef, useCallback } from 'react'; import TokenTracker from '@metamask/eth-token-tracker'; import { shallowEqual, useSelector } from 'react-redux'; -import { getCurrentChainId, getSelectedInternalAccount } from '../selectors'; +import { getSelectedInternalAccount } from '../selectors'; import { SECOND } from '../../shared/constants/time'; import { isEqualCaseInsensitive } from '../../shared/modules/string-utils'; +import { getProviderConfig } from '../ducks/metamask/metamask'; import { useEqualityCheck } from './useEqualityCheck'; export function useTokenTracker({ @@ -12,7 +13,7 @@ export function useTokenTracker({ includeFailedTokens = false, hideZeroBalanceTokens = false, }) { - const chainId = useSelector(getCurrentChainId); + const { chainId, rpcUrl } = useSelector(getProviderConfig); const { address: selectedAddress } = useSelector( getSelectedInternalAccount, shallowEqual, @@ -97,8 +98,9 @@ export function useTokenTracker({ useEffect(() => { // This effect will only run initially and when: // 1. chainId is updated, - // 2. userAddress is changed, - // 3. token list is updated and not equal to previous list + // 2. rpc url is changd, + // 3. userAddress is changed, + // 4. token list is updated and not equal to previous list // in any of these scenarios, we should indicate to the user that their token // values are in the process of updating by setting loading state. setLoading(true); @@ -121,6 +123,7 @@ export function useTokenTracker({ userAddress, teardownTracker, chainId, + rpcUrl, memoizedTokens, updateBalances, buildTracker, diff --git a/ui/index.js b/ui/index.js index 0198e586bfdf..4f98eab94209 100644 --- a/ui/index.js +++ b/ui/index.js @@ -308,12 +308,6 @@ function setupStateHooks(store) { }; } -// Check for local feature flags and represent them so they're avialable -// to the front-end of the app -window.metamaskFeatureFlags = { - networkMenuRedesign: Boolean(process.env.ENABLE_NETWORK_UI_REDESIGN), -}; - window.logStateString = async function (cb) { const state = await window.stateHooks.getCleanAppState(); const logs = window.stateHooks.getLogs(); diff --git a/ui/pages/asset/components/native-asset.tsx b/ui/pages/asset/components/native-asset.tsx index 0ebf3f02c317..cdc38afcd240 100644 --- a/ui/pages/asset/components/native-asset.tsx +++ b/ui/pages/asset/components/native-asset.tsx @@ -2,6 +2,7 @@ import React, { useContext } from 'react'; import { useSelector } from 'react-redux'; import { getAccountLink } from '@metamask/etherscan-link'; import { + getCurrentChainId, getCurrentCurrency, getNativeCurrencyImage, getRpcPrefsForCurrentProvider, @@ -29,7 +30,8 @@ const NativeAsset = () => { const image = useSelector(getNativeCurrencyImage); const showFiat = useSelector(getShouldShowFiat); const currentCurrency = useSelector(getCurrentCurrency); - const { chainId, ticker, type } = useSelector(getProviderConfig); + const chainId = useSelector(getCurrentChainId); + const { ticker, type } = useSelector(getProviderConfig) ?? {}; const { address } = useSelector(getSelectedInternalAccount); const rpcPrefs = useSelector(getRpcPrefsForCurrentProvider); diff --git a/ui/pages/confirm-add-suggested-nft/confirm-add-suggested-nft.test.js b/ui/pages/confirm-add-suggested-nft/confirm-add-suggested-nft.test.js index 003e88f16351..909b2caf76ed 100644 --- a/ui/pages/confirm-add-suggested-nft/confirm-add-suggested-nft.test.js +++ b/ui/pages/confirm-add-suggested-nft/confirm-add-suggested-nft.test.js @@ -74,7 +74,9 @@ const renderComponent = (pendingNfts = {}) => { metamask: { ...mockState.metamask, pendingApprovals: pendingNfts, - ...mockNetworkState({ chainId: CHAIN_IDS.MAINNET }), + ...mockNetworkState({ + chainId: CHAIN_IDS.MAINNET, + }), }, history: { mostRecentOverviewPage: '/', diff --git a/ui/pages/confirmations/components/advanced-gas-controls/advanced-gas-controls.test.js b/ui/pages/confirmations/components/advanced-gas-controls/advanced-gas-controls.test.js index 9e8aff0e7d4c..13e2637ecb96 100644 --- a/ui/pages/confirmations/components/advanced-gas-controls/advanced-gas-controls.test.js +++ b/ui/pages/confirmations/components/advanced-gas-controls/advanced-gas-controls.test.js @@ -1,11 +1,15 @@ import React from 'react'; +import configureMockStore from 'redux-mock-store'; import { renderWithProvider } from '../../../../../test/jest/rendering'; import AdvancedGasControls from './advanced-gas-controls.component'; const renderComponent = (props) => { - return renderWithProvider(); + const store = configureMockStore([])({ + metamask: {}, + }); + return renderWithProvider(, store); }; describe('AdvancedGasControls Component', () => { diff --git a/ui/pages/confirmations/components/advanced-gas-fee-popover/advanced-gas-fee-defaults/advanced-gas-fee-defaults.test.js b/ui/pages/confirmations/components/advanced-gas-fee-popover/advanced-gas-fee-defaults/advanced-gas-fee-defaults.test.js index d6bcb4495950..5e330a8b90c7 100644 --- a/ui/pages/confirmations/components/advanced-gas-fee-popover/advanced-gas-fee-defaults/advanced-gas-fee-defaults.test.js +++ b/ui/pages/confirmations/components/advanced-gas-fee-popover/advanced-gas-fee-defaults/advanced-gas-fee-defaults.test.js @@ -17,10 +17,10 @@ import configureStore from '../../../../../store/store'; import AdvancedGasFeeInputs from '../advanced-gas-fee-inputs'; import { CHAIN_IDS } from '../../../../../../shared/constants/network'; import { getSelectedInternalAccountFromMockState } from '../../../../../../test/jest/mocks'; +import { mockNetworkState } from '../../../../../../test/stub/networks'; import AdvancedGasFeeDefaults from './advanced-gas-fee-defaults'; -const TEXT_SELECTOR = - 'Save these values as my default for the Chain 5 network.'; +const TEXT_SELECTOR = 'Save these values as my default for the Goerli network.'; jest.mock('../../../../../store/actions', () => ({ gasFeeStartPollingByNetworkClientId: jest @@ -43,6 +43,7 @@ const render = async (defaultGasParams, contextParams) => { metamask: { ...mockState.metamask, ...defaultGasParams, + ...mockNetworkState({ chainId: CHAIN_IDS.GOERLI }), accounts: { [mockSelectedInternalAccount.address]: { address: mockSelectedInternalAccount.address, diff --git a/ui/pages/confirmations/components/advanced-gas-inputs/advanced-gas-inputs.test.js b/ui/pages/confirmations/components/advanced-gas-inputs/advanced-gas-inputs.test.js index 92af1a3bd4d8..aecf6fa14912 100644 --- a/ui/pages/confirmations/components/advanced-gas-inputs/advanced-gas-inputs.test.js +++ b/ui/pages/confirmations/components/advanced-gas-inputs/advanced-gas-inputs.test.js @@ -20,7 +20,7 @@ describe('AdvancedGasInputs', () => { minimumGasLimit: 21000, }; - const store = configureStore({}); + const store = configureStore({ metamask: {} }); beforeEach(() => { clock = sinon.useFakeTimers(); diff --git a/ui/pages/confirmations/components/confirm-subtitle/confirm-subtitle.test.js b/ui/pages/confirmations/components/confirm-subtitle/confirm-subtitle.test.js index 3c45b42cc717..baa2d112b671 100644 --- a/ui/pages/confirmations/components/confirm-subtitle/confirm-subtitle.test.js +++ b/ui/pages/confirmations/components/confirm-subtitle/confirm-subtitle.test.js @@ -5,6 +5,7 @@ import mockState from '../../../../../test/data/mock-state.json'; import { renderWithProvider } from '../../../../../test/lib/render-helpers'; import configureStore from '../../../../store/store'; import { getSelectedInternalAccountFromMockState } from '../../../../../test/jest/mocks'; +import { getProviderConfig } from '../../../../ducks/metamask/metamask'; import ConfirmSubTitle from './confirm-subtitle'; const mockSelectedInternalAccount = @@ -50,9 +51,7 @@ describe('ConfirmSubTitle', () => { mockState.metamask.preferences.showFiatInTestnets = false; mockState.metamask.allNftContracts = { [mockSelectedInternalAccount.address]: { - [mockState.metamask.networkConfigurations[ - mockState.metamask.selectedNetworkClientId - ].chainId]: [{ address: '0x9' }], + [getProviderConfig(mockState).chainId]: [{ address: '0x9' }], }, }; store = configureStore(mockState); diff --git a/ui/pages/confirmations/components/confirm/header/__snapshots__/header.test.tsx.snap b/ui/pages/confirmations/components/confirm/header/__snapshots__/header.test.tsx.snap index 5c627c06c972..46bf53c2a7bc 100644 --- a/ui/pages/confirmations/components/confirm/header/__snapshots__/header.test.tsx.snap +++ b/ui/pages/confirmations/components/confirm/header/__snapshots__/header.test.tsx.snap @@ -57,9 +57,9 @@ exports[`Header should match snapshot with signature confirmation 1`] = `
- C + G
- Chain 5 + Goerli

@@ -170,9 +170,9 @@ exports[`Header should match snapshot with transaction confirmation 1`] = `
- C + G
- Chain 5 + Goerli

diff --git a/ui/pages/confirmations/components/confirm/header/header.test.tsx b/ui/pages/confirmations/components/confirm/header/header.test.tsx index 508089d7ed8d..c6b8481c01fc 100644 --- a/ui/pages/confirmations/components/confirm/header/header.test.tsx +++ b/ui/pages/confirmations/components/confirm/header/header.test.tsx @@ -31,7 +31,7 @@ describe('Header', () => { it('contains network name and account name', () => { const { getByText } = render(); expect(getByText('Test Account')).toBeInTheDocument(); - expect(getByText('Chain 5')).toBeInTheDocument(); + expect(getByText('Goerli')).toBeInTheDocument(); }); it('contains account info icon', async () => { diff --git a/ui/pages/confirmations/components/confirm/network-change-toast/network-change-toast-legacy.tsx b/ui/pages/confirmations/components/confirm/network-change-toast/network-change-toast-legacy.tsx index 3a6f6d2f88d2..fca355a9b063 100644 --- a/ui/pages/confirmations/components/confirm/network-change-toast/network-change-toast-legacy.tsx +++ b/ui/pages/confirmations/components/confirm/network-change-toast/network-change-toast-legacy.tsx @@ -1,13 +1,17 @@ import React, { useCallback, useEffect, useState } from 'react'; import { useSelector } from 'react-redux'; +import { Hex } from '@metamask/utils'; import { Box } from '../../../../../components/component-library'; import { Toast } from '../../../../../components/multichain'; import { getLastInteractedConfirmationInfo, setLastInteractedConfirmationInfo, } from '../../../../../store/actions'; -import { getCurrentChainId, getNetworkDetails } from '../../../../../selectors'; +import { + getCurrentChainId, + getNetworkConfigurationsByChainId, +} from '../../../../../selectors'; import { useI18nContext } from '../../../../../hooks/useI18nContext'; const CHAIN_CHANGE_THRESHOLD_MILLISECONDS = 60 * 1000; // 1 Minute @@ -22,9 +26,8 @@ const NetworkChangeToastLegacy = ({ const newChainId = confirmation?.chainId ?? chainId; const [toastVisible, setToastVisible] = useState(false); const t = useI18nContext(); - const networkInfo = useSelector((state) => - getNetworkDetails(state, newChainId), - ); + const networkConfigurations = useSelector(getNetworkConfigurationsByChainId); + const network = networkConfigurations[newChainId as Hex]; const hideToast = useCallback(() => { setToastVisible(false); @@ -78,7 +81,7 @@ const NetworkChangeToastLegacy = ({ diff --git a/ui/pages/confirmations/components/security-provider-banner-alert/blockaid-banner-alert/blockaid-banner-alert.test.js b/ui/pages/confirmations/components/security-provider-banner-alert/blockaid-banner-alert/blockaid-banner-alert.test.js index 203b930673e4..f0f9ff15bf92 100644 --- a/ui/pages/confirmations/components/security-provider-banner-alert/blockaid-banner-alert/blockaid-banner-alert.test.js +++ b/ui/pages/confirmations/components/security-provider-banner-alert/blockaid-banner-alert/blockaid-banner-alert.test.js @@ -6,6 +6,7 @@ import BlockaidPackage from '@blockaid/ppom_release/package.json'; import { renderWithProvider } from '../../../../../../test/lib/render-helpers'; import { Severity } from '../../../../../helpers/constants/design-system'; import configureStore from '../../../../../store/store'; +import { mockNetworkState } from '../../../../../../test/stub/networks'; import { BlockaidReason, @@ -42,6 +43,11 @@ const mockSecurityAlertResponse = { }; describe('Blockaid Banner Alert', () => { + const mockStore = { + metamask: { + ...mockNetworkState({}), + }, + }; it('should not render when securityAlertResponse is not present', () => { const { container } = renderWithProvider( { securityAlertResponse: undefined, }} />, - configureStore(), + configureStore(mockStore), ); expect(container.querySelector('.mm-banner-alert')).toBeNull(); @@ -65,7 +71,7 @@ describe('Blockaid Banner Alert', () => { }, }} />, - configureStore(), + configureStore(mockStore), ); expect(container.querySelector('.mm-banner-alert')).toBeNull(); @@ -81,7 +87,7 @@ describe('Blockaid Banner Alert', () => { }, }} />, - configureStore(), + configureStore(mockStore), ); const warningBannerAlert = container.querySelector( '.mm-banner-alert--severity-warning', @@ -98,7 +104,7 @@ describe('Blockaid Banner Alert', () => { securityAlertResponse: mockSecurityAlertResponse, }} />, - configureStore(), + configureStore(mockStore), ); const warningBannerAlert = container.querySelector( '.mm-banner-alert--severity-warning', @@ -118,7 +124,7 @@ describe('Blockaid Banner Alert', () => { }, }} />, - configureStore(), + configureStore(mockStore), ); const dangerBannerAlert = container.querySelector( '.mm-banner-alert--severity-danger', @@ -138,7 +144,7 @@ describe('Blockaid Banner Alert', () => { }, }} />, - configureStore(), + configureStore(mockStore), ); expect(getByText('This is a deceptive request')).toBeInTheDocument(); @@ -154,7 +160,7 @@ describe('Blockaid Banner Alert', () => { }, }} />, - configureStore(), + configureStore(mockStore), ); expect(getByText('Be careful')).toBeInTheDocument(); @@ -171,7 +177,7 @@ describe('Blockaid Banner Alert', () => { }, }} />, - configureStore(), + configureStore(mockStore), ); expect(getByText('This is a suspicious request')).toBeInTheDocument(); @@ -192,7 +198,7 @@ describe('Blockaid Banner Alert', () => { }, }} />, - configureStore(), + configureStore(mockStore), ); expect(container).toMatchSnapshot(); @@ -210,7 +216,7 @@ describe('Blockaid Banner Alert', () => { features: undefined, }} />, - configureStore(), + configureStore(mockStore), ); expect(container).toMatchSnapshot(); @@ -225,7 +231,7 @@ describe('Blockaid Banner Alert', () => { features: undefined, }} />, - configureStore(), + configureStore(mockStore), ); expect(container).toMatchSnapshot(); @@ -243,7 +249,7 @@ describe('Blockaid Banner Alert', () => { features: undefined, }} />, - configureStore(), + configureStore(mockStore), ); const elm = getByRole('link', { name: 'Report an issue' }); @@ -264,7 +270,7 @@ describe('Blockaid Banner Alert', () => { }, }} />, - configureStore(), + configureStore(mockStore), ); const elm = getByRole('link', { name: 'Report an issue' }); @@ -315,7 +321,7 @@ describe('Blockaid Banner Alert', () => { }, }} />, - configureStore(), + configureStore(mockStore), ); expect(getByText(expectedDescription)).toBeInTheDocument(); @@ -337,7 +343,7 @@ describe('Blockaid Banner Alert', () => { }, }} />, - configureStore(), + configureStore(mockStore), ); expect(getByText(stubOtherDescription)).toBeInTheDocument(); @@ -362,7 +368,7 @@ describe('Blockaid Banner Alert', () => { }, }} />, - configureStore(), + configureStore(mockStore), ); fireEvent.click(screen.queryByText('See details')); diff --git a/ui/pages/confirmations/components/signature-request-header/__snapshots__/signature-request-header.test.js.snap b/ui/pages/confirmations/components/signature-request-header/__snapshots__/signature-request-header.test.js.snap index ef1797f6e8b5..3baa846043ed 100644 --- a/ui/pages/confirmations/components/signature-request-header/__snapshots__/signature-request-header.test.js.snap +++ b/ui/pages/confirmations/components/signature-request-header/__snapshots__/signature-request-header.test.js.snap @@ -62,7 +62,7 @@ exports[`SignatureRequestHeader should match snapshot 1`] = ` - C + G @@ -73,7 +73,7 @@ exports[`SignatureRequestHeader should match snapshot 1`] = ` class="mm-box mm-text mm-text--body-sm mm-box--color-text-alternative" data-testid="signature-request-network-display" > - Chain 5 + Goerli
- C + G @@ -149,7 +149,7 @@ exports[`SignatureRequestOriginal should match snapshot 1`] = ` class="mm-box mm-text mm-text--body-sm mm-box--color-text-alternative" data-testid="signature-request-network-display" > - Chain 5 + Goerli
- C + G @@ -146,7 +146,7 @@ exports[`SignatureRequestSIWE (Sign in with Ethereum) should match snapshot 1`] class="mm-box mm-text mm-text--body-sm mm-box--color-text-alternative" data-testid="signature-request-network-display" > - Chain 5 + Goerli
- C + G - Chain 5 + Goerli - C + G - Chain 5 + Goerli (selector) => { return {}; case pendingApprovalsSortedSelector: return Object.values(opts.metamask.pendingApprovals); + case getNetworkConfigurationsByChainId: + return opts.metamask.networkConfigurationsByChainId; default: return undefined; } diff --git a/ui/pages/confirmations/confirm-send-ether/__snapshots__/confirm-send-ether.test.js.snap b/ui/pages/confirmations/confirm-send-ether/__snapshots__/confirm-send-ether.test.js.snap index 1da44ad87146..2bbceca19ec8 100644 --- a/ui/pages/confirmations/confirm-send-ether/__snapshots__/confirm-send-ether.test.js.snap +++ b/ui/pages/confirmations/confirm-send-ether/__snapshots__/confirm-send-ether.test.js.snap @@ -85,13 +85,13 @@ exports[`ConfirmSendEther should render correct information for for confirm send
- C + G
- Chain 5 + Goerli - C + G
Chain 5 logo
@@ -49,7 +48,7 @@ exports[`Confirm matches snapshot for signature - personal sign type 1`] = ` class="mm-box mm-text mm-text--body-md mm-box--color-text-alternative" data-testid="header-network-display-name" > - Chain 5 + Goerli

@@ -261,9 +260,9 @@ exports[`Confirm should match snapshot for signature - typed sign - V4 - PermitB
- C + G
- Chain 5 + Goerli

@@ -1307,9 +1306,9 @@ exports[`Confirm should match snapshot for signature - typed sign - V4 - PermitS
- C + G
- Chain 5 + Goerli

@@ -2069,12 +2068,11 @@ exports[`Confirm should match snapshot for signature - typed sign - V4 1`] = ` />
Chain 5 logo
@@ -2091,7 +2089,7 @@ exports[`Confirm should match snapshot for signature - typed sign - V4 1`] = ` class="mm-box mm-text mm-text--body-md mm-box--color-text-alternative" data-testid="header-network-display-name" > - Chain 5 + Goerli

@@ -2753,9 +2751,9 @@ exports[`Confirm should match snapshot for signature - typed sign - permit 1`] =
- C + G
- Chain 5 + Goerli

@@ -3503,9 +3501,9 @@ exports[`Confirm should match snapshot signature - typed sign - order 1`] = `
- C + G
- Chain 5 + Goerli

diff --git a/ui/pages/confirmations/confirmation/components/confirmation-network-switch/confirmation-network-switch.js b/ui/pages/confirmations/confirmation/components/confirmation-network-switch/confirmation-network-switch.js index 0d8b9936ab11..6413337216be 100644 --- a/ui/pages/confirmations/confirmation/components/confirmation-network-switch/confirmation-network-switch.js +++ b/ui/pages/confirmations/confirmation/components/confirmation-network-switch/confirmation-network-switch.js @@ -20,7 +20,7 @@ import { const getNetworkDetails = (network) => { return { ...network, - nickname: network.nickname ?? NETWORK_TO_NAME_MAP[network.chainId], + name: network.name ?? NETWORK_TO_NAME_MAP[network.chainId], iconUrl: network.iconUrl ?? CHAIN_ID_TO_NETWORK_IMAGE_URL_MAP[network.chainId], }; @@ -44,7 +44,7 @@ export default function ConfirmationNetworkSwitch({ toNetwork, fromNetwork }) { > @@ -53,7 +53,7 @@ export default function ConfirmationNetworkSwitch({ toNetwork, fromNetwork }) { justifyContent={JustifyContent.center} data-testid="network-switch-from-network" > - {fromNetworkDetails.nickname} + {fromNetworkDetails.name} @@ -80,7 +80,7 @@ export default function ConfirmationNetworkSwitch({ toNetwork, fromNetwork }) { justifyContent={JustifyContent.center} data-testid="network-switch-to-network" > - {toNetworkDetails.nickname} + {toNetworkDetails.name} @@ -90,12 +90,10 @@ export default function ConfirmationNetworkSwitch({ toNetwork, fromNetwork }) { ConfirmationNetworkSwitch.propTypes = { toNetwork: PropTypes.shape({ chainId: PropTypes.string.isRequired, - nickname: PropTypes.string.isRequired, - type: PropTypes.string, + name: PropTypes.string.isRequired, }), fromNetwork: PropTypes.shape({ chainId: PropTypes.string.isRequired, - nickname: PropTypes.string.isRequired, - type: PropTypes.string, + name: PropTypes.string.isRequired, }), }; diff --git a/ui/pages/confirmations/confirmation/components/confirmation-network-switch/confirmation-network-switch.stories.js b/ui/pages/confirmations/confirmation/components/confirmation-network-switch/confirmation-network-switch.stories.js index 372b715f7fb5..a3963055f860 100644 --- a/ui/pages/confirmations/confirmation/components/confirmation-network-switch/confirmation-network-switch.stories.js +++ b/ui/pages/confirmations/confirmation/components/confirmation-network-switch/confirmation-network-switch.stories.js @@ -15,13 +15,13 @@ export default { toNetwork: { chainId: '0xa', ticker: 'OP', - nickname: 'Optimism', + name: 'Optimism', rpcUrl: 'https://optimism-mainnet.infura.io', }, fromNetwork: { chainId: '1', ticker: 'ETH', - nickname: 'Ethereum Mainnet', + name: 'Ethereum Mainnet', }, }, }; diff --git a/ui/pages/confirmations/confirmation/confirmation.js b/ui/pages/confirmations/confirmation/confirmation.js index 90a4e5fb4ed6..b37743c256bc 100644 --- a/ui/pages/confirmations/confirmation/confirmation.js +++ b/ui/pages/confirmations/confirmation/confirmation.js @@ -31,6 +31,7 @@ import { getTotalUnapprovedCount, useSafeChainsListValidationSelector, getSnapsMetadata, + getNetworkConfigurationsByChainId, getHideSnapBranding, } from '../../../selectors'; import NetworkDisplay from '../../../components/app/network-display/network-display'; @@ -211,6 +212,9 @@ export default function ConfirmationPage({ const useSafeChainsListValidation = useSelector( useSafeChainsListValidationSelector, ); + const networkConfigurationsByChainId = useSelector( + getNetworkConfigurationsByChainId, + ); const [approvalFlowLoadingText, setApprovalFlowLoadingText] = useState(null); const [currentPendingConfirmation, setCurrentPendingConfirmation] = @@ -299,6 +303,10 @@ export default function ConfirmationPage({ { matchedChain, currencySymbolWarning, + existingNetworkConfiguration: + networkConfigurationsByChainId?.[ + pendingConfirmation.requestData?.chainId + ], }, // Passing `t` in the contexts object is a bit redundant but since it's a // context too, it makes sense (for completeness) @@ -315,6 +323,7 @@ export default function ConfirmationPage({ trackEvent, isSnapDialog, snapName, + networkConfigurationsByChainId, ]); useEffect(() => { diff --git a/ui/pages/confirmations/confirmation/stories/util.js b/ui/pages/confirmations/confirmation/stories/util.js index a5d8d1ba136b..bb0a661ae470 100644 --- a/ui/pages/confirmations/confirmation/stories/util.js +++ b/ui/pages/confirmations/confirmation/stories/util.js @@ -4,6 +4,7 @@ import { NetworkStatus } from '@metamask/network-controller'; import configureStore from '../../../../store/store'; import testData from '../../../../../.storybook/test-data'; import { Box } from '../../../../components/component-library'; +import { mockNetworkState } from '../../../../../test/stub/networks'; const STORE_MOCK = { ...testData, @@ -22,6 +23,18 @@ const STORE_MOCK = { status: NetworkStatus.Available, }, }, + ...mockNetworkState({ + id: 'testNetworkClientId', + rpcUrl: 'https://testrpc.com', + chainId: '0x1', + nickname: 'mainnet', + name: 'mainnet', + blockExplorerUrl: 'https://etherscan.io', + metadata: { + EIPS: { 1559: true }, + status: NetworkStatus.Available, + }, + }), pendingApprovals: { testId: { id: 'testId', diff --git a/ui/pages/confirmations/confirmation/templates/__snapshots__/add-ethereum-chain.test.js.snap b/ui/pages/confirmations/confirmation/templates/__snapshots__/add-ethereum-chain.test.js.snap index 003ef05a9469..38bdc74279f8 100644 --- a/ui/pages/confirmations/confirmation/templates/__snapshots__/add-ethereum-chain.test.js.snap +++ b/ui/pages/confirmations/confirmation/templates/__snapshots__/add-ethereum-chain.test.js.snap @@ -35,12 +35,12 @@ exports[`add-ethereum-chain confirmation should match snapshot 1`] = `

- Allow this site to add a network? + Update Test initial state

- This will allow this network to be used within MetaMask. + This site is requesting to update your default network URL. You can edit defaults and network information any time.
- ETH + GoerliETH @@ -363,7 +363,7 @@ exports[`remove-snap-account confirmation should match snapshot 1`] = `
- E + G
- ETH + GoerliETH
diff --git a/ui/pages/confirmations/confirmation/templates/add-ethereum-chain.js b/ui/pages/confirmations/confirmation/templates/add-ethereum-chain.js index 656d016f0a34..d14048897e39 100644 --- a/ui/pages/confirmations/confirmation/templates/add-ethereum-chain.js +++ b/ui/pages/confirmations/confirmation/templates/add-ethereum-chain.js @@ -1,5 +1,6 @@ import { ethErrors } from 'eth-rpc-errors'; import React from 'react'; +import { RpcEndpointType } from '@metamask/network-controller'; import { infuraProjectId, @@ -224,9 +225,31 @@ function getState(pendingApproval) { function getValues(pendingApproval, t, actions, history, data) { const originIsMetaMask = pendingApproval.origin === 'metamask'; const customRpcUrl = pendingApproval.requestData.rpcUrl; - const childrenTitleText = process.env.CHAIN_PERMISSIONS - ? t('addNetworkConfirmationTitle', [pendingApproval.requestData.chainName]) - : t('addEthereumChainConfirmationTitle'); + + let title; + if (originIsMetaMask) { + title = t('wantToAddThisNetwork'); + } else if (data.existingNetworkConfiguration) { + title = t('updateNetworkConfirmationTitle', [ + data.existingNetworkConfiguration.name, + ]); + } else { + title = process.env.CHAIN_PERMISSIONS + ? t('addNetworkConfirmationTitle', [ + pendingApproval.requestData.chainName, + ]) + : t('addEthereumChainConfirmationTitle'); + } + + let subtitle; + if (data.existingNetworkConfiguration) { + subtitle = t('updateEthereumChainConfirmationDescription'); + } else { + subtitle = process.env.CHAIN_PERMISSIONS + ? t('multichainAddEthereumChainConfirmationDescription') + : t('addEthereumChainConfirmationDescription'); + } + return { content: [ { @@ -332,9 +355,7 @@ function getValues(pendingApproval, t, actions, history, data) { { element: 'Typography', key: 'title', - children: originIsMetaMask - ? t('wantToAddThisNetwork') - : childrenTitleText, + children: title, props: { variant: TypographyVariant.H3, align: 'center', @@ -347,9 +368,7 @@ function getValues(pendingApproval, t, actions, history, data) { { element: 'Typography', key: 'description', - children: process.env.CHAIN_PERMISSIONS - ? t('multichainAddEthereumChainConfirmationDescription') - : t('addEthereumChainConfirmationDescription'), + children: subtitle, props: { variant: TypographyVariant.H7, align: 'center', @@ -515,18 +534,26 @@ function getValues(pendingApproval, t, actions, history, data) { pendingApproval.requestData, ); if (originIsMetaMask) { - const networkConfigurationId = await actions.upsertNetworkConfiguration( - { - ...pendingApproval.requestData, - nickname: pendingApproval.requestData.chainName, - }, - { - setActive: false, - source: pendingApproval.requestData.source, - }, - ); + const blockExplorer = + pendingApproval.requestData.rpcPrefs.blockExplorerUrl; + + const addedNetwork = await actions.addNetwork({ + chainId: pendingApproval.requestData.chainId, + name: pendingApproval.requestData.chainName, + nativeCurrency: pendingApproval.requestData.ticker, + blockExplorerUrls: blockExplorer ? [blockExplorer] : [], + defaultBlockExplorerUrlIndex: blockExplorer ? 0 : undefined, + defaultRpcEndpointIndex: 0, + rpcEndpoints: [ + { + url: pendingApproval.requestData.rpcUrl, + type: RpcEndpointType.Custom, + }, + ], + }); + await actions.setNewNetworkAdded({ - networkConfigurationId, + networkConfigurationId: addedNetwork.rpcEndpoints[0].networkClientId, nickname: pendingApproval.requestData.chainName, }); diff --git a/ui/pages/confirmations/confirmation/templates/index.js b/ui/pages/confirmations/confirmation/templates/index.js index 31b8d2210d0d..fd6df7e4959b 100644 --- a/ui/pages/confirmations/confirmation/templates/index.js +++ b/ui/pages/confirmations/confirmation/templates/index.js @@ -5,7 +5,7 @@ import { rejectPendingApproval, resolvePendingApproval, setNewNetworkAdded, - upsertNetworkConfiguration, + addNetwork, } from '../../../../store/actions'; import { ///: BEGIN:ONLY_INCLUDE_IF(keyring-snaps) @@ -152,8 +152,7 @@ function getAttenuatedDispatch(dispatch) { dispatch(rejectPendingApproval(...args)), resolvePendingApproval: (...args) => dispatch(resolvePendingApproval(...args)), - upsertNetworkConfiguration: (...args) => - dispatch(upsertNetworkConfiguration(...args)), + addNetwork: (...args) => dispatch(addNetwork(...args)), setNewNetworkAdded: (...args) => dispatch(setNewNetworkAdded(...args)), deleteInterface: (...args) => dispatch(deleteInterface(...args)), }; diff --git a/ui/pages/confirmations/confirmation/templates/remove-snap-account.test.js b/ui/pages/confirmations/confirmation/templates/remove-snap-account.test.js index 2d58ca66d128..9cb73c38bfea 100644 --- a/ui/pages/confirmations/confirmation/templates/remove-snap-account.test.js +++ b/ui/pages/confirmations/confirmation/templates/remove-snap-account.test.js @@ -7,6 +7,8 @@ import Confirmation from '../confirmation'; import { renderWithProvider } from '../../../../../test/lib/render-helpers'; import { SNAP_MANAGE_ACCOUNTS_CONFIRMATION_TYPES } from '../../../../../shared/constants/app'; import mockState from '../../../../../test/data/mock-state.json'; +import { mockNetworkState } from '../../../../../test/stub/networks'; +import { CHAIN_IDS } from '../../../../../shared/constants/network'; const middleware = [thunk]; @@ -39,6 +41,7 @@ const mockBaseStore = { }, approvalFlows: [], subjectMetadata: {}, + ...mockNetworkState({ chainId: CHAIN_IDS.GOERLI }), }, }; diff --git a/ui/pages/confirmations/confirmation/templates/switch-ethereum-chain.test.js b/ui/pages/confirmations/confirmation/templates/switch-ethereum-chain.test.js index e53a8e7de190..4abcf700196f 100644 --- a/ui/pages/confirmations/confirmation/templates/switch-ethereum-chain.test.js +++ b/ui/pages/confirmations/confirmation/templates/switch-ethereum-chain.test.js @@ -19,20 +19,12 @@ const mockApproval = { origin: 'https://test-dapp.metamask.io', requestData: { toNetworkConfiguration: { - rpcUrl: 'https://rpcurl.test.chain', - rpcPrefs: { - blockExplorerUrl: 'https://blockexplorer.test.chain', - }, - chainName: 'Test chain', - ticker: 'TST', chainId: '0x9999', - nickname: 'Test chain', + name: 'Test chain', }, fromNetworkConfiguration: { - type: 'rpc', - rpcUrl: 'http://example-custom-rpc.metamask.io', chainId: '0x9999', - nickname: 'Test initial state', + name: 'Test initial state', }, }, }; diff --git a/ui/pages/confirmations/hooks/alerts/useConfirmationOriginAlerts.test.ts b/ui/pages/confirmations/hooks/alerts/useConfirmationOriginAlerts.test.ts index ade12ca00328..ff2cd10cfe60 100644 --- a/ui/pages/confirmations/hooks/alerts/useConfirmationOriginAlerts.test.ts +++ b/ui/pages/confirmations/hooks/alerts/useConfirmationOriginAlerts.test.ts @@ -9,6 +9,7 @@ import { genUnapprovedContractInteractionConfirmation } from '../../../../../tes import { renderHookWithConfirmContextProvider } from '../../../../../test/lib/confirmations/render-helpers'; import { unapprovedPersonalSignMsg } from '../../../../../test/data/confirmations/personal_sign'; import { SignatureRequestType } from '../../types/confirm'; +import { CHAIN_IDS } from '../../../../../shared/constants/network'; import useConfirmationOriginAlerts from './useConfirmationOriginAlerts'; const expectedAlert = [ @@ -51,7 +52,7 @@ describe('useConfirmationOriginAlerts', () => { it('returns an alert for transaction with special characters in origin', () => { const contractInteraction = genUnapprovedContractInteractionConfirmation({ - chainId: mockState.metamask.networkConfigurations.goerli.chainId, + chainId: CHAIN_IDS.GOERLI, }); const { result } = renderHookWithConfirmContextProvider( () => useConfirmationOriginAlerts(), diff --git a/ui/pages/confirmations/hooks/useConfirmationNetworkInfo.ts b/ui/pages/confirmations/hooks/useConfirmationNetworkInfo.ts index 1fab535733a1..4c6dddfa7a5a 100644 --- a/ui/pages/confirmations/hooks/useConfirmationNetworkInfo.ts +++ b/ui/pages/confirmations/hooks/useConfirmationNetworkInfo.ts @@ -1,52 +1,48 @@ import { useSelector } from 'react-redux'; +import { Hex } from '@metamask/utils'; import { + CHAIN_ID_TO_NETWORK_IMAGE_URL_MAP, NETWORK_TO_NAME_MAP, - NETWORK_TYPES, } from '../../../../shared/constants/network'; -import { getAllNetworks } from '../../../selectors'; -import { getProviderConfig } from '../../../ducks/metamask/metamask'; +import { + getCurrentChainId, + getNetworkConfigurationsByChainId, +} from '../../../selectors'; import { useI18nContext } from '../../../hooks/useI18nContext'; import { useConfirmContext } from '../context/confirm'; -type KeyOfNetworkName = keyof typeof NETWORK_TO_NAME_MAP; - function useConfirmationNetworkInfo() { const t = useI18nContext(); const { currentConfirmation } = useConfirmContext(); - const allNetworks = useSelector(getAllNetworks); - const providerConfig = useSelector(getProviderConfig); + const networkConfigurations = useSelector(getNetworkConfigurationsByChainId); + const currentChainId = useSelector(getCurrentChainId); let networkDisplayName = ''; - let confirmationNetwork; + let networkImageUrl = ''; if (currentConfirmation) { // use the current confirmation chainId, else use the current network chainId - const currentChainId = - currentConfirmation?.chainId ?? providerConfig.chainId; - confirmationNetwork = allNetworks.find( - ({ id, chainId }) => - chainId === currentChainId && - (providerConfig.type === NETWORK_TYPES.RPC - ? id === providerConfig.id - : id === providerConfig.type), - ); - - if (confirmationNetwork) { - const { nickname } = confirmationNetwork; - if (providerConfig.type === NETWORK_TYPES.RPC) { - networkDisplayName = nickname ?? t('privateNetwork'); - } else { - networkDisplayName = - NETWORK_TO_NAME_MAP[confirmationNetwork?.chainId as KeyOfNetworkName]; - } - } + const chainId = + (currentConfirmation?.chainId as Hex | undefined) ?? currentChainId; + + const networkConfiguration = networkConfigurations[chainId]; + + networkDisplayName = + networkConfiguration?.name ?? + NETWORK_TO_NAME_MAP[chainId as keyof typeof NETWORK_TO_NAME_MAP] ?? + t('privateNetwork'); + + networkImageUrl = + CHAIN_ID_TO_NETWORK_IMAGE_URL_MAP[ + chainId as keyof typeof CHAIN_ID_TO_NETWORK_IMAGE_URL_MAP + ]; } return { - networkImageUrl: confirmationNetwork?.rpcPrefs?.imageUrl ?? '', + networkImageUrl, networkDisplayName, }; } diff --git a/ui/pages/confirmations/hooks/useTransactionInfo.test.js b/ui/pages/confirmations/hooks/useTransactionInfo.test.js index 59aaf7b167c3..61ae036c4000 100644 --- a/ui/pages/confirmations/hooks/useTransactionInfo.test.js +++ b/ui/pages/confirmations/hooks/useTransactionInfo.test.js @@ -1,6 +1,7 @@ import { renderHookWithProvider } from '../../../../test/lib/render-helpers'; import mockState from '../../../../test/data/mock-state.json'; import { getSelectedInternalAccountFromMockState } from '../../../../test/jest/mocks'; +import { getCurrentChainId } from '../../../selectors'; import { useTransactionInfo } from './useTransactionInfo'; const mockSelectedInternalAccount = @@ -21,9 +22,7 @@ describe('useTransactionInfo', () => { it('should return true if transaction is NFT transfer', () => { mockState.metamask.allNftContracts = { [mockSelectedInternalAccount.address]: { - [mockState.metamask.networkConfigurations[ - mockState.metamask.selectedNetworkClientId - ].chainId]: [{ address: '0x9' }], + [getCurrentChainId(mockState)]: [{ address: '0x9' }], }, }; diff --git a/ui/pages/home/home.component.js b/ui/pages/home/home.component.js index 19b76a881c6c..2df3f2907266 100644 --- a/ui/pages/home/home.component.js +++ b/ui/pages/home/home.component.js @@ -50,6 +50,9 @@ import { ModalHeader, ModalOverlay, } from '../../components/component-library'; +///: BEGIN:ONLY_INCLUDE_IF(build-main,build-beta,build-flask) +import MultiRpcEditModal from '../../components/app/multi-rpc-edit-modal/multi-rpc-edit-modal'; +///: END:ONLY_INCLUDE_IF import { RESTORE_VAULT_ROUTE, CONFIRM_TRANSACTION_ROUTE, @@ -154,6 +157,7 @@ export default class Home extends PureComponent { announcementsToShow: PropTypes.bool.isRequired, onboardedInThisUISession: PropTypes.bool, isSmartTransactionsOptInModalAvailable: PropTypes.bool.isRequired, + showMultiRpcModal: PropTypes.bool.isRequired, ///: END:ONLY_INCLUDE_IF newNetworkAddedConfigurationId: PropTypes.string, isNotification: PropTypes.bool.isRequired, @@ -177,7 +181,6 @@ export default class Home extends PureComponent { pendingConfirmations: PropTypes.arrayOf(PropTypes.object).isRequired, pendingConfirmationsPrioritized: PropTypes.arrayOf(PropTypes.object) .isRequired, - networkMenuRedesign: PropTypes.bool, hasApprovalFlows: PropTypes.bool.isRequired, infuraBlocked: PropTypes.bool.isRequired, setRecoveryPhraseReminderHasBeenShown: PropTypes.func.isRequired, @@ -374,7 +377,6 @@ export default class Home extends PureComponent { closeNotificationPopup, isNotification, hasAllowedPopupRedirectApprovals, - networkMenuRedesign, newNetworkAddedConfigurationId, setActiveNetwork, clearNewNetworkAdded, @@ -392,8 +394,8 @@ export default class Home extends PureComponent { const { notificationClosing } = this.state; if ( - prevNewNetworkAddedConfigurationId !== newNetworkAddedConfigurationId && - networkMenuRedesign + newNetworkAddedConfigurationId && + prevNewNetworkAddedConfigurationId !== newNetworkAddedConfigurationId ) { setActiveNetwork(newNetworkAddedConfigurationId); clearNewNetworkAdded(); @@ -498,11 +500,8 @@ export default class Home extends PureComponent { newTokensImportedError, setNewTokensImported, setNewTokensImportedError, - newNetworkAddedConfigurationId, - networkMenuRedesign, clearNewNetworkAdded, clearEditedNetwork, - setActiveNetwork, } = this.props; const onAutoHide = () => { @@ -627,7 +626,9 @@ export default class Home extends PureComponent { - {t('newNetworkEdited', [editedNetwork.nickname])} + {editedNetwork.newNetwork + ? t('newNetworkAdded', [editedNetwork.nickname]) + : t('newNetworkEdited', [editedNetwork.nickname])} ) : null} - {newNetworkAddedConfigurationId && !networkMenuRedesign && ( - clearNewNetworkAdded()} - > - - - {t('networkAddedSuccessfully')} - - - - - - - )} ); } @@ -986,6 +941,7 @@ export default class Home extends PureComponent { firstTimeFlowType, newNetworkAddedConfigurationId, isSmartTransactionsOptInModalAvailable, + showMultiRpcModal, ///: END:ONLY_INCLUDE_IF } = this.props; @@ -1012,6 +968,12 @@ export default class Home extends PureComponent { showWhatsNewPopup && !showSmartTransactionsOptInModal; + const showMultiRpcEditModal = + canSeeModals && + showMultiRpcModal && + !showSmartTransactionsOptInModal && + !showWhatsNew; + const showTermsOfUse = completedOnboarding && !onboardedInThisUISession && showTermsOfUsePopup; ///: END:ONLY_INCLUDE_IF @@ -1036,6 +998,8 @@ export default class Home extends PureComponent { isOpen={showSmartTransactionsOptInModal} hideWhatsNewPopup={hideWhatsNewPopup} /> + + {showMultiRpcEditModal && } {showWhatsNew ? : null} {!showWhatsNew && showRecoveryPhraseReminder ? ( { @@ -118,7 +117,6 @@ const mapStateToProps = (state) => { const pendingConfirmations = getUnapprovedTemplatedConfirmations(state); const pendingConfirmationsPrioritized = getPrioritizedUnapprovedTemplatedConfirmations(state); - const networkMenuRedesign = getLocalNetworkMenuRedesignFeatureFlag(state); ///: BEGIN:ONLY_INCLUDE_IF(build-mmi) const institutionalConnectRequests = getInstitutionalConnectRequests(state); @@ -195,7 +193,6 @@ const mapStateToProps = (state) => { shouldShowWeb3ShimUsageNotification, pendingConfirmations, pendingConfirmationsPrioritized, - networkMenuRedesign, infuraBlocked: getInfuraBlocked(state), announcementsToShow: getSortedAnnouncementsToShow(state).length > 0, showWhatsNewPopup, @@ -226,6 +223,7 @@ const mapStateToProps = (state) => { ///: END:ONLY_INCLUDE_IF isSmartTransactionsOptInModalAvailable: getIsSmartTransactionsOptInModalAvailable(state), + showMultiRpcModal: state.metamask.preferences.showMultiRpcModal, }; }; diff --git a/ui/pages/institutional/institutional-entity-done-page/institutional-entity-done-page.test.tsx b/ui/pages/institutional/institutional-entity-done-page/institutional-entity-done-page.test.tsx index d459f9893e7e..6601fc1eabdb 100644 --- a/ui/pages/institutional/institutional-entity-done-page/institutional-entity-done-page.test.tsx +++ b/ui/pages/institutional/institutional-entity-done-page/institutional-entity-done-page.test.tsx @@ -18,6 +18,7 @@ const props = { const render = () => { const store = configureStore({ ...mockState, + metamask: {}, history: { mostRecentOverviewPage: 'test', }, diff --git a/ui/pages/onboarding-flow/add-network-modal/__snapshots__/add-network-modal.test.js.snap b/ui/pages/onboarding-flow/add-network-modal/__snapshots__/add-network-modal.test.js.snap deleted file mode 100644 index b6a29f3cedbf..000000000000 --- a/ui/pages/onboarding-flow/add-network-modal/__snapshots__/add-network-modal.test.js.snap +++ /dev/null @@ -1,175 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Add Network Modal should render 1`] = ` -
-
-

- Add custom network -

-
-
-
-
- - - - -
- A malicious network provider can lie about the state of the blockchain and record your network activity. Only add custom networks you trust. -
-
-
-
- -
- -
-
-
- -
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
-
-
- -
-
-
-`; diff --git a/ui/pages/onboarding-flow/add-network-modal/add-network-modal.stories.tsx b/ui/pages/onboarding-flow/add-network-modal/add-network-modal.stories.tsx deleted file mode 100644 index 5153ccb2ca56..000000000000 --- a/ui/pages/onboarding-flow/add-network-modal/add-network-modal.stories.tsx +++ /dev/null @@ -1,40 +0,0 @@ -import type { Meta, StoryObj } from '@storybook/react'; -import AddNetworkModal from './index'; - -const meta: Meta = { - title: 'Pages/OnboardingFlow/AddNetworkModal', - component: AddNetworkModal, - argTypes: { - showHeader: { control: 'boolean' }, - addNewNetwork: { control: 'boolean' }, - onEditNetwork: { action: 'onEditNetwork' }, - networkToEdit: { control: 'object' }, - onRpcUrlAdd: { action: 'onRpcUrlAdd' }, - prevActionMode: { control: 'text' }, - networkFormInformation: { control: 'object' }, - setNetworkFormInformation: { action: 'setNetworkFormInformation' }, - }, - args: { - showHeader: false, - addNewNetwork: true, - onEditNetwork: undefined, - networkToEdit: undefined, - prevActionMode: undefined, - networkFormInformation: {}, - setNetworkFormInformation: () => null, - onRpcUrlAdd: () => {}, - }, -}; - -export default meta; -type Story = StoryObj; - -export const Default: Story = { - args: {}, -}; - -export const ShowHeader: Story = { - args: { - showHeader: true, - }, -}; diff --git a/ui/pages/onboarding-flow/add-network-modal/add-network-modal.test.js b/ui/pages/onboarding-flow/add-network-modal/add-network-modal.test.js deleted file mode 100644 index ba126bbeb2b0..000000000000 --- a/ui/pages/onboarding-flow/add-network-modal/add-network-modal.test.js +++ /dev/null @@ -1,76 +0,0 @@ -import React from 'react'; -import { waitFor } from '@testing-library/react'; -import configureMockStore from 'redux-mock-store'; -import thunk from 'redux-thunk'; -import { renderWithProvider } from '../../../../test/lib/render-helpers'; -import * as useSafeChainsModule from '../../settings/networks-tab/networks-form/use-safe-chains'; -import AddNetworkModal from '.'; - -const mockHideModal = jest.fn(); -jest.mock('../../../store/actions', () => ({ - ...jest.requireActual('../../../store/actions'), - hideModal: () => mockHideModal, -})); - -jest.mock('../../../pages/settings/networks-tab/networks-form/use-safe-chains'); - -const mockNetworkMenuRedesignToggle = jest.fn(); - -jest.mock('../../../helpers/utils/feature-flags', () => ({ - ...jest.requireActual('../../../helpers/utils/feature-flags'), - getLocalNetworkMenuRedesignFeatureFlag: () => mockNetworkMenuRedesignToggle, -})); - -describe('Add Network Modal', () => { - it('should render', async () => { - mockNetworkMenuRedesignToggle.mockImplementation(() => false); - - jest.spyOn(useSafeChainsModule, 'useSafeChains').mockReturnValue({ - safeChains: [ - { - chainId: '1', - name: 'Mocked Ethereum Mainnet', - nativeCurrency: { symbol: 'MOCKETH' }, - rpc: ['https://mocked.example.com/rpc'], - }, - { - chainId: '3', - name: 'Mocked Another Chain', - nativeCurrency: { symbol: 'MOCKANC' }, - rpc: ['https://mocked.another-example.com/rpc'], - }, - ], - }); - - const mockStore = configureMockStore([])({ - metamask: { useSafeChainsListValidation: true, orderedNetworkList: {} }, - }); - - const { container } = renderWithProvider( - , - mockStore, - ); - - await waitFor(() => { - expect(container).toMatchSnapshot(); - }); - }); - - it('should not render the new network flow modal', async () => { - mockNetworkMenuRedesignToggle.mockReturnValue(true); - - const mockStore = configureMockStore([thunk])({ - metamask: { useSafeChainsListValidation: true, orderedNetworkList: {} }, - }); - - const { queryByText } = renderWithProvider( - , - mockStore, - ); - - await waitFor(() => { - expect(queryByText('Cancel')).not.toBeInTheDocument(); - expect(queryByText('Next')).toBeInTheDocument(); - }); - }); -}); diff --git a/ui/pages/onboarding-flow/add-network-modal/index.js b/ui/pages/onboarding-flow/add-network-modal/index.js deleted file mode 100644 index 911bb89eee04..000000000000 --- a/ui/pages/onboarding-flow/add-network-modal/index.js +++ /dev/null @@ -1,89 +0,0 @@ -import React from 'react'; -import { useDispatch } from 'react-redux'; -import PropTypes from 'prop-types'; -import { useI18nContext } from '../../../hooks/useI18nContext'; - -import { hideModal } from '../../../store/actions'; - -import Typography from '../../../components/ui/typography/typography'; -import Box from '../../../components/ui/box/box'; -import { - TEXT_ALIGN, - TypographyVariant, - FONT_WEIGHT, -} from '../../../helpers/constants/design-system'; -import NetworksForm from '../../settings/networks-tab/networks-form/networks-form'; - -export default function AddNetworkModal({ - showHeader = false, - onEditNetwork = null, - addNewNetwork = true, - networkToEdit = null, - onRpcUrlAdd, - prevActionMode = null, - networkFormInformation = {}, - setNetworkFormInformation = () => null, -}) { - const dispatch = useDispatch(); - const t = useI18nContext(); - - const closeCallback = () => - dispatch(hideModal({ name: 'ONBOARDING_ADD_NETWORK' })); - - const additionalProps = networkToEdit - ? { selectedNetwork: networkToEdit } - : {}; - - return ( - <> - {showHeader ? ( - - - {t('onboardingMetametricsModalTitle')} - - - ) : null} - - - ); -} - -AddNetworkModal.propTypes = { - showHeader: PropTypes.bool, - isNewNetworkFlow: PropTypes.bool, - addNewNetwork: PropTypes.bool, - onEditNetwork: PropTypes.func, - networkToEdit: PropTypes.object, - onRpcUrlAdd: PropTypes.func, - prevActionMode: PropTypes.string, - networkFormInformation: PropTypes.object, - setNetworkFormInformation: PropTypes.func, -}; - -AddNetworkModal.defaultProps = { - showHeader: false, - isNewNetworkFlow: false, - addNewNetwork: true, - onEditNetwork: null, - networkToEdit: null, - prevActionMode: null, - networkFormInformation: {}, - setNetworkFormInformation: () => null, -}; diff --git a/ui/pages/onboarding-flow/onboarding-flow.test.js b/ui/pages/onboarding-flow/onboarding-flow.test.js index eb5672b68c73..bfafbac7f070 100644 --- a/ui/pages/onboarding-flow/onboarding-flow.test.js +++ b/ui/pages/onboarding-flow/onboarding-flow.test.js @@ -41,7 +41,11 @@ describe('Onboarding Flow', () => { accounts: {}, selectedAccount: '', }, - ...mockNetworkState({ chainId: CHAIN_IDS.GOERLI }), + ...mockNetworkState( + { chainId: CHAIN_IDS.GOERLI }, + { chainId: CHAIN_IDS.MAINNET }, + { chainId: CHAIN_IDS.LINEA_MAINNET }, + ), incomingTransactionsPreferences: { [CHAIN_IDS.MAINNET]: true, diff --git a/ui/pages/onboarding-flow/privacy-settings/privacy-settings.js b/ui/pages/onboarding-flow/privacy-settings/privacy-settings.js index 9f1bb0dcf8c3..fffd5c00feda 100644 --- a/ui/pages/onboarding-flow/privacy-settings/privacy-settings.js +++ b/ui/pages/onboarding-flow/privacy-settings/privacy-settings.js @@ -19,19 +19,16 @@ import { } from '../../../../shared/lib/ui-utils'; import { Box, - PickerNetwork, Text, TextField, ButtonPrimary, ButtonPrimarySize, - ButtonSecondary, - ButtonSecondarySize, - Icon, IconName, ButtonLink, AvatarNetwork, ButtonIcon, IconSize, + Icon, } from '../../../components/component-library'; import { MetaMetricsContext } from '../../../contexts/metametrics'; import { @@ -46,10 +43,9 @@ import { import { ONBOARDING_PIN_EXTENSION_ROUTE } from '../../../helpers/constants/routes'; import { useI18nContext } from '../../../hooks/useI18nContext'; import { - getAllNetworks, - getCurrentNetwork, getPetnamesEnabled, getExternalServicesOnboardingToggleState, + getNetworkConfigurationsByChainId, } from '../../../selectors'; import { selectIsProfileSyncingEnabled } from '../../../selectors/metamask-notifications/profile-syncing'; import { selectParticipateInMetaMetrics } from '../../../selectors/metamask-notifications/authentication'; @@ -69,6 +65,7 @@ import { setUseTransactionSimulations, setPetnamesEnabled, performSignIn, + setEditedNetwork, } from '../../../store/actions'; import { onboardingToggleBasicFunctionalityOn, @@ -76,11 +73,9 @@ import { } from '../../../ducks/app/app'; import IncomingTransactionToggle from '../../../components/app/incoming-trasaction-toggle/incoming-transaction-toggle'; import { - CHAIN_IDS, CHAIN_ID_TO_NETWORK_IMAGE_URL_MAP, - NETWORK_TO_NAME_MAP, + TEST_CHAINS, } from '../../../../shared/constants/network'; -import { getLocalNetworkMenuRedesignFeatureFlag } from '../../../helpers/utils/feature-flags'; import { Setting } from './setting'; /** @@ -155,8 +150,7 @@ export default function PrivacySettings() { const [turnOnPetnames, setTurnOnPetnames] = useState(petnamesEnabled); const trackEvent = useContext(MetaMetricsContext); - const currentNetwork = useSelector(getCurrentNetwork); - const allNetworks = useSelector(getAllNetworks); + const networkConfigurations = useSelector(getNetworkConfigurationsByChainId); const externalServicesOnboardingToggleState = useSelector( getExternalServicesOnboardingToggleState, @@ -171,10 +165,6 @@ export default function PrivacySettings() { externalServicesOnboardingToggleState, ); - const networkMenuRedesign = useSelector( - getLocalNetworkMenuRedesignFeatureFlag, - ); - const handleSubmit = () => { dispatch(toggleExternalServices(externalServicesOnboardingToggleState)); dispatch(setUsePhishDetect(phishingToggleState)); @@ -300,7 +290,7 @@ export default function PrivacySettings() { /> dispatch(setIncomingTransactionsPreferences(chainId, value)) } @@ -393,103 +383,85 @@ export default function PrivacySettings() { , ])} - {networkMenuRedesign ? ( - - - {[CHAIN_IDS.MAINNET, CHAIN_IDS.LINEA_MAINNET].map( - (chainId) => ( + + + {Object.values(networkConfigurations) + .filter(({ chainId }) => !TEST_CHAINS.includes(chainId)) + .map((network) => ( + { + dispatch( + setEditedNetwork({ chainId: network.chainId }), + ); + dispatch(toggleNetworkMenu()); + }} + display={Display.Flex} + alignItems={AlignItems.center} + justifyContent={JustifyContent.spaceBetween} + > - console.log(`chain ${chainId} clicked`) - } display={Display.Flex} alignItems={AlignItems.center} - justifyContent={JustifyContent.spaceBetween} > - - - - - {NETWORK_TO_NAME_MAP[chainId]} - - - { - // Get just the protocol + domain, not the infura key in path - new URL( - allNetworks.find( - (network) => - network.chainId === chainId, - )?.rpcUrl, - )?.origin - } - - - - + + + {network.name} + + + { + // Get just the protocol + domain, not the infura key in path + new URL( + network?.rpcEndpoints[ + network?.defaultRpcEndpointIndex + ]?.url, + )?.origin + } + + - ), - )} - console.log('add a network clicked')} - justifyContent={JustifyContent.Left} - variant={ButtonVariant.link} - > - - - - {t('addANetwork')} - - - - - - ) : ( - - {currentNetwork ? ( -
- <> - dispatch(toggleNetworkMenu())} + - -
- ) : ( - { - e.preventDefault(); - dispatch( - showModal({ name: 'ONBOARDING_ADD_NETWORK' }), - ); - }} +
+ ))} + { + dispatch( + toggleNetworkMenu({ isAddingNewNetwork: true }), + ); + }} + justifyContent={JustifyContent.Left} + variant={ButtonVariant.link} + > + - {t('onboardingAdvancedPrivacyNetworkButton')} - - )} + + + {t('addANetwork')} + + +
- )} +
} /> diff --git a/ui/pages/onboarding-flow/privacy-settings/privacy-settings.test.js b/ui/pages/onboarding-flow/privacy-settings/privacy-settings.test.js index d85a0c53029b..80561e9376ae 100644 --- a/ui/pages/onboarding-flow/privacy-settings/privacy-settings.test.js +++ b/ui/pages/onboarding-flow/privacy-settings/privacy-settings.test.js @@ -26,8 +26,12 @@ jest.mock('../../../ducks/app/app.ts', () => { describe('Privacy Settings Onboarding View', () => { const mockStore = { metamask: { - ...mockNetworkState({ chainId: CHAIN_IDS.MAINNET }), - + ...mockNetworkState( + { chainId: CHAIN_IDS.MAINNET }, + { chainId: CHAIN_IDS.LINEA_MAINNET }, + { chainId: CHAIN_IDS.SEPOLIA }, + { chainId: CHAIN_IDS.LINEA_SEPOLIA }, + ), preferences: { petnamesEnabled: true, }, diff --git a/ui/pages/routes/routes.component.js b/ui/pages/routes/routes.component.js index d28b99a9a5c9..5814d7a5759e 100644 --- a/ui/pages/routes/routes.component.js +++ b/ui/pages/routes/routes.component.js @@ -208,7 +208,6 @@ export default class Routes extends Component { currentExtensionPopupId: PropTypes.number, useRequestQueue: PropTypes.bool, showSurveyToast: PropTypes.bool.isRequired, - networkMenuRedesign: PropTypes.bool.isRequired, showPrivacyPolicyToast: PropTypes.bool.isRequired, newPrivacyPolicyToastShownDate: PropTypes.number, setSurveyLinkLastClickedOrClosed: PropTypes.func.isRequired, @@ -831,7 +830,6 @@ export default class Routes extends Component { hideDeprecatedNetworkModal, switchedNetworkDetails, clearSwitchedNetworkDetails, - networkMenuRedesign, clearEditedNetwork, ///: BEGIN:ONLY_INCLUDE_IF(keyring-snaps) isShowKeyringSnapRemovalResultModal, @@ -922,7 +920,7 @@ export default class Routes extends Component { }} /> ) : null} - {networkMenuRedesign ? : null} + {accountDetailsAddress ? ( ) : null} diff --git a/ui/pages/routes/routes.component.test.js b/ui/pages/routes/routes.component.test.js index 0d5e5c789f17..ec8c4e96c864 100644 --- a/ui/pages/routes/routes.component.test.js +++ b/ui/pages/routes/routes.component.test.js @@ -77,11 +77,6 @@ jest.mock( '../../components/app/metamask-template-renderer/safe-component-list', ); -jest.mock('../../helpers/utils/feature-flags', () => ({ - ...jest.requireActual('../../helpers/utils/feature-flags'), - getLocalNetworkMenuRedesignFeatureFlag: () => false, -})); - const render = async (route, state) => { const store = configureMockStore(middlewares)({ ...mockSendState, diff --git a/ui/pages/routes/routes.container.js b/ui/pages/routes/routes.container.js index dd88ca780596..856aa8b53ade 100644 --- a/ui/pages/routes/routes.container.js +++ b/ui/pages/routes/routes.container.js @@ -29,7 +29,6 @@ import { getUseNftDetection, getNftDetectionEnablementToast, } from '../../selectors'; -import { getLocalNetworkMenuRedesignFeatureFlag } from '../../helpers/utils/feature-flags'; import { getSmartTransactionsOptInStatus } from '../../../shared/modules/selectors'; import { lockMetamask, @@ -142,7 +141,6 @@ function mapStateToProps(state) { newPrivacyPolicyToastShownDate: getNewPrivacyPolicyToastShownDate(state), showPrivacyPolicyToast: getShowPrivacyPolicyToast(state), showSurveyToast: getShowSurveyToast(state), - networkMenuRedesign: getLocalNetworkMenuRedesignFeatureFlag(state), ///: BEGIN:ONLY_INCLUDE_IF(keyring-snaps) isShowKeyringSnapRemovalResultModal: state.appState.showKeyringRemovalSnapModal, diff --git a/ui/pages/settings/developer-options-tab/__snapshots__/developer-options-tab.test.tsx.snap b/ui/pages/settings/developer-options-tab/__snapshots__/developer-options-tab.test.tsx.snap index 2015a0f0893d..f8cd5cd61006 100644 --- a/ui/pages/settings/developer-options-tab/__snapshots__/developer-options-tab.test.tsx.snap +++ b/ui/pages/settings/developer-options-tab/__snapshots__/developer-options-tab.test.tsx.snap @@ -169,76 +169,6 @@ exports[`Develop options tab should match snapshot 1`] = ` -
-
-
- - Network Menu Redesign - -
- Toggles the new design of the Networks menu -
-
-
-
-
-
-
-
- Linea Mainnet logo -
-
-

- Linea Mainnet -

-

- - Lineascan.build - -

-
-
-
-