This monorepo is a collection of packages used across multiple MetaMask clients
  • TypeScript 99%
  • JavaScript 0.7%
  • jsonc 0.2%
  • Shell 0.1%
Find a file
Erik Marks bd5249d64b
refactor(permission-controller)!: Add messenger alternative to restricted method hooks (#8551)
## Explanation

Adds a `messenger` option to permission specification builders as an
alternative to `methodHooks`, aligning spec builders with the
messenger-based method middleware introduced in #8506. Restricted-method
specs can now declare the root-messenger actions they need via
`actionNames` and consume a minimally-scoped `Messenger`.

Incidentally, also removes the `factoryHooks` and `validatorHooks`
fields from the spec builder surface. Both of these were unused in
practice.

## References

- Related to #8506
- Preview build PRs:
  - https://github.com/MetaMask/metamask-extension/pull/42128
- Extension CI failing as of merge due to unrelated problems, but
succeeds when testing manually.
  - https://github.com/MetaMask/metamask-mobile/pull/29343
  - https://github.com/MetaMask/snaps/pull/3969

## Checklist

- [x] I've updated the test suite for new or updated code as appropriate
- [x] I've updated documentation (JSDoc, Markdown, etc.) for new or
updated code as appropriate
- [x] I've communicated my changes to consumers by [updating changelogs
for packages I've
changed](https://github.com/MetaMask/core/tree/main/docs/processes/updating-changelogs.md)
- [x] I've introduced [breaking
changes](https://github.com/MetaMask/core/tree/main/docs/processes/breaking-changes.md)
in this PR and have prepared draft pull requests for clients and
consumer packages to resolve them

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **Medium Risk**
> Breaking type-surface changes to permission specification builders
(removing `factoryHooks`/`validatorHooks` and adding optional scoped
`messenger`) may require downstream updates; new messenger delegation
logic could impact how restricted-method specs invoke host actions.
> 
> **Overview**
> Restricted-method permission specification builders can now receive an
optional scoped `messenger` (constructed from spec-declared
`actionNames`) as an alternative to relying on `methodHooks`, enabling
specs to call only explicitly-delegated host actions.
> 
> Introduces `createRestrictedMethodMessenger` (exported from the
package) to create a child `Messenger` with a minimal delegated action
surface, and adds tests covering delegation behavior and the new builder
option. **BREAKING:** removes `factoryHooks`, `validatorHooks`, and
related export fields from the permission specification builder API
surface.
> 
> <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit
1e2fe74a0d. Bugbot is set up for automated
code reviews on this repo. Configure
[here](https://www.cursor.com/dashboard/bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

---------

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
2026-04-24 19:09:53 +00:00
.cursor Add support for Claude Code and Bugbot (#8139) 2026-03-16 19:47:56 +00:00
.github ci: Remove concurrency config for update changelogs workflow (#8563) 2026-04-23 12:13:58 +00:00
.yarn/plugins/@yarnpkg Replace tsup with ts-bridge (#4648) 2024-09-16 11:00:15 +02:00
docs Add guideline for defining the name of a controller (#8528) 2026-04-23 14:32:53 +00:00
packages refactor(permission-controller)!: Add messenger alternative to restricted method hooks (#8551) 2026-04-24 19:09:53 +00:00
scripts chore: Enable Oxfmt for generating method action types files (#8498) 2026-04-16 21:30:26 +00:00
tests refactor(transaction-controller): encapsulate provider logic (#8273) 2026-03-27 13:28:33 +00:00
types chore(lint): Fix suppressed ESLint errors in root (#7495) 2025-12-15 14:07:45 +00:00
.depcheckrc.yml chore: migrate Jest from v27 to v29 (#7894) 2026-02-11 01:37:27 +00:00
.editorconfig Keep indent size of 2 for Markdown files (#938) 2022-10-13 11:14:23 -06:00
.gitattributes chore: Use stricter TypeScript configuration for linting (#7280) 2025-12-02 14:10:40 +00:00
.gitignore refactor(transaction-controller): encapsulate provider logic (#8273) 2026-03-27 13:28:33 +00:00
.nvmrc Revert "chore: Update .nvmrc to Node.js version v24.7.0" (#6969) 2025-10-27 21:19:14 +00:00
.oxfmtrc.json chore: Enable Oxfmt for generating method action types files (#8498) 2026-04-16 21:30:26 +00:00
.prettierrc.js chore: Replace Prettier with Oxfmt (#8434) 2026-04-13 13:48:18 -06:00
.yarnrc.yml chore(dev-deps): Bump @ts-bridge/cli from ^0.6.1 to ^0.6.4 (#7039) 2025-11-03 13:49:59 +01:00
AGENTS.md Deprecate <ControllerName>:stateChange in favor of :stateChanged (#8187) 2026-04-03 07:01:54 +00:00
CLAUDE.md Add support for Claude Code and Bugbot (#8139) 2026-03-16 19:47:56 +00:00
eslint-suppressions.json fix native asset detection (#8483) 2026-04-23 08:16:43 +00:00
eslint.config.mjs chore: Enable Oxfmt for generating method action types files (#8498) 2026-04-16 21:30:26 +00:00
jest.config.packages.js feat(messenger): add generate-action-types CLI tool as subpath export (#8264) 2026-04-01 09:49:46 +00:00
jest.config.scripts.js chore: migrate Jest from v27 to v29 (#7894) 2026-02-11 01:37:27 +00:00
package.json Release/935.0.0 (#8578) 2026-04-24 14:09:38 +00:00
README.md feat: Add createMethodMiddleware function (#8506) 2026-04-22 07:34:55 +00:00
release.config.json Convert to monorepo (#831) 2022-11-11 14:12:22 -07:00
teams.json feat: added authenticated user storage (#8260) 2026-04-20 21:18:31 +00:00
tsconfig.base.json chore: migrate Jest from v27 to v29 (#7894) 2026-02-11 01:37:27 +00:00
tsconfig.build.json feat: added authenticated user storage (#8260) 2026-04-20 21:18:31 +00:00
tsconfig.json feat: added authenticated user storage (#8260) 2026-04-20 21:18:31 +00:00
tsconfig.packages.build.json chore: Use stricter TypeScript configuration for linting (#7280) 2025-12-02 14:10:40 +00:00
tsconfig.packages.json chore: Use stricter TypeScript configuration for linting (#7280) 2025-12-02 14:10:40 +00:00
tsconfig.scripts.json chore: Use stricter TypeScript configuration for linting (#7280) 2025-12-02 14:10:40 +00:00
yarn.config.cjs chore: Replace Prettier with Oxfmt (#8434) 2026-04-13 13:48:18 -06:00
yarn.lock Release 934.0.0 (#8571) 2026-04-23 15:39:37 +00:00

Core Monorepo

This monorepo is a collection of packages used across multiple MetaMask clients (e.g. metamask-extension, metamask-mobile).

Contributing

See the Contributor Documentation for help on:

  • Setting up your development environment
  • Working with the monorepo
  • Testing changes in clients
  • Issuing new releases
  • Creating a new package

Installation/Usage

Each package in this repository has its own README where you can find installation and usage instructions. See packages/ for more.

Packages

%%{ init: { 'flowchart': { 'curve': 'bumpX' } } }%%
graph LR;
linkStyle default opacity:0.5
  account_tree_controller(["@metamask/account-tree-controller"]);
  accounts_controller(["@metamask/accounts-controller"]);
  address_book_controller(["@metamask/address-book-controller"]);
  ai_controllers(["@metamask/ai-controllers"]);
  analytics_controller(["@metamask/analytics-controller"]);
  analytics_data_regulation_controller(["@metamask/analytics-data-regulation-controller"]);
  announcement_controller(["@metamask/announcement-controller"]);
  app_metadata_controller(["@metamask/app-metadata-controller"]);
  approval_controller(["@metamask/approval-controller"]);
  assets_controller(["@metamask/assets-controller"]);
  assets_controllers(["@metamask/assets-controllers"]);
  authenticated_user_storage(["@metamask/authenticated-user-storage"]);
  base_controller(["@metamask/base-controller"]);
  base_data_service(["@metamask/base-data-service"]);
  bridge_controller(["@metamask/bridge-controller"]);
  bridge_status_controller(["@metamask/bridge-status-controller"]);
  build_utils(["@metamask/build-utils"]);
  chain_agnostic_permission(["@metamask/chain-agnostic-permission"]);
  chomp_api_service(["@metamask/chomp-api-service"]);
  claims_controller(["@metamask/claims-controller"]);
  client_controller(["@metamask/client-controller"]);
  compliance_controller(["@metamask/compliance-controller"]);
  composable_controller(["@metamask/composable-controller"]);
  config_registry_controller(["@metamask/config-registry-controller"]);
  connectivity_controller(["@metamask/connectivity-controller"]);
  controller_utils(["@metamask/controller-utils"]);
  core_backend(["@metamask/core-backend"]);
  delegation_controller(["@metamask/delegation-controller"]);
  earn_controller(["@metamask/earn-controller"]);
  eip_5792_middleware(["@metamask/eip-5792-middleware"]);
  eip_7702_internal_rpc_middleware(["@metamask/eip-7702-internal-rpc-middleware"]);
  eip1193_permission_middleware(["@metamask/eip1193-permission-middleware"]);
  ens_controller(["@metamask/ens-controller"]);
  eth_block_tracker(["@metamask/eth-block-tracker"]);
  eth_json_rpc_middleware(["@metamask/eth-json-rpc-middleware"]);
  eth_json_rpc_provider(["@metamask/eth-json-rpc-provider"]);
  foundryup(["@metamask/foundryup"]);
  gas_fee_controller(["@metamask/gas-fee-controller"]);
  gator_permissions_controller(["@metamask/gator-permissions-controller"]);
  geolocation_controller(["@metamask/geolocation-controller"]);
  json_rpc_engine(["@metamask/json-rpc-engine"]);
  json_rpc_middleware_stream(["@metamask/json-rpc-middleware-stream"]);
  keyring_controller(["@metamask/keyring-controller"]);
  logging_controller(["@metamask/logging-controller"]);
  message_manager(["@metamask/message-manager"]);
  messenger(["@metamask/messenger"]);
  messenger_cli(["@metamask/messenger-cli"]);
  money_account_balance_service(["@metamask/money-account-balance-service"]);
  money_account_controller(["@metamask/money-account-controller"]);
  money_account_upgrade_controller(["@metamask/money-account-upgrade-controller"]);
  multichain_account_service(["@metamask/multichain-account-service"]);
  multichain_api_middleware(["@metamask/multichain-api-middleware"]);
  multichain_network_controller(["@metamask/multichain-network-controller"]);
  multichain_transactions_controller(["@metamask/multichain-transactions-controller"]);
  name_controller(["@metamask/name-controller"]);
  network_controller(["@metamask/network-controller"]);
  network_enablement_controller(["@metamask/network-enablement-controller"]);
  notification_services_controller(["@metamask/notification-services-controller"]);
  permission_controller(["@metamask/permission-controller"]);
  permission_log_controller(["@metamask/permission-log-controller"]);
  perps_controller(["@metamask/perps-controller"]);
  phishing_controller(["@metamask/phishing-controller"]);
  polling_controller(["@metamask/polling-controller"]);
  preferences_controller(["@metamask/preferences-controller"]);
  profile_metrics_controller(["@metamask/profile-metrics-controller"]);
  profile_sync_controller(["@metamask/profile-sync-controller"]);
  ramps_controller(["@metamask/ramps-controller"]);
  rate_limit_controller(["@metamask/rate-limit-controller"]);
  react_data_query(["@metamask/react-data-query"]);
  remote_feature_flag_controller(["@metamask/remote-feature-flag-controller"]);
  sample_controllers(["@metamask/sample-controllers"]);
  seedless_onboarding_controller(["@metamask/seedless-onboarding-controller"]);
  selected_network_controller(["@metamask/selected-network-controller"]);
  shield_controller(["@metamask/shield-controller"]);
  signature_controller(["@metamask/signature-controller"]);
  social_controllers(["@metamask/social-controllers"]);
  storage_service(["@metamask/storage-service"]);
  subscription_controller(["@metamask/subscription-controller"]);
  transaction_controller(["@metamask/transaction-controller"]);
  transaction_pay_controller(["@metamask/transaction-pay-controller"]);
  user_operation_controller(["@metamask/user-operation-controller"]);
  account_tree_controller --> accounts_controller;
  account_tree_controller --> base_controller;
  account_tree_controller --> keyring_controller;
  account_tree_controller --> messenger;
  account_tree_controller --> multichain_account_service;
  account_tree_controller --> profile_sync_controller;
  accounts_controller --> base_controller;
  accounts_controller --> keyring_controller;
  accounts_controller --> messenger;
  accounts_controller --> network_controller;
  accounts_controller --> controller_utils;
  address_book_controller --> base_controller;
  address_book_controller --> controller_utils;
  address_book_controller --> messenger;
  ai_controllers --> base_controller;
  ai_controllers --> messenger;
  analytics_controller --> base_controller;
  analytics_controller --> messenger;
  analytics_data_regulation_controller --> base_controller;
  analytics_data_regulation_controller --> controller_utils;
  analytics_data_regulation_controller --> messenger;
  announcement_controller --> base_controller;
  announcement_controller --> messenger;
  app_metadata_controller --> base_controller;
  app_metadata_controller --> messenger;
  approval_controller --> base_controller;
  approval_controller --> messenger;
  assets_controller --> account_tree_controller;
  assets_controller --> accounts_controller;
  assets_controller --> assets_controllers;
  assets_controller --> base_controller;
  assets_controller --> client_controller;
  assets_controller --> controller_utils;
  assets_controller --> core_backend;
  assets_controller --> keyring_controller;
  assets_controller --> messenger;
  assets_controller --> network_controller;
  assets_controller --> network_enablement_controller;
  assets_controller --> permission_controller;
  assets_controller --> phishing_controller;
  assets_controller --> polling_controller;
  assets_controller --> preferences_controller;
  assets_controller --> transaction_controller;
  assets_controllers --> account_tree_controller;
  assets_controllers --> accounts_controller;
  assets_controllers --> approval_controller;
  assets_controllers --> base_controller;
  assets_controllers --> controller_utils;
  assets_controllers --> core_backend;
  assets_controllers --> keyring_controller;
  assets_controllers --> messenger;
  assets_controllers --> multichain_account_service;
  assets_controllers --> network_controller;
  assets_controllers --> network_enablement_controller;
  assets_controllers --> permission_controller;
  assets_controllers --> phishing_controller;
  assets_controllers --> polling_controller;
  assets_controllers --> preferences_controller;
  assets_controllers --> profile_sync_controller;
  assets_controllers --> storage_service;
  assets_controllers --> transaction_controller;
  authenticated_user_storage --> base_data_service;
  authenticated_user_storage --> controller_utils;
  authenticated_user_storage --> messenger;
  base_controller --> messenger;
  base_controller --> json_rpc_engine;
  base_data_service --> controller_utils;
  base_data_service --> messenger;
  bridge_controller --> accounts_controller;
  bridge_controller --> assets_controller;
  bridge_controller --> assets_controllers;
  bridge_controller --> base_controller;
  bridge_controller --> controller_utils;
  bridge_controller --> gas_fee_controller;
  bridge_controller --> messenger;
  bridge_controller --> multichain_network_controller;
  bridge_controller --> network_controller;
  bridge_controller --> polling_controller;
  bridge_controller --> profile_sync_controller;
  bridge_controller --> remote_feature_flag_controller;
  bridge_controller --> transaction_controller;
  bridge_controller --> eth_json_rpc_provider;
  bridge_status_controller --> accounts_controller;
  bridge_status_controller --> base_controller;
  bridge_status_controller --> bridge_controller;
  bridge_status_controller --> controller_utils;
  bridge_status_controller --> gas_fee_controller;
  bridge_status_controller --> keyring_controller;
  bridge_status_controller --> messenger;
  bridge_status_controller --> network_controller;
  bridge_status_controller --> polling_controller;
  bridge_status_controller --> profile_sync_controller;
  bridge_status_controller --> transaction_controller;
  chain_agnostic_permission --> controller_utils;
  chain_agnostic_permission --> permission_controller;
  chomp_api_service --> base_data_service;
  chomp_api_service --> controller_utils;
  chomp_api_service --> messenger;
  claims_controller --> base_controller;
  claims_controller --> controller_utils;
  claims_controller --> keyring_controller;
  claims_controller --> messenger;
  claims_controller --> profile_sync_controller;
  client_controller --> base_controller;
  client_controller --> messenger;
  compliance_controller --> base_controller;
  compliance_controller --> controller_utils;
  compliance_controller --> messenger;
  composable_controller --> base_controller;
  composable_controller --> messenger;
  composable_controller --> json_rpc_engine;
  config_registry_controller --> base_controller;
  config_registry_controller --> controller_utils;
  config_registry_controller --> keyring_controller;
  config_registry_controller --> messenger;
  config_registry_controller --> polling_controller;
  config_registry_controller --> profile_sync_controller;
  config_registry_controller --> remote_feature_flag_controller;
  connectivity_controller --> base_controller;
  connectivity_controller --> messenger;
  core_backend --> accounts_controller;
  core_backend --> controller_utils;
  core_backend --> keyring_controller;
  core_backend --> messenger;
  core_backend --> profile_sync_controller;
  delegation_controller --> base_controller;
  delegation_controller --> keyring_controller;
  delegation_controller --> messenger;
  earn_controller --> account_tree_controller;
  earn_controller --> base_controller;
  earn_controller --> controller_utils;
  earn_controller --> messenger;
  earn_controller --> network_controller;
  earn_controller --> transaction_controller;
  eip_5792_middleware --> messenger;
  eip_5792_middleware --> transaction_controller;
  eip_5792_middleware --> keyring_controller;
  eip_7702_internal_rpc_middleware --> controller_utils;
  eip1193_permission_middleware --> chain_agnostic_permission;
  eip1193_permission_middleware --> controller_utils;
  eip1193_permission_middleware --> json_rpc_engine;
  eip1193_permission_middleware --> permission_controller;
  ens_controller --> base_controller;
  ens_controller --> controller_utils;
  ens_controller --> messenger;
  ens_controller --> network_controller;
  eth_block_tracker --> eth_json_rpc_provider;
  eth_block_tracker --> json_rpc_engine;
  eth_json_rpc_middleware --> eth_block_tracker;
  eth_json_rpc_middleware --> eth_json_rpc_provider;
  eth_json_rpc_middleware --> json_rpc_engine;
  eth_json_rpc_middleware --> message_manager;
  eth_json_rpc_middleware --> network_controller;
  eth_json_rpc_provider --> json_rpc_engine;
  gas_fee_controller --> base_controller;
  gas_fee_controller --> controller_utils;
  gas_fee_controller --> messenger;
  gas_fee_controller --> network_controller;
  gas_fee_controller --> polling_controller;
  gator_permissions_controller --> base_controller;
  gator_permissions_controller --> messenger;
  gator_permissions_controller --> network_controller;
  gator_permissions_controller --> transaction_controller;
  geolocation_controller --> base_controller;
  geolocation_controller --> controller_utils;
  geolocation_controller --> messenger;
  json_rpc_engine --> messenger;
  json_rpc_middleware_stream --> json_rpc_engine;
  keyring_controller --> base_controller;
  keyring_controller --> messenger;
  logging_controller --> base_controller;
  logging_controller --> controller_utils;
  logging_controller --> messenger;
  message_manager --> base_controller;
  message_manager --> controller_utils;
  message_manager --> messenger;
  money_account_balance_service --> base_data_service;
  money_account_balance_service --> controller_utils;
  money_account_balance_service --> messenger;
  money_account_balance_service --> network_controller;
  money_account_controller --> accounts_controller;
  money_account_controller --> base_controller;
  money_account_controller --> keyring_controller;
  money_account_controller --> messenger;
  money_account_upgrade_controller --> base_controller;
  money_account_upgrade_controller --> chomp_api_service;
  money_account_upgrade_controller --> keyring_controller;
  money_account_upgrade_controller --> messenger;
  multichain_account_service --> accounts_controller;
  multichain_account_service --> base_controller;
  multichain_account_service --> keyring_controller;
  multichain_account_service --> messenger;
  multichain_account_service --> controller_utils;
  multichain_api_middleware --> chain_agnostic_permission;
  multichain_api_middleware --> controller_utils;
  multichain_api_middleware --> json_rpc_engine;
  multichain_api_middleware --> network_controller;
  multichain_api_middleware --> permission_controller;
  multichain_api_middleware --> multichain_transactions_controller;
  multichain_network_controller --> accounts_controller;
  multichain_network_controller --> base_controller;
  multichain_network_controller --> controller_utils;
  multichain_network_controller --> messenger;
  multichain_network_controller --> network_controller;
  multichain_network_controller --> keyring_controller;
  multichain_transactions_controller --> accounts_controller;
  multichain_transactions_controller --> base_controller;
  multichain_transactions_controller --> messenger;
  multichain_transactions_controller --> polling_controller;
  multichain_transactions_controller --> keyring_controller;
  name_controller --> base_controller;
  name_controller --> controller_utils;
  name_controller --> messenger;
  network_controller --> base_controller;
  network_controller --> connectivity_controller;
  network_controller --> controller_utils;
  network_controller --> eth_block_tracker;
  network_controller --> eth_json_rpc_middleware;
  network_controller --> eth_json_rpc_provider;
  network_controller --> json_rpc_engine;
  network_controller --> messenger;
  network_enablement_controller --> base_controller;
  network_enablement_controller --> controller_utils;
  network_enablement_controller --> messenger;
  network_enablement_controller --> multichain_network_controller;
  network_enablement_controller --> network_controller;
  network_enablement_controller --> transaction_controller;
  notification_services_controller --> base_controller;
  notification_services_controller --> controller_utils;
  notification_services_controller --> keyring_controller;
  notification_services_controller --> messenger;
  notification_services_controller --> profile_sync_controller;
  permission_controller --> approval_controller;
  permission_controller --> base_controller;
  permission_controller --> controller_utils;
  permission_controller --> json_rpc_engine;
  permission_controller --> messenger;
  permission_log_controller --> base_controller;
  permission_log_controller --> json_rpc_engine;
  permission_log_controller --> messenger;
  perps_controller --> base_controller;
  perps_controller --> controller_utils;
  perps_controller --> messenger;
  perps_controller --> account_tree_controller;
  perps_controller --> geolocation_controller;
  perps_controller --> keyring_controller;
  perps_controller --> network_controller;
  perps_controller --> profile_sync_controller;
  perps_controller --> remote_feature_flag_controller;
  perps_controller --> transaction_controller;
  phishing_controller --> base_controller;
  phishing_controller --> controller_utils;
  phishing_controller --> messenger;
  phishing_controller --> transaction_controller;
  polling_controller --> base_controller;
  polling_controller --> controller_utils;
  polling_controller --> network_controller;
  polling_controller --> messenger;
  preferences_controller --> base_controller;
  preferences_controller --> messenger;
  profile_metrics_controller --> accounts_controller;
  profile_metrics_controller --> base_controller;
  profile_metrics_controller --> controller_utils;
  profile_metrics_controller --> keyring_controller;
  profile_metrics_controller --> messenger;
  profile_metrics_controller --> polling_controller;
  profile_metrics_controller --> profile_sync_controller;
  profile_metrics_controller --> transaction_controller;
  profile_sync_controller --> address_book_controller;
  profile_sync_controller --> base_controller;
  profile_sync_controller --> keyring_controller;
  profile_sync_controller --> messenger;
  ramps_controller --> base_controller;
  ramps_controller --> controller_utils;
  ramps_controller --> messenger;
  rate_limit_controller --> base_controller;
  rate_limit_controller --> messenger;
  react_data_query --> base_data_service;
  remote_feature_flag_controller --> base_controller;
  remote_feature_flag_controller --> controller_utils;
  remote_feature_flag_controller --> messenger;
  sample_controllers --> base_controller;
  sample_controllers --> base_data_service;
  sample_controllers --> messenger;
  sample_controllers --> network_controller;
  sample_controllers --> controller_utils;
  seedless_onboarding_controller --> base_controller;
  seedless_onboarding_controller --> keyring_controller;
  seedless_onboarding_controller --> messenger;
  selected_network_controller --> base_controller;
  selected_network_controller --> json_rpc_engine;
  selected_network_controller --> messenger;
  selected_network_controller --> network_controller;
  selected_network_controller --> permission_controller;
  shield_controller --> base_controller;
  shield_controller --> controller_utils;
  shield_controller --> messenger;
  shield_controller --> signature_controller;
  shield_controller --> transaction_controller;
  signature_controller --> accounts_controller;
  signature_controller --> approval_controller;
  signature_controller --> base_controller;
  signature_controller --> controller_utils;
  signature_controller --> gator_permissions_controller;
  signature_controller --> keyring_controller;
  signature_controller --> logging_controller;
  signature_controller --> messenger;
  signature_controller --> network_controller;
  social_controllers --> base_controller;
  social_controllers --> base_data_service;
  social_controllers --> controller_utils;
  social_controllers --> messenger;
  social_controllers --> profile_sync_controller;
  storage_service --> messenger;
  subscription_controller --> base_controller;
  subscription_controller --> controller_utils;
  subscription_controller --> messenger;
  subscription_controller --> polling_controller;
  subscription_controller --> profile_sync_controller;
  subscription_controller --> transaction_controller;
  transaction_controller --> accounts_controller;
  transaction_controller --> approval_controller;
  transaction_controller --> base_controller;
  transaction_controller --> controller_utils;
  transaction_controller --> core_backend;
  transaction_controller --> gas_fee_controller;
  transaction_controller --> messenger;
  transaction_controller --> network_controller;
  transaction_controller --> remote_feature_flag_controller;
  transaction_controller --> connectivity_controller;
  transaction_controller --> eth_block_tracker;
  transaction_controller --> eth_json_rpc_provider;
  transaction_pay_controller --> assets_controller;
  transaction_pay_controller --> assets_controllers;
  transaction_pay_controller --> base_controller;
  transaction_pay_controller --> bridge_controller;
  transaction_pay_controller --> bridge_status_controller;
  transaction_pay_controller --> controller_utils;
  transaction_pay_controller --> gas_fee_controller;
  transaction_pay_controller --> messenger;
  transaction_pay_controller --> network_controller;
  transaction_pay_controller --> ramps_controller;
  transaction_pay_controller --> remote_feature_flag_controller;
  transaction_pay_controller --> transaction_controller;
  user_operation_controller --> approval_controller;
  user_operation_controller --> base_controller;
  user_operation_controller --> controller_utils;
  user_operation_controller --> gas_fee_controller;
  user_operation_controller --> keyring_controller;
  user_operation_controller --> messenger;
  user_operation_controller --> network_controller;
  user_operation_controller --> polling_controller;
  user_operation_controller --> transaction_controller;
  user_operation_controller --> eth_block_tracker;

(This section may be regenerated at any time by running yarn update-readme-content.)