Skip to content

fix(network-connection-banner-controller): subscribe to ClientController:stateChange - #9893

Merged
cryptodev-2s merged 5 commits into
mainfrom
fix/banner-controller-client-state-change-event
Aug 17, 2026
Merged

fix(network-connection-banner-controller): subscribe to ClientController:stateChange#9893
cryptodev-2s merged 5 commits into
mainfrom
fix/banner-controller-client-state-change-event

Conversation

@cryptodev-2s

@cryptodev-2s cryptodev-2s commented Aug 17, 2026

Copy link
Copy Markdown
Contributor

Explanation

NetworkConnectionBannerController subscribes to ClientController:stateChanged using an event type it defines locally. @metamask/client-controller only declares and exports ClientController:stateChange.

It works at runtime because BaseController publishes both names. This is a contract cleanup, not a behavior fix.

Now the controller uses the exported ClientControllerStateChangeEvent, dropping the duplicated local type and matching the three other upstream subscriptions in the file.

Breaking: clients must delegate ClientController:stateChange instead of ClientController:stateChanged, otherwise the controller stops receiving UI open state and the banner never shows. Both extension and mobile need the one line swap.

References

Checklist

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

Note

Cursor Bugbot is generating a summary for commit ec8b9d7. Configure here.

…ler:stateChange

The controller subscribed to ClientController:stateChanged using a locally
defined event type, but @metamask/client-controller only declares and exports
ClientController:stateChange. Clients that delegate the exported event (mobile)
never deliver UI open state, so the controller never starts and the banner never
shows.
@cryptodev-2s
cryptodev-2s requested a review from a team as a code owner August 17, 2026 09:37
@cryptodev-2s cryptodev-2s self-assigned this Aug 17, 2026
Both clients delegate ClientController:stateChanged today and BaseController
publishes both names, so the banner does work at runtime. The defect is the
undeclared event type, not a dead subscription.
@cryptodev-2s

Copy link
Copy Markdown
Contributor Author

@metamaskbot publish-preview

@cryptodev-2s
cryptodev-2s enabled auto-merge August 17, 2026 09:44
this.messenger.subscribe(
'ClientController:stateChanged',
// eslint-disable-next-line no-restricted-syntax -- awaiting upstream :stateChanged migration
'ClientController:stateChange',

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Why is this necessary? Does ClientController not publish both?

@cryptodev-2s cryptodev-2s Aug 17, 2026

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Because it's marked as deprecated.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

If remove it we get

Subscribing to ':stateChange' events is deprecated. Use ':stateChanged' instead.eslint[no-restricted-syntax](https://eslint.org/docs/latest/rules/no-restricted-syntax)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I wasn't referring to the eslint comment. I am curious why we are making this change in the first place and why we can't use :stateChanged in this controller? Is it not published by ClientController?

@cryptodev-2s cryptodev-2s Aug 17, 2026

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

No it's not defined by ClientController because it still uses :stateChange https://github.com/MetaMask/core/blob/main/packages/client-controller/src/ClientController.ts#L82

@github-actions

Copy link
Copy Markdown
Contributor

Preview builds have been published. Learn how to use preview builds in other projects.

Expand for full list of packages and versions.
@metamask-previews/account-tree-controller@8.0.0-preview-c9c49e0
@metamask-previews/accounts-controller@39.1.0-preview-c9c49e0
@metamask-previews/address-book-controller@7.1.2-preview-c9c49e0
@metamask-previews/ai-controllers@0.8.0-preview-c9c49e0
@metamask-previews/analytics-controller@2.0.0-preview-c9c49e0
@metamask-previews/analytics-data-regulation-controller@0.0.0-preview-c9c49e0
@metamask-previews/announcement-controller@8.1.0-preview-c9c49e0
@metamask-previews/app-metadata-controller@2.0.1-preview-c9c49e0
@metamask-previews/approval-controller@9.0.2-preview-c9c49e0
@metamask-previews/assets-controller@13.1.4-preview-c9c49e0
@metamask-previews/assets-controllers@111.1.1-preview-c9c49e0
@metamask-previews/authenticated-user-storage@3.0.1-preview-c9c49e0
@metamask-previews/base-controller@9.1.0-preview-c9c49e0
@metamask-previews/base-data-service@0.1.3-preview-c9c49e0
@metamask-previews/bitcoin-regtest-up@1.0.0-preview-c9c49e0
@metamask-previews/bridge-controller@79.2.0-preview-c9c49e0
@metamask-previews/bridge-status-controller@75.1.0-preview-c9c49e0
@metamask-previews/build-utils@3.0.4-preview-c9c49e0
@metamask-previews/chain-agnostic-permission@1.7.0-preview-c9c49e0
@metamask-previews/chomp-api-service@4.0.0-preview-c9c49e0
@metamask-previews/claims-controller@0.6.0-preview-c9c49e0
@metamask-previews/client-controller@1.0.1-preview-c9c49e0
@metamask-previews/client-utils@2.0.2-preview-c9c49e0
@metamask-previews/compliance-controller@2.1.0-preview-c9c49e0
@metamask-previews/composable-controller@12.0.1-preview-c9c49e0
@metamask-previews/config-registry-controller@2.0.1-preview-c9c49e0
@metamask-previews/connectivity-controller@0.3.0-preview-c9c49e0
@metamask-previews/controller-utils@12.3.0-preview-c9c49e0
@metamask-previews/core-backend@8.1.2-preview-c9c49e0
@metamask-previews/delegation-controller@3.0.2-preview-c9c49e0
@metamask-previews/earn-controller@12.2.5-preview-c9c49e0
@metamask-previews/eip-5792-middleware@3.0.5-preview-c9c49e0
@metamask-previews/eip-7702-internal-rpc-middleware@0.1.1-preview-c9c49e0
@metamask-previews/eip1193-permission-middleware@2.0.1-preview-c9c49e0
@metamask-previews/ens-controller@19.1.6-preview-c9c49e0
@metamask-previews/eth-block-tracker@15.0.1-preview-c9c49e0
@metamask-previews/eth-json-rpc-middleware@24.0.0-preview-c9c49e0
@metamask-previews/eth-json-rpc-provider@6.0.1-preview-c9c49e0
@metamask-previews/foundryup@1.0.1-preview-c9c49e0
@metamask-previews/gas-fee-controller@26.3.1-preview-c9c49e0
@metamask-previews/gator-permissions-controller@5.0.1-preview-c9c49e0
@metamask-previews/geolocation-controller@1.0.0-preview-c9c49e0
@metamask-previews/java-tron-up@1.0.0-preview-c9c49e0
@metamask-previews/json-rpc-engine@10.5.0-preview-c9c49e0
@metamask-previews/json-rpc-middleware-stream@8.0.8-preview-c9c49e0
@metamask-previews/keyring-controller@27.1.1-preview-c9c49e0
@metamask-previews/kyc-controller@0.0.0-preview-c9c49e0
@metamask-previews/local-node-utils@1.0.0-preview-c9c49e0
@metamask-previews/logging-controller@9.0.0-preview-c9c49e0
@metamask-previews/message-manager@14.1.2-preview-c9c49e0
@metamask-previews/messenger@2.0.0-preview-c9c49e0
@metamask-previews/messenger-cli@0.2.0-preview-c9c49e0
@metamask-previews/money-account-api-data-service@0.4.0-preview-c9c49e0
@metamask-previews/money-account-balance-service@2.4.1-preview-c9c49e0
@metamask-previews/money-account-controller@1.0.0-preview-c9c49e0
@metamask-previews/money-account-upgrade-controller@3.0.1-preview-c9c49e0
@metamask-previews/money-account-utils@1.1.0-preview-c9c49e0
@metamask-previews/multichain-account-service@13.0.2-preview-c9c49e0
@metamask-previews/multichain-api-middleware@4.0.2-preview-c9c49e0
@metamask-previews/multichain-network-controller@3.2.3-preview-c9c49e0
@metamask-previews/multichain-transactions-controller@7.1.2-preview-c9c49e0
@metamask-previews/name-controller@9.1.2-preview-c9c49e0
@metamask-previews/network-connection-banner-controller@0.1.2-preview-c9c49e0
@metamask-previews/network-controller@35.0.1-preview-c9c49e0
@metamask-previews/network-enablement-controller@6.0.3-preview-c9c49e0
@metamask-previews/notification-services-controller@26.0.1-preview-c9c49e0
@metamask-previews/passkey-controller@3.0.0-preview-c9c49e0
@metamask-previews/permission-controller@13.1.1-preview-c9c49e0
@metamask-previews/permission-log-controller@5.1.0-preview-c9c49e0
@metamask-previews/perps-controller@12.0.0-preview-c9c49e0
@metamask-previews/phishing-controller@17.3.1-preview-c9c49e0
@metamask-previews/platform-api-docs@0.0.0-preview-c9c49e0
@metamask-previews/polling-controller@16.0.9-preview-c9c49e0
@metamask-previews/preferences-controller@23.1.0-preview-c9c49e0
@metamask-previews/profile-metrics-controller@4.0.3-preview-c9c49e0
@metamask-previews/profile-sync-controller@29.0.0-preview-c9c49e0
@metamask-previews/ramps-controller@20.0.0-preview-c9c49e0
@metamask-previews/rate-limit-controller@7.0.1-preview-c9c49e0
@metamask-previews/react-data-query@0.2.2-preview-c9c49e0
@metamask-previews/remote-feature-flag-controller@5.0.0-preview-c9c49e0
@metamask-previews/sample-controllers@5.0.4-preview-c9c49e0
@metamask-previews/seedless-onboarding-controller@10.1.1-preview-c9c49e0
@metamask-previews/selected-network-controller@26.1.6-preview-c9c49e0
@metamask-previews/sentinel-api-service@1.0.0-preview-c9c49e0
@metamask-previews/shield-controller@6.0.0-preview-c9c49e0
@metamask-previews/signature-controller@39.2.9-preview-c9c49e0
@metamask-previews/smart-transactions-controller@25.1.0-preview-c9c49e0
@metamask-previews/snap-account-service@2.1.2-preview-c9c49e0
@metamask-previews/social-controllers@2.7.1-preview-c9c49e0
@metamask-previews/solana-test-validator-up@1.0.0-preview-c9c49e0
@metamask-previews/stellar-quickstart-up@0.0.0-preview-c9c49e0
@metamask-previews/storage-service@1.0.2-preview-c9c49e0
@metamask-previews/subscription-controller@7.0.0-preview-c9c49e0
@metamask-previews/transaction-controller@69.5.2-preview-c9c49e0
@metamask-previews/transaction-pay-controller@26.3.0-preview-c9c49e0
@metamask-previews/user-operation-controller@41.2.8-preview-c9c49e0
@metamask-previews/wallet@10.0.0-preview-c9c49e0
@metamask-previews/wallet-cli@0.0.0-preview-c9c49e0

@cryptodev-2s
cryptodev-2s added this pull request to the merge queue Aug 17, 2026
Merged via the queue into main with commit 2b5ca0d Aug 17, 2026
46 checks passed
@cryptodev-2s
cryptodev-2s deleted the fix/banner-controller-client-state-change-event branch August 17, 2026 10:03
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