Skip to content

refactor!(eth-json-rpc-provider): Migrate to JsonRpcEngineV2 - #7001

Merged
rekmarks merged 21 commits into
mainfrom
rekm/ejrpcp-v2
Nov 5, 2025
Merged

refactor!(eth-json-rpc-provider): Migrate to JsonRpcEngineV2#7001
rekmarks merged 21 commits into
mainfrom
rekm/ejrpcp-v2

Conversation

@rekmarks

@rekmarksrekmarks commented Oct 29, 2025

Copy link
Copy Markdown
Member

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.

@rekmarksrekmarks changed the title refactor!: Support JsonRpcEngineV2refactor(eth-json-rpc-provider): Support JsonRpcEngineV2Oct 30, 2025
@rekmarks
rekmarksforce-pushed the rekm/ejrpcp-v2 branch 2 times, most recently from 6cb53fa to 88118a9CompareOctober 31, 2025 17:29
Base automatically changed from rekm/internal-provider to mainOctober 31, 2025 19:09
@rekmarks
rekmarksforce-pushed the rekm/ejrpcp-v2 branch 2 times, most recently from 34175ce to bb89c25CompareNovember 1, 2025 00:11
@rekmarksrekmarks changed the title refactor(eth-json-rpc-provider): Support JsonRpcEngineV2refactor!(eth-json-rpc-provider): Support JsonRpcEngineV2Nov 1, 2025
@rekmarks
rekmarksforce-pushed the rekm/ejrpcp-v2 branch 2 times, most recently from fbc467a to c0feb25CompareNovember 4, 2025 17:28
@rekmarks

This comment was marked as outdated.

@github-actions

This comment was marked as outdated.

@rekmarks

Copy link
Copy Markdown
MemberAuthor

@metamaskbot publish-preview

@github-actions

Copy link
Copy Markdown
Contributor

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"
}

@rekmarksrekmarks changed the title refactor!(eth-json-rpc-provider): Support JsonRpcEngineV2refactor!(eth-json-rpc-provider): Migrate to JsonRpcEngineV2Nov 4, 2025
@rekmarks
rekmarks marked this pull request as ready for review November 4, 2025 20:08
@rekmarks
rekmarks requested review from a team as code ownersNovember 4, 2025 20:08

@mcmiremcmire left a comment

Copy link
Copy Markdown
Collaborator

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.

Comment threadpackages/eth-json-rpc-provider/src/internal-provider.ts Outdated
Comment threadpackages/eth-json-rpc-provider/src/internal-provider.ts
Comment threadpackages/eth-json-rpc-provider/CHANGELOG.md
Comment threadpackages/eth-json-rpc-provider/CHANGELOG.md
Comment threadpackages/eth-json-rpc-provider/src/internal-provider.ts Outdated
Comment threadpackages/json-rpc-engine/CHANGELOG.md Outdated
Comment threadjest.config.packages.js
Comment threadpackages/eth-json-rpc-provider/src/internal-provider.test.ts Outdated
@rekmarks
rekmarks requested a review from mcmireNovember 5, 2025 00:02

@mcmiremcmire left a comment

Copy link
Copy Markdown
Collaborator

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.

Comment threadpackages/eth-json-rpc-provider/package.json
@rekmarks
rekmarks requested a review from mcmireNovember 5, 2025 16:41

@mcmiremcmire left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Two more questions.

Comment threadpackages/eth-json-rpc-provider/src/internal-provider.ts
return provider;
>(middleware: LegacyJsonRpcMiddleware<Params, Result>): InternalProvider {
return providerFromMiddlewareV2(
asV2Middleware(middleware) as JsonRpcMiddleware<JsonRpcRequest>,

Copy link
Copy Markdown
Collaborator

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
Copy Markdown
MemberAuthor

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
Copy Markdown
MemberAuthor

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

@mcmiremcmire left a comment

Copy link
Copy Markdown
Collaborator

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
Copy Markdown
MemberAuthor

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 mainNov 5, 2025
262 checks passed
@rekmarks
rekmarks deleted the rekm/ejrpcp-v2 branch November 5, 2025 19:18
@rekmarks

Copy link
Copy Markdown
MemberAuthor

@metamaskbot publish-preview

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

Copy link
Copy Markdown
Contributor

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 freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@rekmarks@mcmire