Skip to content

Conversation

@rekmarks
Copy link
Member

@rekmarks rekmarks commented Oct 29, 2025

Explanation

Per #6327, migrates @metamask/eth-json-rpc-provider to JsonRpcEngineV2 following its recent introduction. Intended to be closely followed by #6976 and subsequently released.

The InternalProvider is updated to use JsonRpcServer under the hood. It can be constructed with a JsonRpcServer or legacy engine, but the latter will be wrapped by a JsonRpcServer in order to ensure consistent behavior across all internal providers. Meanwhile, providerFromEngine() is removed, it being a useless wrapper over the InternalProvider constructor.

Elsewhere in the monorepo, these changes revealed a discrepancy in behavior between the error handling of the legacy engine and asV2Middleware(), which the latter is amended to resolve.

In addition, the changes to the InternalProvider revealed that the legacy engine tolerates responses with { result: undefined }. This is impossible to express using the V2 engine, which caused some NetworkController tests reliant on the legacy behavior to fail. Further investigation proved that these undefined results would error elsewhere in our JSON-RPC pipelines, so we simply remove these test cases. The upshot is that we no longer retry undefined results for "child requests" in the retryOnEmpty middleware. It is unclear if this was occurring in practice, and it ought to be treated as a breach of contract by the RPC endpoint if it does.

References

Checklist


Note

Migrates InternalProvider to JsonRpcEngineV2, adds providerFromMiddlewareV2, removes providerFromEngine, aligns error handling and retry semantics across packages, and updates consumers/tests and config.

  • @metamask/eth-json-rpc-provider:
    • Migration: InternalProvider now wraps JsonRpcEngineV2 (accepts legacy engine or V2 server).
    • API: Add providerFromMiddlewareV2; deprecate providerFromMiddleware; remove providerFromEngine.
    • IDs: Switch from uuid to nanoid for request ids.
    • Exports/Tests: Update exports and comprehensive tests for V1/V2 engines.
  • @metamask/json-rpc-engine:
    • V2 Enhancements: Export additional V2 types; refine asV2Middleware to use deserializeError and ignore undefined errors from legacy middleware; add tests.
    • Server: Type refinements for JsonRpcServer and JsonRpcEngineV2.
  • @metamask/eth-json-rpc-middleware:
    • Retry Behavior (BREAKING): retryOnEmpty no longer treats undefined as an empty value; now errors on advancing block tag with undefined results.
  • @metamask/network-controller:
    • Provider: Replace providerFromEngine with direct InternalProvider construction in create-network-client.
    • Tests/Changelog: Align tests with new empty-value semantics and provider changes.
  • Tooling:
    • Map @metamask/json-rpc-engine/v2 in Jest/TS paths.
    • Update block-tracker tests to use InternalProvider directly.

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

@rekmarks rekmarks changed the title refactor!: Support JsonRpcEngineV2 refactor(eth-json-rpc-provider): Support JsonRpcEngineV2 Oct 30, 2025
@rekmarks rekmarks force-pushed the rekm/ejrpcp-v2 branch 2 times, most recently from 6cb53fa to 88118a9 Compare October 31, 2025 17:29
Base automatically changed from rekm/internal-provider to main October 31, 2025 19:09
@rekmarks rekmarks force-pushed the rekm/ejrpcp-v2 branch 2 times, most recently from 34175ce to bb89c25 Compare November 1, 2025 00:11
@rekmarks rekmarks changed the title refactor(eth-json-rpc-provider): Support JsonRpcEngineV2 refactor!(eth-json-rpc-provider): Support JsonRpcEngineV2 Nov 1, 2025
@rekmarks rekmarks force-pushed the rekm/ejrpcp-v2 branch 2 times, most recently from fbc467a to c0feb25 Compare November 4, 2025 17:28
@rekmarks

This comment was marked as outdated.

@github-actions

This comment was marked as outdated.

@rekmarks
Copy link
Member Author

rekmarks commented Nov 4, 2025

@metamaskbot publish-preview

@github-actions
Copy link
Contributor

github-actions bot commented Nov 4, 2025

Preview builds have been published. See these instructions for more information about preview builds.

Expand for full list of packages and versions.
{
  "@metamask-previews/account-tree-controller": "2.0.0-preview-3d5a68a",
  "@metamask-previews/accounts-controller": "34.0.0-preview-3d5a68a",
  "@metamask-previews/address-book-controller": "7.0.0-preview-3d5a68a",
  "@metamask-previews/announcement-controller": "8.0.0-preview-3d5a68a",
  "@metamask-previews/app-metadata-controller": "2.0.0-preview-3d5a68a",
  "@metamask-previews/approval-controller": "8.0.0-preview-3d5a68a",
  "@metamask-previews/assets-controllers": "87.0.0-preview-3d5a68a",
  "@metamask-previews/base-controller": "9.0.0-preview-3d5a68a",
  "@metamask-previews/bridge-controller": "59.0.0-preview-3d5a68a",
  "@metamask-previews/bridge-status-controller": "59.0.0-preview-3d5a68a",
  "@metamask-previews/build-utils": "3.0.4-preview-3d5a68a",
  "@metamask-previews/chain-agnostic-permission": "1.2.2-preview-3d5a68a",
  "@metamask-previews/composable-controller": "12.0.0-preview-3d5a68a",
  "@metamask-previews/controller-utils": "11.15.0-preview-3d5a68a",
  "@metamask-previews/core-backend": "4.0.0-preview-3d5a68a",
  "@metamask-previews/delegation-controller": "1.0.0-preview-3d5a68a",
  "@metamask-previews/earn-controller": "9.0.0-preview-3d5a68a",
  "@metamask-previews/eip-5792-middleware": "2.0.0-preview-3d5a68a",
  "@metamask-previews/eip-7702-internal-rpc-middleware": "0.1.0-preview-3d5a68a",
  "@metamask-previews/eip1193-permission-middleware": "1.0.2-preview-3d5a68a",
  "@metamask-previews/ens-controller": "18.0.0-preview-3d5a68a",
  "@metamask-previews/error-reporting-service": "3.0.0-preview-3d5a68a",
  "@metamask-previews/eth-block-tracker": "14.0.0-preview-3d5a68a",
  "@metamask-previews/eth-json-rpc-middleware": "21.0.0-preview-3d5a68a",
  "@metamask-previews/eth-json-rpc-provider": "5.0.1-preview-3d5a68a",
  "@metamask-previews/foundryup": "1.0.1-preview-3d5a68a",
  "@metamask-previews/gas-fee-controller": "25.0.0-preview-3d5a68a",
  "@metamask-previews/gator-permissions-controller": "0.3.0-preview-3d5a68a",
  "@metamask-previews/json-rpc-engine": "10.1.1-preview-3d5a68a",
  "@metamask-previews/json-rpc-middleware-stream": "8.0.8-preview-3d5a68a",
  "@metamask-previews/keyring-controller": "24.0.0-preview-3d5a68a",
  "@metamask-previews/logging-controller": "7.0.0-preview-3d5a68a",
  "@metamask-previews/message-manager": "14.0.0-preview-3d5a68a",
  "@metamask-previews/messenger": "0.3.0-preview-3d5a68a",
  "@metamask-previews/multichain-account-service": "2.1.0-preview-3d5a68a",
  "@metamask-previews/multichain-api-middleware": "1.2.4-preview-3d5a68a",
  "@metamask-previews/multichain-network-controller": "2.0.0-preview-3d5a68a",
  "@metamask-previews/multichain-transactions-controller": "6.0.0-preview-3d5a68a",
  "@metamask-previews/name-controller": "9.0.0-preview-3d5a68a",
  "@metamask-previews/network-controller": "25.0.0-preview-3d5a68a",
  "@metamask-previews/network-enablement-controller": "3.1.0-preview-3d5a68a",
  "@metamask-previews/notification-services-controller": "19.0.0-preview-3d5a68a",
  "@metamask-previews/permission-controller": "12.1.0-preview-3d5a68a",
  "@metamask-previews/permission-log-controller": "5.0.0-preview-3d5a68a",
  "@metamask-previews/phishing-controller": "15.0.0-preview-3d5a68a",
  "@metamask-previews/polling-controller": "15.0.0-preview-3d5a68a",
  "@metamask-previews/preferences-controller": "21.0.0-preview-3d5a68a",
  "@metamask-previews/profile-sync-controller": "26.0.0-preview-3d5a68a",
  "@metamask-previews/rate-limit-controller": "7.0.0-preview-3d5a68a",
  "@metamask-previews/remote-feature-flag-controller": "2.0.0-preview-3d5a68a",
  "@metamask-previews/sample-controllers": "3.0.0-preview-3d5a68a",
  "@metamask-previews/seedless-onboarding-controller": "6.1.0-preview-3d5a68a",
  "@metamask-previews/selected-network-controller": "25.0.0-preview-3d5a68a",
  "@metamask-previews/shield-controller": "1.2.0-preview-3d5a68a",
  "@metamask-previews/signature-controller": "35.0.0-preview-3d5a68a",
  "@metamask-previews/subscription-controller": "3.2.0-preview-3d5a68a",
  "@metamask-previews/token-search-discovery-controller": "4.0.0-preview-3d5a68a",
  "@metamask-previews/transaction-controller": "61.1.0-preview-3d5a68a",
  "@metamask-previews/transaction-pay-controller": "3.0.0-preview-3d5a68a",
  "@metamask-previews/user-operation-controller": "40.0.0-preview-3d5a68a"
}

@rekmarks rekmarks changed the title refactor!(eth-json-rpc-provider): Support JsonRpcEngineV2 refactor!(eth-json-rpc-provider): Migrate to JsonRpcEngineV2 Nov 4, 2025
…hten v2 types

- InternalProvider
  - replace rpcHandler with server
  - wrap legacy engine via asV2Middleware + JsonRpcServer
  - update tests
- asV2Middleware: fix middleware signature
- providerFromMiddleware
  - Use providerFromMiddlewareV2 and asV2Middleware to wrap legacy
    middleware
- json-rpc-engine:
  - add MiddlewareConstraint
  - update JsonRpcServer/asV2Middleware generics
@rekmarks rekmarks marked this pull request as ready for review November 4, 2025 20:08
@rekmarks rekmarks requested review from a team as code owners November 4, 2025 20:08
Copy link
Contributor

@mcmire mcmire left a comment

Choose a reason for hiding this comment

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

Some suggestions but overall makes sense / looks good.

@rekmarks rekmarks requested a review from mcmire November 5, 2025 00:02
Copy link
Contributor

@mcmire mcmire left a comment

Choose a reason for hiding this comment

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

This looks good, but I am going to do another pass tomorrow just to be sure.

@rekmarks rekmarks requested a review from mcmire November 5, 2025 16:41
Copy link
Contributor

@mcmire mcmire left a comment

Choose a reason for hiding this comment

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

Two more questions.

return provider;
>(middleware: LegacyJsonRpcMiddleware<Params, Result>): InternalProvider {
return providerFromMiddlewareV2(
asV2Middleware(middleware) as JsonRpcMiddleware<JsonRpcRequest>,
Copy link
Contributor

Choose a reason for hiding this comment

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

I see that if we remove the type assertion we get a type error around params. Do we need to do some kind of transformation of params to remove undefined or something?

Copy link
Member Author

Choose a reason for hiding this comment

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

It actually fails due to the context generics, specifically by tripping up the InvalidEngine type. I do not know why.

Copy link
Member Author

Choose a reason for hiding this comment

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

We put on our thinking caps and figured out why: 4a63eea

Copy link
Contributor

@mcmire mcmire left a comment

Choose a reason for hiding this comment

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

LGTM!

@rekmarks rekmarks enabled auto-merge (squash) November 5, 2025 19:14
@rekmarks
Copy link
Member Author

rekmarks commented Nov 5, 2025

For posterity: we labeled this no-changelog to skip adding a changelog entry in packages/eth-block-tracker due to changes in packages/eth-block-tracker/tests.

@rekmarks rekmarks merged commit cfc47aa into main Nov 5, 2025
262 checks passed
@rekmarks rekmarks deleted the rekm/ejrpcp-v2 branch November 5, 2025 19:18
@rekmarks
Copy link
Member Author

rekmarks commented Nov 5, 2025

@metamaskbot publish-preview

@rekmarks rekmarks restored the rekm/ejrpcp-v2 branch November 5, 2025 22:46
@github-actions
Copy link
Contributor

github-actions bot commented Nov 5, 2025

Preview builds have been published. See these instructions for more information about preview builds.

Expand for full list of packages and versions.
{
  "@metamask-previews/account-tree-controller": "2.0.0-preview-684a40c0",
  "@metamask-previews/accounts-controller": "34.0.0-preview-684a40c0",
  "@metamask-previews/address-book-controller": "7.0.0-preview-684a40c0",
  "@metamask-previews/announcement-controller": "8.0.0-preview-684a40c0",
  "@metamask-previews/app-metadata-controller": "2.0.0-preview-684a40c0",
  "@metamask-previews/approval-controller": "8.0.0-preview-684a40c0",
  "@metamask-previews/assets-controllers": "87.1.0-preview-684a40c0",
  "@metamask-previews/base-controller": "9.0.0-preview-684a40c0",
  "@metamask-previews/bridge-controller": "59.0.0-preview-684a40c0",
  "@metamask-previews/bridge-status-controller": "59.0.0-preview-684a40c0",
  "@metamask-previews/build-utils": "3.0.4-preview-684a40c0",
  "@metamask-previews/chain-agnostic-permission": "1.2.2-preview-684a40c0",
  "@metamask-previews/composable-controller": "12.0.0-preview-684a40c0",
  "@metamask-previews/controller-utils": "11.15.0-preview-684a40c0",
  "@metamask-previews/core-backend": "4.0.0-preview-684a40c0",
  "@metamask-previews/delegation-controller": "1.0.0-preview-684a40c0",
  "@metamask-previews/earn-controller": "9.0.0-preview-684a40c0",
  "@metamask-previews/eip-5792-middleware": "2.0.0-preview-684a40c0",
  "@metamask-previews/eip-7702-internal-rpc-middleware": "0.1.0-preview-684a40c0",
  "@metamask-previews/eip1193-permission-middleware": "1.0.2-preview-684a40c0",
  "@metamask-previews/ens-controller": "18.0.0-preview-684a40c0",
  "@metamask-previews/error-reporting-service": "3.0.0-preview-684a40c0",
  "@metamask-previews/eth-block-tracker": "14.0.0-preview-684a40c0",
  "@metamask-previews/eth-json-rpc-middleware": "21.0.0-preview-684a40c0",
  "@metamask-previews/eth-json-rpc-provider": "5.0.1-preview-684a40c0",
  "@metamask-previews/foundryup": "1.0.1-preview-684a40c0",
  "@metamask-previews/gas-fee-controller": "25.0.0-preview-684a40c0",
  "@metamask-previews/gator-permissions-controller": "0.4.0-preview-684a40c0",
  "@metamask-previews/json-rpc-engine": "10.1.1-preview-684a40c0",
  "@metamask-previews/json-rpc-middleware-stream": "8.0.8-preview-684a40c0",
  "@metamask-previews/keyring-controller": "24.0.0-preview-684a40c0",
  "@metamask-previews/logging-controller": "7.0.0-preview-684a40c0",
  "@metamask-previews/message-manager": "14.0.0-preview-684a40c0",
  "@metamask-previews/messenger": "0.3.0-preview-684a40c0",
  "@metamask-previews/multichain-account-service": "2.1.0-preview-684a40c0",
  "@metamask-previews/multichain-api-middleware": "1.2.4-preview-684a40c0",
  "@metamask-previews/multichain-network-controller": "2.0.0-preview-684a40c0",
  "@metamask-previews/multichain-transactions-controller": "6.0.0-preview-684a40c0",
  "@metamask-previews/name-controller": "9.0.0-preview-684a40c0",
  "@metamask-previews/network-controller": "25.0.0-preview-684a40c0",
  "@metamask-previews/network-enablement-controller": "3.1.0-preview-684a40c0",
  "@metamask-previews/notification-services-controller": "19.0.0-preview-684a40c0",
  "@metamask-previews/permission-controller": "12.1.0-preview-684a40c0",
  "@metamask-previews/permission-log-controller": "5.0.0-preview-684a40c0",
  "@metamask-previews/phishing-controller": "15.0.0-preview-684a40c0",
  "@metamask-previews/polling-controller": "15.0.0-preview-684a40c0",
  "@metamask-previews/preferences-controller": "21.0.0-preview-684a40c0",
  "@metamask-previews/profile-sync-controller": "26.0.0-preview-684a40c0",
  "@metamask-previews/rate-limit-controller": "7.0.0-preview-684a40c0",
  "@metamask-previews/remote-feature-flag-controller": "2.0.0-preview-684a40c0",
  "@metamask-previews/sample-controllers": "3.0.0-preview-684a40c0",
  "@metamask-previews/seedless-onboarding-controller": "6.1.0-preview-684a40c0",
  "@metamask-previews/selected-network-controller": "25.0.0-preview-684a40c0",
  "@metamask-previews/shield-controller": "2.0.0-preview-684a40c0",
  "@metamask-previews/signature-controller": "36.0.0-preview-684a40c0",
  "@metamask-previews/subscription-controller": "3.2.0-preview-684a40c0",
  "@metamask-previews/token-search-discovery-controller": "4.0.0-preview-684a40c0",
  "@metamask-previews/transaction-controller": "61.1.0-preview-684a40c0",
  "@metamask-previews/transaction-pay-controller": "3.0.0-preview-684a40c0",
  "@metamask-previews/user-operation-controller": "40.0.0-preview-684a40c0"
}

@rekmarks rekmarks deleted the rekm/ejrpcp-v2 branch November 5, 2025 22:50
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.

3 participants