Skip to content

fix: NotificationServicesController - check keyring state when using stateChange event #5731

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

Merged

Conversation

Prithpal-Sooriya
Copy link
Contributor

Explanation

Uncovered on extension. I haven't pieced all the moving parts together but notifications essentially perform:

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

Somewhere above (or potentially another controller?) will then fire another KeyringController:stateChange, and we have a infinite loop preventing other redux or state updates.

Now we will check the size of the keyring to better assume if accounts have been added or removed.

References

Changelog

Checklist

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

@Prithpal-Sooriya Prithpal-Sooriya requested a review from a team as a code owner April 29, 2025 22:32
@Prithpal-Sooriya Prithpal-Sooriya force-pushed the fix/infinite-notification-subscription-fire-events branch from 8ec0eeb to d376008 Compare April 29, 2025 22:36
@Prithpal-Sooriya Prithpal-Sooriya requested a review from a team as a code owner April 29, 2025 22:36
@Prithpal-Sooriya Prithpal-Sooriya enabled auto-merge (squash) April 30, 2025 18:04
@Prithpal-Sooriya Prithpal-Sooriya merged commit 2bc47f8 into main Apr 30, 2025
202 checks passed
@Prithpal-Sooriya Prithpal-Sooriya deleted the fix/infinite-notification-subscription-fire-events branch April 30, 2025 18:11
github-merge-queue bot pushed a commit to MetaMask/metamask-extension that referenced this pull request Apr 30, 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.
github-merge-queue bot pushed a commit to MetaMask/metamask-extension that referenced this pull request Apr 30, 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.
github-merge-queue bot pushed a commit to MetaMask/metamask-extension that referenced this pull request 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.
github-merge-queue bot pushed a commit to MetaMask/metamask-extension that referenced this pull request 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 to MetaMask/metamask-extension that referenced this pull request 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 to MetaMask/metamask-extension that referenced this pull request 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 to MetaMask/metamask-extension that referenced this pull request 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 to MetaMask/metamask-extension that referenced this pull request 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 to MetaMask/metamask-extension that referenced this pull request 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 to MetaMask/metamask-extension that referenced this pull request 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 to MetaMask/metamask-extension that referenced this pull request 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 to MetaMask/metamask-extension that referenced this pull request 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 to MetaMask/metamask-extension that referenced this pull request 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 to MetaMask/metamask-extension that referenced this pull request 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 to MetaMask/metamask-extension that referenced this pull request 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.
DDDDDanica pushed a commit to MetaMask/metamask-extension that referenced this pull request 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 to MetaMask/metamask-extension that referenced this pull request 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 to MetaMask/metamask-extension that referenced this pull request 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 to MetaMask/metamask-extension that referenced this pull request 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 to MetaMask/metamask-extension that referenced this pull request 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 to MetaMask/metamask-extension that referenced this pull request 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 to MetaMask/metamask-extension that referenced this pull request 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 to MetaMask/metamask-extension that referenced this pull request 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 to MetaMask/metamask-extension that referenced this pull request 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 to MetaMask/metamask-extension that referenced this pull request 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 to MetaMask/metamask-extension that referenced this pull request 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 to MetaMask/metamask-extension that referenced this pull request 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 to MetaMask/metamask-extension that referenced this pull request 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 to MetaMask/metamask-extension that referenced this pull request 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 to MetaMask/metamask-extension that referenced this pull request 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 to MetaMask/metamask-extension that referenced this pull request 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 to MetaMask/metamask-extension that referenced this pull request 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 to MetaMask/metamask-extension that referenced this pull request 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 to MetaMask/metamask-extension that referenced this pull request 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 to MetaMask/metamask-extension that referenced this pull request 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 to MetaMask/metamask-extension that referenced this pull request 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 to MetaMask/metamask-extension that referenced this pull request 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 to MetaMask/metamask-extension that referenced this pull request 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 to MetaMask/metamask-extension that referenced this pull request 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 to MetaMask/metamask-extension that referenced this pull request 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 to MetaMask/metamask-extension that referenced this pull request 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 to MetaMask/metamask-extension that referenced this pull request 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 to MetaMask/metamask-extension that referenced this pull request 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 to MetaMask/metamask-extension that referenced this pull request 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 to MetaMask/metamask-extension that referenced this pull request 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 to MetaMask/metamask-extension that referenced this pull request 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.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants