diff --git a/.circleci/config.yml b/.circleci/config.yml
index 1755e91b46a1..8884b4efb241 100644
--- a/.circleci/config.yml
+++ b/.circleci/config.yml
@@ -125,6 +125,9 @@ workflows:
- prep-build-test-flask:
requires:
- prep-deps
+ - prep-build-test-mmi:
+ requires:
+ - prep-deps
- prep-build-storybook:
requires:
- prep-deps
@@ -162,6 +165,12 @@ workflows:
- test-e2e-firefox-snaps-flask:
requires:
- prep-build-test-flask
+ - test-e2e-chrome-mmi:
+ requires:
+ - prep-build-test-mmi
+ - test-e2e-chrome-rpc-mmi:
+ requires:
+ - prep-build-test-mmi
- test-e2e-chrome-mv3:
requires:
- prep-build-test-mv3
@@ -248,6 +257,8 @@ workflows:
- test-e2e-firefox-snaps
- test-e2e-chrome-snaps-flask
- test-e2e-firefox-snaps-flask
+ - test-e2e-chrome-mmi
+ - test-e2e-chrome-rpc-mmi
- test-storybook
- benchmark:
requires:
@@ -350,23 +361,28 @@ jobs:
executor: node-browsers
steps:
- run: *shallow-git-clone
+ - run:
+ name: Save Yarn version
+ command: |
+ yarn --version > /tmp/YARN_VERSION
- restore_cache:
keys:
# First try to get the specific cache for the checksum of the yarn.lock file.
# This cache key lookup will fail if the lock file is modified and a cache
# has not yet been persisted for the new checksum.
- - dependency-cache-v1-{{ checksum "yarn.lock" }}
+ - dependency-cache-{{ checksum "/tmp/YARN_VERSION" }}-{{ checksum "yarn.lock" }}
# To prevent having to do a full install of every node_module when
# dependencies change, restore from the last known cache of any
- # branch/checksum, the install step will remove cached items that are no longer
- # required and add the new dependencies, and the cache will be persisted.
- - dependency-cache-v1-
+ # branch/checksum with the same Yarn version, the install step will remove
+ # cached items that are no longer required and add the new dependencies, and
+ # the cache will be persisted.
+ - dependency-cache-{{ checksum "/tmp/YARN_VERSION" }}-
- gh/install
- run:
name: Install dependencies
command: .circleci/scripts/install-dependencies.sh
- save_cache:
- key: dependency-cache-v1-{{ checksum "yarn.lock" }}
+ key: dependency-cache-{{ checksum "/tmp/YARN_VERSION" }}-{{ checksum "yarn.lock" }}
paths:
- .yarn/cache
- persist_to_workspace:
@@ -568,10 +584,10 @@ jobs:
name: Build extension for testing
command: yarn build:test:flask
- run:
- name: Move test build to 'dist-test' to avoid conflict with production build
+ name: Move test build to 'dist-test-flask' to avoid conflict with production build
command: mv ./dist ./dist-test-flask
- run:
- name: Move test zips to 'builds-test' to avoid conflict with production build
+ name: Move test zips to 'builds-test-flask' to avoid conflict with production build
command: mv ./builds ./builds-test-flask
- persist_to_workspace:
root: .
@@ -579,6 +595,27 @@ jobs:
- dist-test-flask
- builds-test-flask
+ prep-build-test-mmi:
+ executor: node-browsers-medium-plus
+ steps:
+ - run: *shallow-git-clone
+ - attach_workspace:
+ at: .
+ - run:
+ name: Build extension for testing
+ command: yarn build:test:mmi
+ - run:
+ name: Move test build to 'dist-test' to avoid conflict with production build
+ command: mv ./dist ./dist-test-mmi
+ - run:
+ name: Move test zips to 'builds-test' to avoid conflict with production build
+ command: mv ./builds ./builds-test-mmi
+ - persist_to_workspace:
+ root: .
+ paths:
+ - dist-test-mmi
+ - builds-test-mmi
+
prep-build-test-mv3:
executor: node-browsers-medium-plus
steps:
@@ -592,7 +629,7 @@ jobs:
name: Move test build to 'dist-test' to avoid conflict with production build
command: mv ./dist ./dist-test-mv3
- run:
- name: Move test zips to 'builds-test' to avoid conflict with production build
+ name: Move test zips to 'builds-test-mv3' to avoid conflict with production build
command: mv ./builds ./builds-test-mv3
- persist_to_workspace:
root: .
@@ -855,6 +892,42 @@ jobs:
- store_test_results:
path: test/test-results/e2e.xml
+ test-e2e-chrome-rpc-mmi:
+ executor: node-browsers
+ steps:
+ - checkout
+ - run:
+ name: Re-Install Chrome
+ command: ./.circleci/scripts/chrome-install.sh
+ - attach_workspace:
+ at: .
+ - run:
+ name: Move test build to dist
+ command: mv ./dist-test-mmi ./dist
+ - run:
+ name: Move test zips to builds
+ command: mv ./builds-test-mmi ./builds
+ - run:
+ name: test:e2e:chrome:rpc
+ command: |
+ if .circleci/scripts/test-run-e2e.sh
+ then
+ yarn test:e2e:chrome:rpc --retries 2 --debug --build-type=mmi
+ fi
+ no_output_timeout: 20m
+ - run:
+ name: Merge JUnit report
+ command: |
+ if [ "$(ls -A test/test-results/e2e)" ]; then
+ yarn test:e2e:report
+ fi
+ when: always
+ - store_artifacts:
+ path: test-artifacts
+ destination: test-artifacts
+ - store_test_results:
+ path: test/test-results/e2e.xml
+
test-e2e-firefox-snaps:
executor: node-browsers
parallelism: 4
@@ -950,7 +1023,7 @@ jobs:
command: |
if .circleci/scripts/test-run-e2e.sh
then
- yarn test:e2e:firefox:snaps --retries 2 --debug
+ yarn test:e2e:firefox:snaps --retries 2 --debug --build-type=flask
fi
no_output_timeout: 20m
- run:
@@ -987,7 +1060,44 @@ jobs:
command: |
if .circleci/scripts/test-run-e2e.sh
then
- yarn test:e2e:chrome:snaps --retries 2 --debug
+ yarn test:e2e:chrome:snaps --retries 2 --debug --build-type=flask
+ fi
+ no_output_timeout: 20m
+ - run:
+ name: Merge JUnit report
+ command: |
+ if [ "$(ls -A test/test-results/e2e)" ]; then
+ yarn test:e2e:report
+ fi
+ when: always
+ - store_artifacts:
+ path: test-artifacts
+ destination: test-artifacts
+ - store_test_results:
+ path: test/test-results/e2e.xml
+
+ test-e2e-chrome-mmi:
+ executor: node-browsers
+ parallelism: 4
+ steps:
+ - run: *shallow-git-clone
+ - run:
+ name: Re-Install Chrome
+ command: ./.circleci/scripts/chrome-install.sh
+ - attach_workspace:
+ at: .
+ - run:
+ name: Move test build to dist
+ command: mv ./dist-test-mmi ./dist
+ - run:
+ name: Move test zips to builds
+ command: mv ./builds-test-mmi ./builds
+ - run:
+ name: test:e2e:chrome:mmi
+ command: |
+ if .circleci/scripts/test-run-e2e.sh
+ then
+ yarn test:e2e:chrome:mmi --retries 2 --debug --build-type=mmi
fi
no_output_timeout: 20m
- run:
@@ -1162,6 +1272,10 @@ jobs:
- store_artifacts:
path: builds-mmi
destination: builds-mmi
+ - store_artifacts:
+ path: builds-test
+ - store_artifacts:
+ path: builds-test-flask
- store_artifacts:
path: coverage
destination: coverage
diff --git a/.depcheckrc.yml b/.depcheckrc.yml
index 187fd0b1eafc..972b13b06e8a 100644
--- a/.depcheckrc.yml
+++ b/.depcheckrc.yml
@@ -10,14 +10,6 @@ ignores:
- '@fortawesome/fontawesome-free'
- 'punycode'
- #
- # snaps flask deps
- #
- - '@metamask/rpc-methods-flask'
- - '@metamask/snaps-controllers-flask'
- - '@metamask/snaps-ui-flask'
- - '@metamask/snaps-utils-flask'
-
#
# dev deps
#
diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
index 546f26ec89bd..626825e79323 100644
--- a/.github/CODEOWNERS
+++ b/.github/CODEOWNERS
@@ -9,7 +9,6 @@
* @MetaMask/extension-devs
**/snaps/** @MetaMask/snaps-devs
-**/flask/** @MetaMask/snaps-devs
development/ @MetaMask/extension-devs @kumavis
lavamoat/ @MetaMask/extension-devs @MetaMask/supply-chain @MetaMask/snaps-devs
diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md
index 74131102ecea..a7d720258e0b 100644
--- a/.github/CONTRIBUTING.md
+++ b/.github/CONTRIBUTING.md
@@ -6,13 +6,14 @@ If you're submitting code to MetaMask, there are some simple things we'd appreci
Before taking the time to code and implement something, feel free to open an issue and discuss it! There may even be an issue already open, and together we may come up with a specific strategy before you take your precious time to write code.
-There are also plenty of open issues we'd love help with. Search the [`good first issue`](https://github.com/MetaMask/metamask-extension/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22) label, or head to Gitcoin and earn ETH for completing projects we've posted bounties on.
+There are also plenty of open issues we'd love help with. Search the [`good first issue`](https://github.com/MetaMask/metamask-extension/contribute) label, or head to Gitcoin and earn ETH for completing projects we've posted bounties on.
If you're picking up a bounty or an existing issue, feel free to ask clarifying questions on the issue as you go about your work.
### Submitting a pull request
When you're done with your project / bugfix / feature and ready to submit a PR, there are a couple guidelines we ask you to follow:
+- [ ] **Make sure you followed our [`coding guidelines`](https://github.com/MetaMask/metamask-extension/blob/develop/.github/guidelines/CODING_GUIDELINES.md)**: These guidelines aim to maintain consistency and readability across the codebase. They help ensure that the code is easy to understand, maintain, and modify, which is particularly important when working with multiple contributors.
- [ ] **Test it**: For any new programmatic functionality, we like unit tests when possible, so if you can keep your code cleanly isolated, please do add a test file to the `tests` folder.
- [ ] **Add to the CHANGELOG**: Help us keep track of all the moving pieces by adding an entry to the [`CHANGELOG.md`](https://github.com/MetaMask/metamask-extension/blob/develop/CHANGELOG.md) with a link to your PR.
- [ ] **Meet the spec**: Make sure the PR adds functionality that matches the issue you're closing. This is especially important for bounties: sometimes design or implementation details are included in the conversation, so read carefully!
diff --git a/.github/ISSUE_TEMPLATE/bug-report.yml b/.github/ISSUE_TEMPLATE/bug-report.yml
index 90450a3953aa..df752860bfb1 100644
--- a/.github/ISSUE_TEMPLATE/bug-report.yml
+++ b/.github/ISSUE_TEMPLATE/bug-report.yml
@@ -16,17 +16,30 @@ body:
id: what-happened
attributes:
label: Describe the bug
- description: What happened? What did you expect to happen? Please include screenshots if applicable!
- placeholder: Tell us what you see!
+ description: What happened?
+ placeholder: A clear and concise description of what the bug is
validations:
required: true
+ - type: textarea
+ id: expected-behavior
+ attributes:
+ label: Expected behavior
+ description: What did you expect to happen?
+ - type: textarea
+ id: screenshot
+ attributes:
+ label: Screenshots
+ description: Please include screenshots if applicable!
- type: textarea
id: reproduce
attributes:
label: Steps to reproduce
- description: List all steps needed to reproduce the problem
- value: |
- 1.
+ description: "List all steps needed to reproduce the problem:"
+ placeholder: |
+ 1. Go to '...'
+ 2. Click on '...'
+ 3. Scroll down to '...'
+ 4. See error
validations:
required: true
- type: textarea
@@ -96,3 +109,14 @@ body:
attributes:
label: Additional context
description: Add any other context about the problem here, e.g. related issues, additional error messages or logs, or any potentially relevant details about the environment or situation the bug occurred in.
+ - type: textarea
+ id: severity
+ attributes:
+ label: Severity
+ description: |
+ To be added after bug submission by internal support / PM:
+ placeholder: |
+ - How critical is the impact of this bug on a user?
+ - Add stats if available on % of customers impacted
+ - Is this visible to all users?
+ - Is this tech debt?
diff --git a/.github/ISSUE_TEMPLATE/general-issue.yml b/.github/ISSUE_TEMPLATE/general-issue.yml
new file mode 100644
index 000000000000..f23b47082e5a
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/general-issue.yml
@@ -0,0 +1,105 @@
+name: General issue
+description: For any issues
+labels: []
+assignees: []
+
+body:
+ - type: markdown
+ attributes:
+ value: |
+ ## **Description**
+
+ - type: textarea
+ id: description
+ attributes:
+ label: What is this about?
+ placeholder: Describe the issue here.
+ validations:
+ required: true
+
+ - type: markdown
+ attributes:
+ value: |
+ ## **Scenario (for user stories only)**
+
+ - type: textarea
+ id: scenario
+ attributes:
+ label: Scenario
+ placeholder: |
+ - GIVEN a user is in x state
+ - WHEN a user does x
+ - AND a user does x
+ - THEN x should occur
+
+ - type: markdown
+ attributes:
+ value: |
+ ## **Design (for user stories only)**
+
+ - type: textarea
+ id: design
+ attributes:
+ label: Design
+ placeholder: If available, provide a link to the design (e.g., Figma) or screenshots. If you're an external contributor and don't have access to the design, feel free to skip this step or provide any visual representation of the issue if possible.
+
+ - type: markdown
+ attributes:
+ value: |
+ ## **Technical Details (for technical tasks only)**
+
+ - type: textarea
+ id: technical-details
+ attributes:
+ label: Technical Details
+ placeholder: |
+ - Implementation details
+ - Insight to what needs to be done
+ - Etc.
+
+ - type: markdown
+ attributes:
+ value: |
+ ## **[Threat Modeling Framework](https://github.com/adamshostack/4QuestionFrame) (for technical tasks only)**
+
+ - type: textarea
+ id: threat-modeling
+ attributes:
+ label: Threat Modeling Framework
+ placeholder: |
+ - What are we working on? What does this aim to solve?
+ - What can go wrong?
+ - What are we going to do about it?
+ - Did we do a good job?
+
+ - type: markdown
+ attributes:
+ value: |
+ ## **Acceptance Criteria**
+
+ - type: textarea
+ id: acceptance-criteria
+ attributes:
+ label: Acceptance Criteria
+ placeholder: |
+ - Are metrics required?
+ - Are translations required?
+ - Cases to satisfy
+ - XYZ should work
+ - Etc.
+
+ - type: markdown
+ attributes:
+ value: |
+ ## **References**
+
+ - type: textarea
+ id: references
+ attributes:
+ label: References
+ placeholder: |
+ - References go here.
+ - Screenshots.
+ - Issue numbers. Links.
+ - Slack threads.
+ - Etc.
diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
deleted file mode 100644
index 8f4c7ba9eac2..000000000000
--- a/.github/PULL_REQUEST_TEMPLATE.md
+++ /dev/null
@@ -1,53 +0,0 @@
-## Explanation
-
-
-
-## Screenshots/Screencaps
-
-
-
-### Before
-
-
-
-### After
-
-
-
-## Manual Testing Steps
-
-
-
-## Pre-merge author checklist
-
-- [ ] I've clearly explained:
- - [ ] What problem this PR is solving
- - [ ] How this problem was solved
- - [ ] How reviewers can test my changes
-- [ ] Sufficient automated test coverage has been added
-
-## Pre-merge reviewer checklist
-
-- [ ] Manual testing (e.g. pull and build branch, run in browser, test code being changed)
-- [ ] PR is linked to the appropriate GitHub issue
-- [ ] **IF** this PR fixes a bug in the release milestone, add this PR to the release milestone
-
-If further QA is required (e.g. new feature, complex testing steps, large refactor), add the `Extension QA Board` label.
-
-In this case, a QA Engineer approval will be be required.
diff --git a/.github/guidelines/CODING_GUIDELINES.md b/.github/guidelines/CODING_GUIDELINES.md
new file mode 100644
index 000000000000..a59e3fd71fa5
--- /dev/null
+++ b/.github/guidelines/CODING_GUIDELINES.md
@@ -0,0 +1,64 @@
+# MetaMask Coding Guidelines
+
+### 1. New Code Should be TypeScript
+- New components and utilities should be written in TypeScript and enforce typing.
+- Existing code should be refactored into TypeScript where time allows. If you are replacing a component, use TypeScript.
+- Follow contributor doc [TypeScript Guidelines](https://github.com/MetaMask/contributor-docs/blob/main/docs/typescript.md).
+
+### 2. Using Functional Components and Hooks Instead of Classes
+- Use functional components and hooks as they result in more concise and readable code compared to classes.
+
+### 3. Organize Files Related to the Same Component in One Folder
+- An example of a component file structure:
+
+```.tsx
+avatar-account
+├── avatar-account.stories.tsx
+├── avatar-account.scss
+├── avatar-account.test.tsx
+├── avatar-account.tsx
+├── avatar-account.types.ts
+├── README.md
+├── __snapshots__
+│ └── avatar-account.test.tsx.snap
+└── index.ts
+```
+
+### 4. Follow Naming Conventions
+- You should always use PascalCase when naming components. For example: *TextField*, *NavMenu*, and *SuccessButton*.
+- Use camelCase for functions declared inside components like *handleInput()* or *showElement()*.
+- When creating hooks use *withHookName()*.
+
+### 5. Avoid Repetitive Code
+- If you notice you are writing duplicated code or components, convert it into a component, utility functions or hooks that can be reused. Do this with [scalable intention](https://sandimetz.com/blog/2016/1/20/the-wrong-abstraction).
+
+### 6. Component Optimization
+- For functional components, instead of having large return statements, breaking the component down into smaller sub-components.
+- Use memoizing techniques where possible. Utilize the `useMemo` hook for values and `useCallback` for functions. Follow recommended React guidance.
+- Use the useEffect hook for performing side effects like data fetching or DOM manipulation after the component has rendered. However, use it judiciously as unnecessary effects can complicate code and affect performance. For a deeper understanding, we recommend reading [this article](https://react.dev/learn/you-might-not-need-an-effect).
+
+### 7. Use Object Destructuring For Props
+- Instead of passing the props object, use object destructuring to pass the prop name. This discards the need to refer to the props object each time you need to use it.
+
+```tsx
+import React from 'react';
+const MyComponent = ({ id }) => {
+ return
;
+};
+
+```
+
+### 8. Document Each Component/Utility
+- New utility functions should be documented [TSDoc](https://tsdoc.org) commenting format.
+- Referencing our component docs.
+- If applicable add URL to online resources if they are meaningful for the component/method.
+
+### 9. Write Tests for Each Component/Utility
+- Write tests for the components you create as it reduces the possibilities of errors. Testing ensures that the components are behaving as you would expect. In this project Jest is used, and it provides an environment where you can execute your tests.
+- Follow the contributor docs [Unit Testing Guidelines](https://github.com/MetaMask/contributor-docs/blob/main/docs/unit-testing.md).
+
+### 10. External packages should be well maintained
+- New packages should only be integrated if the application doesn’t have the existing functionality and it cannot be added by implementing a small utility function. Use the https://snyk.io/advisor/ to assess the popularity, maintainability and security analysis. The package must be in good standing to be added to the project.
+- Update existing dependencies when you notice they are out of date.
+
+[Source](https://www.makeuseof.com/must-follow-react-practices/)
diff --git a/.github/LABELING_GUIDELINES.md b/.github/guidelines/LABELING_GUIDELINES.md
similarity index 83%
rename from .github/LABELING_GUIDELINES.md
rename to .github/guidelines/LABELING_GUIDELINES.md
index 27247b7dfefb..ec7ad636c729 100644
--- a/.github/LABELING_GUIDELINES.md
+++ b/.github/guidelines/LABELING_GUIDELINES.md
@@ -1,17 +1,20 @@
# PR Labeling Guidelines
To maintain a consistent and efficient development workflow, we have set specific label guidelines for all pull requests (PRs). Please ensure you adhere to the following instructions:
-### Mandatory Labels:
+### Mandatory team labels:
- **Internal Developers**: Every PR raised by an internal developer must include a label prefixed with `team-` (e.g., `team-extension-ux`, `team-extension-platform`, etc.). This indicates the respective internal team responsible for the PR.
- **External Contributors**: PRs from contributors outside the organization must have the `external-contributor` label.
It's essential to ensure that PRs have the appropriate labels before they are considered for merging.
-### Prohibited Labels:
+### Optional QA labels:
+- **needs-qa**: If the PR includes a new features, complex testing steps, or large refactors, this label must be added to indicated PR requires a full manual QA prior being merged and added to a release.
+
+### Labels prohibited when PR needs to be merged:
Any PR that includes one of the following labels can not be merged:
-- **needs-qa**: The PR requires a full manual QA prior to being added to a release.
+- **needs-qa**: The PR requires a full manual QA prior to being merged and added to a release.
- **QA'd but questions**: The PR has been checked by QA, but there are pending questions or clarifications needed on minor issues that were found.
- **issues-found**: The PR has been checked by QA or other reviewers, and appeared to include issues that need to be addressed.
- **need-ux-ds-review**: The PR requires a review from the User Experience or Design System teams.
diff --git a/.github/pull-request-template.md b/.github/pull-request-template.md
new file mode 100644
index 000000000000..fcdebbcb5215
--- /dev/null
+++ b/.github/pull-request-template.md
@@ -0,0 +1,46 @@
+## **Description**
+_Write a short description of the changes included in this pull request, also include relevant motivation and context. Have in mind the following questions:_
+_1. What is the reason for the change?_
+_2. What is the improvement/solution?_
+
+## **Manual testing steps**
+
+_1. Step1:_
+_2. Step2:_
+_3. ..._
+
+## **Screenshots/Recordings**
+
+_If applicable, add screenshots and/or recordings to visualize the before and after of your change._
+
+### **Before**
+
+_[screenshot]_
+
+### **After**
+
+_[screenshot]_
+
+## **Related issues**
+
+_Fixes #???_
+
+## **Pre-merge author checklist**
+
+- [ ] I’ve followed [MetaMask Coding Standards](https://github.com/MetaMask/metamask-extension/blob/develop/.github/guidelines/CODING_GUIDELINES.md).
+- [ ] I've clearly explained:
+ - [ ] What problem this PR is solving.
+ - [ ] How this problem was solved.
+ - [ ] How reviewers can test my changes.
+- [ ] I’ve indicated what issue this PR is linked to: Fixes #???
+- [ ] I’ve included tests if applicable.
+- [ ] I’ve documented any added code.
+- [ ] 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)).
+- [ ] I’ve properly set the pull request status:
+ - [ ] In case it's not yet "ready for review", I've set it to "draft".
+ - [ ] In case it's "ready for review", I've changed it from "draft" to "non-draft".
+
+## **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.
diff --git a/.github/workflows/trigger-metamask-institutional-e2e-ci.yml b/.github/workflows/trigger-metamask-institutional-e2e-ci.yml
new file mode 100644
index 000000000000..3701c04241ad
--- /dev/null
+++ b/.github/workflows/trigger-metamask-institutional-e2e-ci.yml
@@ -0,0 +1,28 @@
+name: Trigger MetaMask Institutional E2E CI
+
+on:
+ push:
+ branches: [ Version-v*, master ]
+ pull_request:
+ branches: [ Version-v*, master ]
+ types:
+ - opened
+ - reopened
+ - synchronize
+ - ready_for_review
+
+jobs:
+ trigger-mmi-e2e-ci:
+ runs-on: ubuntu-latest
+ if: ${{ (!github.event.pull_request.draft && (startsWith(github.head_ref, 'Version-v') || github.head_ref == 'master')) || (!github.event.pull_request) }}
+ steps:
+ - name: Trigger MetaMask Institutional E2E CI
+ env:
+ MMI_E2E_CI_TOKEN: ${{ secrets.MMI_E2E_CI_TOKEN }}
+ run: |
+ curl -L -X POST \
+ -H "Accept: application/vnd.github+json" \
+ -H "Authorization: Bearer $MMI_E2E_CI_TOKEN" \
+ -H "X-GitHub-Api-Version: 2022-11-28" \
+ https://api.github.com/repos/consensys-vertical-apps/mmi-extension-e2e/dispatches \
+ -d '{"event_type": "mm-triggered", "client_payload":{"ref_name": "${{ github.ref_name }}", "sha": "${{ github.sha }}"}}'
diff --git a/.metamaskrc.dist b/.metamaskrc.dist
index 151c29808c86..2b723c2b1c78 100644
--- a/.metamaskrc.dist
+++ b/.metamaskrc.dist
@@ -5,7 +5,7 @@
INFURA_PROJECT_ID=00000000000
;PASSWORD=METAMASK PASSWORD
-,SEGMENT_WRITE_KEY=
+;SEGMENT_WRITE_KEY=
;SWAPS_USE_DEV_APIS=
;PORTFOLIO_URL=
;TRANSACTION_SECURITY_PROVIDER=
diff --git a/.storybook/test-data.js b/.storybook/test-data.js
index 7acce27bc431..b78ae04c0620 100644
--- a/.storybook/test-data.js
+++ b/.storybook/test-data.js
@@ -1062,12 +1062,6 @@ const state = {
unapprovedEncryptionPublicKeyMsgCount: 0,
unapprovedTypedMessages: {},
unapprovedTypedMessagesCount: 0,
- keyringTypes: [
- KeyringType.imported,
- KeyringType.hdKeyTree,
- KeyringType.trezor,
- KeyringType.ledger,
- ],
keyrings: [
{
type: KeyringType.hdKeyTree,
@@ -1137,7 +1131,6 @@ const state = {
lostIdentities: {},
forgottenPassword: false,
ipfsGateway: 'dweb.link',
- infuraBlocked: false,
migratedPrivacyMode: false,
selectedAddress: '0x9d0ba4ddac06032527b140912ec808ab9451b788',
metaMetricsId:
diff --git a/.yarn/patches/@babel-core-npm-7.21.5-c72c337956.patch b/.yarn/patches/@babel-core-npm-7.21.5-c72c337956.patch
deleted file mode 100644
index c6a1743a7167..000000000000
--- a/.yarn/patches/@babel-core-npm-7.21.5-c72c337956.patch
+++ /dev/null
@@ -1,12 +0,0 @@
-diff --git a/lib/index.js b/lib/index.js
-index c991f62dc64553502e9911a7f21e77e008d7f438..e503c7494d21b13df85b10e1657b2af8ca4d964f 100644
---- a/lib/index.js
-+++ b/lib/index.js
-@@ -222,7 +222,6 @@ var _transform = require("./transform");
- var _transformFile = require("./transform-file");
- var _transformAst = require("./transform-ast");
- var _parse = require("./parse");
--var thisFile = require("./index");
- const version = "7.21.5";
- exports.version = version;
- const DEFAULT_EXTENSIONS = Object.freeze([".js", ".jsx", ".es6", ".es", ".mjs", ".cjs"]);
diff --git a/.yarn/patches/@babel-core-npm-7.23.2-b93f586907.patch b/.yarn/patches/@babel-core-npm-7.23.2-b93f586907.patch
new file mode 100644
index 000000000000..fdae8d6b2b4e
--- /dev/null
+++ b/.yarn/patches/@babel-core-npm-7.23.2-b93f586907.patch
@@ -0,0 +1,12 @@
+diff --git a/lib/index.js b/lib/index.js
+index 64ff8344f6280d20988f8c3c81e1f248a1869e53..6739e7bd2271be6b861479ec384bbd007bdb5df8 100644
+--- a/lib/index.js
++++ b/lib/index.js
+@@ -222,7 +222,6 @@ var _transform = require("./transform.js");
+ var _transformFile = require("./transform-file.js");
+ var _transformAst = require("./transform-ast.js");
+ var _parse = require("./parse.js");
+-var thisFile = require("./index.js");
+ ;
+ const version = "7.23.2";
+ exports.version = version;
diff --git a/.yarn/patches/@babel-runtime-npm-7.18.9-28ca6b5f61.patch b/.yarn/patches/@babel-runtime-npm-7.23.2-d013d6cf7e.patch
similarity index 91%
rename from .yarn/patches/@babel-runtime-npm-7.18.9-28ca6b5f61.patch
rename to .yarn/patches/@babel-runtime-npm-7.23.2-d013d6cf7e.patch
index 30144e224f5e..1197cddf1a1b 100644
--- a/.yarn/patches/@babel-runtime-npm-7.18.9-28ca6b5f61.patch
+++ b/.yarn/patches/@babel-runtime-npm-7.23.2-d013d6cf7e.patch
@@ -1,30 +1,10 @@
diff --git a/helpers/construct.js b/helpers/construct.js
-index ecc013db4703c1c6ca8a5bba3db3955e75c1a972..08826bea9453f1351c08d44be9fffca92923fd76 100644
+index 3d3c232dcb226892cdf6181c6f4f4f40f2325fcc..da7e2696a244fadd35f0eeb5cae5f577ee3c7442 100644
--- a/helpers/construct.js
+++ b/helpers/construct.js
-@@ -1,22 +1,21 @@
+@@ -1,18 +1,21 @@
-var setPrototypeOf = require("./setPrototypeOf.js");
-+// All of MetaMask's supported browsers include `Reflect.construct` support, so
-+// we don't need this polyfill.
-
-var isNativeReflectConstruct = require("./isNativeReflectConstruct.js");
-+// This Proxy preseves the two properties that were added by `@babel/runtime`.
-+// I am not entire sure what these properties are for (maybe ES5/ES6
-+// interoperability?) but they have been preserved just in case.
-+const reflectProxy = new Proxy(
-+ Reflect.construct,
-+ {
-+ get: function (target, property) {
-+ if (property === 'default') {
-+ return target;
-+ } else if (property === '__esModule') {
-+ return true;
-+ }
-+ return Reflect.get(...arguments);
-+ }
-+ }
-+);
-
-function _construct(Parent, args, Class) {
- if (isNativeReflectConstruct()) {
- module.exports = _construct = Reflect.construct.bind(), module.exports.__esModule = true, module.exports["default"] = module.exports;
@@ -38,11 +18,28 @@ index ecc013db4703c1c6ca8a5bba3db3955e75c1a972..08826bea9453f1351c08d44be9fffca9
- return instance;
- }, module.exports.__esModule = true, module.exports["default"] = module.exports;
- }
--
- return _construct.apply(null, arguments);
-}
--
-module.exports = _construct, module.exports.__esModule = true, module.exports["default"] = module.exports;
\ No newline at end of file
++// All of MetaMask's supported browsers include `Reflect.construct` support, so
++// we don't need this polyfill.
++
++// This Proxy preseves the two properties that were added by `@babel/runtime`.
++// I am not entire sure what these properties are for (maybe ES5/ES6
++// interoperability?) but they have been preserved just in case.
++const reflectProxy = new Proxy(
++ Reflect.construct,
++ {
++ get: function (target, property) {
++ if (property === 'default') {
++ return target;
++ } else if (property === '__esModule') {
++ return true;
++ }
++ return Reflect.get(...arguments);
++ }
++ }
++);
++
+module.exports = reflectProxy;
-\ No newline at end of file
diff --git a/.yarn/patches/@metamask-keyring-controller-npm-7.2.0-fcc0c7893b.patch b/.yarn/patches/@metamask-keyring-controller-npm-7.2.0-fcc0c7893b.patch
deleted file mode 100644
index 956b9fe308f7..000000000000
--- a/.yarn/patches/@metamask-keyring-controller-npm-7.2.0-fcc0c7893b.patch
+++ /dev/null
@@ -1,46 +0,0 @@
-diff --git a/dist/KeyringController.d.ts b/dist/KeyringController.d.ts
-index ccfd5ca9accf782b0a612ab1666501898cf2abb9..f772552156491b308f2aa29a734a5138237d951e 100644
---- a/dist/KeyringController.d.ts
-+++ b/dist/KeyringController.d.ts
-@@ -1,10 +1,11 @@
- import type { TxData, TypedTransaction } from '@ethereumjs/tx';
--import { type MetaMaskKeyring as QRKeyring, type IKeyringState as IQRKeyringState } from '@keystonehq/metamask-airgapped-keyring';
-+import type { MetaMaskKeyring as QRKeyring, IKeyringState as IQRKeyringState } from '@keystonehq/metamask-airgapped-keyring';
- import type { RestrictedControllerMessenger } from '@metamask/base-controller';
- import { BaseControllerV2 } from '@metamask/base-controller';
- import type { PersonalMessageParams, TypedMessageParams } from '@metamask/message-manager';
- import type { PreferencesController } from '@metamask/preferences-controller';
--import { type Hex, type Keyring, type Json } from '@metamask/utils';
-+import type { Hex, Keyring, Json } from '@metamask/utils';
-+import type { KeyringController as EthKeyringController } from '@metamask/eth-keyring-controller';
- import type { Patch } from 'immer';
- declare const name = "KeyringController";
- /**
-@@ -135,6 +136,10 @@ export declare class KeyringController extends BaseControllerV2 {
-+ // Expecting reject error but throwing manually rather than waiting
-+ });
- __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_cancelAbstractMessage).call(this, messageManager, messageId);
-- throw eth_rpc_errors_1.ethErrors.provider.userRejectedRequest('User rejected the request.');
-+ throw eth_rpc_errors_1.ethErrors.provider.userRejectedRequest(`MetaMask ${messageName} Signature: User denied message signature.`);
- }
- yield signMessage(messageParamsWithId, signingOpts);
- const signatureResult = yield signaturePromise;
-@@ -305,7 +308,7 @@ _SignatureController_keyringController = new WeakMap(), _SignatureController_isE
- return __awaiter(this, void 0, void 0, function* () {
- return yield __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_signAbstractMessage).call(this, __classPrivateFieldGet(this, _SignatureController_personalMessageManager, "f"), controller_utils_1.ApprovalType.PersonalSign, msgParams, (cleanMsgParams) => __awaiter(this, void 0, void 0, function* () { return yield __classPrivateFieldGet(this, _SignatureController_keyringController, "f").signPersonalMessage(cleanMsgParams); }));
- });
--}, _SignatureController_signTypedMessage = function _SignatureController_signTypedMessage(msgParams,
-+}, _SignatureController_signTypedMessage = function _SignatureController_signTypedMessage(msgParams,
- /* istanbul ignore next */
- opts = { parseJsonData: true }) {
- return __awaiter(this, void 0, void 0, function* () {
diff --git a/.yarn/patches/@metamask-signature-controller-npm-6.0.0-90e8e479a9.patch b/.yarn/patches/@metamask-signature-controller-npm-6.0.0-90e8e479a9.patch
new file mode 100644
index 000000000000..128ad3f80189
--- /dev/null
+++ b/.yarn/patches/@metamask-signature-controller-npm-6.0.0-90e8e479a9.patch
@@ -0,0 +1,17 @@
+diff --git a/dist/SignatureController.js b/dist/SignatureController.js
+index 46d4b4d0553f86d368d30b7e90a9dc2e03d26ef9..e7063a3753bc3821e661c11132e33304b4fce416 100644
+--- a/dist/SignatureController.js
++++ b/dist/SignatureController.js
+@@ -280,8 +280,11 @@ _SignatureController_isEthSignEnabled = new WeakMap(), _SignatureController_getA
+ resultCallbacks = acceptResult.resultCallbacks;
+ }
+ catch (_a) {
++ signaturePromise.catch(() => {
++ // Expecting reject error but throwing manually rather than waiting
++ });
+ __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_cancelAbstractMessage).call(this, messageManager, messageId);
+- throw eth_rpc_errors_1.ethErrors.provider.userRejectedRequest('User rejected the request.');
++ throw eth_rpc_errors_1.ethErrors.provider.userRejectedRequest(`MetaMask ${messageName} Signature: User denied message signature.`);
+ }
+ yield signMessage(messageParamsWithId, signingOpts);
+ const signatureResult = yield signaturePromise;
diff --git a/.yarn/patches/lavamoat-core-npm-14.4.1-c4e8bbb016.patch b/.yarn/patches/lavamoat-core-npm-14.4.1-c4e8bbb016.patch
index abae9b29583c..07a662583315 100644
--- a/.yarn/patches/lavamoat-core-npm-14.4.1-c4e8bbb016.patch
+++ b/.yarn/patches/lavamoat-core-npm-14.4.1-c4e8bbb016.patch
@@ -1,3 +1,16 @@
+diff --git a/src/kernelTemplate.js b/src/kernelTemplate.js
+index de8d73048b7bb7c4e74009b5c85ad919fe197ef0..e5bcb987cff013def8b2e8c767eb75a57ea0bd7a 100644
+--- a/src/kernelTemplate.js
++++ b/src/kernelTemplate.js
+@@ -60,6 +60,8 @@
+ errorTaming: 'unsafe',
+ // shows the full call stack
+ stackFiltering: 'verbose',
++ // prevents most common override mistake cases from tripping up users
++ overrideTaming: 'severe',
+ }
+
+ lockdown(lockdownOptions)
diff --git a/src/loadPolicy.js b/src/loadPolicy.js
index ef71923f9282d6a5e9f74e6ec6fa0516f28f508b..0118fda7e1b0fa461ec01ceff8d7112d072f3dfb 100644
--- a/src/loadPolicy.js
diff --git a/.yarn/patches/typescript-npm-4.4.4-3fedcc07a3.patch b/.yarn/patches/typescript-npm-4.4.4-3fedcc07a3.patch
deleted file mode 100644
index 95cb488b1435..000000000000
--- a/.yarn/patches/typescript-npm-4.4.4-3fedcc07a3.patch
+++ /dev/null
@@ -1,242 +0,0 @@
-diff --git a/lib/typescript.js b/lib/typescript.js
-index 323de6f4da00612e90e685142120736bfaeed37b..350e352e36f8bb6a870d7c24eaeae6bf7d648840 100644
---- a/lib/typescript.js
-+++ b/lib/typescript.js
-@@ -24,11 +24,58 @@ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
- return to.concat(ar || Array.prototype.slice.call(from));
- };
- var __assign = (this && this.__assign) || function () {
-- __assign = Object.assign || function(t) {
-+ __assign = function(t) {
- for (var s, i = 1, n = arguments.length; i < n; i++) {
- s = arguments[i];
-- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
-- t[p] = s[p];
-+ for (var p in s) {
-+ if (Object.prototype.hasOwnProperty.call(s, p)) {
-+ /**
-+ * In the original version of this package, this was:
-+ *
-+ * t[p] = s[p]
-+ *
-+ * Unfortunately LavaMoat trips up on this, so we have to change
-+ * it.
-+ *
-+ * Internally LavaMoat uses `lockdown` (part of SES, which is
-+ * part of Endo) to freeze modifications to "intrinsics" — core
-+ * things like `Object.prototype`, `Function.prototype`, etc.
-+ * This will cause code which is responsible for said
-+ * modifications to fail at runtime, because it makes the
-+ * properties of these intrinsics non-writable.
-+ *
-+ * The reason we have to change *this* code is that later on,
-+ * this `__assign` function is used to merge two objects, and
-+ * one of those objects contains a `constructor` property. As we
-+ * know, `constructor` is a special property, as it's a property
-+ * on `Object.prototype` that stores the constructor used to
-+ * create that object. But when used in this context, there is
-+ * nothing inherently special about it – it's just a property on
-+ * an object we're setting. Unfortunately, that's not how it's
-+ * being treated. Because `lockdown` freezes `Object.prototype`,
-+ * `Object.prototype.constructor` is non-writable, and due to a
-+ * "mistake" in the ES5 spec [1], that means `constructor` on
-+ * *any* object is non-writable too. So an error is thrown when
-+ * this code is executed.
-+ *
-+ * There is a way to get around this, which is to configure
-+ * `lockdown` with the option `overrideTaming: 'severe'`.
-+ * The mechanics of this option, as well as more information
-+ * about the "mistake" this option solves, are explained here
-+ * [2]. Unfortunately, we cannot enable this option because
-+ * LavaMoat is the one running `lockdown` here [3]. So to work
-+ * around this, we use `Object.defineProperty` to define the
-+ * property we want. As this does not use property assignment
-+ * (`object[key] = value`) but rather defines the property more
-+ * directly, this bypasses the "override mistake".
-+ *
-+ * [1]: https://web.archive.org/web/20141230041441/http://wiki.ecmascript.org/doku.php?id=strawman:fixing_override_mistake
-+ * [2]: https://github.com/endojs/endo/blob/864f086f87e1e7ef78a401a7550ff0aeb664bba0/packages/ses/src/enable-property-overrides.js#L28
-+ * [3]: https://github.com/LavaMoat/LavaMoat/blob/7c15bf8ba34ba1a9ceb3ffe591b1b2bfb084bead/packages/core/src/kernelTemplate.js#L32-L43
-+ */
-+ Object.defineProperty(t, p, Object.getOwnPropertyDescriptor(s, p))
-+ }
-+ }
- }
- return t;
- };
-@@ -9820,87 +9867,94 @@ var ts;
- }
- ts.tokenIsIdentifierOrKeywordOrGreaterThan = tokenIsIdentifierOrKeywordOrGreaterThan;
- /** @internal */
-- ts.textToKeywordObj = (_a = {
-- abstract: 126 /* AbstractKeyword */,
-- any: 129 /* AnyKeyword */,
-- as: 127 /* AsKeyword */,
-- asserts: 128 /* AssertsKeyword */,
-- bigint: 156 /* BigIntKeyword */,
-- boolean: 132 /* BooleanKeyword */,
-- break: 81 /* BreakKeyword */,
-- case: 82 /* CaseKeyword */,
-- catch: 83 /* CatchKeyword */,
-- class: 84 /* ClassKeyword */,
-- continue: 86 /* ContinueKeyword */,
-- const: 85 /* ConstKeyword */
-- },
-- _a["" + "constructor"] = 133 /* ConstructorKeyword */,
-- _a.debugger = 87 /* DebuggerKeyword */,
-- _a.declare = 134 /* DeclareKeyword */,
-- _a.default = 88 /* DefaultKeyword */,
-- _a.delete = 89 /* DeleteKeyword */,
-- _a.do = 90 /* DoKeyword */,
-- _a.else = 91 /* ElseKeyword */,
-- _a.enum = 92 /* EnumKeyword */,
-- _a.export = 93 /* ExportKeyword */,
-- _a.extends = 94 /* ExtendsKeyword */,
-- _a.false = 95 /* FalseKeyword */,
-- _a.finally = 96 /* FinallyKeyword */,
-- _a.for = 97 /* ForKeyword */,
-- _a.from = 154 /* FromKeyword */,
-- _a.function = 98 /* FunctionKeyword */,
-- _a.get = 135 /* GetKeyword */,
-- _a.if = 99 /* IfKeyword */,
-- _a.implements = 117 /* ImplementsKeyword */,
-- _a.import = 100 /* ImportKeyword */,
-- _a.in = 101 /* InKeyword */,
-- _a.infer = 136 /* InferKeyword */,
-- _a.instanceof = 102 /* InstanceOfKeyword */,
-- _a.interface = 118 /* InterfaceKeyword */,
-- _a.intrinsic = 137 /* IntrinsicKeyword */,
-- _a.is = 138 /* IsKeyword */,
-- _a.keyof = 139 /* KeyOfKeyword */,
-- _a.let = 119 /* LetKeyword */,
-- _a.module = 140 /* ModuleKeyword */,
-- _a.namespace = 141 /* NamespaceKeyword */,
-- _a.never = 142 /* NeverKeyword */,
-- _a.new = 103 /* NewKeyword */,
-- _a.null = 104 /* NullKeyword */,
-- _a.number = 145 /* NumberKeyword */,
-- _a.object = 146 /* ObjectKeyword */,
-- _a.package = 120 /* PackageKeyword */,
-- _a.private = 121 /* PrivateKeyword */,
-- _a.protected = 122 /* ProtectedKeyword */,
-- _a.public = 123 /* PublicKeyword */,
-- _a.override = 157 /* OverrideKeyword */,
-- _a.readonly = 143 /* ReadonlyKeyword */,
-- _a.require = 144 /* RequireKeyword */,
-- _a.global = 155 /* GlobalKeyword */,
-- _a.return = 105 /* ReturnKeyword */,
-- _a.set = 147 /* SetKeyword */,
-- _a.static = 124 /* StaticKeyword */,
-- _a.string = 148 /* StringKeyword */,
-- _a.super = 106 /* SuperKeyword */,
-- _a.switch = 107 /* SwitchKeyword */,
-- _a.symbol = 149 /* SymbolKeyword */,
-- _a.this = 108 /* ThisKeyword */,
-- _a.throw = 109 /* ThrowKeyword */,
-- _a.true = 110 /* TrueKeyword */,
-- _a.try = 111 /* TryKeyword */,
-- _a.type = 150 /* TypeKeyword */,
-- _a.typeof = 112 /* TypeOfKeyword */,
-- _a.undefined = 151 /* UndefinedKeyword */,
-- _a.unique = 152 /* UniqueKeyword */,
-- _a.unknown = 153 /* UnknownKeyword */,
-- _a.var = 113 /* VarKeyword */,
-- _a.void = 114 /* VoidKeyword */,
-- _a.while = 115 /* WhileKeyword */,
-- _a.with = 116 /* WithKeyword */,
-- _a.yield = 125 /* YieldKeyword */,
-- _a.async = 130 /* AsyncKeyword */,
-- _a.await = 131 /* AwaitKeyword */,
-- _a.of = 158 /* OfKeyword */,
-- _a);
-+ /**
-+ * In the original version of this package, this object was built by
-+ * initializing one object and then adding more properties to that object.
-+ * This ends up throwing an error when this code is executed due to
-+ * the same issue as explained at the top of this file: essentially,
-+ * the `constructor` property of any object cannot be set due to the
-+ * "override mistake". The fix for this is to just build one big object.
-+ */
-+ ts.textToKeywordObj = {
-+ abstract: 126 /* AbstractKeyword */,
-+ any: 129 /* AnyKeyword */,
-+ as: 127 /* AsKeyword */,
-+ asserts: 128 /* AssertsKeyword */,
-+ bigint: 156 /* BigIntKeyword */,
-+ boolean: 132 /* BooleanKeyword */,
-+ break: 81 /* BreakKeyword */,
-+ case: 82 /* CaseKeyword */,
-+ catch: 83 /* CatchKeyword */,
-+ class: 84 /* ClassKeyword */,
-+ continue: 86 /* ContinueKeyword */,
-+ const: 85 /* ConstKeyword */,
-+ ["constructor"]: 133 /* ConstructorKeyword */,
-+ debugger: 87 /* DebuggerKeyword */,
-+ declare: 134 /* DeclareKeyword */,
-+ default: 88 /* DefaultKeyword */,
-+ delete: 89 /* DeleteKeyword */,
-+ do: 90 /* DoKeyword */,
-+ else: 91 /* ElseKeyword */,
-+ enum: 92 /* EnumKeyword */,
-+ export: 93 /* ExportKeyword */,
-+ extends: 94 /* ExtendsKeyword */,
-+ false: 95 /* FalseKeyword */,
-+ finally: 96 /* FinallyKeyword */,
-+ for: 97 /* ForKeyword */,
-+ from: 154 /* FromKeyword */,
-+ function: 98 /* FunctionKeyword */,
-+ get: 135 /* GetKeyword */,
-+ if: 99 /* IfKeyword */,
-+ implements: 117 /* ImplementsKeyword */,
-+ import: 100 /* ImportKeyword */,
-+ in: 101 /* InKeyword */,
-+ infer: 136 /* InferKeyword */,
-+ instanceof: 102 /* InstanceOfKeyword */,
-+ interface: 118 /* InterfaceKeyword */,
-+ intrinsic: 137 /* IntrinsicKeyword */,
-+ is: 138 /* IsKeyword */,
-+ keyof: 139 /* KeyOfKeyword */,
-+ let: 119 /* LetKeyword */,
-+ module: 140 /* ModuleKeyword */,
-+ namespace: 141 /* NamespaceKeyword */,
-+ never: 142 /* NeverKeyword */,
-+ new: 103 /* NewKeyword */,
-+ null: 104 /* NullKeyword */,
-+ number: 145 /* NumberKeyword */,
-+ object: 146 /* ObjectKeyword */,
-+ package: 120 /* PackageKeyword */,
-+ private: 121 /* PrivateKeyword */,
-+ protected: 122 /* ProtectedKeyword */,
-+ public: 123 /* PublicKeyword */,
-+ override: 157 /* OverrideKeyword */,
-+ readonly: 143 /* ReadonlyKeyword */,
-+ require: 144 /* RequireKeyword */,
-+ global: 155 /* GlobalKeyword */,
-+ return: 105 /* ReturnKeyword */,
-+ set: 147 /* SetKeyword */,
-+ static: 124 /* StaticKeyword */,
-+ string: 148 /* StringKeyword */,
-+ super: 106 /* SuperKeyword */,
-+ switch: 107 /* SwitchKeyword */,
-+ symbol: 149 /* SymbolKeyword */,
-+ this: 108 /* ThisKeyword */,
-+ throw: 109 /* ThrowKeyword */,
-+ true: 110 /* TrueKeyword */,
-+ try: 111 /* TryKeyword */,
-+ type: 150 /* TypeKeyword */,
-+ typeof: 112 /* TypeOfKeyword */,
-+ undefined: 151 /* UndefinedKeyword */,
-+ unique: 152 /* UniqueKeyword */,
-+ unknown: 153 /* UnknownKeyword */,
-+ var: 113 /* VarKeyword */,
-+ void: 114 /* VoidKeyword */,
-+ while: 115 /* WhileKeyword */,
-+ with: 116 /* WithKeyword */,
-+ yield: 125 /* YieldKeyword */,
-+ async: 130 /* AsyncKeyword */,
-+ await: 131 /* AwaitKeyword */,
-+ of: 158 /* OfKeyword */
-+ };
- var textToKeyword = new ts.Map(ts.getEntries(ts.textToKeywordObj));
- var textToToken = new ts.Map(ts.getEntries(__assign(__assign({}, ts.textToKeywordObj), { "{": 18 /* OpenBraceToken */, "}": 19 /* CloseBraceToken */, "(": 20 /* OpenParenToken */, ")": 21 /* CloseParenToken */, "[": 22 /* OpenBracketToken */, "]": 23 /* CloseBracketToken */, ".": 24 /* DotToken */, "...": 25 /* DotDotDotToken */, ";": 26 /* SemicolonToken */, ",": 27 /* CommaToken */, "<": 29 /* LessThanToken */, ">": 31 /* GreaterThanToken */, "<=": 32 /* LessThanEqualsToken */, ">=": 33 /* GreaterThanEqualsToken */, "==": 34 /* EqualsEqualsToken */, "!=": 35 /* ExclamationEqualsToken */, "===": 36 /* EqualsEqualsEqualsToken */, "!==": 37 /* ExclamationEqualsEqualsToken */, "=>": 38 /* EqualsGreaterThanToken */, "+": 39 /* PlusToken */, "-": 40 /* MinusToken */, "**": 42 /* AsteriskAsteriskToken */, "*": 41 /* AsteriskToken */, "/": 43 /* SlashToken */, "%": 44 /* PercentToken */, "++": 45 /* PlusPlusToken */, "--": 46 /* MinusMinusToken */, "<<": 47 /* LessThanLessThanToken */, "": 30 /* LessThanSlashToken */, ">>": 48 /* GreaterThanGreaterThanToken */, ">>>": 49 /* GreaterThanGreaterThanGreaterThanToken */, "&": 50 /* AmpersandToken */, "|": 51 /* BarToken */, "^": 52 /* CaretToken */, "!": 53 /* ExclamationToken */, "~": 54 /* TildeToken */, "&&": 55 /* AmpersandAmpersandToken */, "||": 56 /* BarBarToken */, "?": 57 /* QuestionToken */, "??": 60 /* QuestionQuestionToken */, "?.": 28 /* QuestionDotToken */, ":": 58 /* ColonToken */, "=": 63 /* EqualsToken */, "+=": 64 /* PlusEqualsToken */, "-=": 65 /* MinusEqualsToken */, "*=": 66 /* AsteriskEqualsToken */, "**=": 67 /* AsteriskAsteriskEqualsToken */, "/=": 68 /* SlashEqualsToken */, "%=": 69 /* PercentEqualsToken */, "<<=": 70 /* LessThanLessThanEqualsToken */, ">>=": 71 /* GreaterThanGreaterThanEqualsToken */, ">>>=": 72 /* GreaterThanGreaterThanGreaterThanEqualsToken */, "&=": 73 /* AmpersandEqualsToken */, "|=": 74 /* BarEqualsToken */, "^=": 78 /* CaretEqualsToken */, "||=": 75 /* BarBarEqualsToken */, "&&=": 76 /* AmpersandAmpersandEqualsToken */, "??=": 77 /* QuestionQuestionEqualsToken */, "@": 59 /* AtToken */, "#": 62 /* HashToken */, "`": 61 /* BacktickToken */ })));
- /*
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 5283ec097070..a75f094c96b4 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6,6 +6,47 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased]
+## [11.3.0]
+### Added
+- Display total fiat balance on home screen ([#20941](https://github.com/MetaMask/metamask-extension/pull/20941))
+- Give the user the ability to opt out of 3rd party network validation when adding a new network ([#20816](https://github.com/MetaMask/metamask-extension/pull/20816))
+- Adds conversion buttons to buy, receive, and learn more about NFTs when an account is empty. ([#21049](https://github.com/MetaMask/metamask-extension/pull/21049))
+- What's New modal for the latest Buy and Sell features ([#20965](https://github.com/MetaMask/metamask-extension/pull/20965))
+- [Flask] Suggest names for Ethereum addresses in signature requests using installed snaps ([#20959](https://github.com/MetaMask/metamask-extension/pull/20959))
+
+### Changed
+- Move the token detection prompt to the top of the assets list ([#20932](https://github.com/MetaMask/metamask-extension/pull/20932))
+- Adds address validation to the Import NFT modal ([#21028](https://github.com/MetaMask/metamask-extension/pull/21028))
+- Add error message to the Import NFT modal if an NFT with that tokenId already exists ([#20940](https://github.com/MetaMask/metamask-extension/pull/20940))
+- Show a warning when sending 0 tokens ([#21091](https://github.com/MetaMask/metamask-extension/pull/21091))
+- Enable bridge button on the zkSync network, and for some tokens on other networks ([#21085](https://github.com/MetaMask/metamask-extension/pull/21085))
+- Stop displaying a mismatched account warning on the Sign In With Ethereum page ([#21107](https://github.com/MetaMask/metamask-extension/pull/21107))
+- Ensure "Enhanced Token Detection" is toggled off when opening "Advanced Configuration" during onboarding ([#20960](https://github.com/MetaMask/metamask-extension/pull/20960))
+- Improve loading speed/performance upon opening MetaMask ([#20843](https://github.com/MetaMask/metamask-extension/pull/20843))
+- Ensure logos are displayed on "Popular Networks" added from within MetaMask ([#20895](https://github.com/MetaMask/metamask-extension/pull/20895))
+- Show more characters in the addresses in the Connected Sites account list ([#21048](https://github.com/MetaMask/metamask-extension/pull/21048))
+- Replaces the "Add / Import / Hardware" links with a single button that takes the user to another quick modal to add, import, or connect a hardware wallet.([#21081](https://github.com/MetaMask/metamask-extension/pull/21081))
+- Disable the "Buy" button on the Sepolia network ([#20839](https://github.com/MetaMask/metamask-extension/pull/20839))
+- Update the "Buy" button to a "Buy & Sell" button ([#20891](https://github.com/MetaMask/metamask-extension/pull/20891))
+- Only display the Notification item in the dropdown menu if the user has installed a snap using the notifications permission ([#20913](https://github.com/MetaMask/metamask-extension/pull/20913))
+- Update Snaps Settings screen ([#21061](https://github.com/MetaMask/metamask-extension/pull/21061))
+- Site connection icon now indicates a connection if a dapp is connected to a snap ([#20811](https://github.com/MetaMask/metamask-extension/pull/20811))
+- Update copy on the remove snap modal ([#21065](https://github.com/MetaMask/metamask-extension/pull/21065))
+- Update the padding of the transaction insight dropdown ([#21022](https://github.com/MetaMask/metamask-extension/pull/21022))
+- [Flask] Suggest names for Ethereum addresses in signature requests using services such as ENS and Etherscan ([#20831](https://github.com/MetaMask/metamask-extension/pull/20831))
+
+### Fixed
+- Fix to ensure contract address is pre-populated, and NFT is removed from token list, when converting a token to an NFT ([#20747](https://github.com/MetaMask/metamask-extension/pull/20747))
+- Fix autodetect tokens link so that the user is correctly taken to the right scroll position in settings ([#20978](https://github.com/MetaMask/metamask-extension/pull/20978))
+- Ensure safe batch NFT transfers show display recipient address correctly ([#21042](https://github.com/MetaMask/metamask-extension/pull/21042))
+- Fix bug that can prevent MetaMask from loading, and be stuck on the loading screen, on Firefox ([#20992](https://github.com/MetaMask/metamask-extension/pull/20992))
+- Ensure correct network icon is displayed in the "You have switched to" modal when switching to "Popular Networks" ([#21016](https://github.com/MetaMask/metamask-extension/pull/21016))
+- Ensure disconnecting a single dapp from a snap only disconnects that dapp ([#20983](https://github.com/MetaMask/metamask-extension/pull/20983))
+- Fix the Snap npm link so that it leads to the stated version of the npm package ([#20897](https://github.com/MetaMask/metamask-extension/pull/20897))
+- Fix to prevent crashes when switching network during a snaps confirmation ([#21088](https://github.com/MetaMask/metamask-extension/pull/21088))
+- Fix issue that could cause crashes when attempting to render certain NFTs ([#21418](https://github.com/MetaMask/metamask-extension/pull/21418))
+
+
## [11.2.0]
### Added
- Adds Swaps support for the zkSync Era network ([#20809](https://github.com/MetaMask/metamask-extension/pull/20809))
@@ -4066,7 +4107,8 @@ Update styles and spacing on the critical error page ([#20350](https://github.c
### Uncategorized
- Added the ability to restore accounts from seed words.
-[Unreleased]: https://github.com/MetaMask/metamask-extension/compare/v11.2.0...HEAD
+[Unreleased]: https://github.com/MetaMask/metamask-extension/compare/v11.3.0...HEAD
+[11.3.0]: https://github.com/MetaMask/metamask-extension/compare/v11.2.0...v11.3.0
[11.2.0]: https://github.com/MetaMask/metamask-extension/compare/v11.1.2...v11.2.0
[11.1.2]: https://github.com/MetaMask/metamask-extension/compare/v11.1.1...v11.1.2
[11.1.1]: https://github.com/MetaMask/metamask-extension/compare/v11.1.0...v11.1.1
diff --git a/README.md b/README.md
index c817f3c570d6..adad35727fbc 100644
--- a/README.md
+++ b/README.md
@@ -17,17 +17,22 @@ To learn how to contribute to the MetaMask project itself, visit our [Internal D
- Install [Node.js](https://nodejs.org) version 18
- If you are using [nvm](https://github.com/nvm-sh/nvm#installing-and-updating) (recommended) running `nvm use` will automatically choose the right node version for you.
- Enable Corepack by executing the command `corepack enable` within the metamask-extension project. Corepack is a utility included with Node.js by default. It manages Yarn on a per-project basis, using the version specified by the `packageManager` property in the project's package.json file. Please note that modern releases of [Yarn](https://yarnpkg.com/getting-started/install) are not intended to be installed globally or via npm.
-- Duplicate `.metamaskrc.dist` within the root and rename it to `.metamaskrc`
- - Replace the `INFURA_PROJECT_ID` value with your own personal [Infura Project ID](https://infura.io/docs).
+- Duplicate `.metamaskrc.dist` within the root and rename it to `.metamaskrc` by running `cp .metamaskrc{.dist,}`.
+ - Replace the `INFURA_PROJECT_ID` value with your own personal [Infura API Key](https://docs.infura.io/networks/ethereum/how-to/secure-a-project/project-id).
+ - If you don't have an Infura account, you can create one for free on the [Infura website](https://app.infura.io/register).
- If debugging MetaMetrics, you'll need to add a value for `SEGMENT_WRITE_KEY` [Segment write key](https://segment.com/docs/connections/find-writekey/), see [Developing on MetaMask - Segment](./development/README.md#segment).
- If debugging unhandled exceptions, you'll need to add a value for `SENTRY_DSN` [Sentry Dsn](https://docs.sentry.io/product/sentry-basics/dsn-explainer/), see [Developing on MetaMask - Sentry](./development/README.md#sentry).
- Optionally, replace the `PASSWORD` value with your development wallet password to avoid entering it each time you open the app.
+- Run `yarn install` to install the dependencies.
- Build the project to the `./dist/` folder with `yarn dist`.
- Optionally, you may run `yarn start` to run dev mode.
+ - Uncompressed builds can be found in `/dist`, compressed builds can be found in `/builds` once they're built.
+ - See the [build system readme](./development/build/README.md) for build system usage information.
-Uncompressed builds can be found in `/dist`, compressed builds can be found in `/builds` once they're built.
+- Follow these instructions to verify that your local build runs correctly:
+ - [How to add custom build to Chrome](./docs/add-to-chrome.md)
+ - [How to add custom build to Firefox](./docs/add-to-firefox.md)
-See the [build system readme](./development/build/README.md) for build system usage information.
## Git Hooks
@@ -37,6 +42,8 @@ To get quick feedback from our shared code quality fitness functions before comm
You can read more about them in our [testing documentation](./docs/testing.md#fitness-functions-measuring-progress-in-code-quality-and-preventing-regressions-using-custom-git-hooks).
+If you are using VS Code and are unable to make commits from the source control sidebar due to a "command not found" error, try these steps from the [Husky docs](https://typicode.github.io/husky/troubleshooting.html#command-not-found).
+
## Contributing
### Development builds
@@ -102,6 +109,16 @@ Single e2e tests can be run with `yarn test:e2e:single test/e2e/tests/TEST_NAME.
For example, to run the `account-details` tests using Chrome, with debug logging and with the browser set to remain open upon failure, you would use:
`yarn test:e2e:single test/e2e/tests/account-details.spec.js --browser=chrome --debug --leave-running`
+#### Running specific builds types e2e test
+
+Differnt build types have different e2e tests sets. In order to run them look in the `packaje.json` file. You will find:
+```console
+ "test:e2e:chrome:mmi": "SELENIUM_BROWSER=chrome node test/e2e/run-all.js --mmi",
+ "test:e2e:chrome:snaps": "SELENIUM_BROWSER=chrome node test/e2e/run-all.js --snaps",
+ "test:e2e:chrome:mv3": "SELENIUM_BROWSER=chrome node test/e2e/run-all.js --mv3",
+```
+Note: MMI runs a subset of MetaMask's e2e tests. To facilitate this, we have appended the `@no-mmi` tags to the names of those tests that are not applicable to this build type.
+
### Changing dependencies
Whenever you change dependencies (adding, removing, or updating, either in `package.json` or `yarn.lock`), there are various files that must be kept up-to-date.
@@ -138,8 +155,6 @@ Whenever you change dependencies (adding, removing, or updating, either in `pack
## Other Docs
-- [How to add custom build to Chrome](./docs/add-to-chrome.md)
-- [How to add custom build to Firefox](./docs/add-to-firefox.md)
- [How to add a new translation to MetaMask](./docs/translating-guide.md)
- [Publishing Guide](./docs/publishing.md)
- [How to use the TREZOR emulator](./docs/trezor-emulator.md)
diff --git a/app/_locales/de/messages.json b/app/_locales/de/messages.json
index 851cdaeb7c49..213d8876df39 100644
--- a/app/_locales/de/messages.json
+++ b/app/_locales/de/messages.json
@@ -611,19 +611,10 @@
"busy": {
"message": "Ausgelastet"
},
- "buy": {
- "message": "Kaufen"
- },
"buyAsset": {
"message": "$1 kaufen",
"description": "$1 is the ticker symbol of a an asset the user is being prompted to purchase"
},
- "buyDescription": {
- "message": "Halten Sie Ihre Kryptowährung und erzielen Sie potenzielle Gewinne"
- },
- "buyDisabled": {
- "message": "Kaufen ist in diesem Netzwerk nicht verfügbar"
- },
"buyMoreAsset": {
"message": "Mehr $1 kaufen",
"description": "$1 is the ticker symbol of a an asset the user is being prompted to purchase"
@@ -1408,9 +1399,6 @@
"enableAutoDetect": {
"message": " Automatische Erkennung aktivieren"
},
- "enableForAllNetworks": {
- "message": "Für alle Netzwerke aktivieren"
- },
"enableFromSettings": {
"message": " In den Einstellungen aktivieren."
},
@@ -1550,11 +1538,9 @@
"experimental": {
"message": "Experimentell"
},
- "exploreMetaMaskSnaps": {
- "message": "MetaMask Snaps erforschen"
- },
"extendWalletWithSnaps": {
- "message": "Erweitern Sie Ihr Wallet-Erlebnis."
+ "message": "Erweitern Sie Ihr Wallet-Erlebnis.",
+ "description": "Banner description displayed on Snaps list page in Settings when less than 6 Snaps is installed."
},
"externalExtension": {
"message": "Externe Erweiterung"
@@ -1585,9 +1571,6 @@
"message": "Dateiimport fehlgeschlagen? Bitte hier klicken!",
"description": "Helps user import their account from a JSON file"
},
- "fileTooBig": {
- "message": "Die abgelegte Datei ist zu groß."
- },
"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."
@@ -3203,14 +3186,6 @@
"message": "Erlauben Sie dem Snap Lebenszyklus-Hooks zu verwenden, um den Code während seines Lebenszyklus zu bestimmten Zeiten auszuführen.",
"description": "An extended description for the `endowment:lifecycle-hooks` permission"
},
- "permission_longRunning": {
- "message": "Für unbestimmte Zeit ausführen.",
- "description": "The description for the `endowment:long-running` permission"
- },
- "permission_longRunningDescription": {
- "message": "Gestatten Sie dem Snap, unbegrenzt ausgeführt zu werden, während es zum Beispiel große Datenmengen verarbeitet.",
- "description": "An extended description for the `endowment:long-running` permission"
- },
"permission_manageAccounts": {
"message": "Ethereum-Konten hinzufügen und kontrollieren",
"description": "The description for `snap_manageAccounts` permission"
diff --git a/app/_locales/el/messages.json b/app/_locales/el/messages.json
index 9ba54b66e1d7..b5f4828434af 100644
--- a/app/_locales/el/messages.json
+++ b/app/_locales/el/messages.json
@@ -611,19 +611,10 @@
"busy": {
"message": "Απασχολημένο"
},
- "buy": {
- "message": "Αγορά"
- },
"buyAsset": {
"message": "Αγορά $1",
"description": "$1 is the ticker symbol of a an asset the user is being prompted to purchase"
},
- "buyDescription": {
- "message": "Κρατήστε τα κρυπτονομίσματά σας και κερδίστε πιθανά κέρδη"
- },
- "buyDisabled": {
- "message": "Η αγορά δεν είναι διαθέσιμη σε αυτό το δίκτυο"
- },
"buyMoreAsset": {
"message": "Αγοράστε περισσότερα $1",
"description": "$1 is the ticker symbol of a an asset the user is being prompted to purchase"
@@ -1408,9 +1399,6 @@
"enableAutoDetect": {
"message": " Ενεργοποίηση αυτόματου εντοπισμού"
},
- "enableForAllNetworks": {
- "message": "Ενεργοποίηση σε όλα τα δίκτυα"
- },
"enableFromSettings": {
"message": "Ενεργοποιήστε το από τις Ρυθμίσεις."
},
@@ -1550,11 +1538,9 @@
"experimental": {
"message": "Πειραματικά"
},
- "exploreMetaMaskSnaps": {
- "message": "Εξερευνήστε το MetaMask Snaps"
- },
"extendWalletWithSnaps": {
- "message": "Προσαρμόστε την εμπειρία του πορτοφολιού σας."
+ "message": "Προσαρμόστε την εμπειρία του πορτοφολιού σας.",
+ "description": "Banner description displayed on Snaps list page in Settings when less than 6 Snaps is installed."
},
"externalExtension": {
"message": "Εξωτερική επέκταση"
@@ -1585,9 +1571,6 @@
"message": "Η εισαγωγή αρχείων δεν λειτουργεί; Κάντε κλικ εδώ!",
"description": "Helps user import their account from a JSON file"
},
- "fileTooBig": {
- "message": "Το υποβαλλόμενο αρχείο είναι πολύ μεγάλο."
- },
"flaskWelcomeUninstall": {
"message": "θα πρέπει να απεγκαταστήσετε αυτή την επέκταση",
"description": "This request is shown on the Flask Welcome screen. It is intended for non-developers, and will be bolded."
@@ -3203,14 +3186,6 @@
"message": "Επιτρέψτε στο snap να χρησιμοποιεί επιχειρηματικά μοντέλα για την εκτέλεση κώδικα σε συγκεκριμένες χρονικές στιγμές κατά τη διάρκεια του κύκλου ζωής του.",
"description": "An extended description for the `endowment:lifecycle-hooks` permission"
},
- "permission_longRunning": {
- "message": "Εκτέλεση επ' αόριστον.",
- "description": "The description for the `endowment:long-running` permission"
- },
- "permission_longRunningDescription": {
- "message": "Επιτρέψτε στο snap να εκτελείται επ' αόριστον, ενώ, για παράδειγμα, επεξεργάζεται μεγάλες ποσότητες δεδομένων.",
- "description": "An extended description for the `endowment:long-running` permission"
- },
"permission_manageAccounts": {
"message": "Προσθήκη και έλεγχος λογαριασμών στο Ethereum",
"description": "The description for `snap_manageAccounts` permission"
diff --git a/app/_locales/en/messages.json b/app/_locales/en/messages.json
index 6eeddd86044e..780889ab8ace 100644
--- a/app/_locales/en/messages.json
+++ b/app/_locales/en/messages.json
@@ -153,6 +153,9 @@
"accountSelectionRequired": {
"message": "You need to select an account!"
},
+ "accountsConnected": {
+ "message": "Accounts connected"
+ },
"active": {
"message": "Active"
},
@@ -243,6 +246,9 @@
"addIPFSGateway": {
"message": "Add your preferred IPFS gateway"
},
+ "addImportAccount": {
+ "message": "Add account or hardware wallet"
+ },
"addMemo": {
"message": "Add memo"
},
@@ -256,6 +262,9 @@
"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 account"
+ },
"addNewToken": {
"message": "Add new token"
},
@@ -268,6 +277,12 @@
"addSnapAccountModalDescription": {
"message": "Discover options to keep your account secure with MetaMask Snaps"
},
+ "addSnapAccountToggle": {
+ "message": "Enable \"Add Snap account\""
+ },
+ "addSnapAccountsDescription": {
+ "message": "Turning on this feature will give you the option to add a Snap account right from your account list. If you install a Snap account, remember that it is a third-party service."
+ },
"addSuggestedNFTs": {
"message": "Add suggested NFTs"
},
@@ -620,16 +635,19 @@
"buy": {
"message": "Buy"
},
+ "buyAndSell": {
+ "message": "Buy & Sell"
+ },
+ "buyAndSellDescription": {
+ "message": "Buy crypto or sell your crypto for cash"
+ },
+ "buyAndSellDisabled": {
+ "message": "Buy & Sell is not available in this network"
+ },
"buyAsset": {
"message": "Buy $1",
"description": "$1 is the ticker symbol of a an asset the user is being prompted to purchase"
},
- "buyDescription": {
- "message": "Hold up your crypto and earn potential profits"
- },
- "buyDisabled": {
- "message": "Buy is not available in this network"
- },
"buyMoreAsset": {
"message": "Buy more $1",
"description": "$1 is the ticker symbol of a an asset the user is being prompted to purchase"
@@ -717,6 +735,10 @@
"coingecko": {
"message": "CoinGecko"
},
+ "comboNoOptions": {
+ "message": "No options found",
+ "description": "Default text shown in the combo field dropdown if no options."
+ },
"configureSnapPopupDescription": {
"message": "You're now leaving MetaMask to configure this snap."
},
@@ -831,6 +853,9 @@
"message": "$1 is not connected to any sites.",
"description": "$1 is the account name"
},
+ "connectedSnapAndNoAccountDescription": {
+ "message": "MetaMask is connected to this site, but no accounts are connected yet"
+ },
"connecting": {
"message": "Connecting..."
},
@@ -947,6 +972,12 @@
"createPassword": {
"message": "Create password"
},
+ "createSnapAccountDescription": {
+ "message": "$1 wants to add a new Snap account to your wallet"
+ },
+ "createSnapAccountTitle": {
+ "message": "Create Snap account"
+ },
"cryptoCompare": {
"message": "CryptoCompare"
},
@@ -1295,6 +1326,10 @@
"disconnectThisAccount": {
"message": "Disconnect this account"
},
+ "discoverSnaps": {
+ "message": "Discover Snaps",
+ "description": "Text that links to the Snaps website. Displayed in a banner on Snaps list page in settings."
+ },
"dismiss": {
"message": "Dismiss"
},
@@ -1426,9 +1461,6 @@
"enableAutoDetect": {
"message": " Enable autodetect"
},
- "enableForAllNetworks": {
- "message": "Enable for all networks"
- },
"enableFromSettings": {
"message": " Enable it from Settings."
},
@@ -1580,11 +1612,9 @@
"experimental": {
"message": "Experimental"
},
- "exploreMetaMaskSnaps": {
- "message": "Explore MetaMask Snaps"
- },
"extendWalletWithSnaps": {
- "message": "Customize your wallet experience."
+ "message": "Explore community-built Snaps to customize your web3 experience",
+ "description": "Banner description displayed on Snaps list page in Settings when less than 6 Snaps is installed."
},
"externalExtension": {
"message": "External extension"
@@ -1615,9 +1645,6 @@
"message": "File import not working? Click here!",
"description": "Helps user import their account from a JSON file"
},
- "fileTooBig": {
- "message": "The dropped file is too big."
- },
"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."
@@ -2374,6 +2401,38 @@
"name": {
"message": "Name"
},
+ "nameAddressLabel": {
+ "message": "Address",
+ "description": "Label above address field in name component modal."
+ },
+ "nameInstructionsNew": {
+ "message": "You are interacting with an unknown contract address. If you trust this author, set a personal display name to identify it going forward.",
+ "description": "Instruction text in name component modal when value is not recognised."
+ },
+ "nameInstructionsSaved": {
+ "message": "Interactions with this address will always be identified using this personal display name.",
+ "description": "Instruction text in name component modal when value is saved."
+ },
+ "nameLabel": {
+ "message": "Display name",
+ "description": "Label above name input field in name component modal."
+ },
+ "nameModalTitleNew": {
+ "message": "Unknown address",
+ "description": "Title of the modal created by the name component when value is not recognised."
+ },
+ "nameModalTitleSaved": {
+ "message": "Saved address",
+ "description": "Title of the modal created by the name component when value is saved."
+ },
+ "nameNoProposedNames": {
+ "message": "No proposed names found",
+ "description": "Text shown in the proposed name dropdown if none found."
+ },
+ "nameSetPlaceholder": {
+ "message": "Set a personal display name...",
+ "description": "Placeholder text for name input field in name component modal."
+ },
"nativeToken": {
"message": "The native token on this network is $1. It is the token used for gas fees.",
"description": "$1 represents the name of the native token on the current network"
@@ -2544,9 +2603,15 @@
"message": "This token is an NFT. Add on the $1",
"description": "$1 is a clickable link with text defined by the 'importNFTPage' key"
},
+ "nftAlreadyAdded": {
+ "message": "NFT has already been added."
+ },
"nftDisclaimer": {
"message": "Disclaimer: MetaMask pulls the media file from the source url. This url sometimes is changed by the marketplace the NFT was minted on."
},
+ "nftLearnMore": {
+ "message": "Learn more about NFTs"
+ },
"nftOptions": {
"message": "NFT Options"
},
@@ -2898,6 +2963,15 @@
"notifications9Title": {
"message": "👓 We are making transactions easier to read."
},
+ "notificationsBuySellActionText": {
+ "message": "Try it on MetaMask Portfolio"
+ },
+ "notificationsBuySellDescription": {
+ "message": "Introducing the ‘Buy & Sell’ button, giving you easy access to our latest feature: Sell. When clicked, you’ll be redirected to MetaMask Portfolio, where you’ll be able to convert your crypto to cash in a flash. Initially available for ETH on mainnet in the US (state restrictions apply), UK, and parts of Europe."
+ },
+ "notificationsBuySellTitle": {
+ "message": "Sell your crypto, get cash"
+ },
"notificationsDropLedgerFirefoxDescription": {
"message": "Firefox no longer supports U2F, so Ledger won't work with MetaMask on Firefox. Try MetaMask on Google Chrome instead.",
"description": "Description of a notification in the 'See What's New' popup. Describes that ledger will not longer be supported for firefox users and they should use MetaMask on chrome for ledger support instead."
@@ -3260,18 +3334,14 @@
"message": "Allow the snap to use lifecycle hooks to run code at specific times during its lifecycle.",
"description": "An extended description for the `endowment:lifecycle-hooks` permission"
},
- "permission_longRunning": {
- "message": "Run indefinitely.",
- "description": "The description for the `endowment:long-running` permission"
- },
- "permission_longRunningDescription": {
- "message": "Allow the snap to run indefinitely while, for example, processing large amounts of data.",
- "description": "An extended description for the `endowment:long-running` permission"
- },
"permission_manageAccounts": {
"message": "Add and control Ethereum accounts",
"description": "The description for `snap_manageAccounts` permission"
},
+ "permission_manageAccountsDescription": {
+ "message": "Allow this Snap to add or remove Ethereum accounts, then transact and sign with these accounts.",
+ "description": "An extended description for the `snap_manageAccounts` permission"
+ },
"permission_manageBip32Keys": {
"message": "Control your accounts and assets under $1 ($2).",
"description": "The description for the `snap_getBip32Entropy` permission. $1 is a derivation path, e.g. 'm/44'/0'/0''. $2 is the elliptic curve name, e.g. 'secp256k1'."
@@ -3535,7 +3605,16 @@
"message": "NFT was successfully removed!"
},
"removeSnap": {
- "message": "Remove snap"
+ "message": "Remove Snap"
+ },
+ "removeSnapAccountBannerDescription": {
+ "message": "Be sure you can access this account on your own before removing it"
+ },
+ "removeSnapAccountDescription": {
+ "message": "$1 wants to remove this account from MetaMask:"
+ },
+ "removeSnapAccountTitle": {
+ "message": "Remove account"
},
"removeSnapConfirmation": {
"message": "Are you sure you want to remove $1?",
@@ -3872,6 +3951,9 @@
"message": "Warning: you are about to send to a token contract which could result in a loss of funds. $1",
"description": "$1 is a clickable link with text defined by the 'learnMoreUpperCase' key. The link will open to a support article regarding the known contract address warning"
},
+ "sendingZeroAmount": {
+ "message": "You are sending 0 $1."
+ },
"sepolia": {
"message": "Sepolia test network"
},
@@ -3991,6 +4073,18 @@
"smartSwapsSubDescription": {
"message": "* Smart Swaps will attempt to submit your transaction privately, multiple times. If all attempts fail, the transaction will be broadcast publicly to ensure your Swap successfully goes through."
},
+ "snapAccountCreated": {
+ "message": "Your account is ready!"
+ },
+ "snapAccountRemoved": {
+ "message": "Account removed"
+ },
+ "snapAccounts": {
+ "message": "Snap accounts"
+ },
+ "snapAccountsDescription": {
+ "message": "Accounts controlled by third-party Snaps."
+ },
"snapConfigure": {
"message": "Configure"
},
@@ -4120,6 +4214,9 @@
"snaps": {
"message": "Snaps"
},
+ "snapsConnected": {
+ "message": "Snaps connected"
+ },
"snapsInsightLoading": {
"message": "Loading transaction insight..."
},
@@ -4141,6 +4238,9 @@
"message": "Consensys has no access to information you share with Third Party Services.",
"description": "Third part of a message in popup modal displayed when installing a snap for the first time."
},
+ "snapsSettings": {
+ "message": "Snap settings"
+ },
"snapsSettingsDescription": {
"message": "Manage your Snaps"
},
@@ -5304,6 +5404,16 @@
"usePhishingDetectionDescription": {
"message": "Display a warning for phishing domains targeting Ethereum users"
},
+ "useSafeChainsListValidation": {
+ "message": "Network details check"
+ },
+ "useSafeChainsListValidationDescription": {
+ "message": "MetaMask uses a third-party service called $1 to show accurate and standardized network details. This reduces your chances of connecting to malicious or incorrect network. When using this feature, your IP address is exposed to chainid.network."
+ },
+ "useSafeChainsListValidationWebsite": {
+ "message": "chainid.network",
+ "description": "useSafeChainsListValidationWebsite is separated from the rest of the text so that we can bold the third party service name in the middle of them"
+ },
"useSiteSuggestion": {
"message": "Use site suggestion"
},
diff --git a/app/_locales/es/messages.json b/app/_locales/es/messages.json
index 69914a0c3d90..7f9b105957b4 100644
--- a/app/_locales/es/messages.json
+++ b/app/_locales/es/messages.json
@@ -611,19 +611,10 @@
"busy": {
"message": "Ocupado"
},
- "buy": {
- "message": "Comprar"
- },
"buyAsset": {
"message": "Comprar $1",
"description": "$1 is the ticker symbol of a an asset the user is being prompted to purchase"
},
- "buyDescription": {
- "message": "Guarde sus criptomonedas y obtenga ganancias potenciales"
- },
- "buyDisabled": {
- "message": "Comprar no está disponible en esta red"
- },
"buyMoreAsset": {
"message": "Comprar más $1",
"description": "$1 is the ticker symbol of a an asset the user is being prompted to purchase"
@@ -1408,9 +1399,6 @@
"enableAutoDetect": {
"message": " Activar autodetección"
},
- "enableForAllNetworks": {
- "message": "Habilitar para todas las redes"
- },
"enableFromSettings": {
"message": " Actívela en Configuración."
},
@@ -1550,11 +1538,9 @@
"experimental": {
"message": "Experimental"
},
- "exploreMetaMaskSnaps": {
- "message": "Explore MetaMask Snaps"
- },
"extendWalletWithSnaps": {
- "message": "Amplíe la experiencia de uso de su monedero."
+ "message": "Amplíe la experiencia de uso de su monedero.",
+ "description": "Banner description displayed on Snaps list page in Settings when less than 6 Snaps is installed."
},
"externalExtension": {
"message": "Extensión externa"
@@ -1585,9 +1571,6 @@
"message": "¿No funciona la importación del archivo? Haga clic aquí.",
"description": "Helps user import their account from a JSON file"
},
- "fileTooBig": {
- "message": "El archivo arrastrado es demasiado grande."
- },
"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."
@@ -3203,14 +3186,6 @@
"message": "Permita que el snap use ganchos de ciclo de vida para ejecutar código en momentos específicos durante su ciclo de vida.",
"description": "An extended description for the `endowment:lifecycle-hooks` permission"
},
- "permission_longRunning": {
- "message": "Ejecutar indefinidamente.",
- "description": "The description for the `endowment:long-running` permission"
- },
- "permission_longRunningDescription": {
- "message": "Permita que el snap se ejecute indefinidamente mientras, por ejemplo, procesa grandes cantidades de datos.",
- "description": "An extended description for the `endowment:long-running` permission"
- },
"permission_manageAccounts": {
"message": "Agregar y controlar cuentas de Ethereum",
"description": "The description for `snap_manageAccounts` permission"
diff --git a/app/_locales/es_419/messages.json b/app/_locales/es_419/messages.json
index d148117d7e48..77d571d76648 100644
--- a/app/_locales/es_419/messages.json
+++ b/app/_locales/es_419/messages.json
@@ -299,9 +299,6 @@
"busy": {
"message": "Ocupado"
},
- "buy": {
- "message": "Comprar"
- },
"bytes": {
"message": "Bytes"
},
diff --git a/app/_locales/fr/messages.json b/app/_locales/fr/messages.json
index 423f49b172b1..33cca3bfc540 100644
--- a/app/_locales/fr/messages.json
+++ b/app/_locales/fr/messages.json
@@ -611,19 +611,10 @@
"busy": {
"message": "Occupé"
},
- "buy": {
- "message": "Acheter"
- },
"buyAsset": {
"message": "Acheter $1",
"description": "$1 is the ticker symbol of a an asset the user is being prompted to purchase"
},
- "buyDescription": {
- "message": "Conservez vos crypto-actifs et dégagez des bénéfices potentiels"
- },
- "buyDisabled": {
- "message": "Impossible d’effectuer un achat sur ce réseau"
- },
"buyMoreAsset": {
"message": "Acheter plus de $1",
"description": "$1 is the ticker symbol of a an asset the user is being prompted to purchase"
@@ -1408,9 +1399,6 @@
"enableAutoDetect": {
"message": " Activer la détection automatique"
},
- "enableForAllNetworks": {
- "message": "Activer pour tous les réseaux"
- },
"enableFromSettings": {
"message": " Activez-la depuis les Paramètres."
},
@@ -1550,11 +1538,9 @@
"experimental": {
"message": "Expérimental"
},
- "exploreMetaMaskSnaps": {
- "message": "Explorer les Snaps MetaMask"
- },
"extendWalletWithSnaps": {
- "message": "Personnalisez votre expérience de portefeuille."
+ "message": "Personnalisez votre expérience de portefeuille.",
+ "description": "Banner description displayed on Snaps list page in Settings when less than 6 Snaps is installed."
},
"externalExtension": {
"message": "Extension externe"
@@ -1585,9 +1571,6 @@
"message": "L’importation de fichier ne fonctionne pas ? Cliquez ici !",
"description": "Helps user import their account from a JSON file"
},
- "fileTooBig": {
- "message": "Le fichier déconnecté est trop volumineux."
- },
"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."
@@ -3203,14 +3186,6 @@
"message": "Autorisez le Snap à utiliser des hooks de cycle de vie pour exécuter du code à des moments spécifiques de son cycle de vie.",
"description": "An extended description for the `endowment:lifecycle-hooks` permission"
},
- "permission_longRunning": {
- "message": "Fonctionner indéfiniment.",
- "description": "The description for the `endowment:long-running` permission"
- },
- "permission_longRunningDescription": {
- "message": "Autoriser l’exécution illimitée du snap pendant, par exemple, le traitement de volumes importants de données.",
- "description": "An extended description for the `endowment:long-running` permission"
- },
"permission_manageAccounts": {
"message": "Ajouter et gérer des comptes Ethereum",
"description": "The description for `snap_manageAccounts` permission"
diff --git a/app/_locales/hi/messages.json b/app/_locales/hi/messages.json
index b1cbf1c5464c..658e6bb42e33 100644
--- a/app/_locales/hi/messages.json
+++ b/app/_locales/hi/messages.json
@@ -611,19 +611,10 @@
"busy": {
"message": "बिज़ी"
},
- "buy": {
- "message": "खरीदें"
- },
"buyAsset": {
"message": "$1 खरीदें",
"description": "$1 is the ticker symbol of a an asset the user is being prompted to purchase"
},
- "buyDescription": {
- "message": "अपने क्रिप्टो को रोक कर रखें और शानदार लाभ कमाएं"
- },
- "buyDisabled": {
- "message": "इस नेटवर्क में खरीदारी उपलब्ध नहीं है"
- },
"buyMoreAsset": {
"message": "ज्यादा $1 खरीदें",
"description": "$1 is the ticker symbol of a an asset the user is being prompted to purchase"
@@ -1408,9 +1399,6 @@
"enableAutoDetect": {
"message": " ऑटो डिटेक्ट इनेबल करें"
},
- "enableForAllNetworks": {
- "message": "सभी नेटवर्क पर इनेबल करें"
- },
"enableFromSettings": {
"message": " इसे सेटिंग्स से इनेबल करें।"
},
@@ -1550,11 +1538,9 @@
"experimental": {
"message": "एक्सपेरिमेंटल"
},
- "exploreMetaMaskSnaps": {
- "message": "MetaMask Snaps को एक्सप्लोर करें"
- },
"extendWalletWithSnaps": {
- "message": "वॉलेट एक्सपीरियंस को कस्टमाइज़ करें।"
+ "message": "वॉलेट एक्सपीरियंस को कस्टमाइज़ करें।",
+ "description": "Banner description displayed on Snaps list page in Settings when less than 6 Snaps is installed."
},
"externalExtension": {
"message": "बाहरी एक्स्टेन्शन"
@@ -1585,9 +1571,6 @@
"message": "फाइल इम्पोर्ट काम नहीं कर रहा है? यहां क्लिक करें!",
"description": "Helps user import their account from a JSON file"
},
- "fileTooBig": {
- "message": "ड्रॉप की गई फाइल बहुत बड़ी है।"
- },
"flaskWelcomeUninstall": {
"message": "आपको इस एक्सटेन्शन को अनइंस्टाल करना चाहिए",
"description": "This request is shown on the Flask Welcome screen. It is intended for non-developers, and will be bolded."
@@ -3203,14 +3186,6 @@
"message": "Snap को उसके लाइफसाइकल के दौरान खास समयों पर कोड चलाने के लिए लाइफसाइकल हुक का इस्तेमाल करने की अनुमति दें।",
"description": "An extended description for the `endowment:lifecycle-hooks` permission"
},
- "permission_longRunning": {
- "message": "अनिश्चित काल तक चलाएं।",
- "description": "The description for the `endowment:long-running` permission"
- },
- "permission_longRunningDescription": {
- "message": "उदाहरण के लिए, बड़ी मात्रा में डेटा प्रॉसेस करते समय Snap को अनिश्चित काल तक चलने दें।",
- "description": "An extended description for the `endowment:long-running` permission"
- },
"permission_manageAccounts": {
"message": "Ethereum अकाउंट जोड़ें और नियंत्रित करें",
"description": "The description for `snap_manageAccounts` permission"
diff --git a/app/_locales/id/messages.json b/app/_locales/id/messages.json
index beda6288f89f..4c4d238492bf 100644
--- a/app/_locales/id/messages.json
+++ b/app/_locales/id/messages.json
@@ -611,19 +611,10 @@
"busy": {
"message": "Sibuk"
},
- "buy": {
- "message": "Beli"
- },
"buyAsset": {
"message": "Beli $1",
"description": "$1 is the ticker symbol of a an asset the user is being prompted to purchase"
},
- "buyDescription": {
- "message": "Pertahankan kripto Anda dan dapatkan potensi keuntungan"
- },
- "buyDisabled": {
- "message": "Beli tidak tersedia di jaringan ini"
- },
"buyMoreAsset": {
"message": "Beli lebih banyak $1",
"description": "$1 is the ticker symbol of a an asset the user is being prompted to purchase"
@@ -1408,9 +1399,6 @@
"enableAutoDetect": {
"message": " Aktifkan deteksi otomatis"
},
- "enableForAllNetworks": {
- "message": "Aktifkan untuk semua jaringan"
- },
"enableFromSettings": {
"message": " Aktifkan dari Pengaturan."
},
@@ -1550,11 +1538,9 @@
"experimental": {
"message": "Eksperimental"
},
- "exploreMetaMaskSnaps": {
- "message": "Jelajahi MetaMask Snaps"
- },
"extendWalletWithSnaps": {
- "message": "Perluas pengalaman dompet."
+ "message": "Perluas pengalaman dompet.",
+ "description": "Banner description displayed on Snaps list page in Settings when less than 6 Snaps is installed."
},
"externalExtension": {
"message": "Ekstensi eksternal"
@@ -1585,9 +1571,6 @@
"message": "Impor file tidak bekerja? Klik di sini!",
"description": "Helps user import their account from a JSON file"
},
- "fileTooBig": {
- "message": "File yang didrop terlalu besar."
- },
"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."
@@ -3203,14 +3186,6 @@
"message": "Izinkan snap menggunakan lifecycle hook untuk menjalankan kode pada waktu tertentu selama siklus hidupnya.",
"description": "An extended description for the `endowment:lifecycle-hooks` permission"
},
- "permission_longRunning": {
- "message": "Operasikan sepanjang waktu.",
- "description": "The description for the `endowment:long-running` permission"
- },
- "permission_longRunningDescription": {
- "message": "Izinkan snap beroperasi sepanjang waktu saat, sebagai contoh, memproses data dalam jumlah besar.",
- "description": "An extended description for the `endowment:long-running` permission"
- },
"permission_manageAccounts": {
"message": "Tambah dan kontrol akun Ethereum",
"description": "The description for `snap_manageAccounts` permission"
diff --git a/app/_locales/it/messages.json b/app/_locales/it/messages.json
index 1748e0659637..5a7106a79aaf 100644
--- a/app/_locales/it/messages.json
+++ b/app/_locales/it/messages.json
@@ -380,9 +380,6 @@
"busy": {
"message": "Occupato"
},
- "buy": {
- "message": "Compra"
- },
"buyAsset": {
"message": "Compra $1",
"description": "$1 is the ticker symbol of a an asset the user is being prompted to purchase"
diff --git a/app/_locales/ja/messages.json b/app/_locales/ja/messages.json
index ec33d33bef47..267ab31b4fdb 100644
--- a/app/_locales/ja/messages.json
+++ b/app/_locales/ja/messages.json
@@ -611,19 +611,10 @@
"busy": {
"message": "ビジー状態"
},
- "buy": {
- "message": "購入"
- },
"buyAsset": {
"message": "$1を購入",
"description": "$1 is the ticker symbol of a an asset the user is being prompted to purchase"
},
- "buyDescription": {
- "message": "仮想通貨を保持して利益を得ます"
- },
- "buyDisabled": {
- "message": "このネットワークでは購入できません"
- },
"buyMoreAsset": {
"message": "$1を追加購入",
"description": "$1 is the ticker symbol of a an asset the user is being prompted to purchase"
@@ -1408,9 +1399,6 @@
"enableAutoDetect": {
"message": " 自動検出を有効にする"
},
- "enableForAllNetworks": {
- "message": "すべてのネットワークで有効にする"
- },
"enableFromSettings": {
"message": " 設定で有効にします。"
},
@@ -1550,11 +1538,9 @@
"experimental": {
"message": "試験運用"
},
- "exploreMetaMaskSnaps": {
- "message": "MetaMask Snapsを閲覧"
- },
"extendWalletWithSnaps": {
- "message": "ウォレットのユーザー体験をカスタマイズします。"
+ "message": "ウォレットのユーザー体験をカスタマイズします。",
+ "description": "Banner description displayed on Snaps list page in Settings when less than 6 Snaps is installed."
},
"externalExtension": {
"message": "外部拡張機能"
@@ -1585,9 +1571,6 @@
"message": "ファイルのインポートが機能していない場合、ここをクリックしてください!",
"description": "Helps user import their account from a JSON file"
},
- "fileTooBig": {
- "message": "ドロップされたファイルが大きすぎます。"
- },
"flaskWelcomeUninstall": {
"message": "この拡張機能はアンインストールしてください",
"description": "This request is shown on the Flask Welcome screen. It is intended for non-developers, and will be bolded."
@@ -3203,14 +3186,6 @@
"message": "snapがライフサイクルフックを使用して、ライフサイクルの特定のタイミングでコードを実行することを許可します。",
"description": "An extended description for the `endowment:lifecycle-hooks` permission"
},
- "permission_longRunning": {
- "message": "無期限で実行。",
- "description": "The description for the `endowment:long-running` permission"
- },
- "permission_longRunningDescription": {
- "message": "大きなデータの処理中など、snapが無期限で実行されることを許可します。",
- "description": "An extended description for the `endowment:long-running` permission"
- },
"permission_manageAccounts": {
"message": "イーサリアムアカウントを追加して管理します",
"description": "The description for `snap_manageAccounts` permission"
diff --git a/app/_locales/ko/messages.json b/app/_locales/ko/messages.json
index f98405e900d7..6e6e5f1af2ce 100644
--- a/app/_locales/ko/messages.json
+++ b/app/_locales/ko/messages.json
@@ -611,19 +611,10 @@
"busy": {
"message": "바쁨"
},
- "buy": {
- "message": "구매"
- },
"buyAsset": {
"message": "$1 구매",
"description": "$1 is the ticker symbol of a an asset the user is being prompted to purchase"
},
- "buyDescription": {
- "message": "암호화폐를 보유하고 잠재적인 수익을 얻으세요"
- },
- "buyDisabled": {
- "message": "이 네트워크에서는 매수할 수 없습니다"
- },
"buyMoreAsset": {
"message": "$1 추가 구매",
"description": "$1 is the ticker symbol of a an asset the user is being prompted to purchase"
@@ -1408,9 +1399,6 @@
"enableAutoDetect": {
"message": " 자동 감지 활성화"
},
- "enableForAllNetworks": {
- "message": "모든 네트워크에 활성화"
- },
"enableFromSettings": {
"message": " 설정에서 이 기능을 활성화합니다."
},
@@ -1550,11 +1538,9 @@
"experimental": {
"message": "실험적"
},
- "exploreMetaMaskSnaps": {
- "message": "MetaMask 스냅 탐색"
- },
"extendWalletWithSnaps": {
- "message": "지갑 경험을 개인 맞춤하세요."
+ "message": "지갑 경험을 개인 맞춤하세요.",
+ "description": "Banner description displayed on Snaps list page in Settings when less than 6 Snaps is installed."
},
"externalExtension": {
"message": "외부 확장"
@@ -1585,9 +1571,6 @@
"message": "파일 가져오기가 작동하지 않나요? 여기를 클릭하세요.",
"description": "Helps user import their account from a JSON file"
},
- "fileTooBig": {
- "message": "드롭한 파일 크기가 너무 큽니다."
- },
"flaskWelcomeUninstall": {
"message": "이 확장 프로그램을 삭제해야 합니다",
"description": "This request is shown on the Flask Welcome screen. It is intended for non-developers, and will be bolded."
@@ -3203,14 +3186,6 @@
"message": "스냅으로 라이프사이클 훅을 사용하도록 허용하면 라이프사이클 동안 코드를 특정 횟수만큼 실행합니다.",
"description": "An extended description for the `endowment:lifecycle-hooks` permission"
},
- "permission_longRunning": {
- "message": "무기한 운용됩니다.",
- "description": "The description for the `endowment:long-running` permission"
- },
- "permission_longRunningDescription": {
- "message": "예를 들어 많은 양의 데이터를 처리하는 동안 스냅이 무기한 실행되도록 허용합니다.",
- "description": "An extended description for the `endowment:long-running` permission"
- },
"permission_manageAccounts": {
"message": "이더리움 계정 추가 및 제어",
"description": "The description for `snap_manageAccounts` permission"
diff --git a/app/_locales/ph/messages.json b/app/_locales/ph/messages.json
index c51311aabafe..50002410ea2a 100644
--- a/app/_locales/ph/messages.json
+++ b/app/_locales/ph/messages.json
@@ -195,9 +195,6 @@
"buildContactList": {
"message": "Buuin ang iyong listahan ng contact"
},
- "buy": {
- "message": "Bumili"
- },
"bytes": {
"message": "Bytes"
},
diff --git a/app/_locales/pt/messages.json b/app/_locales/pt/messages.json
index 92ff97f1b260..908dcf4cf6c9 100644
--- a/app/_locales/pt/messages.json
+++ b/app/_locales/pt/messages.json
@@ -611,19 +611,10 @@
"busy": {
"message": "Ocupado"
},
- "buy": {
- "message": "Comprar"
- },
"buyAsset": {
"message": "Comprar $1",
"description": "$1 is the ticker symbol of a an asset the user is being prompted to purchase"
},
- "buyDescription": {
- "message": "Segure seus criptoativos e ganhe lucros em potencial"
- },
- "buyDisabled": {
- "message": "A compra não está disponível nesta rede"
- },
"buyMoreAsset": {
"message": "Comprar mais $1",
"description": "$1 is the ticker symbol of a an asset the user is being prompted to purchase"
@@ -1408,9 +1399,6 @@
"enableAutoDetect": {
"message": " Ativar detecção automática"
},
- "enableForAllNetworks": {
- "message": "Ativar para todas as redes"
- },
"enableFromSettings": {
"message": " Ative nas Configurações."
},
@@ -1550,11 +1538,9 @@
"experimental": {
"message": "Experimental"
},
- "exploreMetaMaskSnaps": {
- "message": "Explorar os snaps da MetaMask"
- },
"extendWalletWithSnaps": {
- "message": "Personalize sua experiência com a carteira."
+ "message": "Personalize sua experiência com a carteira.",
+ "description": "Banner description displayed on Snaps list page in Settings when less than 6 Snaps is installed."
},
"externalExtension": {
"message": "Extensão externa"
@@ -1585,9 +1571,6 @@
"message": "A importação de arquivo não está funcionando? Clique aqui!",
"description": "Helps user import their account from a JSON file"
},
- "fileTooBig": {
- "message": "O arquivo inserido é grande demais."
- },
"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."
@@ -3203,14 +3186,6 @@
"message": "Permitir que o snap use ganchos de ciclo de vida para executar códigos em momentos específicos durante seu ciclo de vida.",
"description": "An extended description for the `endowment:lifecycle-hooks` permission"
},
- "permission_longRunning": {
- "message": "Executar indefinidamente.",
- "description": "The description for the `endowment:long-running` permission"
- },
- "permission_longRunningDescription": {
- "message": "Permitir que o snap seja executado indefinidamente, por exemplo, enquanto processa grandes volumes de dados.",
- "description": "An extended description for the `endowment:long-running` permission"
- },
"permission_manageAccounts": {
"message": "Adicionar e controlar contas Ethereum",
"description": "The description for `snap_manageAccounts` permission"
diff --git a/app/_locales/pt_BR/messages.json b/app/_locales/pt_BR/messages.json
index c51166be26bd..f8db416d5650 100644
--- a/app/_locales/pt_BR/messages.json
+++ b/app/_locales/pt_BR/messages.json
@@ -299,9 +299,6 @@
"busy": {
"message": "Ocupado"
},
- "buy": {
- "message": "Comprar"
- },
"bytes": {
"message": "Bytes"
},
diff --git a/app/_locales/ru/messages.json b/app/_locales/ru/messages.json
index 7becb2d165ab..a43db33c1199 100644
--- a/app/_locales/ru/messages.json
+++ b/app/_locales/ru/messages.json
@@ -611,19 +611,10 @@
"busy": {
"message": "Занят"
},
- "buy": {
- "message": "Купить"
- },
"buyAsset": {
"message": "Купить $1",
"description": "$1 is the ticker symbol of a an asset the user is being prompted to purchase"
},
- "buyDescription": {
- "message": "Держите свою криптовалюту и зарабатывайте потенциально прибыль"
- },
- "buyDisabled": {
- "message": "В этой сети недоступна покупка"
- },
"buyMoreAsset": {
"message": "Купить еще $1",
"description": "$1 is the ticker symbol of a an asset the user is being prompted to purchase"
@@ -1408,9 +1399,6 @@
"enableAutoDetect": {
"message": " Включить автоопределение"
},
- "enableForAllNetworks": {
- "message": "Включить для всех сетей"
- },
"enableFromSettings": {
"message": " Включите его в Настройках."
},
@@ -1550,11 +1538,9 @@
"experimental": {
"message": "Экспериментальные"
},
- "exploreMetaMaskSnaps": {
- "message": "Обзор MetaMask Snaps"
- },
"extendWalletWithSnaps": {
- "message": "Настройте кошелек под себя."
+ "message": "Настройте кошелек под себя.",
+ "description": "Banner description displayed on Snaps list page in Settings when less than 6 Snaps is installed."
},
"externalExtension": {
"message": "Внешнее расширение"
@@ -1585,9 +1571,6 @@
"message": "Импорт файлов не работает? Нажмите здесь!",
"description": "Helps user import their account from a JSON file"
},
- "fileTooBig": {
- "message": "Добавленный файл слишком велик."
- },
"flaskWelcomeUninstall": {
"message": "вам нужно должны удалить это расширение",
"description": "This request is shown on the Flask Welcome screen. It is intended for non-developers, and will be bolded."
@@ -3203,14 +3186,6 @@
"message": "Разрешите snap использовать обработчики жизненного цикла для запуска кода в определенное время в течение его жизненного цикла.",
"description": "An extended description for the `endowment:lifecycle-hooks` permission"
},
- "permission_longRunning": {
- "message": "Выполнять бесконечно.",
- "description": "The description for the `endowment:long-running` permission"
- },
- "permission_longRunningDescription": {
- "message": "Разрешите snap работать бесконечно, например, при обработке больших объемов данных.",
- "description": "An extended description for the `endowment:long-running` permission"
- },
"permission_manageAccounts": {
"message": "Добавляйте счета Ethereum и управляйте ими",
"description": "The description for `snap_manageAccounts` permission"
diff --git a/app/_locales/tl/messages.json b/app/_locales/tl/messages.json
index 45135ff62f6d..014e1a06c385 100644
--- a/app/_locales/tl/messages.json
+++ b/app/_locales/tl/messages.json
@@ -611,19 +611,10 @@
"busy": {
"message": "Busy"
},
- "buy": {
- "message": "Bumili"
- },
"buyAsset": {
"message": "Bumili ng $1",
"description": "$1 is the ticker symbol of a an asset the user is being prompted to purchase"
},
- "buyDescription": {
- "message": "I-hold ang iyong crypto at makaipon ng potensyal na tubo"
- },
- "buyDisabled": {
- "message": "Hindi available ang pagbili sa network na ito"
- },
"buyMoreAsset": {
"message": "Bumili pa ng $1",
"description": "$1 is the ticker symbol of a an asset the user is being prompted to purchase"
@@ -1408,9 +1399,6 @@
"enableAutoDetect": {
"message": " Paganahin ang autodetect"
},
- "enableForAllNetworks": {
- "message": "Paganahin para sa lahat ng network"
- },
"enableFromSettings": {
"message": " Paganahin ito mula sa Mga Setting."
},
@@ -1550,11 +1538,9 @@
"experimental": {
"message": "Eksperimental"
},
- "exploreMetaMaskSnaps": {
- "message": "Galugarin ang MetaMask Snaps"
- },
"extendWalletWithSnaps": {
- "message": "I-customize ang iyong karanasan sa wallet."
+ "message": "I-customize ang iyong karanasan sa wallet.",
+ "description": "Banner description displayed on Snaps list page in Settings when less than 6 Snaps is installed."
},
"externalExtension": {
"message": "External Extension"
@@ -1585,9 +1571,6 @@
"message": "Hindi gumagana ang pag-import ng file? Mag-click dito!",
"description": "Helps user import their account from a JSON file"
},
- "fileTooBig": {
- "message": "Napakalaki ng na-drop na file."
- },
"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."
@@ -3203,14 +3186,6 @@
"message": "Pinapayagan ang snap na gumamit ng mga lifecycle hook para paganahin ang code sa mga espisipikong panahon sa oras ng lifecycle nito.",
"description": "An extended description for the `endowment:lifecycle-hooks` permission"
},
- "permission_longRunning": {
- "message": "Patakbuhin ng walang katapusan.",
- "description": "The description for the `endowment:long-running` permission"
- },
- "permission_longRunningDescription": {
- "message": "Payagan ang snap para gumana nang walang limitasyon sa tagal habang, halimbawa, nagpoproseso ng maraming data.",
- "description": "An extended description for the `endowment:long-running` permission"
- },
"permission_manageAccounts": {
"message": "Magdagdag at kontrolin ang mga Ethereum account",
"description": "The description for `snap_manageAccounts` permission"
diff --git a/app/_locales/tr/messages.json b/app/_locales/tr/messages.json
index 0543827c83c4..1ceb3c54d670 100644
--- a/app/_locales/tr/messages.json
+++ b/app/_locales/tr/messages.json
@@ -611,19 +611,10 @@
"busy": {
"message": "Meşgul"
},
- "buy": {
- "message": "Satın Al"
- },
"buyAsset": {
"message": "$1 satın al",
"description": "$1 is the ticker symbol of a an asset the user is being prompted to purchase"
},
- "buyDescription": {
- "message": "Kriptonuzu tutun ve potansiyel kârlar elde edin"
- },
- "buyDisabled": {
- "message": "Satın al bu ağda kullanılamaz"
- },
"buyMoreAsset": {
"message": "Daha fazla $1 satın al",
"description": "$1 is the ticker symbol of a an asset the user is being prompted to purchase"
@@ -1408,9 +1399,6 @@
"enableAutoDetect": {
"message": " Otomatik algılamayı etkinleştir"
},
- "enableForAllNetworks": {
- "message": "Tüm ağlar için etkinleştir"
- },
"enableFromSettings": {
"message": " Ayarlardan etkinleştir."
},
@@ -1550,11 +1538,9 @@
"experimental": {
"message": "Deneysel"
},
- "exploreMetaMaskSnaps": {
- "message": "MetaMask Snaplerini keşfedin"
- },
"extendWalletWithSnaps": {
- "message": "Cüzdan deneyimini kişiselleştirin."
+ "message": "Cüzdan deneyimini kişiselleştirin.",
+ "description": "Banner description displayed on Snaps list page in Settings when less than 6 Snaps is installed."
},
"externalExtension": {
"message": "Harici uzantı"
@@ -1585,9 +1571,6 @@
"message": "Dosya içe aktarma çalışmıyor mu? Buraya tıklayın!",
"description": "Helps user import their account from a JSON file"
},
- "fileTooBig": {
- "message": "Bırakılan dosya çok büyük."
- },
"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."
@@ -3203,14 +3186,6 @@
"message": "Bu yaşam döngüsü sırasında belirli zamanlarda kod çalıştırmak için snapin yaşam döngüsü kancalarını kullanmasına izin verin.",
"description": "An extended description for the `endowment:lifecycle-hooks` permission"
},
- "permission_longRunning": {
- "message": "Süresiz çalıştır.",
- "description": "The description for the `endowment:long-running` permission"
- },
- "permission_longRunningDescription": {
- "message": "Snapin örneğin büyük miktarda veri işlerken belirsiz süreyle çalışmasına izin verin.",
- "description": "An extended description for the `endowment:long-running` permission"
- },
"permission_manageAccounts": {
"message": "Ethereum hesaplarını ekle ve kontrol et",
"description": "The description for `snap_manageAccounts` permission"
diff --git a/app/_locales/vi/messages.json b/app/_locales/vi/messages.json
index 699efc6a3830..d17b243151f6 100644
--- a/app/_locales/vi/messages.json
+++ b/app/_locales/vi/messages.json
@@ -611,19 +611,10 @@
"busy": {
"message": "Đang bận"
},
- "buy": {
- "message": "Mua"
- },
"buyAsset": {
"message": "Mua $1",
"description": "$1 is the ticker symbol of a an asset the user is being prompted to purchase"
},
- "buyDescription": {
- "message": "Giữ tiền mã hóa và kiếm lợi nhuận tiềm năng"
- },
- "buyDisabled": {
- "message": "Mua không khả dụng trong mạng này"
- },
"buyMoreAsset": {
"message": "Mua thêm $1",
"description": "$1 is the ticker symbol of a an asset the user is being prompted to purchase"
@@ -1408,9 +1399,6 @@
"enableAutoDetect": {
"message": " Bật tự động phát hiện"
},
- "enableForAllNetworks": {
- "message": "Bật cho tất cả các mạng"
- },
"enableFromSettings": {
"message": " Bật trong Cài Đặt."
},
@@ -1550,11 +1538,9 @@
"experimental": {
"message": "Thử nghiệm"
},
- "exploreMetaMaskSnaps": {
- "message": "Khám phá MetaMask Snap"
- },
"extendWalletWithSnaps": {
- "message": "Tuỳ biến trải nghiệm sử dụng ví."
+ "message": "Tuỳ biến trải nghiệm sử dụng ví.",
+ "description": "Banner description displayed on Snaps list page in Settings when less than 6 Snaps is installed."
},
"externalExtension": {
"message": "Tiện ích bên ngoài"
@@ -1585,9 +1571,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"
},
- "fileTooBig": {
- "message": "Kích thước tập tin thả vào quá lớ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."
@@ -3203,14 +3186,6 @@
"message": "Cho phép Snap sử dụng hook vòng đời để chạy mã vào những thời điểm cụ thể trong vòng đời của nó.",
"description": "An extended description for the `endowment:lifecycle-hooks` permission"
},
- "permission_longRunning": {
- "message": "Chạy không giới hạn.",
- "description": "The description for the `endowment:long-running` permission"
- },
- "permission_longRunningDescription": {
- "message": "Ví dụ: cho phép Snap chạy vô thời hạn trong quá trình xử lý lượng lớn dữ liệu.",
- "description": "An extended description for the `endowment:long-running` permission"
- },
"permission_manageAccounts": {
"message": "Thêm và kiểm soát các tài khoản Ethereum",
"description": "The description for `snap_manageAccounts` permission"
diff --git a/app/_locales/zh_CN/messages.json b/app/_locales/zh_CN/messages.json
index e94f426e1398..d07fc2f81d7b 100644
--- a/app/_locales/zh_CN/messages.json
+++ b/app/_locales/zh_CN/messages.json
@@ -611,19 +611,10 @@
"busy": {
"message": "忙碌中"
},
- "buy": {
- "message": "购买"
- },
"buyAsset": {
"message": "购买$1",
"description": "$1 is the ticker symbol of a an asset the user is being prompted to purchase"
},
- "buyDescription": {
- "message": "继续持有加密货币,赚取潜在利润"
- },
- "buyDisabled": {
- "message": "在此网络中无法购买"
- },
"buyMoreAsset": {
"message": "购买更多$1",
"description": "$1 is the ticker symbol of a an asset the user is being prompted to purchase"
@@ -1408,9 +1399,6 @@
"enableAutoDetect": {
"message": " 启用自动检测"
},
- "enableForAllNetworks": {
- "message": "为所有网络启用"
- },
"enableFromSettings": {
"message": " 从设置中启用它。"
},
@@ -1550,11 +1538,9 @@
"experimental": {
"message": "实验性"
},
- "exploreMetaMaskSnaps": {
- "message": "探索 MetaMask Snaps"
- },
"extendWalletWithSnaps": {
- "message": "扩展钱包体验。"
+ "message": "扩展钱包体验。",
+ "description": "Banner description displayed on Snaps list page in Settings when less than 6 Snaps is installed."
},
"externalExtension": {
"message": "外部扩展程序"
@@ -1585,9 +1571,6 @@
"message": "文件导入失败?点击这里!",
"description": "Helps user import their account from a JSON file"
},
- "fileTooBig": {
- "message": "拖放的文件太大。"
- },
"flaskWelcomeUninstall": {
"message": "您应该卸载此扩展程序",
"description": "This request is shown on the Flask Welcome screen. It is intended for non-developers, and will be bolded."
@@ -3203,14 +3186,6 @@
"message": "允许snap使用生命周期挂钩在其生命周期的特定时间运行代码。",
"description": "An extended description for the `endowment:lifecycle-hooks` permission"
},
- "permission_longRunning": {
- "message": "无限期运行。",
- "description": "The description for the `endowment:long-running` permission"
- },
- "permission_longRunningDescription": {
- "message": "允许snap无限期运行,例如在处理大量数据时。",
- "description": "An extended description for the `endowment:long-running` permission"
- },
"permission_manageAccounts": {
"message": "添加并控制以太坊账户",
"description": "The description for `snap_manageAccounts` permission"
diff --git a/app/_locales/zh_TW/messages.json b/app/_locales/zh_TW/messages.json
index 5f26256160f8..6d442e961816 100644
--- a/app/_locales/zh_TW/messages.json
+++ b/app/_locales/zh_TW/messages.json
@@ -188,9 +188,6 @@
"browserNotSupported": {
"message": "您的瀏覽器尚未支援..."
},
- "buy": {
- "message": "買"
- },
"bytes": {
"message": "位元組"
},
diff --git a/app/background.html b/app/background.html
index eabb3bf3a704..beed01def0ce 100644
--- a/app/background.html
+++ b/app/background.html
@@ -4,23 +4,7 @@
-
-
-
-
- {{@if(it.applyLavaMoat)}}
-
-
-
- {{#else}}
-
-
-
-
- {{/if}}
- {{@each(it.jsBundles) => val}}
-
- {{/each}}
+