Skip to content

fix: ensure no duplicate accounts are persisted#5710

Merged
mikesposito merged 6 commits into
mainfrom
mikesposito/fix/duplicate-accouts
Apr 25, 2025
Merged

fix: ensure no duplicate accounts are persisted#5710
mikesposito merged 6 commits into
mainfrom
mikesposito/fix/duplicate-accouts

Conversation

@mikesposito

@mikesposito mikesposito commented Apr 24, 2025

Copy link
Copy Markdown
Member

Explanation

Current checks for duplicate accounts only work for imported private keys, and only enforced when creating and restoring keyrings. That is, we don't have proper checks in place to avoid duplicates, and the few checks we have are locking out users instead of ensuring no duplicate is persisted in the vault altogether.

More info on the issue referenced below.

References

Checklist

  • I've updated the test suite for new or updated code as appropriate
  • I've updated documentation (JSDoc, Markdown, etc.) for new or updated code as appropriate
  • I've communicated my changes to consumers by updating changelogs for packages I've changed, highlighting breaking changes as necessary
  • I've prepared draft pull requests for clients and consumer packages to resolve any breaking changes

@mikesposito mikesposito marked this pull request as ready for review April 24, 2025 20:39
@mikesposito mikesposito requested review from a team as code owners April 24, 2025 20:39
@mikesposito

Copy link
Copy Markdown
Member Author

@metamaskbot publish-preview

@mikesposito mikesposito added the team-wallet-framework Deprecated: Please use `team-core-platform` instead. label Apr 24, 2025
@github-actions

Copy link
Copy Markdown
Contributor

Preview builds have been published. See these instructions for more information about preview builds.

Expand for full list of packages and versions.
{
  "@metamask-previews/accounts-controller": "27.0.0-preview-bad0bc3",
  "@metamask-previews/address-book-controller": "6.0.3-preview-bad0bc3",
  "@metamask-previews/announcement-controller": "7.0.3-preview-bad0bc3",
  "@metamask-previews/app-metadata-controller": "1.0.0-preview-bad0bc3",
  "@metamask-previews/approval-controller": "7.1.3-preview-bad0bc3",
  "@metamask-previews/assets-controllers": "58.0.0-preview-bad0bc3",
  "@metamask-previews/base-controller": "8.0.0-preview-bad0bc3",
  "@metamask-previews/bridge-controller": "17.0.0-preview-bad0bc3",
  "@metamask-previews/bridge-status-controller": "14.0.0-preview-bad0bc3",
  "@metamask-previews/build-utils": "3.0.3-preview-bad0bc3",
  "@metamask-previews/chain-agnostic-permission": "0.4.0-preview-bad0bc3",
  "@metamask-previews/composable-controller": "11.0.0-preview-bad0bc3",
  "@metamask-previews/controller-utils": "11.7.0-preview-bad0bc3",
  "@metamask-previews/delegation-controller": "0.1.0-preview-bad0bc3",
  "@metamask-previews/earn-controller": "0.12.0-preview-bad0bc3",
  "@metamask-previews/eip1193-permission-middleware": "0.1.0-preview-bad0bc3",
  "@metamask-previews/ens-controller": "16.0.0-preview-bad0bc3",
  "@metamask-previews/eth-json-rpc-provider": "4.1.8-preview-bad0bc3",
  "@metamask-previews/gas-fee-controller": "23.0.0-preview-bad0bc3",
  "@metamask-previews/json-rpc-engine": "10.0.3-preview-bad0bc3",
  "@metamask-previews/json-rpc-middleware-stream": "8.0.7-preview-bad0bc3",
  "@metamask-previews/keyring-controller": "21.0.3-preview-bad0bc3",
  "@metamask-previews/logging-controller": "6.0.4-preview-bad0bc3",
  "@metamask-previews/message-manager": "12.0.1-preview-bad0bc3",
  "@metamask-previews/multichain": "4.0.0-preview-bad0bc3",
  "@metamask-previews/multichain-api-middleware": "0.2.0-preview-bad0bc3",
  "@metamask-previews/multichain-network-controller": "0.5.1-preview-bad0bc3",
  "@metamask-previews/multichain-transactions-controller": "0.9.0-preview-bad0bc3",
  "@metamask-previews/name-controller": "8.0.3-preview-bad0bc3",
  "@metamask-previews/network-controller": "23.2.0-preview-bad0bc3",
  "@metamask-previews/notification-services-controller": "6.0.0-preview-bad0bc3",
  "@metamask-previews/permission-controller": "11.0.6-preview-bad0bc3",
  "@metamask-previews/permission-log-controller": "3.0.3-preview-bad0bc3",
  "@metamask-previews/phishing-controller": "12.5.0-preview-bad0bc3",
  "@metamask-previews/polling-controller": "13.0.0-preview-bad0bc3",
  "@metamask-previews/preferences-controller": "17.0.0-preview-bad0bc3",
  "@metamask-previews/profile-sync-controller": "12.0.0-preview-bad0bc3",
  "@metamask-previews/queued-request-controller": "10.0.0-preview-bad0bc3",
  "@metamask-previews/rate-limit-controller": "6.0.3-preview-bad0bc3",
  "@metamask-previews/remote-feature-flag-controller": "1.6.0-preview-bad0bc3",
  "@metamask-previews/sample-controllers": "0.1.0-preview-bad0bc3",
  "@metamask-previews/selected-network-controller": "22.0.0-preview-bad0bc3",
  "@metamask-previews/signature-controller": "27.1.0-preview-bad0bc3",
  "@metamask-previews/token-search-discovery-controller": "3.1.0-preview-bad0bc3",
  "@metamask-previews/transaction-controller": "54.2.0-preview-bad0bc3",
  "@metamask-previews/user-operation-controller": "33.0.0-preview-bad0bc3"
}

@mcmire mcmire left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One little typo I noticed.

Other than that, I had a question. Is something catching the error that we now throw here? How does this unbrick the wallet if there are duplicate accounts? Or maybe I'm misunderstanding the effects here.

Comment thread packages/keyring-controller/CHANGELOG.md Outdated
#updateVault(): Promise<boolean> {
return this.#withVaultLock(async () => {
// Ensure no duplicate accounts are persisted.
await this.#assertNoDuplicateAccounts();

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

An eventual error thrown here will trigger a rollback in all public functions that mutate the vault. That is, any new account added before this line and after the last vault update will be discarded

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Also, just quoting you here: #5710 (comment)

(the vault is not updated during login, only decrypted to restore keyrings).

Thus, even if a user already have duplicated accounts in its state (prior to that change), this won't brick his wallet 👍

@mikesposito

mikesposito commented Apr 24, 2025

Copy link
Copy Markdown
Member Author

How does this unbrick the wallet if there are duplicate accounts?

The wallet was bricked because the duplicate check was being done on keyring create and restore, which also happens on login. With these changes we will instead enforce the check only right before updating the vault, so we will catch all possible scenarios of duplication before making them persistent - while also allowing users that have duplicates already to login again (the vault is not updated during login, only decrypted to restore keyrings).

Is something catching the error that we now throw here?

The error thrown there will trigger a rollback of the last operation that called the vault update (See https://github.com/MetaMask/core/blob/main/packages/keyring-controller/src/KeyringController.ts#L2670)

Co-authored-by: Elliot Winkler <elliot.winkler@gmail.com>
@mcmire

mcmire commented Apr 24, 2025

Copy link
Copy Markdown
Contributor

@mikesposito Aha, very cool. Thanks for the explanation!

mcmire
mcmire previously approved these changes Apr 24, 2025

@mcmire mcmire left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Makes sense to me!

@cryptodev-2s cryptodev-2s left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM!

@ccharly ccharly left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Didn't test it, but the logic looks nice (and that's probably the best option to prevent those duplicated addresses 💪). Good job!

@mikesposito mikesposito merged commit 24ea9c7 into main Apr 25, 2025
@mikesposito mikesposito deleted the mikesposito/fix/duplicate-accouts branch April 25, 2025 09:06
github-merge-queue Bot pushed a commit to MetaMask/metamask-extension that referenced this pull request Apr 25, 2025
… `^21.0.4` (#32287)

<!--
Please submit this PR as a draft initially.
Do not mark it as "Ready for review" until the template has been
completely filled out, and PR status checks have passed at least once.
-->

## **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?
-->
Bumping `@metamask/keyring-controller` to `^21.0.4`
```markdown
## [21.0.4]

### Fixed

- Ensure no duplicate accounts are persisted ([#5710](MetaMask/core#5710))
```

[![Open in GitHub
Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/32287?quickstart=1)

## **Related issues**

Fixes: #32097 

## **Manual testing steps**

### In order to test the fix, you first need a wallet bricked because of
a duplicate account:
- Checkout on the v12.16.0 release branch and build locally (a version
with multi-srp support)
- Import or create an SRP (I used `child guilt hollow arrive average
popular nasty soon summer like scheme diary pill country rapid`)
- Import an account that is part of the mnemonic (e.g. I used
`0x80842b7e3cfb1118e86a427cdec418e3b4179ef5bbbfd71c02a76349831c8a8b`
which is the account at index 2 of the above SRP)
- Add a new account on the main HD - note that you'll be able to add the
account, but (1) the account is the same as the imported one
(expectable) and (2) the newly added account is wrongly labeled as
"imported"
- Lock the wallet
- Unlock it with the right password - you will see the reported error:
```
Error: KeyringController - The account you are trying to import is a duplicate
await in withLock		
submitPassword	@	metamask-controller.js:4343
await in submitPassword		
(anonymous)	@	createMetaRPCHandler.js:23
```

### Testing the fix
- Without removing the extension from the browser, switch to this PR
branch and build again
- Visit [chrome://extensions/](chrome://extensions/) and reload the
extension
- Try to login again, you should be able to access the wallet again

## **Screenshots/Recordings**

<!-- If applicable, add screenshots and/or recordings to visualize the
before and after of your change. -->

### **Before**

<!-- [screenshots/recordings] -->

### **After**

<!-- [screenshots/recordings] -->

## **Pre-merge author checklist**

- [ ] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [ ] I've completed the PR template to the best of my ability
- [ ] I’ve included tests if applicable
- [ ] I’ve documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [ ] I’ve applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.

## **Pre-merge reviewer checklist**

- [ ] I've manually tested the PR (e.g. pull and build branch, run the
app, test code being changed).
- [ ] I confirm that this PR addresses all acceptance criteria described
in the ticket it closes and includes the necessary testing evidence such
as recordings and or screenshots.
github-merge-queue Bot pushed a commit to MetaMask/metamask-mobile that referenced this pull request Apr 25, 2025
…4702)

<!--
Please submit this PR as a draft initially.
Do not mark it as "Ready for review" until the template has been
completely filled out, and PR status checks have passed at least once.
-->

## **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?
-->

Updating `@metamask/keyring-controller` to `^21.0.4`

```markdown
## [21.0.4]

### Fixed

- Ensure no duplicate accounts are persisted ([#5710](MetaMask/core#5710))

## [21.0.3]

### Changed

- `ExportableKeyEncryptor` is now a generic type with a type parameter `EncryptionKey` ([#5395](MetaMask/core#5395))
  - The type parameter defaults to `unknown`

### Fixed

- Fixed wrong error message thrown when using the wrong password ([#5627](MetaMask/core#5627))

## [21.0.2]

### Changed

- Bump `@metamask/keyring-api` from `^17.2.0` to `^17.4.0` ([#5565](MetaMask/core#5565))
- Bump `@metamask/keyring-internal-api` from `^6.0.0` to `^6.0.1` ([#5565](MetaMask/core#5565))

### Fixed

- Ignore cached encryption key when the vault needs to upgrade its encryption parameters ([#5601](MetaMask/core#5601))


```

## **Related issues**

Fixes: #14228 

## **Manual testing steps**

1. Go to this page...
2.
3.

## **Screenshots/Recordings**

<!-- If applicable, add screenshots and/or recordings to visualize the
before and after of your change. -->

### **Before**

<!-- [screenshots/recordings] -->

### **After**

<!-- [screenshots/recordings] -->

## **Pre-merge author checklist**

- [ ] I’ve followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile
Coding
Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [ ] I've completed the PR template to the best of my ability
- [ ] I’ve included tests if applicable
- [ ] I’ve documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [ ] I’ve applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.

## **Pre-merge reviewer checklist**

- [ ] I've manually tested the PR (e.g. pull and build branch, run the
app, test code being changed).
- [ ] I confirm that this PR addresses all acceptance criteria described
in the ticket it closes and includes the necessary testing evidence such
as recordings and or screenshots.

---------

Co-authored-by: Nico MASSART <NicolasMassart@users.noreply.github.com>
DDDDDanica pushed a commit to MetaMask/metamask-extension that referenced this pull request Apr 25, 2025
… `^21.0.4` (#32287)

<!--
Please submit this PR as a draft initially.
Do not mark it as "Ready for review" until the template has been
completely filled out, and PR status checks have passed at least once.
-->

<!--
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?
-->
Bumping `@metamask/keyring-controller` to `^21.0.4`
```markdown

- Ensure no duplicate accounts are persisted ([#5710](MetaMask/core#5710))
```

[![Open in GitHub
Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/32287?quickstart=1)

Fixes: #32097

a duplicate account:
- Checkout on the v12.16.0 release branch and build locally (a version
with multi-srp support)
- Import or create an SRP (I used `child guilt hollow arrive average
popular nasty soon summer like scheme diary pill country rapid`)
- Import an account that is part of the mnemonic (e.g. I used
`0x80842b7e3cfb1118e86a427cdec418e3b4179ef5bbbfd71c02a76349831c8a8b`
which is the account at index 2 of the above SRP)
- Add a new account on the main HD - note that you'll be able to add the
account, but (1) the account is the same as the imported one
(expectable) and (2) the newly added account is wrongly labeled as
"imported"
- Lock the wallet
- Unlock it with the right password - you will see the reported error:
```
Error: KeyringController - The account you are trying to import is a duplicate
await in withLock
submitPassword	@	metamask-controller.js:4343
await in submitPassword
(anonymous)	@	createMetaRPCHandler.js:23
```

- Without removing the extension from the browser, switch to this PR
branch and build again
- Visit [chrome://extensions/](chrome://extensions/) and reload the
extension
- Try to login again, you should be able to access the wallet again

<!-- If applicable, add screenshots and/or recordings to visualize the
before and after of your change. -->

<!-- [screenshots/recordings] -->

<!-- [screenshots/recordings] -->

- [ ] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [ ] I've completed the PR template to the best of my ability
- [ ] I’ve included tests if applicable
- [ ] I’ve documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [ ] I’ve applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.

- [ ] 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.
runway-github Bot pushed a commit to MetaMask/metamask-extension that referenced this pull request Apr 25, 2025
…ntroller` from `^21.0.3` to `^21.0.4` (#32287)

<!--
Please submit this PR as a draft initially.
Do not mark it as "Ready for review" until the template has been
completely filled out, and PR status checks have passed at least once.
-->

## **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?
-->
Bumping `@metamask/keyring-controller` to `^21.0.4`
```markdown
## [21.0.4]

### Fixed

- Ensure no duplicate accounts are persisted ([#5710](MetaMask/core#5710))
```

[![Open in GitHub
Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/32287?quickstart=1)

## **Related issues**

Fixes: #32097 

## **Manual testing steps**

### In order to test the fix, you first need a wallet bricked because of
a duplicate account:
- Checkout on the v12.16.0 release branch and build locally (a version
with multi-srp support)
- Import or create an SRP (I used `child guilt hollow arrive average
popular nasty soon summer like scheme diary pill country rapid`)
- Import an account that is part of the mnemonic (e.g. I used
`0x80842b7e3cfb1118e86a427cdec418e3b4179ef5bbbfd71c02a76349831c8a8b`
which is the account at index 2 of the above SRP)
- Add a new account on the main HD - note that you'll be able to add the
account, but (1) the account is the same as the imported one
(expectable) and (2) the newly added account is wrongly labeled as
"imported"
- Lock the wallet
- Unlock it with the right password - you will see the reported error:
```
Error: KeyringController - The account you are trying to import is a duplicate
await in withLock		
submitPassword	@	metamask-controller.js:4343
await in submitPassword		
(anonymous)	@	createMetaRPCHandler.js:23
```

### Testing the fix
- Without removing the extension from the browser, switch to this PR
branch and build again
- Visit [chrome://extensions/](chrome://extensions/) and reload the
extension
- Try to login again, you should be able to access the wallet again

## **Screenshots/Recordings**

<!-- If applicable, add screenshots and/or recordings to visualize the
before and after of your change. -->

### **Before**

<!-- [screenshots/recordings] -->

### **After**

<!-- [screenshots/recordings] -->

## **Pre-merge author checklist**

- [ ] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [ ] I've completed the PR template to the best of my ability
- [ ] I’ve included tests if applicable
- [ ] I’ve documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [ ] I’ve applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.

## **Pre-merge reviewer checklist**

- [ ] I've manually tested the PR (e.g. pull and build branch, run the
app, test code being changed).
- [ ] I confirm that this PR addresses all acceptance criteria described
in the ticket it closes and includes the necessary testing evidence such
as recordings and or screenshots.
DDDDDanica added a commit to MetaMask/metamask-extension that referenced this pull request Apr 25, 2025
… `^21.0.4`(#32287) cp-12.17.0 (#32291)

<!--
Please submit this PR as a draft initially.
Do not mark it as "Ready for review" until the template has been
completely filled out, and PR status checks have passed at least once.
-->

## **Description**
Cherry-pick #32287
<!--
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? -->
Bumping `@metamask/keyring-controller` to `^21.0.4`
```markdown
## [21.0.4]

### Fixed

- Ensure no duplicate accounts are persisted ([#5710](MetaMask/core#5710))
```

[![Open in GitHub

Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/32287?quickstart=1)

## **Related issues**

Fixes: #32097 

## **Manual testing steps**

### In order to test the fix, you first need a wallet bricked because of
a duplicate account:
- Checkout on the v12.16.0 release branch and build locally (a version
with multi-srp support)
- Import or create an SRP (I used `child guilt hollow arrive average
popular nasty soon summer like scheme diary pill country rapid`)
- Import an account that is part of the mnemonic (e.g. I used
`0x80842b7e3cfb1118e86a427cdec418e3b4179ef5bbbfd71c02a76349831c8a8b`
which is the account at index 2 of the above SRP)
- Add a new account on the main HD - note that you'll be able to add the
account, but (1) the account is the same as the imported one
(expectable) and (2) the newly added account is wrongly labeled as
"imported"
- Lock the wallet
- Unlock it with the right password - you will see the reported error:
```
Error: KeyringController - The account you are trying to import is a duplicate
await in withLock		
submitPassword	@	metamask-controller.js:4343
await in submitPassword		
(anonymous)	@	createMetaRPCHandler.js:23
```

### Testing the fix
- Without removing the extension from the browser, switch to this PR
branch and build again
- Visit [chrome://extensions/](chrome://extensions/) and reload the
extension
- Try to login again, you should be able to access the wallet again

## **Screenshots/Recordings**

<!-- If applicable, add screenshots and/or recordings to visualize the
before and after of your change. -->

### **Before**

<!-- [screenshots/recordings] -->

### **After**

<!-- [screenshots/recordings] -->

## **Pre-merge author checklist**

- [ ] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask
Extension Coding

Standards](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [ ] I've completed the PR template to the best of my ability
- [ ] I’ve included tests if applicable
- [ ] I’ve documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [ ] I’ve applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.

## **Pre-merge reviewer checklist**

- [ ] I've manually tested the PR (e.g. pull and build branch, run the
app, test code being changed).
- [ ] I confirm that this PR addresses all acceptance criteria described
in the ticket it closes and includes the necessary testing evidence such
as recordings and or screenshots.

<!--
Please submit this PR as a draft initially.
Do not mark it as "Ready for review" until the template has been
completely filled out, and PR status checks have passed at least once.
-->

## **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?
-->

[![Open in GitHub
Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/32291?quickstart=1)

## **Related issues**

Fixes:

## **Manual testing steps**

1. Go to this page...
2.
3.

## **Screenshots/Recordings**

<!-- If applicable, add screenshots and/or recordings to visualize the
before and after of your change. -->

### **Before**

<!-- [screenshots/recordings] -->

### **After**

<!-- [screenshots/recordings] -->

## **Pre-merge author checklist**

- [ ] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [ ] I've completed the PR template to the best of my ability
- [ ] I’ve included tests if applicable
- [ ] I’ve documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [ ] I’ve applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.

## **Pre-merge reviewer checklist**

- [ ] I've manually tested the PR (e.g. pull and build branch, run the
app, test code being changed).
- [ ] I confirm that this PR addresses all acceptance criteria described
in the ticket it closes and includes the necessary testing evidence such
as recordings and or screenshots.

---------

Co-authored-by: Michele Esposito <34438276+mikesposito@users.noreply.github.com>
runway-github Bot added a commit to MetaMask/metamask-mobile that referenced this pull request Apr 30, 2025
#14702)

<!--
Please submit this PR as a draft initially.
Do not mark it as "Ready for review" until the template has been
completely filled out, and PR status checks have passed at least once.
-->

## **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?
-->

Updating `@metamask/keyring-controller` to `^21.0.4`

```markdown
## [21.0.4]

### Fixed

- Ensure no duplicate accounts are persisted ([#5710](MetaMask/core#5710))

## [21.0.3]

### Changed

- `ExportableKeyEncryptor` is now a generic type with a type parameter `EncryptionKey` ([#5395](MetaMask/core#5395))
  - The type parameter defaults to `unknown`

### Fixed

- Fixed wrong error message thrown when using the wrong password ([#5627](MetaMask/core#5627))

## [21.0.2]

### Changed

- Bump `@metamask/keyring-api` from `^17.2.0` to `^17.4.0` ([#5565](MetaMask/core#5565))
- Bump `@metamask/keyring-internal-api` from `^6.0.0` to `^6.0.1` ([#5565](MetaMask/core#5565))

### Fixed

- Ignore cached encryption key when the vault needs to upgrade its encryption parameters ([#5601](MetaMask/core#5601))


```

## **Related issues**

Fixes: #14228 

## **Manual testing steps**

1. Go to this page...
2.
3.

## **Screenshots/Recordings**

<!-- If applicable, add screenshots and/or recordings to visualize the
before and after of your change. -->

### **Before**

<!-- [screenshots/recordings] -->

### **After**

<!-- [screenshots/recordings] -->

## **Pre-merge author checklist**

- [ ] I’ve followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile
Coding
Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [ ] I've completed the PR template to the best of my ability
- [ ] I’ve included tests if applicable
- [ ] I’ve documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [ ] I’ve applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.

## **Pre-merge reviewer checklist**

- [ ] I've manually tested the PR (e.g. pull and build branch, run the
app, test code being changed).
- [ ] I confirm that this PR addresses all acceptance criteria described
in the ticket it closes and includes the necessary testing evidence such
as recordings and or screenshots.

---------

Co-authored-by: Nico MASSART <NicolasMassart@users.noreply.github.com>
runway-github Bot pushed a commit to MetaMask/metamask-mobile that referenced this pull request Apr 30, 2025
…ontroller` to `^21.0.4` (#14702)

<!--
Please submit this PR as a draft initially.
Do not mark it as "Ready for review" until the template has been
completely filled out, and PR status checks have passed at least once.
-->

## **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?
-->

Updating `@metamask/keyring-controller` to `^21.0.4`

```markdown
## [21.0.4]

### Fixed

- Ensure no duplicate accounts are persisted ([#5710](MetaMask/core#5710))

## [21.0.3]

### Changed

- `ExportableKeyEncryptor` is now a generic type with a type parameter `EncryptionKey` ([#5395](MetaMask/core#5395))
  - The type parameter defaults to `unknown`

### Fixed

- Fixed wrong error message thrown when using the wrong password ([#5627](MetaMask/core#5627))

## [21.0.2]

### Changed

- Bump `@metamask/keyring-api` from `^17.2.0` to `^17.4.0` ([#5565](MetaMask/core#5565))
- Bump `@metamask/keyring-internal-api` from `^6.0.0` to `^6.0.1` ([#5565](MetaMask/core#5565))

### Fixed

- Ignore cached encryption key when the vault needs to upgrade its encryption parameters ([#5601](MetaMask/core#5601))


```

## **Related issues**

Fixes: #14228 

## **Manual testing steps**

1. Go to this page...
2.
3.

## **Screenshots/Recordings**

<!-- If applicable, add screenshots and/or recordings to visualize the
before and after of your change. -->

### **Before**

<!-- [screenshots/recordings] -->

### **After**

<!-- [screenshots/recordings] -->

## **Pre-merge author checklist**

- [ ] I’ve followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile
Coding
Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [ ] I've completed the PR template to the best of my ability
- [ ] I’ve included tests if applicable
- [ ] I’ve documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [ ] I’ve applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.

## **Pre-merge reviewer checklist**

- [ ] I've manually tested the PR (e.g. pull and build branch, run the
app, test code being changed).
- [ ] I confirm that this PR addresses all acceptance criteria described
in the ticket it closes and includes the necessary testing evidence such
as recordings and or screenshots.

---------

Co-authored-by: Nico MASSART <NicolasMassart@users.noreply.github.com>
runway-github Bot added a commit to MetaMask/metamask-mobile that referenced this pull request Apr 30, 2025
#14702)

<!--
Please submit this PR as a draft initially.
Do not mark it as "Ready for review" until the template has been
completely filled out, and PR status checks have passed at least once.
-->

## **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?
-->

Updating `@metamask/keyring-controller` to `^21.0.4`

```markdown
## [21.0.4]

### Fixed

- Ensure no duplicate accounts are persisted ([#5710](MetaMask/core#5710))

## [21.0.3]

### Changed

- `ExportableKeyEncryptor` is now a generic type with a type parameter `EncryptionKey` ([#5395](MetaMask/core#5395))
  - The type parameter defaults to `unknown`

### Fixed

- Fixed wrong error message thrown when using the wrong password ([#5627](MetaMask/core#5627))

## [21.0.2]

### Changed

- Bump `@metamask/keyring-api` from `^17.2.0` to `^17.4.0` ([#5565](MetaMask/core#5565))
- Bump `@metamask/keyring-internal-api` from `^6.0.0` to `^6.0.1` ([#5565](MetaMask/core#5565))

### Fixed

- Ignore cached encryption key when the vault needs to upgrade its encryption parameters ([#5601](MetaMask/core#5601))

```

## **Related issues**

Fixes: #14228

## **Manual testing steps**

1. Go to this page...
2.
3.

## **Screenshots/Recordings**

<!-- If applicable, add screenshots and/or recordings to visualize the
before and after of your change. -->

### **Before**

<!-- [screenshots/recordings] -->

### **After**

<!-- [screenshots/recordings] -->

## **Pre-merge author checklist**

- [ ] I’ve followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile
Coding
Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [ ] I've completed the PR template to the best of my ability
- [ ] I’ve included tests if applicable
- [ ] I’ve documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [ ] I’ve applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.

## **Pre-merge reviewer checklist**

- [ ] I've manually tested the PR (e.g. pull and build branch, run the
app, test code being changed).
- [ ] I confirm that this PR addresses all acceptance criteria described
in the ticket it closes and includes the necessary testing evidence such
as recordings and or screenshots.

---------

Co-authored-by: Nico MASSART <NicolasMassart@users.noreply.github.com>
EtherWizard33 pushed a commit to MetaMask/metamask-mobile that referenced this pull request May 2, 2025
…4702)

<!--
Please submit this PR as a draft initially.
Do not mark it as "Ready for review" until the template has been
completely filled out, and PR status checks have passed at least once.
-->

## **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?
-->

Updating `@metamask/keyring-controller` to `^21.0.4`

```markdown
## [21.0.4]

### Fixed

- Ensure no duplicate accounts are persisted ([#5710](MetaMask/core#5710))

## [21.0.3]

### Changed

- `ExportableKeyEncryptor` is now a generic type with a type parameter `EncryptionKey` ([#5395](MetaMask/core#5395))
  - The type parameter defaults to `unknown`

### Fixed

- Fixed wrong error message thrown when using the wrong password ([#5627](MetaMask/core#5627))

## [21.0.2]

### Changed

- Bump `@metamask/keyring-api` from `^17.2.0` to `^17.4.0` ([#5565](MetaMask/core#5565))
- Bump `@metamask/keyring-internal-api` from `^6.0.0` to `^6.0.1` ([#5565](MetaMask/core#5565))

### Fixed

- Ignore cached encryption key when the vault needs to upgrade its encryption parameters ([#5601](MetaMask/core#5601))


```

## **Related issues**

Fixes: #14228 

## **Manual testing steps**

1. Go to this page...
2.
3.

## **Screenshots/Recordings**

<!-- If applicable, add screenshots and/or recordings to visualize the
before and after of your change. -->

### **Before**

<!-- [screenshots/recordings] -->

### **After**

<!-- [screenshots/recordings] -->

## **Pre-merge author checklist**

- [ ] I’ve followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile
Coding
Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [ ] I've completed the PR template to the best of my ability
- [ ] I’ve included tests if applicable
- [ ] I’ve documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [ ] I’ve applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.

## **Pre-merge reviewer checklist**

- [ ] I've manually tested the PR (e.g. pull and build branch, run the
app, test code being changed).
- [ ] I confirm that this PR addresses all acceptance criteria described
in the ticket it closes and includes the necessary testing evidence such
as recordings and or screenshots.

---------

Co-authored-by: Nico MASSART <NicolasMassart@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

team-wallet-framework Deprecated: Please use `team-core-platform` instead.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

KeyringController does not prevent duplicate accounts properly

4 participants