Skip to content

Conversation

@rekmarks
Copy link
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 Run Android flask E2E tests on next CI run 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

sonarqubecloud bot commented Nov 5, 2025

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

Labels

e2e-test run-android-flask-e2e-smoke Run Android flask E2E tests on next CI run run-flask-e2e-smoke run-ios-e2e-smoke Trigger iOS E2E tests on BitRise size-XS team-ocap-kernel Ocap Kernel team

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants