Skip to content

[Bug]: After activating notifications for the wallet with multiple accounts, the extension experiencing significant slowdown, Send tx may take 20 seconds to submit #31422

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
sleepytanya opened this issue Mar 30, 2025 · 8 comments
Assignees
Labels
regression-RC-12.16.0 Regression bug that was found in release candidate (RC) for release 12.16.0 Sev2-normal Normal severity; minor loss of service or inconvenience. team-assets type-bug Something isn't working

Comments

@sleepytanya
Copy link
Contributor

sleepytanya commented Mar 30, 2025

Describe the bug

Upon activating notifications for a wallet that has multiple accounts, there is a significant slowdown in the extension's performance. Tasks such as sending transactions could take upwards of 20 seconds, buttons may remain disabled for over 10 seconds, after making all as read the dots, inidicating new norifications do not disappear, switching between networks and other basic flows might also experience delays.

Expected behavior

Screenshots/Recordings

not.mov

Steps to reproduce

  1. Not sure if this is a necessary step but I tested with the wallet with multiple (20+) accounts
  2. Turn ON Notifications
  3. Try to mark them as read through popup
  4. Start Send transaction / switch network etc.

Error messages or log output

Detection stage

During release testing

Version

12.1.6.0

Build type

None

Browser

Chrome

Operating system

MacOS

Hardware wallet

No response

Additional context

No response

Severity

No response

@sleepytanya sleepytanya added regression-RC-12.16.0 Regression bug that was found in release candidate (RC) for release 12.16.0 Sev2-normal Normal severity; minor loss of service or inconvenience. team-assets type-bug Something isn't working labels Mar 30, 2025
@github-project-automation github-project-automation bot moved this to To be triaged in Bugs by team Mar 30, 2025
@github-project-automation github-project-automation bot moved this to To be fixed in Bugs by severity Mar 30, 2025
@Prithpal-Sooriya
Copy link
Contributor

Oh wow that is awful.

I'll investigate!

@Prithpal-Sooriya
Copy link
Contributor

I am not able to replicate this from a notification perspective.

However tagging @MetaMask/identity in case slowness is due to any profile syncing feature 👀

@sleepytanya
Copy link
Contributor Author

Consistently reproducing slow performance when turning notifications on:

slow.mov

@Prithpal-Sooriya
Copy link
Contributor

@sleepytanya I have a fix for mark as read, but I don't think this would be the cause for the slowness
#31824

I do know our APIs have been a bit slow recently, but this shouldn't slow down the UI since our API calls are done in the background.

Will do some more digging 😄

@sleepytanya
Copy link
Contributor Author

sleepytanya commented Apr 10, 2025

@Prithpal-Sooriya Thank you for investigating!

Turning notifications On and Off (there is visible difference in the creating tx speed), I didn't notice any changes with Profile sync On / Off (tried in diff combinations with Notifications):

234.mov

github-merge-queue bot pushed a commit that referenced this issue Apr 16, 2025
## **Description**

Improves notification mark as read performance by not passing down all
notifications to our API. Now we only send up notifications that have
not been read yet.

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

## **Related issues**

Tentative Fix For:
#31422
I still need to investigate to see if there are still issues related to
this.


## **Manual testing steps**

1. Have unread notifications
2. Press "Mark All As Read" button
3. See unread notifications become marked as read.

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

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [x] I’ve included tests if applicable
- [x] I’ve documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [x] I’ve applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-extension/blob/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.
@Prithpal-Sooriya
Copy link
Contributor

Hey @sleepytanya could you test using this build?
#32391 (comment)

I wonder if it is related.

github-merge-queue bot pushed a commit that referenced this issue May 1, 2025
## **Description**

Wow, huge oopsy on my side. Urgh, a little annoyed that I didn't spot
this earlier.

After doing some thorough debugging, I found an infinite state update
loop from the NotificationServicesController.
I didn't find the full context but this controller:

- Listens to `KeyringController:stateChange` events
- When receiving an event we perform a `KeyringController:withKeyring`
action.

Somewhere above (or potentially another controller firing events or
actions?) will then fire another `KeyringController:stateChange` and the
loop repeats. This prevents other state updates and redux updates.

Controller fix: MetaMask/core#5731
However this patch can be an interim for existing releases or until the
CORE package is released.

<details><summary>Screenshot of background logs</summary>

![Screenshot 2025-04-29 at 22 43
03](https://github.com/user-attachments/assets/a1f07672-d471-4e60-8124-e6644df0b5f4)

</details> 

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

## **Related issues**

Fixes: Potentially fixes
#32416
#31422

## **Manual testing steps**

1. Turn on notifications
2. Try dismissing the carousel banners
3. Try switching networks
4. Try the send flow where you send sepolia

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

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [x] I’ve included tests if applicable
- [x] I’ve documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [x] I’ve applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-extension/blob/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.
runway-github bot added a commit that referenced this issue May 1, 2025
## **Description**

Wow, huge oopsy on my side. Urgh, a little annoyed that I didn't spot
this earlier.

After doing some thorough debugging, I found an infinite state update
loop from the NotificationServicesController.
I didn't find the full context but this controller:

- Listens to `KeyringController:stateChange` events
- When receiving an event we perform a `KeyringController:withKeyring`
action.

Somewhere above (or potentially another controller firing events or
actions?) will then fire another `KeyringController:stateChange` and the
loop repeats. This prevents other state updates and redux updates.

Controller fix: MetaMask/core#5731
However this patch can be an interim for existing releases or until the
CORE package is released.

<details><summary>Screenshot of background logs</summary>

![Screenshot 2025-04-29 at 22 43
03](https://github.com/user-attachments/assets/a1f07672-d471-4e60-8124-e6644df0b5f4)

</details> 

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

## **Related issues**

Fixes: Potentially fixes
#32416
#31422

## **Manual testing steps**

1. Turn on notifications
2. Try dismissing the carousel banners
3. Try switching networks
4. Try the send flow where you send sepolia

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

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [x] I’ve included tests if applicable
- [x] I’ve documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [x] I’ve applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-extension/blob/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.
runway-github bot added a commit that referenced this issue May 1, 2025
## **Description**

Wow, huge oopsy on my side. Urgh, a little annoyed that I didn't spot
this earlier.

After doing some thorough debugging, I found an infinite state update
loop from the NotificationServicesController.
I didn't find the full context but this controller:

- Listens to `KeyringController:stateChange` events
- When receiving an event we perform a `KeyringController:withKeyring`
action.

Somewhere above (or potentially another controller firing events or
actions?) will then fire another `KeyringController:stateChange` and the
loop repeats. This prevents other state updates and redux updates.

Controller fix: MetaMask/core#5731
However this patch can be an interim for existing releases or until the
CORE package is released.

<details><summary>Screenshot of background logs</summary>

![Screenshot 2025-04-29 at 22 43
03](https://github.com/user-attachments/assets/a1f07672-d471-4e60-8124-e6644df0b5f4)

</details> 

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

## **Related issues**

Fixes: Potentially fixes
#32416
#31422

## **Manual testing steps**

1. Turn on notifications
2. Try dismissing the carousel banners
3. Try switching networks
4. Try the send flow where you send sepolia

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

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [x] I’ve included tests if applicable
- [x] I’ve documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [x] I’ve applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-extension/blob/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.
runway-github bot added a commit that referenced this issue May 1, 2025
## **Description**

Wow, huge oopsy on my side. Urgh, a little annoyed that I didn't spot
this earlier.

After doing some thorough debugging, I found an infinite state update
loop from the NotificationServicesController.
I didn't find the full context but this controller:

- Listens to `KeyringController:stateChange` events
- When receiving an event we perform a `KeyringController:withKeyring`
action.

Somewhere above (or potentially another controller firing events or
actions?) will then fire another `KeyringController:stateChange` and the
loop repeats. This prevents other state updates and redux updates.

Controller fix: MetaMask/core#5731
However this patch can be an interim for existing releases or until the
CORE package is released.

<details><summary>Screenshot of background logs</summary>

![Screenshot 2025-04-29 at 22 43
03](https://github.com/user-attachments/assets/a1f07672-d471-4e60-8124-e6644df0b5f4)

</details>

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

## **Related issues**

Fixes: Potentially fixes
#32416
#31422

## **Manual testing steps**

1. Turn on notifications
2. Try dismissing the carousel banners
3. Try switching networks
4. Try the send flow where you send sepolia

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

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [x] I’ve included tests if applicable
- [x] I’ve documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [x] I’ve applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-extension/blob/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.
runway-github bot pushed a commit that referenced this issue May 1, 2025
…ces controller (#32391)

## **Description**

Wow, huge oopsy on my side. Urgh, a little annoyed that I didn't spot
this earlier.

After doing some thorough debugging, I found an infinite state update
loop from the NotificationServicesController.
I didn't find the full context but this controller:

- Listens to `KeyringController:stateChange` events
- When receiving an event we perform a `KeyringController:withKeyring`
action.

Somewhere above (or potentially another controller firing events or
actions?) will then fire another `KeyringController:stateChange` and the
loop repeats. This prevents other state updates and redux updates.

Controller fix: MetaMask/core#5731
However this patch can be an interim for existing releases or until the
CORE package is released.

<details><summary>Screenshot of background logs</summary>

![Screenshot 2025-04-29 at 22 43
03](https://github.com/user-attachments/assets/a1f07672-d471-4e60-8124-e6644df0b5f4)

</details> 

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

## **Related issues**

Fixes: Potentially fixes
#32416
#31422

## **Manual testing steps**

1. Turn on notifications
2. Try dismissing the carousel banners
3. Try switching networks
4. Try the send flow where you send sepolia

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

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [x] I’ve included tests if applicable
- [x] I’ve documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [x] I’ve applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-extension/blob/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 pushed a commit that referenced this issue May 1, 2025
Wow, huge oopsy on my side. Urgh, a little annoyed that I didn't spot
this earlier.

After doing some thorough debugging, I found an infinite state update
loop from the NotificationServicesController.
I didn't find the full context but this controller:

- Listens to `KeyringController:stateChange` events
- When receiving an event we perform a `KeyringController:withKeyring`
action.

Somewhere above (or potentially another controller firing events or
actions?) will then fire another `KeyringController:stateChange` and the
loop repeats. This prevents other state updates and redux updates.

Controller fix: MetaMask/core#5731
However this patch can be an interim for existing releases or until the
CORE package is released.

<details><summary>Screenshot of background logs</summary>

![Screenshot 2025-04-29 at 22 43
03](https://github.com/user-attachments/assets/a1f07672-d471-4e60-8124-e6644df0b5f4)

</details>

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

Fixes: Potentially fixes
#32416
#31422

1. Turn on notifications
2. Try dismissing the carousel banners
3. Try switching networks
4. Try the send flow where you send sepolia

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

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

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

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [x] I’ve included tests if applicable
- [x] I’ve documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [x] I’ve applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-extension/blob/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 added a commit that referenced this issue May 1, 2025
## **Description**

Wow, huge oopsy on my side. Urgh, a little annoyed that I didn't spot
this earlier.

After doing some thorough debugging, I found an infinite state update
loop from the NotificationServicesController.
I didn't find the full context but this controller:

- Listens to `KeyringController:stateChange` events
- When receiving an event we perform a `KeyringController:withKeyring`
action.

Somewhere above (or potentially another controller firing events or
actions?) will then fire another `KeyringController:stateChange` and the
loop repeats. This prevents other state updates and redux updates.

Controller fix: MetaMask/core#5731
However this patch can be an interim for existing releases or until the
CORE package is released.

<details><summary>Screenshot of background logs</summary>

![Screenshot 2025-04-29 at 22 43
03](https://github.com/user-attachments/assets/a1f07672-d471-4e60-8124-e6644df0b5f4)

</details> 

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

## **Related issues**

Fixes: Potentially fixes
#32416
#31422

## **Manual testing steps**

1. Turn on notifications
2. Try dismissing the carousel banners
3. Try switching networks
4. Try the send flow where you send sepolia

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

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [x] I’ve included tests if applicable
- [x] I’ve documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [x] I’ve applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-extension/blob/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.
runway-github bot added a commit that referenced this issue May 1, 2025
## **Description**

Wow, huge oopsy on my side. Urgh, a little annoyed that I didn't spot
this earlier.

After doing some thorough debugging, I found an infinite state update
loop from the NotificationServicesController.
I didn't find the full context but this controller:

- Listens to `KeyringController:stateChange` events
- When receiving an event we perform a `KeyringController:withKeyring`
action.

Somewhere above (or potentially another controller firing events or
actions?) will then fire another `KeyringController:stateChange` and the
loop repeats. This prevents other state updates and redux updates.

Controller fix: MetaMask/core#5731
However this patch can be an interim for existing releases or until the
CORE package is released.

<details><summary>Screenshot of background logs</summary>

![Screenshot 2025-04-29 at 22 43
03](https://github.com/user-attachments/assets/a1f07672-d471-4e60-8124-e6644df0b5f4)

</details> 

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

## **Related issues**

Fixes: Potentially fixes
#32416
#31422

## **Manual testing steps**

1. Turn on notifications
2. Try dismissing the carousel banners
3. Try switching networks
4. Try the send flow where you send sepolia

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

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [x] I’ve included tests if applicable
- [x] I’ve documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [x] I’ve applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-extension/blob/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.
runway-github bot added a commit that referenced this issue May 1, 2025
## **Description**

Wow, huge oopsy on my side. Urgh, a little annoyed that I didn't spot
this earlier.

After doing some thorough debugging, I found an infinite state update
loop from the NotificationServicesController.
I didn't find the full context but this controller:

- Listens to `KeyringController:stateChange` events
- When receiving an event we perform a `KeyringController:withKeyring`
action.

Somewhere above (or potentially another controller firing events or
actions?) will then fire another `KeyringController:stateChange` and the
loop repeats. This prevents other state updates and redux updates.

Controller fix: MetaMask/core#5731
However this patch can be an interim for existing releases or until the
CORE package is released.

<details><summary>Screenshot of background logs</summary>

![Screenshot 2025-04-29 at 22 43
03](https://github.com/user-attachments/assets/a1f07672-d471-4e60-8124-e6644df0b5f4)

</details> 

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

## **Related issues**

Fixes: Potentially fixes
#32416
#31422

## **Manual testing steps**

1. Turn on notifications
2. Try dismissing the carousel banners
3. Try switching networks
4. Try the send flow where you send sepolia

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

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [x] I’ve included tests if applicable
- [x] I’ve documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [x] I’ve applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-extension/blob/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.
runway-github bot added a commit that referenced this issue May 5, 2025
## **Description**

Wow, huge oopsy on my side. Urgh, a little annoyed that I didn't spot
this earlier.

After doing some thorough debugging, I found an infinite state update
loop from the NotificationServicesController.
I didn't find the full context but this controller:

- Listens to `KeyringController:stateChange` events
- When receiving an event we perform a `KeyringController:withKeyring`
action.

Somewhere above (or potentially another controller firing events or
actions?) will then fire another `KeyringController:stateChange` and the
loop repeats. This prevents other state updates and redux updates.

Controller fix: MetaMask/core#5731
However this patch can be an interim for existing releases or until the
CORE package is released.

<details><summary>Screenshot of background logs</summary>

![Screenshot 2025-04-29 at 22 43
03](https://github.com/user-attachments/assets/a1f07672-d471-4e60-8124-e6644df0b5f4)

</details> 

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

## **Related issues**

Fixes: Potentially fixes
#32416
#31422

## **Manual testing steps**

1. Turn on notifications
2. Try dismissing the carousel banners
3. Try switching networks
4. Try the send flow where you send sepolia

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

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [x] I’ve included tests if applicable
- [x] I’ve documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [x] I’ve applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-extension/blob/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.
runway-github bot added a commit that referenced this issue May 5, 2025
## **Description**

Wow, huge oopsy on my side. Urgh, a little annoyed that I didn't spot
this earlier.

After doing some thorough debugging, I found an infinite state update
loop from the NotificationServicesController.
I didn't find the full context but this controller:

- Listens to `KeyringController:stateChange` events
- When receiving an event we perform a `KeyringController:withKeyring`
action.

Somewhere above (or potentially another controller firing events or
actions?) will then fire another `KeyringController:stateChange` and the
loop repeats. This prevents other state updates and redux updates.

Controller fix: MetaMask/core#5731
However this patch can be an interim for existing releases or until the
CORE package is released.

<details><summary>Screenshot of background logs</summary>

![Screenshot 2025-04-29 at 22 43
03](https://github.com/user-attachments/assets/a1f07672-d471-4e60-8124-e6644df0b5f4)

</details> 

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

## **Related issues**

Fixes: Potentially fixes
#32416
#31422

## **Manual testing steps**

1. Turn on notifications
2. Try dismissing the carousel banners
3. Try switching networks
4. Try the send flow where you send sepolia

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

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [x] I’ve included tests if applicable
- [x] I’ve documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [x] I’ve applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-extension/blob/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.
runway-github bot added a commit that referenced this issue May 5, 2025
## **Description**

Wow, huge oopsy on my side. Urgh, a little annoyed that I didn't spot
this earlier.

After doing some thorough debugging, I found an infinite state update
loop from the NotificationServicesController.
I didn't find the full context but this controller:

- Listens to `KeyringController:stateChange` events
- When receiving an event we perform a `KeyringController:withKeyring`
action.

Somewhere above (or potentially another controller firing events or
actions?) will then fire another `KeyringController:stateChange` and the
loop repeats. This prevents other state updates and redux updates.

Controller fix: MetaMask/core#5731
However this patch can be an interim for existing releases or until the
CORE package is released.

<details><summary>Screenshot of background logs</summary>

![Screenshot 2025-04-29 at 22 43
03](https://github.com/user-attachments/assets/a1f07672-d471-4e60-8124-e6644df0b5f4)

</details> 

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

## **Related issues**

Fixes: Potentially fixes
#32416
#31422

## **Manual testing steps**

1. Turn on notifications
2. Try dismissing the carousel banners
3. Try switching networks
4. Try the send flow where you send sepolia

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

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [x] I’ve included tests if applicable
- [x] I’ve documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [x] I’ve applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-extension/blob/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.
runway-github bot added a commit that referenced this issue May 5, 2025
## **Description**

Wow, huge oopsy on my side. Urgh, a little annoyed that I didn't spot
this earlier.

After doing some thorough debugging, I found an infinite state update
loop from the NotificationServicesController.
I didn't find the full context but this controller:

- Listens to `KeyringController:stateChange` events
- When receiving an event we perform a `KeyringController:withKeyring`
action.

Somewhere above (or potentially another controller firing events or
actions?) will then fire another `KeyringController:stateChange` and the
loop repeats. This prevents other state updates and redux updates.

Controller fix: MetaMask/core#5731
However this patch can be an interim for existing releases or until the
CORE package is released.

<details><summary>Screenshot of background logs</summary>

![Screenshot 2025-04-29 at 22 43
03](https://github.com/user-attachments/assets/a1f07672-d471-4e60-8124-e6644df0b5f4)

</details> 

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

## **Related issues**

Fixes: Potentially fixes
#32416
#31422

## **Manual testing steps**

1. Turn on notifications
2. Try dismissing the carousel banners
3. Try switching networks
4. Try the send flow where you send sepolia

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

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [x] I’ve included tests if applicable
- [x] I’ve documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [x] I’ve applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-extension/blob/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.
runway-github bot added a commit that referenced this issue May 5, 2025
## **Description**

Wow, huge oopsy on my side. Urgh, a little annoyed that I didn't spot
this earlier.

After doing some thorough debugging, I found an infinite state update
loop from the NotificationServicesController.
I didn't find the full context but this controller:

- Listens to `KeyringController:stateChange` events
- When receiving an event we perform a `KeyringController:withKeyring`
action.

Somewhere above (or potentially another controller firing events or
actions?) will then fire another `KeyringController:stateChange` and the
loop repeats. This prevents other state updates and redux updates.

Controller fix: MetaMask/core#5731
However this patch can be an interim for existing releases or until the
CORE package is released.

<details><summary>Screenshot of background logs</summary>

![Screenshot 2025-04-29 at 22 43
03](https://github.com/user-attachments/assets/a1f07672-d471-4e60-8124-e6644df0b5f4)

</details> 

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

## **Related issues**

Fixes: Potentially fixes
#32416
#31422

## **Manual testing steps**

1. Turn on notifications
2. Try dismissing the carousel banners
3. Try switching networks
4. Try the send flow where you send sepolia

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

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [x] I’ve included tests if applicable
- [x] I’ve documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [x] I’ve applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-extension/blob/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.
runway-github bot added a commit that referenced this issue May 5, 2025
## **Description**

Wow, huge oopsy on my side. Urgh, a little annoyed that I didn't spot
this earlier.

After doing some thorough debugging, I found an infinite state update
loop from the NotificationServicesController.
I didn't find the full context but this controller:

- Listens to `KeyringController:stateChange` events
- When receiving an event we perform a `KeyringController:withKeyring`
action.

Somewhere above (or potentially another controller firing events or
actions?) will then fire another `KeyringController:stateChange` and the
loop repeats. This prevents other state updates and redux updates.

Controller fix: MetaMask/core#5731
However this patch can be an interim for existing releases or until the
CORE package is released.

<details><summary>Screenshot of background logs</summary>

![Screenshot 2025-04-29 at 22 43
03](https://github.com/user-attachments/assets/a1f07672-d471-4e60-8124-e6644df0b5f4)

</details> 

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

## **Related issues**

Fixes: Potentially fixes
#32416
#31422

## **Manual testing steps**

1. Turn on notifications
2. Try dismissing the carousel banners
3. Try switching networks
4. Try the send flow where you send sepolia

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

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [x] I’ve included tests if applicable
- [x] I’ve documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [x] I’ve applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-extension/blob/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.
runway-github bot added a commit that referenced this issue May 5, 2025
## **Description**

Wow, huge oopsy on my side. Urgh, a little annoyed that I didn't spot
this earlier.

After doing some thorough debugging, I found an infinite state update
loop from the NotificationServicesController.
I didn't find the full context but this controller:

- Listens to `KeyringController:stateChange` events
- When receiving an event we perform a `KeyringController:withKeyring`
action.

Somewhere above (or potentially another controller firing events or
actions?) will then fire another `KeyringController:stateChange` and the
loop repeats. This prevents other state updates and redux updates.

Controller fix: MetaMask/core#5731
However this patch can be an interim for existing releases or until the
CORE package is released.

<details><summary>Screenshot of background logs</summary>

![Screenshot 2025-04-29 at 22 43
03](https://github.com/user-attachments/assets/a1f07672-d471-4e60-8124-e6644df0b5f4)

</details> 

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

## **Related issues**

Fixes: Potentially fixes
#32416
#31422

## **Manual testing steps**

1. Turn on notifications
2. Try dismissing the carousel banners
3. Try switching networks
4. Try the send flow where you send sepolia

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

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [x] I’ve included tests if applicable
- [x] I’ve documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [x] I’ve applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-extension/blob/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.
runway-github bot added a commit that referenced this issue May 5, 2025
## **Description**

Wow, huge oopsy on my side. Urgh, a little annoyed that I didn't spot
this earlier.

After doing some thorough debugging, I found an infinite state update
loop from the NotificationServicesController.
I didn't find the full context but this controller:

- Listens to `KeyringController:stateChange` events
- When receiving an event we perform a `KeyringController:withKeyring`
action.

Somewhere above (or potentially another controller firing events or
actions?) will then fire another `KeyringController:stateChange` and the
loop repeats. This prevents other state updates and redux updates.

Controller fix: MetaMask/core#5731
However this patch can be an interim for existing releases or until the
CORE package is released.

<details><summary>Screenshot of background logs</summary>

![Screenshot 2025-04-29 at 22 43
03](https://github.com/user-attachments/assets/a1f07672-d471-4e60-8124-e6644df0b5f4)

</details> 

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

## **Related issues**

Fixes: Potentially fixes
#32416
#31422

## **Manual testing steps**

1. Turn on notifications
2. Try dismissing the carousel banners
3. Try switching networks
4. Try the send flow where you send sepolia

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

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [x] I’ve included tests if applicable
- [x] I’ve documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [x] I’ve applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-extension/blob/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.
runway-github bot added a commit that referenced this issue May 5, 2025
## **Description**

Wow, huge oopsy on my side. Urgh, a little annoyed that I didn't spot
this earlier.

After doing some thorough debugging, I found an infinite state update
loop from the NotificationServicesController.
I didn't find the full context but this controller:

- Listens to `KeyringController:stateChange` events
- When receiving an event we perform a `KeyringController:withKeyring`
action.

Somewhere above (or potentially another controller firing events or
actions?) will then fire another `KeyringController:stateChange` and the
loop repeats. This prevents other state updates and redux updates.

Controller fix: MetaMask/core#5731
However this patch can be an interim for existing releases or until the
CORE package is released.

<details><summary>Screenshot of background logs</summary>

![Screenshot 2025-04-29 at 22 43
03](https://github.com/user-attachments/assets/a1f07672-d471-4e60-8124-e6644df0b5f4)

</details> 

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

## **Related issues**

Fixes: Potentially fixes
#32416
#31422

## **Manual testing steps**

1. Turn on notifications
2. Try dismissing the carousel banners
3. Try switching networks
4. Try the send flow where you send sepolia

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

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [x] I’ve included tests if applicable
- [x] I’ve documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [x] I’ve applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-extension/blob/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.
runway-github bot added a commit that referenced this issue May 5, 2025
## **Description**

Wow, huge oopsy on my side. Urgh, a little annoyed that I didn't spot
this earlier.

After doing some thorough debugging, I found an infinite state update
loop from the NotificationServicesController.
I didn't find the full context but this controller:

- Listens to `KeyringController:stateChange` events
- When receiving an event we perform a `KeyringController:withKeyring`
action.

Somewhere above (or potentially another controller firing events or
actions?) will then fire another `KeyringController:stateChange` and the
loop repeats. This prevents other state updates and redux updates.

Controller fix: MetaMask/core#5731
However this patch can be an interim for existing releases or until the
CORE package is released.

<details><summary>Screenshot of background logs</summary>

![Screenshot 2025-04-29 at 22 43
03](https://github.com/user-attachments/assets/a1f07672-d471-4e60-8124-e6644df0b5f4)

</details> 

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

## **Related issues**

Fixes: Potentially fixes
#32416
#31422

## **Manual testing steps**

1. Turn on notifications
2. Try dismissing the carousel banners
3. Try switching networks
4. Try the send flow where you send sepolia

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

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [x] I’ve included tests if applicable
- [x] I’ve documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [x] I’ve applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-extension/blob/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.
runway-github bot added a commit that referenced this issue May 5, 2025
## **Description**

Wow, huge oopsy on my side. Urgh, a little annoyed that I didn't spot
this earlier.

After doing some thorough debugging, I found an infinite state update
loop from the NotificationServicesController.
I didn't find the full context but this controller:

- Listens to `KeyringController:stateChange` events
- When receiving an event we perform a `KeyringController:withKeyring`
action.

Somewhere above (or potentially another controller firing events or
actions?) will then fire another `KeyringController:stateChange` and the
loop repeats. This prevents other state updates and redux updates.

Controller fix: MetaMask/core#5731
However this patch can be an interim for existing releases or until the
CORE package is released.

<details><summary>Screenshot of background logs</summary>

![Screenshot 2025-04-29 at 22 43
03](https://github.com/user-attachments/assets/a1f07672-d471-4e60-8124-e6644df0b5f4)

</details> 

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

## **Related issues**

Fixes: Potentially fixes
#32416
#31422

## **Manual testing steps**

1. Turn on notifications
2. Try dismissing the carousel banners
3. Try switching networks
4. Try the send flow where you send sepolia

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

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [x] I’ve included tests if applicable
- [x] I’ve documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [x] I’ve applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-extension/blob/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.
runway-github bot added a commit that referenced this issue May 5, 2025
## **Description**

Wow, huge oopsy on my side. Urgh, a little annoyed that I didn't spot
this earlier.

After doing some thorough debugging, I found an infinite state update
loop from the NotificationServicesController.
I didn't find the full context but this controller:

- Listens to `KeyringController:stateChange` events
- When receiving an event we perform a `KeyringController:withKeyring`
action.

Somewhere above (or potentially another controller firing events or
actions?) will then fire another `KeyringController:stateChange` and the
loop repeats. This prevents other state updates and redux updates.

Controller fix: MetaMask/core#5731
However this patch can be an interim for existing releases or until the
CORE package is released.

<details><summary>Screenshot of background logs</summary>

![Screenshot 2025-04-29 at 22 43
03](https://github.com/user-attachments/assets/a1f07672-d471-4e60-8124-e6644df0b5f4)

</details> 

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

## **Related issues**

Fixes: Potentially fixes
#32416
#31422

## **Manual testing steps**

1. Turn on notifications
2. Try dismissing the carousel banners
3. Try switching networks
4. Try the send flow where you send sepolia

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

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [x] I’ve included tests if applicable
- [x] I’ve documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [x] I’ve applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-extension/blob/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.
runway-github bot added a commit that referenced this issue May 5, 2025
## **Description**

Wow, huge oopsy on my side. Urgh, a little annoyed that I didn't spot
this earlier.

After doing some thorough debugging, I found an infinite state update
loop from the NotificationServicesController.
I didn't find the full context but this controller:

- Listens to `KeyringController:stateChange` events
- When receiving an event we perform a `KeyringController:withKeyring`
action.

Somewhere above (or potentially another controller firing events or
actions?) will then fire another `KeyringController:stateChange` and the
loop repeats. This prevents other state updates and redux updates.

Controller fix: MetaMask/core#5731
However this patch can be an interim for existing releases or until the
CORE package is released.

<details><summary>Screenshot of background logs</summary>

![Screenshot 2025-04-29 at 22 43
03](https://github.com/user-attachments/assets/a1f07672-d471-4e60-8124-e6644df0b5f4)

</details> 

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

## **Related issues**

Fixes: Potentially fixes
#32416
#31422

## **Manual testing steps**

1. Turn on notifications
2. Try dismissing the carousel banners
3. Try switching networks
4. Try the send flow where you send sepolia

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

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [x] I’ve included tests if applicable
- [x] I’ve documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [x] I’ve applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-extension/blob/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.
runway-github bot added a commit that referenced this issue May 5, 2025
## **Description**

Wow, huge oopsy on my side. Urgh, a little annoyed that I didn't spot
this earlier.

After doing some thorough debugging, I found an infinite state update
loop from the NotificationServicesController.
I didn't find the full context but this controller:

- Listens to `KeyringController:stateChange` events
- When receiving an event we perform a `KeyringController:withKeyring`
action.

Somewhere above (or potentially another controller firing events or
actions?) will then fire another `KeyringController:stateChange` and the
loop repeats. This prevents other state updates and redux updates.

Controller fix: MetaMask/core#5731
However this patch can be an interim for existing releases or until the
CORE package is released.

<details><summary>Screenshot of background logs</summary>

![Screenshot 2025-04-29 at 22 43
03](https://github.com/user-attachments/assets/a1f07672-d471-4e60-8124-e6644df0b5f4)

</details> 

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

## **Related issues**

Fixes: Potentially fixes
#32416
#31422

## **Manual testing steps**

1. Turn on notifications
2. Try dismissing the carousel banners
3. Try switching networks
4. Try the send flow where you send sepolia

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

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [x] I’ve included tests if applicable
- [x] I’ve documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [x] I’ve applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-extension/blob/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.
runway-github bot added a commit that referenced this issue May 5, 2025
## **Description**

Wow, huge oopsy on my side. Urgh, a little annoyed that I didn't spot
this earlier.

After doing some thorough debugging, I found an infinite state update
loop from the NotificationServicesController.
I didn't find the full context but this controller:

- Listens to `KeyringController:stateChange` events
- When receiving an event we perform a `KeyringController:withKeyring`
action.

Somewhere above (or potentially another controller firing events or
actions?) will then fire another `KeyringController:stateChange` and the
loop repeats. This prevents other state updates and redux updates.

Controller fix: MetaMask/core#5731
However this patch can be an interim for existing releases or until the
CORE package is released.

<details><summary>Screenshot of background logs</summary>

![Screenshot 2025-04-29 at 22 43
03](https://github.com/user-attachments/assets/a1f07672-d471-4e60-8124-e6644df0b5f4)

</details> 

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

## **Related issues**

Fixes: Potentially fixes
#32416
#31422

## **Manual testing steps**

1. Turn on notifications
2. Try dismissing the carousel banners
3. Try switching networks
4. Try the send flow where you send sepolia

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

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [x] I’ve included tests if applicable
- [x] I’ve documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [x] I’ve applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-extension/blob/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.
runway-github bot added a commit that referenced this issue May 5, 2025
## **Description**

Wow, huge oopsy on my side. Urgh, a little annoyed that I didn't spot
this earlier.

After doing some thorough debugging, I found an infinite state update
loop from the NotificationServicesController.
I didn't find the full context but this controller:

- Listens to `KeyringController:stateChange` events
- When receiving an event we perform a `KeyringController:withKeyring`
action.

Somewhere above (or potentially another controller firing events or
actions?) will then fire another `KeyringController:stateChange` and the
loop repeats. This prevents other state updates and redux updates.

Controller fix: MetaMask/core#5731
However this patch can be an interim for existing releases or until the
CORE package is released.

<details><summary>Screenshot of background logs</summary>

![Screenshot 2025-04-29 at 22 43
03](https://github.com/user-attachments/assets/a1f07672-d471-4e60-8124-e6644df0b5f4)

</details> 

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

## **Related issues**

Fixes: Potentially fixes
#32416
#31422

## **Manual testing steps**

1. Turn on notifications
2. Try dismissing the carousel banners
3. Try switching networks
4. Try the send flow where you send sepolia

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

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [x] I’ve included tests if applicable
- [x] I’ve documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [x] I’ve applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-extension/blob/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.
runway-github bot added a commit that referenced this issue May 5, 2025
## **Description**

Wow, huge oopsy on my side. Urgh, a little annoyed that I didn't spot
this earlier.

After doing some thorough debugging, I found an infinite state update
loop from the NotificationServicesController.
I didn't find the full context but this controller:

- Listens to `KeyringController:stateChange` events
- When receiving an event we perform a `KeyringController:withKeyring`
action.

Somewhere above (or potentially another controller firing events or
actions?) will then fire another `KeyringController:stateChange` and the
loop repeats. This prevents other state updates and redux updates.

Controller fix: MetaMask/core#5731
However this patch can be an interim for existing releases or until the
CORE package is released.

<details><summary>Screenshot of background logs</summary>

![Screenshot 2025-04-29 at 22 43
03](https://github.com/user-attachments/assets/a1f07672-d471-4e60-8124-e6644df0b5f4)

</details> 

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

## **Related issues**

Fixes: Potentially fixes
#32416
#31422

## **Manual testing steps**

1. Turn on notifications
2. Try dismissing the carousel banners
3. Try switching networks
4. Try the send flow where you send sepolia

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

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [x] I’ve included tests if applicable
- [x] I’ve documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [x] I’ve applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-extension/blob/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.
runway-github bot added a commit that referenced this issue May 5, 2025
## **Description**

Wow, huge oopsy on my side. Urgh, a little annoyed that I didn't spot
this earlier.

After doing some thorough debugging, I found an infinite state update
loop from the NotificationServicesController.
I didn't find the full context but this controller:

- Listens to `KeyringController:stateChange` events
- When receiving an event we perform a `KeyringController:withKeyring`
action.

Somewhere above (or potentially another controller firing events or
actions?) will then fire another `KeyringController:stateChange` and the
loop repeats. This prevents other state updates and redux updates.

Controller fix: MetaMask/core#5731
However this patch can be an interim for existing releases or until the
CORE package is released.

<details><summary>Screenshot of background logs</summary>

![Screenshot 2025-04-29 at 22 43
03](https://github.com/user-attachments/assets/a1f07672-d471-4e60-8124-e6644df0b5f4)

</details> 

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

## **Related issues**

Fixes: Potentially fixes
#32416
#31422

## **Manual testing steps**

1. Turn on notifications
2. Try dismissing the carousel banners
3. Try switching networks
4. Try the send flow where you send sepolia

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

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [x] I’ve included tests if applicable
- [x] I’ve documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [x] I’ve applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-extension/blob/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.
runway-github bot added a commit that referenced this issue May 5, 2025
## **Description**

Wow, huge oopsy on my side. Urgh, a little annoyed that I didn't spot
this earlier.

After doing some thorough debugging, I found an infinite state update
loop from the NotificationServicesController.
I didn't find the full context but this controller:

- Listens to `KeyringController:stateChange` events
- When receiving an event we perform a `KeyringController:withKeyring`
action.

Somewhere above (or potentially another controller firing events or
actions?) will then fire another `KeyringController:stateChange` and the
loop repeats. This prevents other state updates and redux updates.

Controller fix: MetaMask/core#5731
However this patch can be an interim for existing releases or until the
CORE package is released.

<details><summary>Screenshot of background logs</summary>

![Screenshot 2025-04-29 at 22 43
03](https://github.com/user-attachments/assets/a1f07672-d471-4e60-8124-e6644df0b5f4)

</details> 

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

## **Related issues**

Fixes: Potentially fixes
#32416
#31422

## **Manual testing steps**

1. Turn on notifications
2. Try dismissing the carousel banners
3. Try switching networks
4. Try the send flow where you send sepolia

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

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [x] I’ve included tests if applicable
- [x] I’ve documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [x] I’ve applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-extension/blob/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.
runway-github bot added a commit that referenced this issue May 5, 2025
## **Description**

Wow, huge oopsy on my side. Urgh, a little annoyed that I didn't spot
this earlier.

After doing some thorough debugging, I found an infinite state update
loop from the NotificationServicesController.
I didn't find the full context but this controller:

- Listens to `KeyringController:stateChange` events
- When receiving an event we perform a `KeyringController:withKeyring`
action.

Somewhere above (or potentially another controller firing events or
actions?) will then fire another `KeyringController:stateChange` and the
loop repeats. This prevents other state updates and redux updates.

Controller fix: MetaMask/core#5731
However this patch can be an interim for existing releases or until the
CORE package is released.

<details><summary>Screenshot of background logs</summary>

![Screenshot 2025-04-29 at 22 43
03](https://github.com/user-attachments/assets/a1f07672-d471-4e60-8124-e6644df0b5f4)

</details> 

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

## **Related issues**

Fixes: Potentially fixes
#32416
#31422

## **Manual testing steps**

1. Turn on notifications
2. Try dismissing the carousel banners
3. Try switching networks
4. Try the send flow where you send sepolia

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

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [x] I’ve included tests if applicable
- [x] I’ve documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [x] I’ve applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-extension/blob/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.
runway-github bot added a commit that referenced this issue May 5, 2025
## **Description**

Wow, huge oopsy on my side. Urgh, a little annoyed that I didn't spot
this earlier.

After doing some thorough debugging, I found an infinite state update
loop from the NotificationServicesController.
I didn't find the full context but this controller:

- Listens to `KeyringController:stateChange` events
- When receiving an event we perform a `KeyringController:withKeyring`
action.

Somewhere above (or potentially another controller firing events or
actions?) will then fire another `KeyringController:stateChange` and the
loop repeats. This prevents other state updates and redux updates.

Controller fix: MetaMask/core#5731
However this patch can be an interim for existing releases or until the
CORE package is released.

<details><summary>Screenshot of background logs</summary>

![Screenshot 2025-04-29 at 22 43
03](https://github.com/user-attachments/assets/a1f07672-d471-4e60-8124-e6644df0b5f4)

</details> 

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

## **Related issues**

Fixes: Potentially fixes
#32416
#31422

## **Manual testing steps**

1. Turn on notifications
2. Try dismissing the carousel banners
3. Try switching networks
4. Try the send flow where you send sepolia

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

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [x] I’ve included tests if applicable
- [x] I’ve documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [x] I’ve applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-extension/blob/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.
runway-github bot added a commit that referenced this issue May 5, 2025
## **Description**

Wow, huge oopsy on my side. Urgh, a little annoyed that I didn't spot
this earlier.

After doing some thorough debugging, I found an infinite state update
loop from the NotificationServicesController.
I didn't find the full context but this controller:

- Listens to `KeyringController:stateChange` events
- When receiving an event we perform a `KeyringController:withKeyring`
action.

Somewhere above (or potentially another controller firing events or
actions?) will then fire another `KeyringController:stateChange` and the
loop repeats. This prevents other state updates and redux updates.

Controller fix: MetaMask/core#5731
However this patch can be an interim for existing releases or until the
CORE package is released.

<details><summary>Screenshot of background logs</summary>

![Screenshot 2025-04-29 at 22 43
03](https://github.com/user-attachments/assets/a1f07672-d471-4e60-8124-e6644df0b5f4)

</details> 

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

## **Related issues**

Fixes: Potentially fixes
#32416
#31422

## **Manual testing steps**

1. Turn on notifications
2. Try dismissing the carousel banners
3. Try switching networks
4. Try the send flow where you send sepolia

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

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [x] I’ve included tests if applicable
- [x] I’ve documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [x] I’ve applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-extension/blob/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.
runway-github bot added a commit that referenced this issue May 5, 2025
## **Description**

Wow, huge oopsy on my side. Urgh, a little annoyed that I didn't spot
this earlier.

After doing some thorough debugging, I found an infinite state update
loop from the NotificationServicesController.
I didn't find the full context but this controller:

- Listens to `KeyringController:stateChange` events
- When receiving an event we perform a `KeyringController:withKeyring`
action.

Somewhere above (or potentially another controller firing events or
actions?) will then fire another `KeyringController:stateChange` and the
loop repeats. This prevents other state updates and redux updates.

Controller fix: MetaMask/core#5731
However this patch can be an interim for existing releases or until the
CORE package is released.

<details><summary>Screenshot of background logs</summary>

![Screenshot 2025-04-29 at 22 43
03](https://github.com/user-attachments/assets/a1f07672-d471-4e60-8124-e6644df0b5f4)

</details> 

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

## **Related issues**

Fixes: Potentially fixes
#32416
#31422

## **Manual testing steps**

1. Turn on notifications
2. Try dismissing the carousel banners
3. Try switching networks
4. Try the send flow where you send sepolia

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

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [x] I’ve included tests if applicable
- [x] I’ve documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [x] I’ve applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-extension/blob/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.
runway-github bot added a commit that referenced this issue May 5, 2025
## **Description**

Wow, huge oopsy on my side. Urgh, a little annoyed that I didn't spot
this earlier.

After doing some thorough debugging, I found an infinite state update
loop from the NotificationServicesController.
I didn't find the full context but this controller:

- Listens to `KeyringController:stateChange` events
- When receiving an event we perform a `KeyringController:withKeyring`
action.

Somewhere above (or potentially another controller firing events or
actions?) will then fire another `KeyringController:stateChange` and the
loop repeats. This prevents other state updates and redux updates.

Controller fix: MetaMask/core#5731
However this patch can be an interim for existing releases or until the
CORE package is released.

<details><summary>Screenshot of background logs</summary>

![Screenshot 2025-04-29 at 22 43
03](https://github.com/user-attachments/assets/a1f07672-d471-4e60-8124-e6644df0b5f4)

</details> 

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

## **Related issues**

Fixes: Potentially fixes
#32416
#31422

## **Manual testing steps**

1. Turn on notifications
2. Try dismissing the carousel banners
3. Try switching networks
4. Try the send flow where you send sepolia

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

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [x] I’ve included tests if applicable
- [x] I’ve documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [x] I’ve applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-extension/blob/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.
runway-github bot added a commit that referenced this issue May 5, 2025
## **Description**

Wow, huge oopsy on my side. Urgh, a little annoyed that I didn't spot
this earlier.

After doing some thorough debugging, I found an infinite state update
loop from the NotificationServicesController.
I didn't find the full context but this controller:

- Listens to `KeyringController:stateChange` events
- When receiving an event we perform a `KeyringController:withKeyring`
action.

Somewhere above (or potentially another controller firing events or
actions?) will then fire another `KeyringController:stateChange` and the
loop repeats. This prevents other state updates and redux updates.

Controller fix: MetaMask/core#5731
However this patch can be an interim for existing releases or until the
CORE package is released.

<details><summary>Screenshot of background logs</summary>

![Screenshot 2025-04-29 at 22 43
03](https://github.com/user-attachments/assets/a1f07672-d471-4e60-8124-e6644df0b5f4)

</details> 

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

## **Related issues**

Fixes: Potentially fixes
#32416
#31422

## **Manual testing steps**

1. Turn on notifications
2. Try dismissing the carousel banners
3. Try switching networks
4. Try the send flow where you send sepolia

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

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [x] I’ve included tests if applicable
- [x] I’ve documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [x] I’ve applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-extension/blob/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.
runway-github bot added a commit that referenced this issue May 5, 2025
## **Description**

Wow, huge oopsy on my side. Urgh, a little annoyed that I didn't spot
this earlier.

After doing some thorough debugging, I found an infinite state update
loop from the NotificationServicesController.
I didn't find the full context but this controller:

- Listens to `KeyringController:stateChange` events
- When receiving an event we perform a `KeyringController:withKeyring`
action.

Somewhere above (or potentially another controller firing events or
actions?) will then fire another `KeyringController:stateChange` and the
loop repeats. This prevents other state updates and redux updates.

Controller fix: MetaMask/core#5731
However this patch can be an interim for existing releases or until the
CORE package is released.

<details><summary>Screenshot of background logs</summary>

![Screenshot 2025-04-29 at 22 43
03](https://github.com/user-attachments/assets/a1f07672-d471-4e60-8124-e6644df0b5f4)

</details> 

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

## **Related issues**

Fixes: Potentially fixes
#32416
#31422

## **Manual testing steps**

1. Turn on notifications
2. Try dismissing the carousel banners
3. Try switching networks
4. Try the send flow where you send sepolia

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

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [x] I’ve included tests if applicable
- [x] I’ve documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [x] I’ve applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-extension/blob/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.
runway-github bot added a commit that referenced this issue May 5, 2025
## **Description**

Wow, huge oopsy on my side. Urgh, a little annoyed that I didn't spot
this earlier.

After doing some thorough debugging, I found an infinite state update
loop from the NotificationServicesController.
I didn't find the full context but this controller:

- Listens to `KeyringController:stateChange` events
- When receiving an event we perform a `KeyringController:withKeyring`
action.

Somewhere above (or potentially another controller firing events or
actions?) will then fire another `KeyringController:stateChange` and the
loop repeats. This prevents other state updates and redux updates.

Controller fix: MetaMask/core#5731
However this patch can be an interim for existing releases or until the
CORE package is released.

<details><summary>Screenshot of background logs</summary>

![Screenshot 2025-04-29 at 22 43
03](https://github.com/user-attachments/assets/a1f07672-d471-4e60-8124-e6644df0b5f4)

</details> 

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

## **Related issues**

Fixes: Potentially fixes
#32416
#31422

## **Manual testing steps**

1. Turn on notifications
2. Try dismissing the carousel banners
3. Try switching networks
4. Try the send flow where you send sepolia

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

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [x] I’ve included tests if applicable
- [x] I’ve documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [x] I’ve applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-extension/blob/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.
runway-github bot added a commit that referenced this issue May 5, 2025
## **Description**

Wow, huge oopsy on my side. Urgh, a little annoyed that I didn't spot
this earlier.

After doing some thorough debugging, I found an infinite state update
loop from the NotificationServicesController.
I didn't find the full context but this controller:

- Listens to `KeyringController:stateChange` events
- When receiving an event we perform a `KeyringController:withKeyring`
action.

Somewhere above (or potentially another controller firing events or
actions?) will then fire another `KeyringController:stateChange` and the
loop repeats. This prevents other state updates and redux updates.

Controller fix: MetaMask/core#5731
However this patch can be an interim for existing releases or until the
CORE package is released.

<details><summary>Screenshot of background logs</summary>

![Screenshot 2025-04-29 at 22 43
03](https://github.com/user-attachments/assets/a1f07672-d471-4e60-8124-e6644df0b5f4)

</details> 

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

## **Related issues**

Fixes: Potentially fixes
#32416
#31422

## **Manual testing steps**

1. Turn on notifications
2. Try dismissing the carousel banners
3. Try switching networks
4. Try the send flow where you send sepolia

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

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [x] I’ve included tests if applicable
- [x] I’ve documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [x] I’ve applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-extension/blob/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.
runway-github bot added a commit that referenced this issue May 5, 2025
## **Description**

Wow, huge oopsy on my side. Urgh, a little annoyed that I didn't spot
this earlier.

After doing some thorough debugging, I found an infinite state update
loop from the NotificationServicesController.
I didn't find the full context but this controller:

- Listens to `KeyringController:stateChange` events
- When receiving an event we perform a `KeyringController:withKeyring`
action.

Somewhere above (or potentially another controller firing events or
actions?) will then fire another `KeyringController:stateChange` and the
loop repeats. This prevents other state updates and redux updates.

Controller fix: MetaMask/core#5731
However this patch can be an interim for existing releases or until the
CORE package is released.

<details><summary>Screenshot of background logs</summary>

![Screenshot 2025-04-29 at 22 43
03](https://github.com/user-attachments/assets/a1f07672-d471-4e60-8124-e6644df0b5f4)

</details> 

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

## **Related issues**

Fixes: Potentially fixes
#32416
#31422

## **Manual testing steps**

1. Turn on notifications
2. Try dismissing the carousel banners
3. Try switching networks
4. Try the send flow where you send sepolia

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

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [x] I’ve included tests if applicable
- [x] I’ve documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [x] I’ve applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-extension/blob/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.
@Prithpal-Sooriya
Copy link
Contributor

@sleepytanya I think this was similar to this issue: #32416
It has been resolved in #32391

Are we okay to close this issue?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
regression-RC-12.16.0 Regression bug that was found in release candidate (RC) for release 12.16.0 Sev2-normal Normal severity; minor loss of service or inconvenience. team-assets type-bug Something isn't working
Projects
Status: To be fixed
Status: To be triaged
Development

No branches or pull requests

2 participants