Skip to content

refactor(transaction-controller): encapsulate provider logic#8273

Open
matthewwalsh0 wants to merge 11 commits intomainfrom
feat/encapsulate-provider-util
Open

refactor(transaction-controller): encapsulate provider logic#8273
matthewwalsh0 wants to merge 11 commits intomainfrom
feat/encapsulate-provider-util

Conversation

@matthewwalsh0
Copy link
Member

@matthewwalsh0 matthewwalsh0 commented Mar 23, 2026

Explanation

Currently, transaction-controller passes ethQuery instances throughout the codebase — into utils, helpers, hooks, and gas flows — to make RPC calls. This couples every layer to EthQuery internals and makes the provider plumbing verbose and fragile.

This PR introduces a utils/provider.ts module with functions including rpcRequest and getProvider, meaning all EthQuery usage is replaced, and all provider logic is encapsulated and callable anywhere with a messenger.

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

Medium Risk
Refactors transaction publishing/gas estimation/pending tracking to replace EthQuery with messenger-driven rpcRequest, which could subtly change RPC call shapes/ordering and networkClientId resolution across many paths.

Overview
Removes @metamask/eth-query and threads provider access through a new utils/provider.ts API (getProvider, rpcRequest, getNetworkClientId, getChainId) so helpers/flows no longer receive or construct EthQuery instances.

Transaction submission, gas estimation/fee flows (including Linea), balance/simulation utilities, batch publishing hooks, and pending transaction tracking are updated to use rpcRequest + networkClientId/chainId resolution via NetworkController messenger actions, and internal helper signatures are adjusted accordingly (e.g., PendingTransactionTracker now takes networkClientId directly).

Tests are updated to mock rpcRequest/provider utilities, account for changed network client ID lookup, and align integration mocks with the updated RPC call sequence; determineTransactionType is no longer exported from the package and the changelog marks this as a breaking removal.

Written by Cursor Bugbot for commit a0caca0. This will update automatically on new commits. Configure here.

@matthewwalsh0 matthewwalsh0 force-pushed the feat/encapsulate-provider-util branch 2 times, most recently from c2ffb95 to 72ca7a5 Compare March 23, 2026 16:14
…ethQuery from transaction-controller

Replace all ethQuery/EthQuery usage with a new rpcRequest() utility that
accepts messenger + chainId/networkClientId + method + params. Any file
can now send RPC requests without passing around ethQuery instances.

- Add utils/provider.ts with rpcRequest() and getProvider() functions
- Migrate all utils, gas-flows, helpers, hooks, and TransactionController
- Update GasFeeFlowRequest type: ethQuery -> networkClientId (BREAKING)
- Update determineTransactionType signature to options object (BREAKING)
- Remove @metamask/eth-query dependency
- Update all test files to match new signatures
@matthewwalsh0 matthewwalsh0 force-pushed the feat/encapsulate-provider-util branch from 72ca7a5 to a7e5332 Compare March 23, 2026 16:15
@matthewwalsh0 matthewwalsh0 changed the title refactor: encapsulate provider logic in transaction-controller, eliminate ethQuery refactor(transaction-controller): encapsulate provider logic Mar 24, 2026
@matthewwalsh0 matthewwalsh0 marked this pull request as ready for review March 24, 2026 23:36
@matthewwalsh0 matthewwalsh0 requested review from a team as code owners March 24, 2026 23:36
@matthewwalsh0
Copy link
Member Author

@metamaskbot publish-preview

@github-actions
Copy link
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@5.0.1-preview-a0caca0c0
@metamask-previews/accounts-controller@37.0.0-preview-a0caca0c0
@metamask-previews/address-book-controller@7.1.0-preview-a0caca0c0
@metamask-previews/ai-controllers@0.5.0-preview-a0caca0c0
@metamask-previews/analytics-controller@1.0.0-preview-a0caca0c0
@metamask-previews/analytics-data-regulation-controller@0.0.0-preview-a0caca0c0
@metamask-previews/announcement-controller@8.0.0-preview-a0caca0c0
@metamask-previews/app-metadata-controller@2.0.0-preview-a0caca0c0
@metamask-previews/approval-controller@9.0.0-preview-a0caca0c0
@metamask-previews/assets-controller@3.0.0-preview-a0caca0c0
@metamask-previews/assets-controllers@101.0.1-preview-a0caca0c0
@metamask-previews/base-controller@9.0.0-preview-a0caca0c0
@metamask-previews/base-data-service@0.0.0-preview-a0caca0c0
@metamask-previews/bridge-controller@69.2.0-preview-a0caca0c0
@metamask-previews/bridge-status-controller@70.0.0-preview-a0caca0c0
@metamask-previews/build-utils@3.0.4-preview-a0caca0c0
@metamask-previews/chain-agnostic-permission@1.4.0-preview-a0caca0c0
@metamask-previews/claims-controller@0.4.3-preview-a0caca0c0
@metamask-previews/client-controller@1.0.0-preview-a0caca0c0
@metamask-previews/compliance-controller@1.0.1-preview-a0caca0c0
@metamask-previews/composable-controller@12.0.0-preview-a0caca0c0
@metamask-previews/config-registry-controller@0.1.1-preview-a0caca0c0
@metamask-previews/connectivity-controller@0.1.0-preview-a0caca0c0
@metamask-previews/controller-utils@11.19.0-preview-a0caca0c0
@metamask-previews/core-backend@6.2.0-preview-a0caca0c0
@metamask-previews/delegation-controller@2.0.2-preview-a0caca0c0
@metamask-previews/earn-controller@11.1.2-preview-a0caca0c0
@metamask-previews/eip-5792-middleware@3.0.1-preview-a0caca0c0
@metamask-previews/eip-7702-internal-rpc-middleware@0.1.0-preview-a0caca0c0
@metamask-previews/eip1193-permission-middleware@1.0.3-preview-a0caca0c0
@metamask-previews/ens-controller@19.1.0-preview-a0caca0c0
@metamask-previews/error-reporting-service@3.0.1-preview-a0caca0c0
@metamask-previews/eth-block-tracker@15.0.1-preview-a0caca0c0
@metamask-previews/eth-json-rpc-middleware@23.1.0-preview-a0caca0c0
@metamask-previews/eth-json-rpc-provider@6.0.0-preview-a0caca0c0
@metamask-previews/foundryup@1.0.1-preview-a0caca0c0
@metamask-previews/gas-fee-controller@26.1.0-preview-a0caca0c0
@metamask-previews/gator-permissions-controller@2.1.1-preview-a0caca0c0
@metamask-previews/geolocation-controller@0.1.1-preview-a0caca0c0
@metamask-previews/json-rpc-engine@10.2.3-preview-a0caca0c0
@metamask-previews/json-rpc-middleware-stream@8.0.8-preview-a0caca0c0
@metamask-previews/keyring-controller@25.1.0-preview-a0caca0c0
@metamask-previews/logging-controller@8.0.0-preview-a0caca0c0
@metamask-previews/message-manager@14.1.0-preview-a0caca0c0
@metamask-previews/messenger@0.3.0-preview-a0caca0c0
@metamask-previews/multichain-account-service@7.1.0-preview-a0caca0c0
@metamask-previews/multichain-api-middleware@1.2.7-preview-a0caca0c0
@metamask-previews/multichain-network-controller@3.0.5-preview-a0caca0c0
@metamask-previews/multichain-transactions-controller@7.0.2-preview-a0caca0c0
@metamask-previews/name-controller@9.1.0-preview-a0caca0c0
@metamask-previews/network-controller@30.0.0-preview-a0caca0c0
@metamask-previews/network-enablement-controller@5.0.0-preview-a0caca0c0
@metamask-previews/notification-services-controller@23.0.0-preview-a0caca0c0
@metamask-previews/permission-controller@12.2.1-preview-a0caca0c0
@metamask-previews/permission-log-controller@5.0.0-preview-a0caca0c0
@metamask-previews/perps-controller@1.3.0-preview-a0caca0c0
@metamask-previews/phishing-controller@17.0.0-preview-a0caca0c0
@metamask-previews/polling-controller@16.0.3-preview-a0caca0c0
@metamask-previews/preferences-controller@23.0.0-preview-a0caca0c0
@metamask-previews/profile-metrics-controller@3.1.1-preview-a0caca0c0
@metamask-previews/profile-sync-controller@28.0.0-preview-a0caca0c0
@metamask-previews/ramps-controller@12.0.1-preview-a0caca0c0
@metamask-previews/rate-limit-controller@7.0.0-preview-a0caca0c0
@metamask-previews/react-data-query@0.0.0-preview-a0caca0c0
@metamask-previews/remote-feature-flag-controller@4.1.0-preview-a0caca0c0
@metamask-previews/sample-controllers@4.0.3-preview-a0caca0c0
@metamask-previews/seedless-onboarding-controller@9.0.0-preview-a0caca0c0
@metamask-previews/selected-network-controller@26.0.3-preview-a0caca0c0
@metamask-previews/shield-controller@5.0.2-preview-a0caca0c0
@metamask-previews/signature-controller@39.1.0-preview-a0caca0c0
@metamask-previews/storage-service@1.0.0-preview-a0caca0c0
@metamask-previews/subscription-controller@6.0.2-preview-a0caca0c0
@metamask-previews/transaction-controller@63.1.0-preview-a0caca0c0
@metamask-previews/transaction-pay-controller@18.0.0-preview-a0caca0c0
@metamask-previews/user-operation-controller@41.1.0-preview-a0caca0c0

Copy link

@cursor cursor bot left a comment

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes and found 2 potential issues.

Fix All in Cursor

Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, have a team admin enable autofix in the Cursor dashboard.

const networkClientId =
transactionNetworkClientId ??
(this.#findNetworkClientIdByChainId(chainId) as string);
getNetworkClientId({ messenger: this.#messenger, chainId });
Copy link

Choose a reason for hiding this comment

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

GasFeePoller network lookup failure aborts all transaction updates

Low Severity

In #getGasFeeControllerDataByChainId, getNetworkClientId throws for unrecognized chain IDs. Since this runs inside a for loop building a map for ALL chains, a single unknown chain aborts gas fee data fetching for every chain. The old callback could return undefined silently, allowing partial success. This means one stale transaction with an unknown chain could block gas fee polling for all other valid transactions in that cycle.

Fix in Cursor Fix in Web

@matthewwalsh0
Copy link
Member Author

@metamaskbot publish-preview

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant