Skip to content

chore: Bump eth-json-rpc-provider and related deps#22154

Closed
rekmarks wants to merge 1 commit intomainfrom
rekm/preview-ejrpcp-6.0
Closed

chore: Bump eth-json-rpc-provider and related deps#22154
rekmarks wants to merge 1 commit intomainfrom
rekm/preview-ejrpcp-6.0

Conversation

@rekmarks
Copy link
Copy Markdown
Member

@rekmarks rekmarks commented Nov 4, 2025

Preview. Extension: MetaMask/metamask-extension#37521

@rekmarks rekmarks added run-ios-e2e-smoke Trigger iOS E2E tests on BitRise run-android-flask-e2e-smoke DEPRECATED labels Nov 4, 2025
@rekmarks rekmarks added the team-ocap-kernel Ocap Kernel team label Nov 4, 2025
rekmarks added a commit to MetaMask/core that referenced this pull request Nov 5, 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

- Progresses: #6327

## 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/contributing.md#updating-changelogs),
highlighting breaking changes as necessary
- [x] I've prepared draft pull requests for clients and consumer
packages to resolve any breaking changes
- Not intended to be shipped without #6976, but it appears we could if
we wanted to:
    - MetaMask/metamask-extension#37521
    - MetaMask/metamask-mobile#22154

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> Migrates provider to JsonRpcEngineV2 with updated InternalProvider and
helpers, adjusts error/empty-result handling, and updates dependent
packages/tests.
> 
> - **eth-json-rpc-provider**:
> - Migrate to `JsonRpcEngineV2`; `InternalProvider` now wraps legacy
engines via `asV2Middleware`/`JsonRpcEngineV2` and returns results
directly.
> - Add `providerFromMiddlewareV2`; deprecate `providerFromMiddleware`;
remove `providerFromEngine`.
> - Switch ID generation from `uuid` to `nanoid`; update exports/tests
accordingly.
> - **json-rpc-engine (v2)**:
> - Add/expand V2 types and exports (`MiddlewareConstraint`,
`MergedContextOf`, etc.).
> - Update `asV2Middleware` to deserialize errors and ignore `{ error:
undefined }` while forwarding results; add tests.
> - Rename `unserializeError` to `deserializeError` and adjust
usage/tests.
> - **eth-json-rpc-middleware**:
> - Change `retryOnEmpty` to treat only `null` and `"<nil>"` as empty
(stop retrying `undefined`).
> - **network-controller**:
> - Replace `providerFromEngine` usage with `new InternalProvider({
engine })`.
> - Align tests with new empty-result behavior and provider
construction.
> - **eth-block-tracker tests**:
> - Construct providers via `InternalProvider` instead of
`providerFromEngine`.
> - **Tooling/Config**:
>   - Add TS/Jest path mapping for `@metamask/json-rpc-engine/v2`.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
4a63eea. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
@rekmarks rekmarks force-pushed the rekm/preview-ejrpcp-6.0 branch from 3007c03 to 556c4a3 Compare November 5, 2025 21:10
@rekmarks rekmarks changed the title chore: Bump eth-json-rpc-provider and related deps chore: Bump eth-json-rpc-middleware and related deps Nov 5, 2025
@rekmarks rekmarks force-pushed the rekm/preview-ejrpcp-6.0 branch from 556c4a3 to 6e2d898 Compare November 5, 2025 22:55
@rekmarks rekmarks changed the title chore: Bump eth-json-rpc-middleware and related deps chore: Bump eth-json-rpc-provider and related deps Nov 5, 2025
@sonarqubecloud
Copy link
Copy Markdown

sonarqubecloud bot commented Nov 5, 2025

@rekmarks rekmarks force-pushed the rekm/preview-ejrpcp-6.0 branch from fbefc35 to 6e2d898 Compare November 7, 2025 05:45
@rekmarks
Copy link
Copy Markdown
Member Author

rekmarks commented Nov 7, 2025

It's a rousing success.

@rekmarks rekmarks closed this Nov 7, 2025
@rekmarks rekmarks deleted the rekm/preview-ejrpcp-6.0 branch November 7, 2025 05:46
@github-actions github-actions bot locked and limited conversation to collaborators Nov 7, 2025
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant