mirror of
https://github.com/MetaMask/core.git
synced 2026-04-26 14:40:11 +08:00
This monorepo is a collection of packages used across multiple MetaMask clients
- TypeScript 99%
- JavaScript 0.7%
- jsonc 0.2%
- Shell 0.1%
## 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
|
||
|---|---|---|
| .cursor | ||
| .github | ||
| .yarn/plugins/@yarnpkg | ||
| docs | ||
| packages | ||
| scripts | ||
| tests | ||
| types | ||
| .depcheckrc.yml | ||
| .editorconfig | ||
| .gitattributes | ||
| .gitignore | ||
| .nvmrc | ||
| .oxfmtrc.json | ||
| .prettierrc.js | ||
| .yarnrc.yml | ||
| AGENTS.md | ||
| CLAUDE.md | ||
| eslint-suppressions.json | ||
| eslint.config.mjs | ||
| jest.config.packages.js | ||
| jest.config.scripts.js | ||
| package.json | ||
| README.md | ||
| release.config.json | ||
| teams.json | ||
| tsconfig.base.json | ||
| tsconfig.build.json | ||
| tsconfig.json | ||
| tsconfig.packages.build.json | ||
| tsconfig.packages.json | ||
| tsconfig.scripts.json | ||
| yarn.config.cjs | ||
| yarn.lock | ||
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
@metamask/account-tree-controller@metamask/accounts-controller@metamask/address-book-controller@metamask/ai-controllers@metamask/analytics-controller@metamask/analytics-data-regulation-controller@metamask/announcement-controller@metamask/app-metadata-controller@metamask/approval-controller@metamask/assets-controller@metamask/assets-controllers@metamask/authenticated-user-storage@metamask/base-controller@metamask/base-data-service@metamask/bridge-controller@metamask/bridge-status-controller@metamask/build-utils@metamask/chain-agnostic-permission@metamask/chomp-api-service@metamask/claims-controller@metamask/client-controller@metamask/compliance-controller@metamask/composable-controller@metamask/config-registry-controller@metamask/connectivity-controller@metamask/controller-utils@metamask/core-backend@metamask/delegation-controller@metamask/earn-controller@metamask/eip-5792-middleware@metamask/eip-7702-internal-rpc-middleware@metamask/eip1193-permission-middleware@metamask/ens-controller@metamask/eth-block-tracker@metamask/eth-json-rpc-middleware@metamask/eth-json-rpc-provider@metamask/foundryup@metamask/gas-fee-controller@metamask/gator-permissions-controller@metamask/geolocation-controller@metamask/json-rpc-engine@metamask/json-rpc-middleware-stream@metamask/keyring-controller@metamask/logging-controller@metamask/message-manager@metamask/messenger@metamask/messenger-cli@metamask/money-account-balance-service@metamask/money-account-controller@metamask/money-account-upgrade-controller@metamask/multichain-account-service@metamask/multichain-api-middleware@metamask/multichain-network-controller@metamask/multichain-transactions-controller@metamask/name-controller@metamask/network-controller@metamask/network-enablement-controller@metamask/notification-services-controller@metamask/permission-controller@metamask/permission-log-controller@metamask/perps-controller@metamask/phishing-controller@metamask/polling-controller@metamask/preferences-controller@metamask/profile-metrics-controller@metamask/profile-sync-controller@metamask/ramps-controller@metamask/rate-limit-controller@metamask/react-data-query@metamask/remote-feature-flag-controller@metamask/sample-controllers@metamask/seedless-onboarding-controller@metamask/selected-network-controller@metamask/shield-controller@metamask/signature-controller@metamask/social-controllers@metamask/storage-service@metamask/subscription-controller@metamask/transaction-controller@metamask/transaction-pay-controller@metamask/user-operation-controller
%%{ 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.)