Skip to content

feat: add Ethereum MPC keyring - #627

Open
matthiasgeihs wants to merge 13 commits into
mainfrom
mg/mpc-keyring
Open

feat: add Ethereum MPC keyring#627
matthiasgeihs wants to merge 13 commits into
mainfrom
mg/mpc-keyring

Conversation

@matthiasgeihs

@matthiasgeihs matthiasgeihs commented Sep 2, 2026

Copy link
Copy Markdown

Do not merge yet: this PR still vendors MFA wallet packages as local .tgz files under packages/keyring-eth-mpc/. Replace those tarballs with published npm dependencies before merging.

Summary

  • Add @metamask/eth-mpc-keyring: a 2-party client/server MPC keyring with DKLS23 TSS, cloud backup sync, and vendored MFA wallet libs
  • Support create/import init, key-share rotate/check/sync, and signing (transactions, personal_sign, typed data, EIP-7702 authorizations)
  • Replaces the earlier WIP in feat: add MPC keyring #440 with a cleaned history rebased on main

Test plan

  • yarn workspace @metamask/eth-mpc-keyring test
  • yarn workspace @metamask/eth-mpc-keyring build
  • Smoke-check create/import and signing against a staging cloud/relayer if available

Made with Cursor

matthiasgeihs and others added 2 commits September 2, 2026 15:41
Introduce a 2-party client/server MPC keyring with DKLS23 TSS, cloud backup sync, and vendored MFA wallet libs.

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
@matthiasgeihs
matthiasgeihs requested a review from a team as a code owner September 2, 2026 13:54
@matthiasgeihs

Copy link
Copy Markdown
Author

Replaces #440 with a cleaned history rebased onto main.

@socket-security

socket-security Bot commented Sep 2, 2026

Copy link
Copy Markdown

@socket-security

socket-security Bot commented Sep 2, 2026

Copy link
Copy Markdown

Warning

MetaMask internal reviewing guidelines:

  • Do not ignore-all
  • Each alert has instructions on how to review if you don't know what it means. If lost, ask your Security Liaison or the supply-chain group
  • Copy-paste ignore lines for specific packages or a group of one kind with a note on what research you did to deem it safe.
    @SocketSecurity ignore npm/PACKAGE@VERSION
Action Severity Alert  (click "▶" to expand/collapse)
Warn Medium
Network access: npm centrifuge in module globalThis["fetch"]

Module: globalThis["fetch"]

Location: Package overview

From: packages/keyring-eth-mpc/package.jsonnpm/@metamask/mfa-wallet-network@0.0.0npm/centrifuge@5.7.2

ℹ Read more on: This package | This alert | What is network access?

Next steps: Take a moment to review the security alert above. Review the linked package source code to understand the potential risk. Ensure the package is not malicious before proceeding. If you're unsure how to proceed, reach out to your security team or ask the Socket team for help at support@socket.dev.

Suggestion: Packages should remove all network access that is functionally unnecessary. Consumers should audit network access to ensure legitimate use.

Mark the package as acceptable risk. To ignore this alert only in this pull request, reply with the comment @SocketSecurity ignore npm/centrifuge@5.7.2. You can also ignore all packages with @SocketSecurity ignore-all. To ignore an alert for all future pull requests, use Socket's Dashboard to change the triage state of this alert.

Warn Low
Potential code anomaly (AI signal): npm @protobufjs/codegen is 72.0% likely to have a medium risk anomaly

Notes: No direct malicious behavior (e.g., exfiltration, persistence, or credential theft) is evident in this module. However, it is inherently a dynamic code execution utility: it constructs JavaScript source from caller-influenced templates/body and scope, then executes it using the Function constructor. If any upstream input can influence templates or accumulated body, this module can enable code injection/RCE in the caller’s context. Treat as high-risk when used with untrusted data; otherwise it functions as a formatter/codegen helper.

Confidence: 0.72

Severity: 0.52

From: packages/keyring-eth-mpc/package.jsonnpm/@metamask/mfa-wallet-network@0.0.0npm/@trezor/connect-web@9.6.1npm/@protobufjs/codegen@2.0.5

ℹ Read more on: This package | This alert | What is an AI-detected potential code anomaly?

Next steps: Take a moment to review the security alert above. Review the linked package source code to understand the potential risk. Ensure the package is not malicious before proceeding. If you're unsure how to proceed, reach out to your security team or ask the Socket team for help at support@socket.dev.

Suggestion: An AI system found a low-risk anomaly in this package. It may still be fine to use, but you should check that it is safe before proceeding.

Mark the package as acceptable risk. To ignore this alert only in this pull request, reply with the comment @SocketSecurity ignore npm/@protobufjs/codegen@2.0.5. You can also ignore all packages with @SocketSecurity ignore-all. To ignore an alert for all future pull requests, use Socket's Dashboard to change the triage state of this alert.

Warn Low
Potential code anomaly (AI signal): npm protobufjs is 61.0% likely to have a medium risk anomaly

Notes: The analyzed code segment is a standard RPC service wrapper (protobufjs style) with conventional input validation, encoding/decoding, event emission, and end handling. No malicious behavior is evident, and there are no observable security vulnerabilities beyond ordinary library-level error handling. It does not exhibit data exfiltration, backdoors, or other anti-security patterns.

Confidence: 0.61

Severity: 0.55

From: packages/keyring-eth-mpc/package.jsonnpm/@metamask/mfa-wallet-network@0.0.0npm/protobufjs@7.6.6

ℹ Read more on: This package | This alert | What is an AI-detected potential code anomaly?

Next steps: Take a moment to review the security alert above. Review the linked package source code to understand the potential risk. Ensure the package is not malicious before proceeding. If you're unsure how to proceed, reach out to your security team or ask the Socket team for help at support@socket.dev.

Suggestion: An AI system found a low-risk anomaly in this package. It may still be fine to use, but you should check that it is safe before proceeding.

Mark the package as acceptable risk. To ignore this alert only in this pull request, reply with the comment @SocketSecurity ignore npm/protobufjs@7.6.6. You can also ignore all packages with @SocketSecurity ignore-all. To ignore an alert for all future pull requests, use Socket's Dashboard to change the triage state of this alert.

View full report

@cursor
cursor Bot requested review from ccharly and hmalik88 September 2, 2026 14:03
Comment thread packages/keyring-eth-mpc/src/mpc-keyring.ts Outdated
Comment thread packages/keyring-eth-mpc/src/mpc-keyring.ts
Comment thread packages/keyring-eth-mpc/src/mpc-keyring.ts
Comment thread packages/keyring-eth-mpc/src/mpc-keyring.ts
matthiasgeihs and others added 4 commits September 2, 2026 16:12
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Pass convertV so recovery id 27|28 becomes yParity or EIP-155 v.

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Risk: high. Not approved — this adds a new Ethereum MPC keyring with TSS signing, cloud backup, and vendored MFA libraries, which is above the low-risk approval threshold. Human review is needed.

Open in Web View Automation 

Sent by Cursor Approval Agent: Pull Request Router

matthiasgeihs and others added 2 commits September 2, 2026 16:48
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
@matthiasgeihs
matthiasgeihs marked this pull request as draft September 2, 2026 14:50
matthiasgeihs and others added 2 commits September 3, 2026 13:02
Replace backupId with shareEpoch so create/rotate append and activate
epochs only after backup readiness, matching the robust MPC architecture.

Co-authored-by: Cursor <cursoragent@cursor.com>
Prevent mid-sign rotate/sync from being overwritten by stale

Co-authored-by: Cursor <cursoragent@cursor.com>
#applyKeyState snapshots from concurrent signing.
@matthiasgeihs

Copy link
Copy Markdown
Author

Do not merge yet: this PR still vendors MFA wallet packages as local .tgz files under packages/keyring-eth-mpc/. It should not be merged until those tarballs are replaced with published npm dependencies.

@matthiasgeihs
matthiasgeihs marked this pull request as ready for review September 3, 2026 12:19

@cursor cursor Bot left a comment

Copy link
Copy Markdown

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 1 potential issue.

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.

Reviewed by Cursor Bugbot for commit e5a53ee. Configure here.

Comment thread packages/keyring-eth-mpc/src/mpc-keyring.ts
matthiasgeihs and others added 3 commits September 3, 2026 14:42
Pass the create/rotate session nonce to storeKeyShareBackup so a
delayed backup from an overwritten retry cannot attach to a newer share.

Co-authored-by: Cursor <cursoragent@cursor.com>
<!--
Thanks for your contribution! Take a moment to answer these questions so
that reviewers have the information they need to properly understand
your changes:

* What is the current state of things and why does it need to change?
* What is the solution your changes offer and how does it work?

Are there any issues or other links reviewers should consult to
understand this pull request better? For instance:

* Fixes #12345
* See: #67890
-->

## Summary

- MPC cloud HTTP calls now send the profile token in an `Authorization:
Bearer <token>` header instead of including `token` in JSON request
bodies.
- The shared `postJson` helper accepts the token as a separate argument
and applies it consistently across all MPC backend requests.
- Token-only endpoints (`getNetId`, `checkKeyShareBackupId`,
`loadKeyShareBackup`) still use POST but now send an empty JSON body
(`{}`).

## Test plan

- [x] Run `packages/keyring-eth-mpc` unit tests (`cloud.test.ts`)
- [x] Verify `getNetId` requests include the Bearer header and send `{}`
as the body
- [x] Verify sign and backup helpers include the Bearer header and omit
`token` from the JSON payload
- [ ] Confirm MPC backend accepts Bearer authentication for affected
endpoints before merge

<!--
Are there any examples of this change being used in another repository?

When considering changes to the MetaMask module template, it's strongly
preferred that the change be experimented with in another repository
first. This gives reviewers a better sense of how the change works,
making it less likely the change will need to be reverted or adjusted
later.
-->


<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **Medium Risk**
> Auth moves from JSON to Bearer headers across all MPC cloud calls;
clients and the backend must agree before deploy or requests will fail.
> 
> **Overview**
> MPC cloud HTTP clients no longer put the profile `token` in JSON
bodies. **`postJson`** now takes the token separately and sets
**`Authorization: Bearer <token>`** on every backend POST.
> 
> Endpoints that previously sent only `{ token }` (**`getNetId`**,
**`checkKeyShare`**, **`loadKeyShareBackup`**) now POST **`{}`** with
auth in the header. Create/sign/rotate/backup/register calls keep their
payloads but drop the **`token`** field. Unit tests in
**`cloud.test.ts`** assert the header and that **`body.token`** is
absent.
> 
> The unreleased **CHANGELOG** entry is shortened to a single
initial-release line (detailed feature bullets removed).
> 
> <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit
400e5b1. Bugbot is set up for automated
code reviews on this repo. Configure
[here](https://www.cursor.com/dashboard/bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

---------

Co-authored-by: Matthias Geihs <matthias.geihs@consensys.net>
<!--
Thanks for your contribution! Take a moment to answer these questions so
that reviewers have the information they need to properly understand
your changes:

* What is the current state of things and why does it need to change?
* What is the solution your changes offer and how does it work?

Are there any issues or other links reviewers should consult to
understand this pull request better? For instance:

* Fixes #12345
* See: #67890
-->

## Summary

- Add a shared `parseJsonResponse` helper in
`packages/keyring-eth-mpc/src/cloud.ts` to centralize JSON parsing and
non-OK error handling for cloud API responses.
- Introduce `getJson` for Bearer-authenticated GET requests and refactor
`postJson` to reuse `parseJsonResponse`.
- Update `loadKeyShareBackup` to call `getJson` with GET instead of POST
with an empty body.

<!--
Are there any examples of this change being used in another repository?

When considering changes to the MetaMask module template, it's strongly
preferred that the change be experimented with in another repository
first. This gives reviewers a better sense of how the change works,
making it less likely the change will need to be reverted or adjusted
later.
-->


<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **Medium Risk**
> Changes the HTTP method for loading encrypted key-share backups;
behavior depends on the MPC backend accepting GET on that route.
> 
> **Overview**
> Refactors MPC cloud HTTP helpers and fixes how encrypted key-share
backups are fetched.
> 
> **`cloud.ts`** adds **`parseJsonResponse`** for shared non-OK handling
and JSON/empty-body parsing, introduces **`getJson`** for
Bearer-authenticated GETs, and routes **`postJson`** through the same
parser (generic renamed to **`Result`**). **`loadKeyShareBackup`** now
calls **`getJson`** on `/load-key-share-backup` instead of
**`postJson`** with an empty body.
> 
> **`cloud.test.ts`** asserts the backup load uses **GET** with
**`Authorization: Bearer`** and no POST body.
> 
> <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit
2690e54. Bugbot is set up for automated
code reviews on this repo. Configure
[here](https://www.cursor.com/dashboard/bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

---------

Co-authored-by: Matthias Geihs <matthias.geihs@consensys.net>
Co-authored-by: Cursor <cursoragent@cursor.com>
@ccharly ccharly added the DO-NOT-MERGE PRs related to this issue should not be merged label Sep 10, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

DO-NOT-MERGE PRs related to this issue should not be merged

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants