From 5b1e954b1e7f4ab269fb3fd839919da91f1b7244 Mon Sep 17 00:00:00 2001 From: Matthias Geihs Date: Wed, 2 Sep 2026 15:38:49 +0200 Subject: [PATCH 01/38] feat: add Ethereum MPC keyring package Introduce a 2-party client/server MPC keyring with DKLS23 TSS, cloud backup sync, and vendored MFA wallet libs. Co-authored-by: Cursor --- README.md | 3 + package.json | 8 +- packages/keyring-eth-mpc/CHANGELOG.md | 10 + packages/keyring-eth-mpc/LICENSE | 15 + packages/keyring-eth-mpc/README.md | 128 ++++ packages/keyring-eth-mpc/jest.config.js | 32 + .../metamask-mfa-wallet-cl24-lib-0.0.0.tgz | Bin 0 -> 58336 bytes .../metamask-mfa-wallet-dkls23-lib-0.0.0.tgz | Bin 0 -> 8300 bytes .../metamask-mfa-wallet-e2ee-0.0.0.tgz | Bin 0 -> 38443 bytes .../metamask-mfa-wallet-interface-0.0.0.tgz | Bin 0 -> 5627 bytes .../metamask-mfa-wallet-network-0.0.0.tgz | Bin 0 -> 55472 bytes .../metamask-mfa-wallet-util-0.0.0.tgz | Bin 0 -> 8276 bytes packages/keyring-eth-mpc/package.json | 81 ++ packages/keyring-eth-mpc/src/cloud.test.ts | 306 ++++++++ packages/keyring-eth-mpc/src/cloud.ts | 235 ++++++ packages/keyring-eth-mpc/src/index.ts | 9 + .../keyring-eth-mpc/src/mpc-keyring.test.ts | 723 ++++++++++++++++++ packages/keyring-eth-mpc/src/mpc-keyring.ts | 686 +++++++++++++++++ packages/keyring-eth-mpc/src/types.ts | 57 ++ packages/keyring-eth-mpc/src/util.test.ts | 297 +++++++ packages/keyring-eth-mpc/src/util.ts | 349 +++++++++ packages/keyring-eth-mpc/tsconfig.build.json | 16 + packages/keyring-eth-mpc/tsconfig.json | 20 + tsconfig.build.json | 1 + tsconfig.json | 1 + yarn.lock | 170 +++- 26 files changed, 3144 insertions(+), 3 deletions(-) create mode 100644 packages/keyring-eth-mpc/CHANGELOG.md create mode 100644 packages/keyring-eth-mpc/LICENSE create mode 100644 packages/keyring-eth-mpc/README.md create mode 100644 packages/keyring-eth-mpc/jest.config.js create mode 100644 packages/keyring-eth-mpc/metamask-mfa-wallet-cl24-lib-0.0.0.tgz create mode 100644 packages/keyring-eth-mpc/metamask-mfa-wallet-dkls23-lib-0.0.0.tgz create mode 100644 packages/keyring-eth-mpc/metamask-mfa-wallet-e2ee-0.0.0.tgz create mode 100644 packages/keyring-eth-mpc/metamask-mfa-wallet-interface-0.0.0.tgz create mode 100644 packages/keyring-eth-mpc/metamask-mfa-wallet-network-0.0.0.tgz create mode 100644 packages/keyring-eth-mpc/metamask-mfa-wallet-util-0.0.0.tgz create mode 100644 packages/keyring-eth-mpc/package.json create mode 100644 packages/keyring-eth-mpc/src/cloud.test.ts create mode 100644 packages/keyring-eth-mpc/src/cloud.ts create mode 100644 packages/keyring-eth-mpc/src/index.ts create mode 100644 packages/keyring-eth-mpc/src/mpc-keyring.test.ts create mode 100644 packages/keyring-eth-mpc/src/mpc-keyring.ts create mode 100644 packages/keyring-eth-mpc/src/types.ts create mode 100644 packages/keyring-eth-mpc/src/util.test.ts create mode 100644 packages/keyring-eth-mpc/src/util.ts create mode 100644 packages/keyring-eth-mpc/tsconfig.build.json create mode 100644 packages/keyring-eth-mpc/tsconfig.json diff --git a/README.md b/README.md index 7cc92fd36..549ab4a9c 100644 --- a/README.md +++ b/README.md @@ -22,6 +22,7 @@ This repository contains the following packages [^fn1]: - [`@metamask/eth-hd-keyring`](packages/keyring-eth-hd) - [`@metamask/eth-ledger-bridge-keyring`](packages/keyring-eth-ledger-bridge) - [`@metamask/eth-money-keyring`](packages/keyring-eth-money) +- [`@metamask/eth-mpc-keyring`](packages/keyring-eth-mpc) - [`@metamask/eth-qr-keyring`](packages/keyring-eth-qr) - [`@metamask/eth-simple-keyring`](packages/keyring-eth-simple) - [`@metamask/eth-snap-keyring`](packages/keyring-snap-bridge) @@ -51,6 +52,7 @@ linkStyle default opacity:0.5 eth_hd_keyring(["@metamask/eth-hd-keyring"]); eth_ledger_bridge_keyring(["@metamask/eth-ledger-bridge-keyring"]); eth_money_keyring(["@metamask/eth-money-keyring"]); + eth_mpc_keyring(["@metamask/eth-mpc-keyring"]); eth_qr_keyring(["@metamask/eth-qr-keyring"]); eth_simple_keyring(["@metamask/eth-simple-keyring"]); eth_trezor_keyring(["@metamask/eth-trezor-keyring"]); @@ -77,6 +79,7 @@ linkStyle default opacity:0.5 eth_money_keyring --> keyring_api; eth_money_keyring --> keyring_sdk; eth_money_keyring --> keyring_utils; + eth_mpc_keyring --> keyring_utils; eth_qr_keyring --> keyring_api; eth_qr_keyring --> keyring_sdk; eth_qr_keyring --> keyring_utils; diff --git a/package.json b/package.json index 379da95b3..58317f678 100644 --- a/package.json +++ b/package.json @@ -89,7 +89,13 @@ "eslint-import-resolver-typescript": "<=3.7.0", "eslint-plugin-import-x": "<=4.6.1", "napi-postinstall": "npm:npm-empty-package@^1.0.0", - "ws@7.4.6": "^7.5.10" + "ws@7.4.6": "^7.5.10", + "@metamask/mfa-wallet-cl24-lib": "file:./packages/keyring-eth-mpc/metamask-mfa-wallet-cl24-lib-0.0.0.tgz", + "@metamask/mfa-wallet-dkls23-lib": "file:./packages/keyring-eth-mpc/metamask-mfa-wallet-dkls23-lib-0.0.0.tgz", + "@metamask/mfa-wallet-e2ee": "file:./packages/keyring-eth-mpc/metamask-mfa-wallet-e2ee-0.0.0.tgz", + "@metamask/mfa-wallet-interface": "file:./packages/keyring-eth-mpc/metamask-mfa-wallet-interface-0.0.0.tgz", + "@metamask/mfa-wallet-network": "file:./packages/keyring-eth-mpc/metamask-mfa-wallet-network-0.0.0.tgz", + "@metamask/mfa-wallet-util": "file:./packages/keyring-eth-mpc/metamask-mfa-wallet-util-0.0.0.tgz" }, "engines": { "node": ">=22" diff --git a/packages/keyring-eth-mpc/CHANGELOG.md b/packages/keyring-eth-mpc/CHANGELOG.md new file mode 100644 index 000000000..e7c894b17 --- /dev/null +++ b/packages/keyring-eth-mpc/CHANGELOG.md @@ -0,0 +1,10 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [Unreleased] + +[Unreleased]: https://github.com/MetaMask/accounts diff --git a/packages/keyring-eth-mpc/LICENSE b/packages/keyring-eth-mpc/LICENSE new file mode 100644 index 000000000..b5ed1b9c5 --- /dev/null +++ b/packages/keyring-eth-mpc/LICENSE @@ -0,0 +1,15 @@ +ISC License + +Copyright (c) 2020 MetaMask + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/packages/keyring-eth-mpc/README.md b/packages/keyring-eth-mpc/README.md new file mode 100644 index 000000000..00bcfb153 --- /dev/null +++ b/packages/keyring-eth-mpc/README.md @@ -0,0 +1,128 @@ +# MPC Keyring + +A Keyring for Ethereum accounts that uses Multi-Party Computation (MPC) for key management and signing. +Built on top of the [MFA Wallet SDK](https://github.com/MetaMask/mfa-wallet-sdk). + +## Installation + +`yarn add @metamask/eth-mpc-keyring` + +or + +`npm install @metamask/eth-mpc-keyring` + +## The Keyring Class Protocol + +One of the goals of this class is to allow developers to easily add new signing strategies to MetaMask. We call these signing strategies Keyrings, because they can manage multiple keys. + +### Keyring.type + +A class property that returns a unique string describing the Keyring. +This is the only class property or method, the remaining methods are instance methods. + +### constructor( options ) + +As a Javascript class, your Keyring object will be used to instantiate new Keyring instances using the new keyword. For example: + +``` +const keyring = new YourKeyringClass(options); +``` + +The constructor currently receives an options object that will be defined by your keyring-building UI, once the user has gone through the steps required for you to fully instantiate a new keyring. For example, choosing a pattern for a vanity account, or entering a seed phrase. + +We haven't defined the protocol for this account-generating UI yet, so for now please ensure your Keyring behaves nicely when not passed any options object. + +## Keyring Instance Methods + +All below instance methods must return Promises to allow asynchronous resolution. + +### serialize() + +In this method, you must return any JSON-serializable JavaScript object that you like. It will be encoded to a string, encrypted with the user's password, and stored to disk. This is the same object you will receive in the deserialize() method, so it should capture all the information you need to restore the Keyring's state. + +### deserialize( object ) + +As discussed above, the deserialize() method will be passed the JavaScript object that you returned when the serialize() method was called. + +### addAccounts( n = 1 ) + +The addAccounts(n) method is used to inform your keyring that the user wishes to create a new account. You should perform whatever internal steps are needed so that a call to serialize() will persist the new account, and then return an array of the new account addresses. + +The method may be called with or without an argument, specifying the number of accounts to create. You should generally default to 1 per call. + +### getAccounts() + +When this method is called, you must return an array of hex-string addresses for the accounts that your Keyring is able to sign for. + +### signTransaction(address, transaction) + +This method will receive a hex-prefixed, all-lowercase address string for the account you should sign the incoming transaction with. + +For your convenience, the transaction is an instance of ethereumjs-tx, (https://github.com/ethereumjs/ethereumjs-tx) so signing can be as simple as: + +``` +transaction.sign(privateKey) +``` + +You must return a valid signed ethereumjs-tx (https://github.com/ethereumjs/ethereumjs-tx) object when complete, it can be the same transaction you received. + +### signMessage(address, data) + +The `eth_sign` method will receive the incoming data, alread hashed, and must sign that hash, and then return the raw signed hash. + +### exportAccount(address) + +Exports the specified account as a private key hex string. + +## Contributing + +### Setup + +- Install [Node.js](https://nodejs.org) version 18 + - If you are using [nvm](https://github.com/creationix/nvm#installation) (recommended) running `nvm use` will automatically choose the right node version for you. +- Install [Yarn v3](https://yarnpkg.com/getting-started/install) +- Run `yarn install` to install dependencies and run any required post-install scripts + +### Testing and Linting + +Run `yarn test` to run the tests once. To run tests on file changes, run `yarn test:watch`. + +Run `yarn lint` to run the linter, or run `yarn lint:fix` to run the linter and fix any automatically fixable issues. + +### Release & Publishing + +The project follows the same release process as the other libraries in the MetaMask organization. The GitHub Actions [`action-create-release-pr`](https://github.com/MetaMask/action-create-release-pr) and [`action-publish-release`](https://github.com/MetaMask/action-publish-release) are used to automate the release process; see those repositories for more information about how they work. + +1. Choose a release version. + + - The release version should be chosen according to SemVer. Analyze the changes to see whether they include any breaking changes, new features, or deprecations, then choose the appropriate SemVer version. See [the SemVer specification](https://semver.org/) for more information. + +2. If this release is backporting changes onto a previous release, then ensure there is a major version branch for that version (e.g. `1.x` for a `v1` backport release). + + - The major version branch should be set to the most recent release with that major version. For example, when backporting a `v1.0.2` release, you'd want to ensure there was a `1.x` branch that was set to the `v1.0.1` tag. + +3. Trigger the [`workflow_dispatch`](https://docs.github.com/en/actions/reference/events-that-trigger-workflows#workflow_dispatch) event [manually](https://docs.github.com/en/actions/managing-workflow-runs/manually-running-a-workflow) for the `Create Release Pull Request` action to create the release PR. + + - For a backport release, the base branch should be the major version branch that you ensured existed in step 2. For a normal release, the base branch should be the main branch for that repository (which should be the default value). + - This should trigger the [`action-create-release-pr`](https://github.com/MetaMask/action-create-release-pr) workflow to create the release PR. + +4. Update the changelog to move each change entry into the appropriate change category ([See here](https://keepachangelog.com/en/1.0.0/#types) for the full list of change categories, and the correct ordering), and edit them to be more easily understood by users of the package. + + - Generally any changes that don't affect consumers of the package (e.g. lockfile changes or development environment changes) are omitted. Exceptions may be made for changes that might be of interest despite not having an effect upon the published package (e.g. major test improvements, security improvements, improved documentation, etc.). + - Try to explain each change in terms that users of the package would understand (e.g. avoid referencing internal variables/concepts). + - Consolidate related changes into one change entry if it makes it easier to explain. + - Run `yarn auto-changelog validate --rc` to check that the changelog is correctly formatted. + +5. Review and QA the release. + + - If changes are made to the base branch, the release branch will need to be updated with these changes and review/QA will need to restart again. As such, it's probably best to avoid merging other PRs into the base branch while review is underway. + +6. Squash & Merge the release. + + - This should trigger the [`action-publish-release`](https://github.com/MetaMask/action-publish-release) workflow to tag the final release commit and publish the release on GitHub. + +7. Publish the release on npm. + + - Be very careful to use a clean local environment to publish the release, and follow exactly the same steps used during CI. + - Use `npm publish --dry-run` to examine the release contents to ensure the correct files are included. Compare to previous releases if necessary (e.g. using `https://unpkg.com/browse/[package name]@[package version]/`). + - Once you are confident the release contents are correct, publish the release using `npm publish`. diff --git a/packages/keyring-eth-mpc/jest.config.js b/packages/keyring-eth-mpc/jest.config.js new file mode 100644 index 000000000..afeeab368 --- /dev/null +++ b/packages/keyring-eth-mpc/jest.config.js @@ -0,0 +1,32 @@ +/* + * For a detailed explanation regarding each configuration property and type check, visit: + * https://jestjs.io/docs/configuration + */ + +const merge = require('deepmerge'); +const path = require('path'); + +const baseConfig = require('../../jest.config.packages'); + +const displayName = path.basename(__dirname); + +module.exports = merge(baseConfig, { + // The display name when running multiple projects + displayName, + + // An array of regexp pattern strings used to skip coverage collection + coveragePathIgnorePatterns: ['./src/tests'], + + // The glob patterns Jest uses to detect test files + testMatch: ['**/*.test.[jt]s?(x)'], + + // An object that configures minimum threshold enforcement for coverage results + coverageThreshold: { + global: { + branches: 100, + functions: 100, + lines: 100, + statements: 100, + }, + }, +}); diff --git a/packages/keyring-eth-mpc/metamask-mfa-wallet-cl24-lib-0.0.0.tgz b/packages/keyring-eth-mpc/metamask-mfa-wallet-cl24-lib-0.0.0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..81d332609bc1656a70da27be2a57eac323437dc2 GIT binary patch literal 58336 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%0A&bGhrhqXIwRXTh87N1B;+ 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 literal 0 HcmV?d00001 diff --git a/packages/keyring-eth-mpc/metamask-mfa-wallet-e2ee-0.0.0.tgz b/packages/keyring-eth-mpc/metamask-mfa-wallet-e2ee-0.0.0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..e910c6d8d2c90b38f4118da5ec66f4919c6595a0 GIT binary patch literal 38443 zcmZU)b8u%t)A$?Pww;Y_+jg?CZQHh;Y<4%?*x6uX+s?+ezUQ~k^ZxFw_tu?1=FI8p znwqYf)6?_mKBVz*VE=8H7lE%{8`4e3AGK8{bkBwg+)}ann790|qA6KEmU69@BezQI z+>))5l2oFQC0Q>EeD`Sg5%*N?KXD(zVBna`jw)`WmB4$vJ^!_(`Y7Y$@vfost5SEj zSwCMtRbmfdrJy)5F>&kC5ejg2a5w>+7rl7AW`~!x9lia{y~|rex$W{d@(oUc9VffU zzgc6^8b9=LTh%FCZ}Qv)BySes8tw=AbTl76ywky9UUw&}MRzBuVU$%IkJ#Wv2Jb6} zIei3?7Md?23zUPSU~EbSiKZLA1R5IY`)v%KP$a+@hkf7``mKWEJr0#}zpe^IW zMo4Jp(l?*bzJ35?&WknK^cJ)c!^g*YYSc*SrI2e3W@x~oD{%RgOhtQC7#F1t0o2fbf$2d6FK@{&+ zxINs0n~c7Q^dkm zGQ|%RVyDi^I6cea{URA}AO5c%!Os;}k`eVZ4d;G=P#f^3?fN`oXuJ-kO$)frI|9!7 z-vgtJd-y&pw;Z_U8r`GTttYS_dOx3T9<~e~wter1`F!8O3wuSU$6!4cg>AJ}&sTJu z^{uT>9;VdaUzR4ks`bP!F`tjRtlkg7xVC$wXsev(CZ1g19jjxvizvRQU@tipikXho z@{q0ddJAIc6=5j+w`jqQkJuVLjS8KlVlr6%+_SpBuo1+0T=tQ_5CotowdF1dQ_zQ&w1^P>~ z#2;l|1JCTM*ekOORcCS+rwf4|iYO+(JZi!q#X{cM&~d*)YTBDsrtc@fGShhuK;mXp z7POTl*iIX$s;;9w#F4a?G&Iejs;l z#T+OfqNY;^i}F7}|8UnAOM&UR4RhkP*`(%`emCdwC`7w=dR7n@LT@gA7Utwd0q0xyn42d5@_u5AHu!DCq7FXYH?# zA@Yy7eoDpNfhKMiCs@3yD?1h`4Z<@{jIzypFt9ugYALeypcG`8JG{T?mJFX6y!Yk7 z{T6xZ{n5v2uur!)k$J}}SHHjI6J(|QGf00xKF_nINNy8u<~~haU^=AFFI23&iNZ&6 zh7g7AJD0Q^Z^#^YVYu@qqr+`cUsKvtN=TB*vV&Ht$;F znfAGA|_1_(To+IkiL2>J1VdaSR;itc3CM`NMCASj=D_us<(|l>{S`9Dt zR}{Jf3s2Fu%eZ&>$})&ObaYqB0->yjb{hxI1O0i1_NnRdd+x&zVQJ&KyOsjK9zlu> z1D?chTg7J$tgCcl9p(rbjq&WkKUua`{^ZyaN-reuV(CrlWFnuk{aS(~+J(boq`MIn zkI_SqD4T{um5Wt5m3mCGv~;kP`pJ1@dA#?EWNCvWO;L|+J7ZKnGy)x8P1ap1AeQss z@<3%(faZr+Ki-3x-__xY(e;{kRR3U)A^lDlE6wYiT(U*`k;`iM);8p|K>icuRbkk8 zfxN&#f~7mi!OnI)D$Gm1XRO&Hkhmr1P6uOb^=%)ED~8417IqQ-`?h3IShDRK_HM7) zW35BYw*qaFc)N%m<{1dfcyhv_?0j1#`J%K(o7x4t^+W&ZhU;)mB!r5LNY9ucBRwh2 zBa-7sp(r!$L+WyC)y@=}XqxVLw))h#a$5l^srR9G!nF-7Q_1zvLuRe?4F-i@6xS}k zUD+oFT%EOz*NnEr)%4j?)79L5;Vdo@;V3x%nJJ-JSwpsi9=|E(;rPao-ZdQ(s^O&3 zn@fDN#TEW4kgxJCuQ7+E8Dk|ei_PQzil;4h&etjgyx)w8?2&OtQgqWMOy-EWDG15% zdu)2z=T@k9CBGT_C*qPT1hb@glB=I5{ z^>^Edq~jNT-C3IicV4CxZR!yFWj6ZjXTnCw&Mtyyv?n_@SRS{Lq`S{QR zh+eJ)moMaNM4}#ax`rnFQLNFgOf8{}SLv&t+-#PiW>GDFs5FB5B=iN>H5PL_9Md^O zr&CBxhPFOBUKHS$}II=FYoH*#Zre&jcA3t16j;z0Q$;`ZCU*dGulNLYeF zZdLRl(yl+NOS4;5iqm|*baqA#VJ zL+qE@3@P{S^GzRCQ<0fXD77))i}$pPMp#IufxH~K?7*k;2c%w6r9BG;`;N@*B_)wC z#fR^qjE`kUCra_kkhSiwiRuGu6-VS;F`@(*UWjlOFRX|yQf&O!Nnolo@;R2)Z@!0~eLeWW|lih0!iZnarW<_pw5Dsq&%g5x>6C ziN>C}Q@j171{w>vjJALam%r%1BGVYtFNgFBEq+hR3ib-V#R?H$26{21HCoDA_P8V4 zaphkF3E!wR=a@6wGKuE{>iGP_?#Cv}{JmOnGgEnLxOGG8Tw{~WEEq%mArv>Lw%9+i?Q#N} zeZAcsP?VogdEzZm-QJOA9{navaSqnZg7wH9{-^Qix8+Jy z)i~!;kSM+7x~X68w&GDBhAF(b85azUGnlU+Uo_sBPoct`}-!bXw*d1f#Em&P2+MmDTGdY-swUgK&Kod?ctjE zSSWZy*m_JiZtI)7%jq)l@t@?xagMZ2cOn+1!|ujFy0=_zw<SGWsfMBvO0zgt4}5)6NWnE}(Qi`;L%kr-(8XyHv zo@0p3&K5VcUD0yLA5W)Be!E{ zpfS{?8=1a-!ZTw$dllFPV(u4G*d#)()mdhdj1#+JK0#@a$jjRukaYwg`qE?ruuWq? zcyt;7yD3T6gShbMsW;DQg4V-gi|z}fji7t|M1r3xa|ecc%c zv_XJ?2nx8c*-(cGQI9O$xs1;mRWBo^yEI9XQ>rUUdxQ(y0=AZSI90~De|AzZz` zI{pBuCFcSx%OHDe|9{S)rOWgcpeTZP4QAzeudlgXsgViQuKhs}lqrncoZ;TzUyQso zRJ{u|>vw}0!nNHvY_RMzLEy}EqxKXWUOO##hIb5fbd+ucUpp*uU;bO(vDk;m{U$}n zGv%Mvob5}y&(j6!2dtj5r6FluhzN7A#^+cL9x)hBh(rlKB>R9wvqWohFpcm1hct(} zLQB+=>nYI6t1=-|k(8l=&^8)3SDWXCe-N7So{ggC@eEZlr0Ede!9L?VdBJ_Q!Mx{Q ziQgnm7iNRma`L^NG4)Rm4EhFz#&vwFL0k_M&c9u7X7hI4FP7-;pyuI15Ydx8qb4~^ zCVLpL52J0SW|2kz+=MGcu|OOYNX?f1Q57l9k!Xj+0RLuL@NN_)eiR+LlHKt!UUm4i z@K$y5w7|dwIji7g=7BKkyJEa^otC9@2v2>JQM5w}KG_&Yk11t3M1X0Y(ECw+4XZ;h zFHqW)F-c|&<|{z~T@rk*KD37B{eh^x_le=x*(-^DGAwH1u}YmmT8D7~2a_H4p*#8M z&Mmd%(Ym%1Fn>-(`5WPB5Nu%$GA0Sm1QHDNb%>Q>=9(%YiJ8na+MBUjy;jK9QavHx zELwuNI#w8A7~1(KiYIt-#1Yk_P5`O2sYo|eP#QQ7Ml9zI?HrPNm}tO!+^z(}F^;UN z`fCNs0E|3tI!$(52d;=a*^fzTLQI9DdF;F-j?eTU7!V==c@>M7_2>z|U|})|uGfk7 zi!v@9VYdQR0<7J%-W-W{U#lZy`D+f?__~qEL+1(bSqw0yCadT)A`OepN;1;HrScFx zz0N}o38?)H4%McT*IlwoPpcqRR}_ECCOcuX(RE;5Y?O4u$7ZaJHvb&Wyp4JOgx zlm_i=ZO%RhcM(2;tl5&)0PDLox^no%`^;PTz-5mDbY2b;L!R?__uT+qut>cww?keT z&FW#zQ0Ch(L9YVGvWyM#aWO+@fm%dAjcFvX0?4wZretV5x#V{(7fq#U%7DE?UkgiE4QPvg|zW#??d-+97*B(Y&i*aw6ycLX4zX* zs!cl=ql$%}!C;XUbcz$SKcD8K(uOK(P?O$u+}9_qlML*|-Sgt4x!V#v>TGDkaCppA zrQw2>l1IPB2)7k3lhfm|_kz_MSZ8bYtkgKP5?MD%MMY{Ap$I-)i~o$ol1+>GR{2?K zg+mc*dhz(5j ze>`r>zBH07@S8r_CBDIq@P+I7Qc`Q?Bg0dcL5fra3n=e6YVUt@KkAg8YQqoXEeD%A zGtrYaGC}$lZe<{bA2e6e|1P8({PyttRha=+eO8knc2v%7M($j6JTH2k+;PTHF3x#SjH@8K%-|KKRjE#QN#M_csF zw#bc$Vt`PPF4T6CKevhp?ty|7vf<(2D2_fqpslILdIpI1`Ag1lKK=0IHN8D8RJXxL zL*ngPg{r2dV6<=qH_~ZQfT(054-Zk8iU6oQ?(O zg7#Fw8Y17=&V!j{!4^h?yKn$|@)^UUzR*md=EM4^FZQsnK7pCF2nZ&Ab>3J9m=Edc zflMighPxe}C#*Vv&o?Yt4>0g2>;#^tmzV2|{uvW@y&7MbTU%lc-7`Xe^2t z{yQ_`f!^$2z}og|>oFiD$N<9ZnseoYE>TP98bwu|AM8B2rMQE6p-HHl-#}q#jQzST zNhv}rOHT}~5+e7D+rAc4^2-)tPF(3YuR5Hd%G?IY7Ky4LfjG@(<`YJ%3Y*Z`g6AE; zczn6BoSz=}aCmYeC&hA2jl!Hxg21wBrD91)Dv6&Wq_e5!kqA$+`&0X3Zen>%czyi~ zU0NaDIF4_Y!Qn6Ob5vQa?Ne>B;! z?J3-Cnhi&gqEUND3zo&nmK+<^(so6jiy-_lTX14PFR+HVrE%p|bq01)y4rA_y1-3e z{ZJ&cP=|S=;X5K>ta$#TK_Wo^g36%S(63YB2$whLARR$)g2`pFl{PcA?-cxmku+=s zy1$hqAuQcXM-Yfllh3 zbj2LGVU4s{D+`S?ZWBe4PAc)~K5HGpr?7H85xbxzBkaq2uo)i^aPtHhY;=OGy*KuQ zS^nZv0@?Q;1^ZAXL|~e?02&pb;ir=L;}K?)QUkna+Y1F{C3gi2G_r>mvYQF5!~^N`J^3G+IGi%aV_$IKLX&o0ezYM!1qf%pgvO2{IHL` z$mBi?#5wZC9_H&5SPlMf2_YJg3euCF?zL|YSaJ(6H41bQ{+qBnvc)j z*OM}7mkHlQ`ti%tL#0!o&T9K$?d+&BqgD$Emj*@= zldUgb{xD^+!y@Z)g|NTb99E$u@8gSz@^ZM5x@YA(TnqT-gd`aNErof#ARh0U&tvhT zSX?=67)C6lnx)-?Ao*GV|JZr+ZD(`tR^*wx_2TndyeRCmulaJv10w_mOzO$)PT?zQ zthYB5$Efk~^e28F$eIVdzzW!Dc?w4Kwb}$=51xbVxt?;0)z1OO3t;03!z2Qry| znz#aXt~i`NX9l4hE!X;r)0{tW`1s)vrDF<%}c%(sUu zWukX4?=oY*+CnU|7!`d#{?l_NIJa-bE?PS5R#>!h>ihF`tS{`QJ9)*{dfzh-%0blz zXOo&M=RQPEzk50@MzE*)Dv}K{0X}JEuS=HrxqGT?@y4ivggVHCr-b|?FJSkHV*v7B zf)Cyu&LYc2F2*k3{;O8BUbA5sWX2O}W1R-^*W3tv$hKb) zSj^mvt?ySs%*>oL@#{(7EUM?Bh(FDU zI(g#D6aXnCL;D|6rY)HX#Bw{aFhkH6#JoH$sLafvh7t)%Hp9d6DVb>tR!s9lq4~aX z3h0g6@+q~FRHrm8Jeyh8%7^16^2_1Xjta^91sO&P5evzvNY>H18PMNx4$c~P3_#iO zoa`dpbz*Z~_y?uzZb&lYfO*&77`3P<3H14ch#Vcy)NJ8yxN~Q5N^I%_><~X3CEc$E z*N2H&jkeZnN+wvvfLkf70ALKSCz8n*0Rco*>!3ORXi_P{%@gGSrc;UX;}CXB!zx`7 zme5X^pzL`K{oL$6W{!enCFMtH5{Uy^6XY1I90ArrhM!zjv^L!4+p3uDKGqen>V~T~ z>E{UU37C25l0rdB1roMzW~MzJVa%rarZLsKSR?zZ_KAt%i_az6^E)Jqs_M_mqueVa z%rDA$$8tuW>z6%4;C@AKX%i3LvH!kkc&o2_j1XT8DZ3s9BZj=Q^6bm|;e0ry4e~Qg zT?ZE8r^!X6F-9zB5C?KDzWdwTwk#oRbBC7I_atyKejX%H82bli7QQm9l}V(5qK z;CRJ!5)DeDOCpE70iNkihf_A;T z!Vnm#^6D#47V_?=76_R~m<$0%;O$-=n%ra!4nGPsBLOcj9b0(`dY!HKOyy*!4vT<~ zue=bAyiXWJuf`_KMU8DP8Avkl=FXZv)dRuRjPiwRWpEr=T!|122VRUe-U3~=AJXSP zhRfZP_v>^*0vKe2QHlJ${U4Jr0vOmEEGF%jmw!|VRX4s@30lqoO{$W&uYIi@T~+VE z<)!}n&L2VP&tj`xo=OZ=hDs!yn^5=Pr6G(uN+TWiVFJ4*Q{yG4yfcO`=3BKFok>k% zpzm`ct$WGg#BGhI{L`q+@W@wArXvBBJ|?Rgu5vA?)YA zP$j~Fq}lIhrz1Pw`UXhd?5$=kV3#wemUkj`C+D&(Bo&__9j*?L`lm}YQ0@I$54F0H|Y%*i0 z6te~!zRT@OBd+y(@|PBDD_bVyxKZtaxE4vfD}0>okbRx1H`d?FvAL+675C_WzPbm6 zd^dYQlw)G(b|pR@UTU(IXf$fG(G|GUlZ1B&zj{lOEQ?mGbAi)}y^zgU^3)Ep*jpGP zid(&>P$#IW5taOHugvCgO+-s0k^RNzM7E(96|Ke@6#i1`gSMpVHTxY5rl?A;3+c!s zu`rR4)uH)EISlcxL-itE5Yw5UBFKyQS!&DG&#B4nls}u?x_iA$fU zOn&A^&B@62wQ=T$^Kaq;pVCc@TP}4330`I^u4du_W4cfIrG==oWk{DkZS>u^dMe=s_o$;ysmB5Zn`QrOmMHf^g+EikXi4dVZh3gJ+B ztf7T!c$ST^Z|W$ay=9jH)QOx}yGr zEnDtzhS2r!w&(*(@n`KL>^liXx>yI88vE~8Jr!o7U^?5=TYg%ufC_T{rIKQ1Lhuv* zf>6d7+xDSKR&>(^ykc9=yloW)mF93e#aX>NwTIui=FIAgFf6%DV?ZoD&n+7 z@^3!YnMS~C?2N=VHB>SuZ}EFH=Pud!HpfYU-Q-jlMk6cW6g3xv=NNR!nmvc(jhh_Y zUa4DnkN?h&%P+WD=@p;8p>zP9G~8V&K=>p4dHyG}H+4DFrKU48lSBJ=HfB37+H#f? z&O#3XN=%chKM9J$7)K2r2y2HsYllf^87o`}uQ|+iG#y1_%#yEu(t5&f*u$n{da4UX zhlh#!SHwxSx-?x)bElpkQwh@5^MxUjwGYF?vh^2kG}*?P_5{9J^MrYK8vRib@;(>S zG#u}T(@|_{uEl0wf4zMwpqGCt(NNsJCpX)!Z=u=_dEg4k>(KTc<@%Rws=opFVqn9o zfaCHLJ4nP}0|&4rpV4W1$-k*+{ZhEd`zA`yK`XQ?3jfOxdI~nHz5ch{oPf^Qq}*1b zrmZS2)D%WruEcyC)pBtRcYZZNbS1!FZ=nOT9#BjaY4Mx(~D4O*(CPl~=zHPR$f~ zseN|z*U4`WQjhwpQ*}6|YQ0q`UhsOmU~Zq;wpGK%>0tC&YZ1yi8yeVk)_Ks1ZU3X5 z4W^ynYT61{dWH)auyqu>=SK~HoOky*;ayRm#`IWaVP5k|vg?Z4P(BqIwzL##n}8$< z#-loxv{)#X_FPaZqAL5&9FHGbe;8l&X!!jwe9jq96Y%X`VK*!}wGeZv-iR=h_hj$! zr-52ft)E=C)L-^mH(2jk_4j06gU0VW-(TpUR;jWL8M4ecZ!YgvrK5fY6vwwW?N@$`+R9hv@zos*sTMheC; zUOYny;c4oUnbSu&8_%7C1k=NC1WqK5gL$jz1j^RHF4tWx2XYKS`gz3{Cu!TwgkUuN z;S4oX%fw&m20THQyEN0!+hY0PDdjy zL{J(4BV)_z5GIO?IGG%TkZtzteEZfw`Nc3IGQPnD9fx^fKuWhg#`$YI)BhF)V7j2g ze2Tn!JB}tHHNgZEI0G#`*|9)#SBv?92+N_`fyfm72L_+VH)~~dryrQ6Ed5FWdx>xG zLY?#T`wlPEFDr-`LP2wWZ=oYBW~XwtxkGNe{M3Onh@Gx8T?3>CLkbN=soe=H3!3(a zktFP~9q&s=T{95L@$KM9aov?~pDRBBe`hJ^jv-GXERl&^W0 zt$-ee9o`7c;FlEn+Mgv(EcO;;lAXtHxT1HZfiKXyD&1v2Fgu0ps+#h+*iN2)zFP7B zoHOB%y8NvYP=5_TbBMz$s7B{xlv64*yivul6m$%|e{2xg$znzNZF6PO#UR-fq;qFK ze7~vED9L5#H+9)FDdY0U@rvywkg^y^CG~hKXZBD(W+$MIF+Gz%kl?ivmV2@NhOO_I z1=m|qklHxJ40RhYt*=*^I6mnf^-E^~RM;Q?^mWx*(MpPo<)?Oa^GV#DA713=4aO6n zHd}CL5J*qQ+Ofv!F0C?1T<|SpNhOJ6-nzsHt-J%A;ywJtV6RH^E|8>$WH-Vce%v(1 za9XP$gN*@mDi)`QY+ZPHI$1`BG(Vbj>#2HhIX^jidaX1!fwv89T+BJ7n!i>J`8R=% zDK-twNII9_jS-j%F63m)W;)K%|7G(e2K95tTwAOSc|BF*L^eNAcsUVl z6`4i%xZAsc&~43EA)KIi2(%_dp-;C>$mwh6=r+IG7Wcwsd2ADki|pW1O;bzAdkoh`pK zm?Uy4!N-smek!k-+^IGtwbwr&UgO{`*)WIK9e^O(KrD-?LAk^y8pobi1-_qyFkEw{ z#83+P9Bzp-1eaH-j6RCUQpN(c_FmK~e|?%#r}>hf$XKvU+sTA)yig3{diovH@rX7# zr^Ha_{WTm9GR#`4Hmcob7-0Qzqm|KLjF>}WV%44e#t`$^j=;wNB{pm%5AEZ7Eqb)>jXx?BA=dSIYCk!Wahak%$9;;Nl%}Q_U#Y;^SwV_KF z7YlNDSw4$4i|jLo*)q)vGo6OzJX3>;r6%Iv3QRj3#b%BcV=>w+h!$~@C5sG%clM?% z8}Xw-0^5vvf!Q_1<37=`-_D?jpwPZt)fO^K##*gi->lqBBi$=-;*<9#% z+O+DdEl}1T7vX*^c?@(kI`Rp9T+K5(NBH$XF8W7sH^{oWwR{BF+S+P(Q9<@88lfDxCks@fx}+Z?uNfJDRbH>_OL0q{ z6VL{m;-U>Q_^t65RPTWl^TP>@xax>bxao@JL0W3K)x$)S|3?*DSE-wc>#@-D%EJnP zrYKYFbNfvA7PzM*(aBn|f_riIw|$w@XhSVT_Mm6We_SZcdfgmn4KS~?<{@&PI2wmRKD;3VygId1s)ZD(JR?8 zqr7vXk2FXY+hQ3|#vZ@{9h`IbVY2a$<)Y6}OaqYqptj@S|Jwo9MSx>NvdsHG+i-$F zJ1sB&DA#x)pfC*f>%U4fJdX*-00#^}w+HlSEgXnkIbHrwyr_;61b) zH`W$A?L7qY(nN4~A0au8G`a|IeCPntVBr9oQjw1Ztpur&e#!_0OWh{N~;$;XlH{Pv?E@`{#KmEM)qwH#H;LD1AWti4X>ys8cBFfv+@~o z&_3$1M8@2I$ODCYW7H(THy4oNHqnvM$M{4StaG6X@+%PO7>h0F_cTzsgZ4?|X#7=l zsNtV>(7~H#u;Y3z;1oDgd)@v>+}3-r?7jJx^gqJlS3#IhR7~pAMTFgh({s9Iz+t(S z`|*9JXG*9V&>Jn^557m#Vt=&Y5x2M5h2Ex4;?sem2a^mWFo5IbinSaJD|<0**j6gH z*F1fs_*aO2n3(1=h02ePe&>SgiwmEWGs-&jBkS|@ZN3G!G?_H^sDGj_9b8<+8@C@~PjHFQmVzt$nc{ZhM8J2(en1UCFg4l3wy-+m>wj$h$)V^`h8=Om zDyc06tQlOSsCtD;lWyzfnaMRyb$!t zRYhFpebS`7h@vsw)&2Xc*_<%LH>g6WmqinKjXs9I`uoOY3c-gEzJDQOg)@8=B$B5X zvBI?dXr{qq;j5%b(faqB@nHGb&=tkdZSdG??;MEygt>JNzYr$8$^U*XD5bJT!BLF# zly1alMZS|f9lOE(%X;UZ#qWLh3QXWmXk<&BKua^Y|Lz>{7Oh|nYSI$(GZ7;UHAL#^ zyYgj&5@z50mA9sC%2MJoKvXgY-F8TF7BMJ*Wt?)5Lj_)wLP?N>c>_19J9|T!Ji#uJ z#7dC~{tWSib|Bdk(@XW1!0z{-MhU9p$ppC6LMu{CX>EQv zxk9ip`66SI7`v9Z?OiC=k@gFQ;IRn2yjQSi#Z2RArK&VDw2Cr@GjN!7@$^{uSB8u-Z;Ciq-3P^ z5hQas(n1MMO3QBPF0G7uYc#QW(z7X-Ezv@^aDGXCtQv)tI|x{m0a>Dj1$c)pFXM?t ztnhZ8MDzU6#&-l=Z#lZQ$G@W8^eRpb&#HW?WfW~`4UHJaj2qwny4Li=IL;;C339_kiZ=n2VeCmz#cYJWjAv!z<1 zr_cL?5*eu>Ml(Q7)sgF_?E%c;40xpC4@#9nOs!Y*)j9dL? zDv?CGy08Z)wkI(S!t6+bgccvdY%OK+Oe!hs$W+tl%AYttJhc#(ezs70uTXt#F6e^B z>7t4$%P>^x6Yse37V1i`zf^LUYGQq9GU=pr&Zh=VPl5c52bH-4>r5Uj`Dx%cbDk;**XE#p&K$kM;eNkN_%0PUmhvUi9lyLVc{P#EnMGzkGtmqrBXTq(>au_42fB3(Jjr zS=yTxw->YB=u%_RuYY-aULfmePi@hs#?|{$8!5kNY^jdDfh*r+v;lcRx+AN>j*cfU zD*1$j1~`B_dGZ{fQvAlg9UKQ)5*vX~{yU72%+*tX_j`5n0TGcl_t8m1w$g~N^vA)n z5rGc&X2L%X(LB7FmPD_K^*G#F9_0JDGA&oHx8?#4jzE+NveT4i_8IIaZA%<4M6B%g zLYZbPhw-7tsG_=|3s4ctOxmONc2*#8`$>pFnDr9zgT%P=JexjNwra8Ac$~|jV$QZw z({Yan4rI7UddcO3hT+Xf|Lz6(@i*q)@Qem#&70t-!0L~MEW`e|afYko_QS?}0!O*| zNqhMFFYYSrOs}Qn;5MQ5`eG*Yx6ynsZQLj}o@9J4Y*6ffso<`BiBRJ!tfr%{_+nK* zCYPExP`SOMACD$oQA=B`vb5b!#Y;oChd5QUyJ>fRT_G0B!QlM`Azb+u^X;ynyPiyV zss~&)zs*}%9%m(M>D=96LfcLkSto7KT5>anXB{BLxI6q7gy3*j7?z5YQ9w9&bnIB` za5WU>vCCxAugtMjZ_Ldy##GS*SRbXbjw_a|KMo<=wGom{_f#3M-x4NU*dGjr!98}q zop`fQPYQ5*U9oH$H9v+84faxeUbj8G-T!5MiPI`An#pLjF;!)I@M#X1qRE5saD)S51-+YDw-x;FkG7x`ZF=b|f5+i^x zppdTSF)E3Hk@}g&hq;=T3#J#nPJu1FLBZh;<^@n~uOVHh)M%0Qd^gQ5b;XabCHkf>)-#t@kv2n8>>2|L5>k*JZxKdXk1x; zgi4U*sxoogUB@YJalT!D8+&ccRA){gyhV(e)y=wVy#YUdoEqD$aN>cS3uHEymZrHQ zjA4Wa!qX-!jqx&-rDz)s)lU8IQ#kTLFlr8$&H#dzf@#?=YvA#{5LM}4wI6<{S$_&1 zdz3P(dLCaBCfTp2BGS~RrY?_+ZHB0*c^A~0yEShLdL@3vriU2ZB&x=P=$9?B21-Vi}f_auJm0mpLE*4VMXA4afr}x-2EzYPO6E&!n_r@C0u?Zks7vAvhZ?tvu5G!%nqE?NcZ<`)_MLB zjBM{&1TF0ScctDd;s8LhdVydFQF{&a3dGZvj-@7#^3^x+O=?wJ*EG&8d&M7bg0OB* z=b2MU4K2%alc)3zWINgzRapF~Ke~{sY`}oYN=Z^*eS;Q$nv8NmAq=9@0K72-(( z@Ga!q9!7|+?xf-^AON`?nauN-ZY};>rS4_oM;v2o+cS)SC!(b=teuEW&wHz*_2h|s z3#~%;NK{!~$_E6Ek4w)=kqC*%NxhfrwWY5%L+8xHqAzP1%U*UUH7`gO&aWME#th* zHn|%*7EW=<$*HCA+*#&Dg3r*ITn)Ldrb^Z+g4$8ztCac6`-jV;)D_tf<`#jsc^AkW z)j0-VKbcE8geYRAxX zrNCh_>#pbQQ%r2Dr(@Rt2I^3ed!KP?;Rr-~alPGXZMqfl=4SfOB|;|rMdwY~POmea zV)%!ryUl&0x6IJTr+<{QbmHEK;m3zVd&5_&hg<_ZbJnx^ke?QvZ|q!`p`i)$gxoz> z^${W#?MP#sQxKN{)uICUF~m~eWQ?D!9YM%la@KDHzdaU5<4Uw?$??aL_ai@QjDKdw zLwmo1iqbl&ri2$)rwIXfy~VlIYo$T`lCP-rmp+fN!<@<3^MWUWiJh9K8cu-pi#E{I zV)>tnTxUaoqv4IT8u<19?Q+HcBQJKl10Wtn3<$MBCZihC|F3Fsa3je2CgfIx=gG_4 z^K(Xf>g->Eh#mYC&A%y7WmiI=^Ft zGGXb$e}|WU<|w;(8`1d}dM7bthhR{Dsqr~#PWQQMP78YL5XLMxL3vTW;FQY-p7--q z9m_6f{2AWhydxuYzR!=*d&b^(oSt^*wR~qHG+RKBJbX1kl-vo>or2HJNUY%Vr<#%> zByqo~vihU94LT-25OK2J7rAoKe=n92Jh&8rMT`M*a6ze1!BjBbL!ziv;OgoNDsXVN z@-8c6Vomd8sUw`3iCDIjQtPs*!5gxvFLT3=jiD3^Wq@8N1+*LpQe0Aa`|P}$HEiksUzYvVLq@2=Y)D{eVxGiGzxSW#n0j!82q&li1I?6cXg;!cf z%xAE!AniYh+9Li&fb3!9gvcZU9j1|j%+=X>pyeOjkhewN!$Vv8XosDTh=!p|Nqh6o z%S(+tC3}7DCj0%#V84#Iilg)Kk0P_cQ*sWeA$3{<1oc-EVfvY2d9GL8am%U+;Z6xR z4biZ?cW);v2xt4FeNiN0gJY@ReB0d&Y-`fqJO1v)>DbnY`{rx8T~ftK*b~JoFyBcy zrIJ=qh@?=o{iGv#`h-F#pV9YImv>qzH?RZ}nf!{RW|~fXafF=h9=bEe5CM#0!%=Th zYNxkN_;5sE{)4HP5Q+7I*4m?0$@a~3nG6L2#Oo7_6 zOL-G1yZ~mOj6|xep}_286RTW3F!fHzY zAHKdhO7dpgvTS$RwyiGP>auOy>auOyw(Y7en_aeDId#7~cfFZeZ{8o7d43V+MC8g9 zYh}bad+(r{Q{eqh{G3CL`tVCEclg3pdD8W@j%)59?rJ*G4XD`nZ8g8pOLT3J6$N21 z3n_*R0W;DT^i-@|qQsEAV;{{M5s~hxOJ%dRhKHEZ1SMP)nP8s!&I|oTBRZr*JX7x@ zeE}r4MWyW0yzN-to}ZuS$e_+y4N`VJ?Jes_7>R)0GsL-FzWU@@EkTL=hRbV8Hsu>| ztL5cC$l-GEo8o0GZLyT;A#ku8lk6gtc3SG{2>sicf916xfOUE+F^rs5@rMh}SEl)h zeZg;SFZc|S2l)wQ%9DsAM3_O{4A@d3@vnGcMI=}SS zHfs4mQ|=(8%z)e~|1E@iu^VTyXc|HJz7Ok--5*An_q{`?LbHdWkq(*Cq#DrECg(kI z2jVe3D`t~KP{7k%q!&%W&mxd=IuxcN(ep;V67%(CI5f*4y%JI>T(hDswGc-zq66Qk zQuDJmn4=YwKPr-ySvqtcJhf3OlBc>{@QB@=z9%k?f3HUw{Mp;;k2x3p>xD3G4xn~h0#);oOMxh;NNl9353eU=yDyS@_<7W6OOfjqn<2<@7dnM4+1O-w zu-e5^GptY-!rDDeyv!7QpFPGhhLW6@tYp<*Uukf4f|1R`i!!sPYKrXP+7vk$i5s-0 zn-Ug9^XQR$u&QcF?y&07dJ%sTu8=l4REngx5*$5h7+q;$24f^+wAMf$VZD)? zBg=|{MPR|bVXdCR{TpdkR-&v%W&K1|8cXdnb)TA}>I_7vfttvG0-=*-)n6)a%W_i0jiUJ8b)j z*#kIP>w8!eKQTZ1pP%dUdUkg!Y|aewpJa0Lno#vJxM~#_NXAwP8+)VlnRo3?gvUem zRB9H1c-bp&Mr0Tfvp-~<5n88&l4cq+9+>sFmoN|0xKt8)g8;nG^M^L3_{A6(hMKqj zPnzZ>@je=Q6S+S?pU%~p8B#}C@fQBdG+&T8Vu#jitEQVIO~y;{DLEpMIVM;U(_Jtc z@5sWhNEvI!+pLc0XUaDT$vn?)ZEvbTW62_#8L*@hcnEUfDvTa|)4YlNzCcW6ZzGNX z^OwKS_QY9_BO1D#7p|WwQZKNh90rq{h8xXsrw{ztX8sz=9igj<9-%!;KZ7@TaT$_H zs!1GHyrpfikN2BWMTxk1a!pp%Rk(VA!{_N_H`+oo%9)$>4b@91N9JI}63901|C(#( zR`s}g#(&Q64w+dJ&`YrDrkJWIYCT5#d#aHnp!>{qvJJry9q!*jaR*340rAcPjLvL- z|7UeKHd}r2qu*lQ_QEUk(}A_=svyI-XZQOz9s}uzFO52Ah9*y!97JXK!~4qSJ#3cMTf$g(@rWY+jASt}a%Ea(bDKH$W{;CIHb5JsPuG5UpTt=VwT*e33J zb127ghnP<0;VM%K70=nscUoHl8&FofeUl!hEm(57Y->gH@0y-~8@8j(_40s_22Si) z8_JUdS2DTj^CTEG={EK|ZD=aqDY^LM=I)08C*ilrN3ZJMIL zs|8xn)9@6>STc-q}GCCplB?2^&0A4<{)&f5S&7QtAgdPA$Tkyzs6K@f zW$B7A;w+OHg&62J!^r8cx0w{@a&Pct0>k8x;_PPoi?0>hp4|-HP`by)xIp@)==W&M zJ-In`X-{;;UPGP zq1-ftuBmizS_eUbA=5ZR4;Hy(G`1lTE1=DSjwx^9ws^-VF)fP15N4`sT`Od5v%*tO zoN0|$QAIU;L zN3tcD2PN|%>V!(Jz%#l-=*juIc7LN9B*SLG?Ph~JJ;MTx@qelKV;4ZKN^dfP2P-(i zAIC-BhV5%#I-AvY&bS_YWBV+{Wy>56#;QjF2aDL&Y>6Z-Oih7{yzJqIJM(3(Q(v^w zEXKYt%+P{i&{6i}3n1KK;N%O`BFKBq^<~nf7GRKE4=Ik!b8@k@;p!PnAyC`p76SUl zo08190dWv}=Vhj#iy~R0A@p5745w9mNagvmBJy;O2{V@w;3TJNp5%-B=|EJA5wWTe z+0fHxoL2~iy@Hb#@i|@=+4x4pWQP3V1I?7~n!i;N*umZAJu8i07jO|LlE}1nY{;3D z67ff1LHYk0ob`z(=)0=mDNT7BxXdr3ft<&o-is^~fzM!Rh9+?lwZz~v9KcR=oJUBY zb58`K0s_I;C62dER!q*CmBF(G54Pvti?g6`HT~g&{sf?s2!CckCkkrT*K$PmUxz!N z>1^~EAh{#KFC?GMGRG8f5p^T6lC!QOVJcgagW_C#77?Pyg%-AssiRY+{n;C2=rNJ`xrjlfv@hcii2`Cxza9X?m}Vr)jNX%{t0H4bz>FR)Aj(D? z%9ppCWtPEQf(zGVKxwKyd&`AQ;YnZVjrq`8KG4&p zZK}oEU^Q`WpvMA_+KgPfTvCvkV1&hNFUM>j<_gZdjYx$UJy|bqn4b65VGftL&$|7y z&!RJ5ucMO{s$sYNfkN&g#_W^>ofTWu-FE`2+mxPB;umNTk6U-lR)kILVoQo0 z&3NyfZNepMAO~cqvw~?QWuvdGdV-O)R}Rs;E83uP1k4*#=$ksKH0q#oG{}P{Jl%0^ zie(ACqLUm1)vHrHI{>ei^TI30Jlfd8i$hEKwP6t6j$f&K)5ZjPXYOtqKUh+p?t$~X z*>a^6<+NR>RnX-ef7Cb!2fBnVO|{bjCu~AZ*v~=MJSnen;Ztm|=|vx_bI3hoGCBXT zo5W&M1DWN3*(RLnF{+696g*=wziOg0k_5zF(w3^p0xxH#^xCkX;Q+TV)zVCrn)pMS zDAc#jPF}8Is#o3B|ysKBB67*-&D$qlWjHckRmC&H`+fc<@9%~ zOO=-kb(`$BtT!)_+Qhq`b7i)12NdD(7XeOl_oeI>z$no>*UJummVXm4DE9FpM&di= zTi-^jLyLkzfWVm>LY#IK63kTL*Xmz`GaVKp1cDk$JmzGytZc{~ zXQVUrxP6S&+b)rw5upnW#7R36SF~o&M&}iCLu5;_12mTxC(5^7Yx*8k>Yo|XZ|9@a z@-gePP{QX2zUu@oaT)$4Prn{p7QX5QC#4z(Cd-IkCHnbYR-m_Zjb6{COP@SW%uv1= z)Op|4{ig5gerz(J`UCL}&^H0_BV|X}Oc%0o?Omb~>A*0IkvAS+vq5z>YrCZSQC>fV{u=cOkCR5J@l5#FLnCFqoNO zuC=y34u&_fLqAJEvCY5i%@OcchyMS;{6PNp$nUeEw8w$j3<3GK*{s2i+6E79D;%() zu=^jAOZYx|MC5=up5U)6X5`yhSmRyVYnH82Fx*4@F1cB3R}7xTZ`ZQtgSa* zc3?eH#F@-#cGr#Cdxi=E$|ek(LLhX3GHEx#-+(2W)CgA;RkY`1>oXg!C<9|pb&Qt8 zD(d2?t&3oA$_>vX(AKOfV?XGp9-;w$Fceb54G z$lA5?-ERHg?*GqpL-CGJk_buEm6}IZXqzP?q5F&w=whmI_g`^lF#@X-u85oCc!Is; z!!zzra#yo7Y;K#7z+*HXA#jmYNH#nHa6VEuO4vf8zf-eC9z{>G%6O;KLoP5vR8yKK zce(;k9{@?-6DKv8Pq&eRB78Nd4aM-5vxw^lkob>mV9u;A-SoF4{v$^AC^QLv6H4GD zj4}ZYe5pKtxGyk()J)mM-&^z@@^2kLSBEAcAl*TF-SKY)u+ebyoCt?9)MzDPq856nd`%ku=lq)#D&^KMGc%=3MB!G-!G!cw-eD2k zkYg(DCp*OzY2Lq(k`f8mh4`K^2-%H;$@mvzH!jT+^Y_*OY|nU(JgyamA79c!hUoDr zgN;?vV@BGy@)J`Eaum2(Kk|uLl!wz0hl}KP@#h!l7pn#+=H4u(ja$sBX=}C1JaMbE zPiv;a5t9NI#||5cxPDrO3BI>ym{4F>>+JEkdf2-!dJ7_GsMu{h0|q|2M6YnmhK(>B z|0?7Xz=`LnbN|C`A*d#rOM`#OO(J$WL3*I`1lCCSpu;5_R8*=Yd@E$t-AohgJkynt zGfVHzOTY?jzvQv#9lhc*TBo%uK=q2E1XWvgkC+^+o?hY|2ypu5sg|)s5aW_2{HdKX zS328WuCe9p65azJx14Fv#m2UqfupJ|rSn9TUk0~VKK3dAv-WGM-CJab4)X3L0LuNXPgBl<&ZEhg81e;qn^;Jy!?Uzy*B&M&QOkUl(4I<%K)!CqjbOvIc9 zNIw*LdHLPW?%6>%P&l|&*qma2;r*`y&V`%+4i14H7ic7?+g!UxY_NwT(2p4Gkc{ME-?W?;kG|-f_ULv9Dga#WT-y z(bzZ`dz%b-q`~i=FdThAjlr$$N7hv)$nY-$j7Gs~Z8s=01BxH3aW_&TzX}XAf32ao zZfe^z3*530O<3R|)7c;+x<9qPOLI2^=uFYSxl{{$dAa~Y$6?GSt{Sk>Gr};Z66B!}Dn~gd*(b-}x3e_~j zoKhZqFYSfNz-&~a4qcnQ+RdA9Msov2J&kB^?o8>+O+a^2TD~9= z14H(#0*o*Xf_$ZVP(EzrXKOtEmvM@3tTQT`jg+-!Rgzb=jgPd4YG4ET@#3)LY5AeL zwC(Pw^lN3JtTlB$^YQAXscCYkp<|{tqU#K+y1` z#K4kkk&HH$(OJzpNvG_w{1$P-3HArvSCJhDi|evTm+b4qb$CvV5tBla<`t;W;zI0q zV}TNFGC}(jW>3QNK-JBMNThJ19?*h9G)m%egf^>YHse6zb2Q54IFJ@`2xsJQp%3b| zFJ&tejOa}U-k6J!#hFvKn$9uZW2c!(ybEk3xL_-B&M$cpb}}UMg(MZn@sB^aATTZI zMXiWGlgkq;rGhW}uZN+a5~DJ$&+Ftbl!BzUUU;R8GN|5?QqVTRC7G&LXWtZL^$q&z zUZru=jG5CesHbc#eyl2*^QjH9qn3k;0P~6Tn246RpxBD6gH0GvFg50lYm_jHp|hTL z+(g95(mHCJ!|NivmSC)djMo?Knn)fYXo?wOTcQ}$7_zzjo`^vWL|4KI{=iC`dFf-N zAd^LuX*6QyrQ}xxZxy)n?<NnpwmzoML`=TH2_EV!$)Ekqg+(QlukmE4oll*Cia#k3Q#Gow zOO}kU*@`~UJ6qmj{rc^8^#&G3^E~x(tlK8f4ZL>#a`95xdVVmX*JKg`jg)#ka+`Z~ zwb@ld(aAMCB{FjG%5nHW_<1`je788o*2ezwL9H!U3)^rvb-ZOLpP|?5U-AlwD^1oz z!tf%W1WVVY0_e_jXtZc^yq>`j^_|F7Re`Tna~;^Ie|^KNvMCX;yb5`d?gmlX~HfCo-g#}>9AxF!bL1ymLAxm$}>Elduj*Ld4h&R`8q%IM)o zXCIIzXzJ8QN|PmaSayqvM!(Jba0!z&9P(o;lfCoyvE+YnpfN?o11vYRxW9yLjI3rS z{36|@*8Jkj^@73EjDe0gA!*l3!)AzUaDTtXF+NKOj}3T2!$X*r(_! z6|DN+@D8$dmUv&gk7fuaViP80us0`Tm&Y$aQf&dZ_o2JhDQWkAS1DP2t;gKfAuEz) zwIZO!YHFHmtCAK7befTj=4R`Mvp!9lnvvADzc&+7$7L((UsC?Ou)gGb zfFST3z%wmCZ|weL_Wwc8!W;tvegXj9xzOJV6W{8AmfwirA?3Rd{D+ve_8p^*hF^mN7>2bo=%X;{FgUH)d6ClRVRvUQ_4V^FIWYKXRDN$l3GAJzj^e zicc)B$fi4b`+wo_gQ0!dxUUmGLb{9#Sr1q~fj?@+t&64?k2X z8-og}&gF9pT2BoSVq8ISN4LquE*}@DbM2MMsHD@k71=_!loBfL_$eG_X$=>v)DO4d zOsu?fI5d5DgkMYG1AZC4u?ow2OB)t9CIjwgq2!Xe5o_kH63BaQ#6E|}EWWEcYHH*U z^V1vKdAcKh8ZHPYAlkJHgN>>QYt+MO71yx5SL;HZQ6@EB$R0@yF$KKaG^i9-;O8^D zy@agmG!|IQE8zLHt4%z5q=Yrf8M$<5BQktVKj2$cB2^6nl(A#>^8Swg%-WV3gz_*y z5tYo@AbwrGDqwqn@y&PrF@vAV86Pp$@!54*%mHQ)EC!rf{RvB4Bt5A|zsWq(hXU(5*L6 zh@$&t5c5p0ex)Jmo-O!qNknlD!fHlAMpb*~3HcFtD~DftsQ*^)3=tLdBjFbS?cI4c z`mPq+T5F;xY(_E?v)%MpNc{dO&ZgjSQW@L|Kl9^0OP!%#WA|2aQBmF*nW0^1EM0R|19BBWe^zdS{*i zg}PF}N!+Tcf9`XeAY_Iqqj`e(sMhBh4g^$7us!FBu~b|M`JdA{7VHU63A=dJ@%>;} z+2r=`Gba0|F1?M#iA--(nf6R^R1KCms{z5UcgoA>M+&tAnkv-B9oj zbH8Eifxxgr8QK5fow);-LF?Z~+n)(fMDoF`yv} zl#0zHaBXt@x-Pp&O-cynel{r%G=zL%_`uM;Y2^yf|NCGnEnVTRv!6#}F;rAB&+q*7 zQRYF$%80ksZcC_a4_AG?#2i#TZ}e3|wv|Y=QB@=_t(Nb+zMs&7R8 zqD(U=>>lvkA(A?%BH_j>O2%%{I#NF$H6y!MJVKQ;dvQ+KolgkIo%cF`@kJ+>ENA}v zL8)h654>gt8q_ud`2Z8Q+_1f`=$K3eR|G#-T0j267TXplfF@Xx zVm^7(aU&3IIWdC04(s_IQtKOdaX)m*!Ah{#+O-mRsPx+vdExg23vDV}h;eSh^<5%N zV|d>dvG3%WR(`Z1^oiC%qqP8mfXuhjU&M$zimKE-KQ7615h z)y?4@^+%bd^W?Oj>inMxgM?kvTrY=$o-&4XjNkpBe0oOQeDwtvxVc$W=%Xc*6&%t@ zvZuW&dv{D$-Vm?)yyO;A>`F=s(dn6cC!`tMM6t58GaV2Rv$eBk8dm&jEG}Q#)8&uH zxytM80m+-O{E`L7VLK(=1-WpoM%uZ zM@U3^|JC>*D_;B_G1NVd-=vpkoY68`K(!FbQ*w~KXwnm8>Y06c(QO%-xD6)RdiqOj z)VLa^c`ibRWUl4&l!p|N*Q$Y1d)tS+n#4=CRIQkf{j_nFn4*f!>5&qq*y|wp@HUc1 zanT3-m8jW;NoWZZj-nU2EW_a`_x@xA^L_R*dn>~f(5|)7{K5e15%t0V!TqiN1Tx0p z*+X2H>Zt?i;Xpl`5%Z(vEam_~>t7{BYu59a`}}3Fovjvm;1&|Qa%Kkj@s z#}&6~!jFg)bws0JlKEfjlGx|pINx(lzJ9{jM#a~Dmn`@@@#ulJ%{YEr3+9MZ$E`AN zTke@g@{juMD(kkGMoA#97HyDcWCv4SgcCkF!!r4S(w0Zgdj5UA$sgkX#sMiBm;8h33Y;XE}Rll5W<5Lc(K?P4v%_wQP~Qjn9Yz}itQ4MN-8=i9oo2(&>`4o@euMmX(Sf!SQE)-bq-R- z!eqW;vkCXOM6~UDvD1hOvjl8G8KSvU8a@nv%TaTkel2GB`Zh1EyKcJJ+%qrmTVdfj z%Dk?7NxFInL|{y^r|!2lbf&Qq8>%#`$4F%>I>EV^?RIE(hnMrfzW&OL=@_T@;c{%P z2M(re=q`Y1C0nl_0fXC8q(kF|7nT;g&Tamqj0PgN@w}&uN6vY(YO`(T*r@fZ>fE~B zKp35yvbjY$1Y+@HUZxtYH~y;b&C#3T`m@=T%AB0yH=E@Uc>3@t|Do)fa&$OJL9O zKM%NppG|^FCP z1EoP-9HcsTSU+R_SOLQQ##`dwiB4hW59w3B(P2m5JRn(O*f2SU4{u>aZSpF?DPt9> zpT=YyMV|sZC+=`Fb$Lf5N&@Yc!TwvRXt|D?#_srSu!EB~&Hx+y`OLW5MmN_@;y#4u>zlpaVsMp2({rN^Nf- z!g|{rJ!A%1P1`#S<~J2;LMcaXW!xd_oS9#6qcVa>3wWhqp6cI=0F0?-)6_V<|4r#( zXr9mv#WKSBi6jzlL}dsj+E~e?*6m3-@wln_@A81ZPJECW`n9z4o8BpN5)@gca;Mp+ zhaSb6Ck(gZg+Ew$k9;ko@3tCMTaB<<(p@BrP^iov8b$suW1sz}=tzYi8R_dov{DLi ze8KL7Sx+Xa@JAYtM6HB`e)qMUbF-p-_M7*Qr~?H)KOH7P{y1NYC=uzj?iP;s%d}e= zDXxpOu!5{kIf$mAzg30Ew)ps{4%_59DYb!Iv`{RoAK4@Y;lK&gs3;aLe+5{g9qO43 zagrVCzVDhzdahMO&QZC>?r(oGX$ktGLragfM6vo}9Z^i5$qq5eN#&4zb&&V5U=5_( zlS(8~OC*`@L27NlX9I7d@md+9t?>^NJ-WW5@*{^8uCAyWjZ|eY`}rr^9Egn|&Nvm7 zO~S|&e1?)Zv}=wHy``dL!CNXyLuFph?(UF3$t0dhfT`UsZ1Wi;6-rVLcYmvB8`nZL z0HOTV@dhlh!@*oa&RWd56fU`}j6Y;Z8TNM9(T7RK$}Nf_B%^JWa5ZiDBs6|_4n!Jb z2G1gB=&t0txZ^pVzOFR45vUG4YquYRg_+Cv?+vcUt+9-M#82{wwPkm4=;ZUFqwWxR zshJ>Vh)$0nj{M1>cns4i6J_>7Ec~Mv^0|hi!?d^*_IS0x&D?Zt6y_gV35KK?pd=Vn z*9Q8AWCx$HC41zr+u&IA1JR==H*-faLt+uPC>RsWq&tB^L}V<0-|Q!38lW6g46~Rb zG3l#9JTBRV`Dw1OEc^TlC)4U4cZcEv?OKVGBE z7>5)mv8J*|l9NT1Q1HT!iXQjYmn>k#Bql4r_AQj0Z&F-WWe0r!z-rW{=JnYwIU~lR z>bR9OVHq;_yk(QKw8#-&idxY#_EIKD_gs7p(jz^!&;Ek$nV#= zw53J}4*UIMdP_NFgoG|fCpk&V7$PL{*i{{8@DZz<#*ogg7sQ6fN_IX0Mu+~4tW?QT z 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 z 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 literal 0 HcmV?d00001 diff --git a/packages/keyring-eth-mpc/metamask-mfa-wallet-util-0.0.0.tgz b/packages/keyring-eth-mpc/metamask-mfa-wallet-util-0.0.0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..6d4a2b389376fb9c4738a1b85801c6c14647c46f GIT binary patch literal 8276 zcmV-aAgkXWiwFP!000006YV|edfPaX^IK1WR`#2bx+&_g?DRk6Mq{ttM)1GUXe9qP8oSK~YV7PZ_u7rU27GR|+Ra_`m&T?E$trW# zQ=GpvJ{wnZa9>Gzf~2WpO^9JnN+oO<$g(}<(jZ8sk6q;1$eZdenmP7+qI&2?Hw<)1 zkY=lMlUN?nkZ!RiW8ENPsdPRiXly&C;vwBdmx@a?WLxOfb3$fFiSWItOg(SrcIx#j zLS~8@JQr2ltP`u=6dPirUKL7;rNwDbv?*~IZLdbeR4h+d(Z7h}>b9j@9AKB2*TfNR zXHs`(M6F-90H!$gOrt86N>84kR~ME;3<5;HDV6wd9TY&B=-zaGNy$1Uo^q_XS9No& z)NT~RAYRSYuIi=7p2vrlnJ@oG14%v^$zKG=68Ud6cAh5Wzq!|ZTFC!4%JJYF9qB5u zTv94Y_Uz8lCsPkq)GBH5d*OX0ld6J6Gwq9KtN-M5M+;G+i)gC z0MS&eJ2WGXYg@>^^b{RL6DdfwXLlug%p}^i$KH+N5Ck%=xUQ}03T!FC?xJ{r4>lGT zRlF%d<&oc`T%|}fq8KH*0TC2bp&Q+s+H(&%#Pu9q1sDR-E!CK7KtoV%=%(&tfbMkU zZppLJ+$92~Q$VJz>0|g$=&)wb8SiVi+aWp6SFz zbgU6|v<;9x1BQA&i|A%{Gquh5NOZR}o;#NAP6_R!*~qmiM!FHw%^7xE!?15)XsT^# zI*iEeu#H%`w66&r3!7NW_H>o8n{BDltol{%RADc~Vpm#mkbrl26Y=`1Y z4igl?GZ~GB2j?&FnT!S_bb2=Y*Pt)=Q5lcWU{n^+i^2J`;l(+6fzQtH$@xn(JV5y5 zC3-$M=?h5y?et6@jnMF{G&nvz8pwSC4Njz^i~iu`5cMw3(aG=}9Sx2L=W-vN4-p{r zK@H>)06Uh?z_K~Vy}{Ao{H0Jj7@VH~%!A<>!sryAoe!joBYcKVFV0SfBN^e7J~|nm z3{DQt1}BH|v3znaqQMC|86x>#^2s?GJ;O&wfU1Nq&Yum>fIcJ*PhXx54xgQ)XTzhu zd^SQo866F9??`5-PF^DE2oH`0)W^s8P^P_x=g;J`5;SAfp%>3&cm(+H3BuC(V0Z$< zkcKDcXIMHH(E0G}JnZ^nFp>p?&jur4$idn0SSSHIhX>GPa02~KWCjITjbbx0Jfq() zMsf%c^<{iCI5`|aXBgsRZ%;+}!X?oEXEN>|%U{6wU&a34X(#Rf#?xk@|F=<|pm)ER z#8b?KQ9Ji^<6WtA;pv9%!L~oP9lE~<1_3%gz~}{Sj7I(E%$gopuBR9V)v2Y@yF10P zkfLd55enNWmEKu16X~q;!p2XYAj!6v=GCnU=r~YfY!M^+(eXePDaf=f+aWVsq*OU` zm8mHhhsuFKs$zk*8{2csKgtmFD(H-uTtp{|4pB6dRK>4i^9M?T~U@rF0nsbkNGW84;!XYBiW#atjvw$Wxq*nT;yxw1y;@0%BEeKmlx{6@WMc7MoQ{(hPmK zzmLiq87p(cD+A!~`~lA#+q1p984;(7%gv;yDuz+ttJ;>RB1wew{+hvWpgoX zSdJ#TETB*5S~2GSe4+blx8yezkBMnJcgKpQObD>!+SWDHV4O0E`L>DnkwZSrb%#{S zV%;PrY>wsXaspzIDGf^&4vMWDz#XTKE~IL=#LrQMr_G%(+M=1tZ|qLtfR<`ruRlSq zJ$F=ctjuP*HMuxD+7EStXezVE-mQwV>5{GgH#^tM?EiLqC!zn_&32>E|Jx{^%Gd1P zyxiFl%5c$E?v%rIP!`H;LpZZ-uiPnz-`#TORaq44uA};^#&gSWgtDcWwC;^iHrXEH zmOJHcvS5s{pi3CL5`2Ez6YN8Hq+qNFLyU13W6A3YZD`W-zx*g+eAA0afP(WGUQ(qRd1swfMxRE zY9#OfclMfv{lAs6SaLX{C$O3VA>nL}jH<}OSZG$zrB)agk67~Lf0L84RQ}t|r2gM| zTIm0+lm+^qu7eF(094@*F&+vs#xm3M^wU)jW0fj+Noe#qZQt%uZU1d+-^VYR@^3!A z{@*F&e=B7r{cq;$|C}nO|IOw4-z@b1qn14Re`NjNZnO&d-$q%e|II@Gf9oYf{>?4> z|G)v5^8Y<8h*-sPKhydX*@o9p|~alKG@D3GHEr$ z|BGngA^3Tai#$hBuV`qWVc07CN&w*5lwy|#v_m8x{T+fgB_;&khDF^n#CapPGy99z5Rdv9>f;1U`-c zo*^Xx(ofN|ppV3W{)#21$1K*c2B2SZIDhP6{3FHr_a21=y$&+*P(UGc)`SiQ{&Zhr zsp&(Q^x`0*mK3jorOWQi5F$lDK|nu^LlX_B)x)^e<3Nru9wq4uF@$K|%P^W}9MJ(^ zo~=GL5|$3S7~l5#f-B*ho|I|NLr^HyZ8Q#dAANdl1-h(5Er;%F>%RNidTnjke4qf= zw;#e2M5Y}9#8W-g3CHy64W&M1UcjTY=7Oj9tokjA)`QLE#*TeMx)8hQUmGaH&|02L_Vab;N$JhV6 zh5f&kvOxc@8vRx1|F5{D{6 z++xYv|F`b{Z71`8?d-J*`)?~H*Zx~I`fs`Qx6Ju_%p8}62l(6c02fZ*!s%N$egCW_ zuK!s=hfU*HtpA%k%~byXoyJaa|GSlvng0*=xKl^JRy=Z`6GIyjFDngTMzdJjI8?`R6tj{1v$fG>Fjh%qY3TGX1R*Isbk+Di`>wSOa}R_lzm*tB;M54 zAls*9dnicZSLU(+M!*!7g>JkAq@t?Cb!`XTC@%67>VS@*hsWCd@dx^Dj5_E$`W3R^h1{v;5GN^CFhGK4;o!|n;;{VcftI+L+HP_r)cmZ`H<-DFT{0Dm-#TxVg&)e}G6$<(M-od(d#Tqn-C=gL zVjxqQp-bZ35Mm*p8EDXFCxT#r@IZVJSs9BQWc*l}RjNr6*MXZM8o6-!wG-Ln+|!J^ z#_WxFBBYI@;Xb~6Kwm*daJF*M zp#QKH5iERxX}k&X0=Athj(0cEDv=NyU)~gx1MbIyx zmsm>V8f#Ry6jQe*HFlt-`Pc!-gm{6hyw$bXowTne*5Q9l>O}t=?8{$-YT)2Thz_PA z$zjF4vs8+x;z817AWuN1rg#dElWx_>v;CPv`{A7Wt1y^S&t5F&EA!RT{Q63WHBO%B z!V73B)r{fznz{m}gWoAV7^qx29B9N1i1joXVQ3#IH;V3k#xQ+CgOPG11!Si@F+OsB z&>50t#fFg{ybfdD#MTFfQ36>+GFXqgmQ2~5@b!e|ATtHuU07F^ePhv0>kbY2aJLc1 z5c9&^CmEz`3Em{8bQWh-nm4m>QEXyg1_mWj#yJ$?`)oEP@GRz&k2dRPgKwo`dO^F9DzUo%mGgA$ZW`;sXav9+E@4`?SJ zMnWlZy+2zoF${~nw;Eehz6X~0VK z@B-rtXnF02V!VX7l69a`05Z+Sl|UuYhr!VPnGO+=pV7eW4?RDOhC|z;0o_pm31k4f z>LvL?qk@7@I1DS<>2uLH6B*-)43DRNun@X&85 zfIsvYdl{HpJ`yP_xJYKa#4^+>;U}Fj$d7`el!YPbtfSt8R+%w6zhddBlrzZG+FFi9w6n~pEQbj!62fi!64rAL145e{hB>66=O9iH4%XU z$ZMHF3kjxk%})})>{QrzpxdoKhUljPi{&LoPl&tE#cWa1!YKe5ob?zE+9sl$i3``dkXVU{L?&#>BIkU_7DZOjF!lIwpcKNvtz}Oi|2PY)l^)j){UxkLe>n zrp$@*(}x%`O&@Y4OQ1dEzOP6Q@$e902%iBhlOC1GAD|~l#RbL8w#1hhH|XbPkM2G; zh`2oSm&ipR$B6(yPH-aOqXPzs^%n~5O#4NfdpcguO11Vw@*?OF72!q}cHd!?0;7*O zs_5Rt78Kq0MzBoP@-OsaYm;-7e-UazKY1W=ImGxuR2&U42YAri_r3-r^F7WTbfH_` zj~MQ!t5h^i-6j8kXr6GPuH`7t5aRVb->Gr%p6{H&aFj>GNzlKBZ=COzbd1MGwt}-e zHfMpSn;Ya(Pj{%8swq_zAE6!&EMrf}a%!{AIUen3*LaXK+usFZqt~^>z!$r*Q^T!> ztcVYM7N6FPEiThz9SuLvUA-0$GCb8;Oqg+22K#BkYpeeK_phyo_;R5a?YWLOm+!E; zJD2bEh5We;#o7*C=vEKSv6Vf$)OrbP!=?4=4b^2lV>+BA>{l;xw02O1j)(6?6@Sv$ zdTmv6tf9b6T+w~Z3&TR+aZGA9;W&;h?NDAa9mYXr%BZ+!vH;?;R2uUAr%6#*;^SRc zYH~2H>*ZazR&(6FbUCuBikSbd9a(FwQ?|_{Q%Fo@6%L8*(FuONJAaTsLy= zvR}oA%&Ccd2l85)BJv$)DTpj7@*T!2iqJRyTeqU5OUnPd{rs;xt@d8({a=mZ{XbhN z@jJKV{Y$ucb9P$rYOuxkdF5{D;n#WPMb~-J>&6z}<>j{GF7ir=?J~HjE5$d<^i|%1 zoOml<=TQ_-{NHz_ljMEYl~^}3);~D(^0leE0#^CiR{%kj)&o!AA&Cz@;f4?%d{l(c zsUlSNGeTt(^6`MkS>9@0bg#w~n@{(W_FubE@dp~w@bQ4T&gmZ-dlJPI`QC0hh~J=p%pMJb3DS~I`S5~R zT#D5TNW^j!Bm-e8PkSL~E@i0-Q6VoVkzL5oH1Z@af+wQ=Wf)B5lR^Uo2H5T0a)E8^ zlRpgk8q!W3_PHddv1$*h<>&DTG&zbANJfNZJ&WQUVsT%CfFIA_%gLI>@Ds2uxCpxA zdMYGK=x($t&}3;Z;|o0$oN}i{QX)o{x10KT#-n(NTgdN z(tQvOMIzlIk#3Plw@9R0B+~Wwt|F1{h7#!(8FK$a-F`))-0ddH{SR;GN({l9DEe+`nq#^3l`WPmL)z!n)` ziwv+u2G}A4Y(@sy>=2G9C1;WNb=54N=_r$kydvZ4e^AEPBFSr!BzY~8ycS7bizKgW`B1<1B(E|59~E7A^WSEDOiOKvV3AK||uiPyS>8}h#wsKD$dqy1ZuHwHyRzT&qZ;5+sYjcB?1@wvi z_M?M5XHKXaK6uk?qyj)${3hA91M(D9-_i#O%OI-OE!`XOmdCyy+a3mH4J_T$6+{0> zT-2;xDlXALo0__VZfhz4*Db0X#U4f-=&EmHxQ6Yy2tG9! zz%HW4F2`g0^rv48-MT_qq~9mPXd-;R!tf7h_Be(<)D6GINPhRKDWH~s{_lVOSKvUs zd6#(6bCOGysBI!Rik^2wu&FAakU^}8H|_95-V3PmHn0|S^aE9P;9=PZa#`)}hJfS1~Tjg0u8r-l4)qZHQL8s3}D1lD}D zCf>$EX1*RH@3Vto7MOT{ip(_G`~Q~XKX%gbAG?MBXDela{kLicm{qL5bnr*?3+q2? z07%OAi%9;w$d45PuNU%B#Ca5P9z~o-5$BN;=aE+e{qO%5-@CT8X&tjf|F>JM)cLP? z|JRlZn66Z7mpeIk{c}$@%8+$2vJ_CcAvVMYd#d?ATK8)%Jl)V?ucc}Le#Ci9Jmpw% zuh8)UMlUE(H0nQRy|2jKjqPY|xr1I&E4mysFSAUKW!ak&hs@1#386Q%&(t=_Oqo!U zr=B-+JN5cR_onkpQMJu_0DvEat6kMShmg9d=vJ`U-Q+NzKtc3HV7vIXeR=K} zYogO#cTQZO`kumb$jo+i&vx!2sGyhu>_qp1;jWEHgw7!r_@TVzQlQ6!b2buJ*N8kG z6L9Bt&{#2CLZABq`Vl!|_z@xBcHo})^g{cx$PNtbm%08$Vbn|`V`Xl5sfJ)t`mOGR z=4FR`nClK%4UxJUB9%i_;?R}F*ha_t#h!$WgoTm`m)0($k6O~)qNa_a70e`tHlkPu!=6!CXU}V4L(!e0#oI&-?6qR( z*?@zZH9^lDGE*E2!;rQaazA-dBL80dO;%EP!*91B@96Zv(h zR`Zkz3R?IbUENYi%>c8}t2x9VikmUStX3R$cnqCRhJE?%@br8zJQ?lRYUFlC939dF zDMszuteN!pb}o8PTo2W1u#Gq#aol})P;+&ISYG&)huxv;VtowI&5;y!N@CFb^|n5| zpd%0LM)B0?`k+|1P)0R!-6u21abl@D;lwFgM#|i?qa_9yf8Pk{x0r{&2~_&5i&E0!*tW{ZLuY`f-1ht(+HsF*7%wouEv*DMnh{y zY_$?qwV5%W=vK|tT^AC?L>qef_a;wulv)Pr{(G0w6|#|76W!w3XW1GXK=Vhj`6Im1 z>ZkoyBkJJGhD3Lzs2h8?7Ib7rbb#F<6W#Tw-V60w@JzI3aNlG*6S_U#m;T)DlA;u) SC`I{Z%KrmahvxGDE&%|uZK#<5 literal 0 HcmV?d00001 diff --git a/packages/keyring-eth-mpc/package.json b/packages/keyring-eth-mpc/package.json new file mode 100644 index 000000000..aad463f31 --- /dev/null +++ b/packages/keyring-eth-mpc/package.json @@ -0,0 +1,81 @@ +{ + "name": "@metamask/eth-mpc-keyring", + "version": "0.0.0", + "description": "A Keyring for Ethereum accounts that uses Multi-Party Computation (MPC) for key management and signing.", + "keywords": [ + "ethereum", + "keyring" + ], + "homepage": "https://github.com/MetaMask/accounts/tree/main/packages/keyring-eth-mpc#readme", + "bugs": { + "url": "https://github.com/MetaMask/accounts/issues" + }, + "repository": { + "type": "git", + "url": "https://github.com/MetaMask/accounts.git" + }, + "license": "ISC", + "exports": { + ".": { + "import": { + "types": "./dist/index.d.mts", + "default": "./dist/index.mjs" + }, + "require": { + "types": "./dist/index.d.cts", + "default": "./dist/index.cjs" + } + } + }, + "main": "./dist/index.cjs", + "types": "./dist/index.d.cts", + "files": [ + "dist/" + ], + "scripts": { + "build": "ts-bridge --project tsconfig.build.json --no-references", + "build:clean": "yarn build --clean", + "build:docs": "typedoc", + "changelog:update": "../../scripts/update-changelog.sh @metamask/eth-mpc-keyring", + "changelog:validate": "../../scripts/validate-changelog.sh @metamask/eth-mpc-keyring", + "publish:preview": "yarn npm publish --tag preview", + "test": "jest", + "test:clean": "jest --clearCache" + }, + "dependencies": { + "@ethereumjs/util": "^9.1.0", + "@metamask/eth-sig-util": "^9.0.0", + "@metamask/mfa-wallet-cl24-lib": "^0.0.0", + "@metamask/mfa-wallet-dkls23-lib": "^0.0.0", + "@metamask/mfa-wallet-e2ee": "^0.0.0", + "@metamask/mfa-wallet-network": "^0.0.0", + "@metamask/mfa-wallet-util": "^0.0.0" + }, + "devDependencies": { + "@ethereumjs/tx": "^5.4.0", + "@lavamoat/allow-scripts": "^3.2.1", + "@lavamoat/preinstall-always-fail": "^2.1.0", + "@metamask/auto-changelog": "^6.1.0", + "@metamask/keyring-utils": "workspace:^", + "@metamask/mfa-wallet-interface": "^0.0.0", + "@metamask/utils": "^11.11.0", + "@ts-bridge/cli": "^0.6.3", + "@types/jest": "^29.5.12", + "deepmerge": "^4.2.2", + "jest": "^29.5.0", + "typescript": "~5.3.3" + }, + "engines": { + "node": ">=22" + }, + "publishConfig": { + "access": "public", + "registry": "https://registry.npmjs.org/" + }, + "lavamoat": { + "allowScripts": { + "@lavamoat/preinstall-always-fail": false, + "@metamask/mfa-wallet-network>centrifuge>protobufjs": false + } + } +} diff --git a/packages/keyring-eth-mpc/src/cloud.test.ts b/packages/keyring-eth-mpc/src/cloud.test.ts new file mode 100644 index 000000000..380aaac27 --- /dev/null +++ b/packages/keyring-eth-mpc/src/cloud.test.ts @@ -0,0 +1,306 @@ +import { bytesToBase64 } from '@metamask/utils'; + +import { + checkKeyShareBackupId, + createKey, + getNetId, + loadKeyShareBackup, + registerClient, + rotateKeyShares, + sign, + storeKeyShareBackup, +} from './cloud'; + +describe('cloud helpers', () => { + let fetchSpy: jest.SpyInstance; + + beforeEach(() => { + fetchSpy = jest.spyOn(globalThis, 'fetch'); + }); + + afterEach(() => { + fetchSpy.mockRestore(); + }); + + const okJson = (body: unknown): void => { + fetchSpy.mockResolvedValue({ + ok: true, + text: jest.fn().mockResolvedValue(JSON.stringify(body)), + } as never); + }; + + const okEmpty = (): void => { + fetchSpy.mockResolvedValue({ + ok: true, + text: jest.fn().mockResolvedValue(''), + } as never); + }; + + it('gets the server network id', async () => { + okJson({ netId: 'server-1' }); + + expect( + await getNetId({ + baseURL: 'https://cloud.example', + token: 'token-1', + }), + ).toBe('server-1'); + + expect(fetchSpy).toHaveBeenCalledWith( + 'https://cloud.example/net-id', + expect.objectContaining({ + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + }), + ); + }); + + it('throws when getting the server network id fails', async () => { + fetchSpy.mockResolvedValue({ + ok: false, + statusText: 'Unauthorized', + } as never); + + await expect( + getNetId({ + baseURL: 'https://cloud.example', + token: 'token-1', + }), + ).rejects.toThrow('Failed to get server network id: Unauthorized'); + }); + + it('starts cloud key generation', async () => { + okEmpty(); + + await createKey({ + baseURL: 'https://cloud.example', + token: 'token-1', + clientNetId: 'local-1', + nonce: '0xnonce', + }); + + expect(fetchSpy).toHaveBeenCalledWith( + 'https://cloud.example/create-key', + expect.objectContaining({ method: 'POST' }), + ); + }); + + it('throws when cloud key generation initialization fails', async () => { + fetchSpy.mockResolvedValue({ + ok: false, + statusText: 'Unauthorized', + } as never); + + await expect( + createKey({ + baseURL: 'https://cloud.example', + token: 'token-1', + clientNetId: 'local-1', + nonce: '0xnonce', + }), + ).rejects.toThrow( + 'Failed to initialize cloud keygen session: Unauthorized', + ); + }); + + it('registers a client network id', async () => { + okEmpty(); + + await registerClient({ + baseURL: 'https://cloud.example', + token: 'token-1', + clientNetId: 'local-1', + }); + + expect(fetchSpy).toHaveBeenCalledWith( + 'https://cloud.example/register-client', + expect.objectContaining({ method: 'POST' }), + ); + }); + + it('throws when client registration fails', async () => { + fetchSpy.mockResolvedValue({ + ok: false, + statusText: 'Forbidden', + } as never); + + await expect( + registerClient({ + baseURL: 'https://cloud.example', + token: 'token-1', + clientNetId: 'local-1', + }), + ).rejects.toThrow('Failed to register client: Forbidden'); + }); + + it('starts a cloud sign session with a base64-encoded message', async () => { + okEmpty(); + const data = new Uint8Array([104, 105]); // "hi" + + await sign({ + baseURL: 'https://cloud.example', + token: 'token-1', + clientNetId: 'local-1', + nonce: '0xnonce', + data, + }); + + const body = JSON.parse( + (fetchSpy.mock.calls[0]?.[1] as { body: string }).body, + ) as { data: string }; + expect(body.data).toBe('aGk='); + }); + + it('throws when cloud sign initialization fails', async () => { + fetchSpy.mockResolvedValue({ + ok: false, + statusText: 'Server Error', + } as never); + + await expect( + sign({ + baseURL: 'https://cloud.example', + token: 'token-1', + clientNetId: 'local-1', + nonce: '0xnonce', + data: new Uint8Array([1]), + }), + ).rejects.toThrow('Failed to initialize cloud sign session: Server Error'); + }); + + it('starts a cloud key rotation session', async () => { + okEmpty(); + + await rotateKeyShares({ + baseURL: 'https://cloud.example', + token: 'token-1', + clientNetId: 'local-1', + nonce: '0xnonce', + }); + + expect(fetchSpy).toHaveBeenCalledWith( + 'https://cloud.example/rotate-key-shares', + expect.objectContaining({ method: 'POST' }), + ); + }); + + it('throws when cloud key rotation initialization fails', async () => { + fetchSpy.mockResolvedValue({ + ok: false, + statusText: 'Forbidden', + } as never); + + await expect( + rotateKeyShares({ + baseURL: 'https://cloud.example', + token: 'token-1', + clientNetId: 'local-1', + nonce: '0xnonce', + }), + ).rejects.toThrow( + 'Failed to initialize cloud key rotation session: Forbidden', + ); + }); + + it('stores an encrypted key share backup', async () => { + okEmpty(); + const encryptedKeyShare = new Uint8Array([1, 2, 3]); + + await storeKeyShareBackup({ + baseURL: 'https://cloud.example', + token: 'token-1', + backupId: 'backup-1', + encryptedKeyShare, + }); + + const body = JSON.parse( + (fetchSpy.mock.calls[0]?.[1] as { body: string }).body, + ) as { encryptedKeyShare: string; backupId: string }; + expect(body.backupId).toBe('backup-1'); + expect(body.encryptedKeyShare).toBe(bytesToBase64(encryptedKeyShare)); + }); + + it('throws when storing a key share backup fails', async () => { + fetchSpy.mockResolvedValue({ + ok: false, + statusText: 'Bad Request', + } as never); + + await expect( + storeKeyShareBackup({ + baseURL: 'https://cloud.example', + token: 'token-1', + backupId: 'backup-1', + encryptedKeyShare: new Uint8Array([1]), + }), + ).rejects.toThrow('Failed to store key share backup: Bad Request'); + }); + + it('checks the stored backup id', async () => { + okJson({ backupId: 'backup-1' }); + + expect( + await checkKeyShareBackupId({ + baseURL: 'https://cloud.example', + token: 'token-1', + }), + ).toBe('backup-1'); + }); + + it('returns null when the backend has no backup id', async () => { + okJson({}); + + expect( + await checkKeyShareBackupId({ + baseURL: 'https://cloud.example', + token: 'token-1', + }), + ).toBeNull(); + }); + + it('throws when checking the backup id fails', async () => { + fetchSpy.mockResolvedValue({ + ok: false, + statusText: 'Not Found', + } as never); + + await expect( + checkKeyShareBackupId({ + baseURL: 'https://cloud.example', + token: 'token-1', + }), + ).rejects.toThrow('Failed to check key share backup id: Not Found'); + }); + + it('loads an encrypted key share backup', async () => { + const encryptedKeyShare = new Uint8Array([9, 8, 7]); + okJson({ + encryptedKeyShare: bytesToBase64(encryptedKeyShare), + backupId: 'backup-1', + }); + + expect( + await loadKeyShareBackup({ + baseURL: 'https://cloud.example', + token: 'token-1', + }), + ).toStrictEqual({ + encryptedKeyShare, + backupId: 'backup-1', + }); + }); + + it('throws when loading a key share backup fails', async () => { + fetchSpy.mockResolvedValue({ + ok: false, + statusText: 'Unauthorized', + } as never); + + await expect( + loadKeyShareBackup({ + baseURL: 'https://cloud.example', + token: 'token-1', + }), + ).rejects.toThrow('Failed to load key share backup: Unauthorized'); + }); +}); diff --git a/packages/keyring-eth-mpc/src/cloud.ts b/packages/keyring-eth-mpc/src/cloud.ts new file mode 100644 index 000000000..192076362 --- /dev/null +++ b/packages/keyring-eth-mpc/src/cloud.ts @@ -0,0 +1,235 @@ +import type { PartyId } from '@metamask/mfa-wallet-interface'; +import { base64ToBytes, bytesToBase64 } from '@metamask/utils'; + +export type LoadKeyShareBackupResult = { + encryptedKeyShare: Uint8Array; + backupId: string; +}; + +/** + * Fetch JSON from the MPC backend, throwing on non-OK responses. + * + * @param url - The request URL. + * @param body - The JSON request body. + * @param errorPrefix - Prefix for the thrown error message. + * @returns The parsed JSON body, or `undefined` when the response is empty. + */ +async function postJson( + url: string, + body: Record, + errorPrefix: string, +): Promise { + const response = await fetch(url, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(body), + }); + + if (!response.ok) { + throw new Error(`${errorPrefix}: ${response.statusText}`); + } + + const text = await response.text(); + if (text.length === 0) { + return undefined as Response; + } + return JSON.parse(text) as Response; +} + +/** + * Return the server network id for this profile, creating one if needed. + * + * @param opts - Request options. + * @param opts.baseURL - MPC backend base URL. + * @param opts.token - Profile token. + * @returns The server network id. + */ +export async function getNetId(opts: { + baseURL: string; + token: string; +}): Promise { + const data = await postJson<{ netId: string }>( + `${opts.baseURL}/net-id`, + { token: opts.token }, + 'Failed to get server network id', + ); + return data.netId; +} + +/** + * Start DKG on the backend for a new key. + * + * @param opts - Request options. + * @param opts.baseURL - MPC backend base URL. + * @param opts.token - Profile token with 2FA. + * @param opts.clientNetId - Client network id. + * @param opts.nonce - Client session nonce. + */ +export async function createKey(opts: { + baseURL: string; + token: string; + clientNetId: PartyId; + nonce: string; +}): Promise { + await postJson( + `${opts.baseURL}/create-key`, + { + token: opts.token, + clientNetId: opts.clientNetId, + nonce: opts.nonce, + }, + 'Failed to initialize cloud keygen session', + ); +} + +/** + * Authorize this client network id to use the existing key share. + * + * @param opts - Request options. + * @param opts.baseURL - MPC backend base URL. + * @param opts.token - Profile token with 2FA. + * @param opts.clientNetId - Client network id. + */ +export async function registerClient(opts: { + baseURL: string; + token: string; + clientNetId: PartyId; +}): Promise { + await postJson( + `${opts.baseURL}/register-client`, + { + token: opts.token, + clientNetId: opts.clientNetId, + }, + 'Failed to register client', + ); +} + +/** + * Start a backend signing session. + * + * @param opts - Request options. + * @param opts.baseURL - MPC backend base URL. + * @param opts.token - Profile token with 2FA and challenge. + * @param opts.data - Message hash to sign. + * @param opts.clientNetId - Client network id. + * @param opts.nonce - Client session nonce. + */ +export async function sign(opts: { + baseURL: string; + token: string; + data: Uint8Array; + clientNetId: PartyId; + nonce: string; +}): Promise { + await postJson( + `${opts.baseURL}/sign`, + { + token: opts.token, + data: bytesToBase64(opts.data), + clientNetId: opts.clientNetId, + nonce: opts.nonce, + }, + 'Failed to initialize cloud sign session', + ); +} + +/** + * Start a backend share-rotation session. + * + * @param opts - Request options. + * @param opts.baseURL - MPC backend base URL. + * @param opts.token - Profile token with 2FA. + * @param opts.clientNetId - Client network id. + * @param opts.nonce - Client session nonce. + */ +export async function rotateKeyShares(opts: { + baseURL: string; + token: string; + clientNetId: PartyId; + nonce: string; +}): Promise { + await postJson( + `${opts.baseURL}/rotate-key-shares`, + { + token: opts.token, + clientNetId: opts.clientNetId, + nonce: opts.nonce, + }, + 'Failed to initialize cloud key rotation session', + ); +} + +/** + * Store an encrypted key-share backup and its client-minted id. + * + * @param opts - Request options. + * @param opts.baseURL - MPC backend base URL. + * @param opts.token - Profile token with 2FA. + * @param opts.backupId - Opaque backup id minted by the client. + * @param opts.encryptedKeyShare - Encrypted key share ciphertext. + */ +export async function storeKeyShareBackup(opts: { + baseURL: string; + token: string; + backupId: string; + encryptedKeyShare: Uint8Array; +}): Promise { + await postJson( + `${opts.baseURL}/store-key-share-backup`, + { + token: opts.token, + backupId: opts.backupId, + encryptedKeyShare: bytesToBase64(opts.encryptedKeyShare), + }, + 'Failed to store key share backup', + ); +} + +/** + * Return the backup id currently stored on the backend. + * + * @param opts - Request options. + * @param opts.baseURL - MPC backend base URL. + * @param opts.token - Profile token (2FA not required). + * @returns The stored backup id, or `null` if none exists. + */ +export async function checkKeyShareBackupId(opts: { + baseURL: string; + token: string; +}): Promise { + const data = await postJson<{ backupId?: string | null }>( + `${opts.baseURL}/check-key-share-backup-id`, + { token: opts.token }, + 'Failed to check key share backup id', + ); + return typeof data.backupId === 'string' ? data.backupId : null; +} + +/** + * Load the encrypted key-share backup from the backend. + * + * @param opts - Request options. + * @param opts.baseURL - MPC backend base URL. + * @param opts.token - Profile token with 2FA. + * @returns The ciphertext and backup id. + */ +export async function loadKeyShareBackup(opts: { + baseURL: string; + token: string; +}): Promise { + const data = await postJson<{ + encryptedKeyShare: string; + backupId: string; + }>( + `${opts.baseURL}/load-key-share-backup`, + { token: opts.token }, + 'Failed to load key share backup', + ); + return { + encryptedKeyShare: base64ToBytes(data.encryptedKeyShare), + backupId: data.backupId, + }; +} diff --git a/packages/keyring-eth-mpc/src/index.ts b/packages/keyring-eth-mpc/src/index.ts new file mode 100644 index 000000000..dcc422a8f --- /dev/null +++ b/packages/keyring-eth-mpc/src/index.ts @@ -0,0 +1,9 @@ +export { MPCKeyring } from './mpc-keyring'; + +export type { + MPCKeyringOpts, + MPCKeyringSerializer, + MPCKeyringSetupParams, + MPCKeyringState, + ProfileTokenOpts, +} from './types'; diff --git a/packages/keyring-eth-mpc/src/mpc-keyring.test.ts b/packages/keyring-eth-mpc/src/mpc-keyring.test.ts new file mode 100644 index 000000000..a502ab8cb --- /dev/null +++ b/packages/keyring-eth-mpc/src/mpc-keyring.test.ts @@ -0,0 +1,723 @@ +/* eslint-disable @typescript-eslint/explicit-function-return-type */ +import { hashPersonalMessage } from '@ethereumjs/util'; +import { type Hex, type Json, bytesToHex } from '@metamask/utils'; + +import { MPCKeyring } from './mpc-keyring'; + +const mockCreateKey = jest.fn(); +const mockRotateKeyShares = jest.fn(); +const mockDklsSetup = jest.fn(); +const mockDklsSign = jest.fn(); +const mockCreateIdentity = jest.fn(); +const mockCreateSession = jest.fn(); +const mockCreateScopedSessionId = jest.fn(); +const mockThresholdKeyToJson = jest.fn(); +const mockThresholdKeyFromJson = jest.fn(); +const mockNetworkIdentityToJson = jest.fn(); +const mockNetworkIdentityFromJson = jest.fn(); +const mockGetNetId = jest.fn(); +const mockStartCreateKey = jest.fn(); +const mockRegisterClient = jest.fn(); +const mockStartSign = jest.fn(); +const mockStartRotateKeyShares = jest.fn(); +const mockStoreKeyShareBackup = jest.fn(); +const mockCheckKeyShareBackupId = jest.fn(); +const mockLoadKeyShareBackup = jest.fn(); +let lastNetworkManagerOptions: Record | undefined; + +const mockDerivedAddress = '0x1111111111111111111111111111111111111111' as Hex; +const mockSessionNonce = + '0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' as Hex; +const mockBackupId = + '0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb'; +const mockTypedDataHash = new Uint8Array([9, 8, 7, 6]); +const mockEthSignature = new Uint8Array(65); +mockEthSignature[64] = 27; +const mockBackupKey = new Uint8Array(32).fill(7); + +jest.mock('@metamask/mfa-wallet-cl24-lib', () => { + class MockCL24DKM { + createKey(...args: unknown[]) { + return mockCreateKey(...args); + } + + rotateKeyShares(...args: unknown[]) { + return mockRotateKeyShares(...args); + } + } + + class MockCL24ThresholdKeySerializer { + toJson(value: unknown) { + return mockThresholdKeyToJson(value); + } + + fromJson(value: unknown) { + return mockThresholdKeyFromJson(value); + } + } + + return { + secp256k1: {}, + CL24DKM: MockCL24DKM, + CL24ThresholdKeySerializer: MockCL24ThresholdKeySerializer, + dealersFromCL24Key: ( + key: { shareIndexes: number[] }, + custodians: string[], + ) => { + if (custodians.length !== key.shareIndexes.length) { + throw new Error('Custodians do not match share indexes'); + } + return custodians.map((netId, shareIndex) => ({ netId, shareIndex })); + }, + }; +}); + +jest.mock('@metamask/mfa-wallet-network', () => { + class MockMfaNetworkManager { + constructor(opts: Record) { + lastNetworkManagerOptions = opts; + } + + createIdentity(...args: unknown[]) { + return mockCreateIdentity(...args); + } + + createSession(...args: unknown[]) { + return mockCreateSession(...args); + } + } + + class MockMfaNetworkIdentitySerializer { + toJson(value: unknown) { + return mockNetworkIdentityToJson(value); + } + + fromJson(value: unknown) { + return mockNetworkIdentityFromJson(value); + } + } + + return { + MfaNetworkManager: MockMfaNetworkManager, + MfaNetworkIdentitySerializer: MockMfaNetworkIdentitySerializer, + createScopedSessionId: (...args: unknown[]) => + mockCreateScopedSessionId(...args), + }; +}); + +jest.mock('@metamask/mfa-wallet-dkls23-lib', () => { + class MockDkls23TssLib { + setup(...args: unknown[]) { + return mockDklsSetup(...args); + } + + sign(...args: unknown[]) { + return mockDklsSign(...args); + } + } + + return { Dkls23TssLib: MockDkls23TssLib }; +}); + +jest.mock('./cloud', () => ({ + getNetId: (...args: unknown[]) => mockGetNetId(...args), + createKey: (...args: unknown[]) => mockStartCreateKey(...args), + registerClient: (...args: unknown[]) => mockRegisterClient(...args), + sign: (...args: unknown[]) => mockStartSign(...args), + rotateKeyShares: (...args: unknown[]) => mockStartRotateKeyShares(...args), + storeKeyShareBackup: (...args: unknown[]) => mockStoreKeyShareBackup(...args), + checkKeyShareBackupId: (...args: unknown[]) => + mockCheckKeyShareBackupId(...args), + loadKeyShareBackup: (...args: unknown[]) => mockLoadKeyShareBackup(...args), +})); + +jest.mock('./util', () => { + const actual = jest.requireActual('./util'); + return { + ...actual, + generateSessionNonce: jest.fn(() => mockSessionNonce), + createBackupId: jest.fn(() => mockBackupId), + encryptBytes: jest.fn(async (_key: Uint8Array, plaintext: Uint8Array) => { + return plaintext; + }), + decryptBytes: jest.fn(async (_key: Uint8Array, ciphertext: Uint8Array) => { + return ciphertext; + }), + getSignedTypedDataHash: jest.fn(() => mockTypedDataHash), + publicKeyToAddressHex: jest.fn(() => mockDerivedAddress), + toEthSig: jest.fn(() => mockEthSignature), + }; +}); + +const makeThresholdKey = () => { + return { + threshold: 2, + shareIndex: 0, + shareIndexes: [1, 2], + publicKey: new Uint8Array([4, 1, 2, 3]), + privateKeyShare: new Uint8Array([5, 6, 7]), + secretPolynomialCommitment: [new Uint8Array([8])], + }; +}; + +const makeSerializedState = (overrides: Record = {}) => ({ + netCreds: { partyId: 'local-user' }, + keyShare: makeThresholdKey(), + serverNetId: 'cloud-user', + backupId: mockBackupId, + tssSetup: '0x0102', + ...overrides, +}); + +const makeRootSession = () => { + const session = { + sendMessage: jest.fn(), + receiveMessage: jest + .fn() + .mockResolvedValue( + new TextEncoder().encode(JSON.stringify({ haveSetup: true })), + ), + createSubsession: jest + .fn() + .mockImplementation((label: string) => ({ label })), + disconnect: jest.fn().mockResolvedValue(undefined), + }; + return session; +}; + +const makeKeyring = ( + getProfileToken = jest.fn().mockResolvedValue('token'), + getBackupEncryptionKey = jest.fn().mockResolvedValue(mockBackupKey), +) => + new MPCKeyring({ + getRandomBytes: (size) => new Uint8Array(size).fill(3), + dkls23Lib: {} as never, + cloudURL: 'https://cloud.example', + relayerURL: 'https://relayer.example', + getProfileToken, + getBackupEncryptionKey, + }); + +const deserializeState = async ( + keyring: MPCKeyring, + state = makeSerializedState(), +) => { + await keyring.deserialize(state as unknown as Json); +}; + +describe('MPCKeyring', () => { + beforeEach(() => { + lastNetworkManagerOptions = undefined; + + const mockedUtil = jest.requireMock('./util'); + + mockedUtil.generateSessionNonce.mockReturnValue(mockSessionNonce); + mockedUtil.createBackupId.mockReturnValue(mockBackupId); + mockedUtil.encryptBytes.mockImplementation( + async (_key: Uint8Array, plaintext: Uint8Array) => plaintext, + ); + mockedUtil.decryptBytes.mockImplementation( + async (_key: Uint8Array, ciphertext: Uint8Array) => ciphertext, + ); + mockedUtil.getSignedTypedDataHash.mockReturnValue(mockTypedDataHash); + mockedUtil.publicKeyToAddressHex.mockReturnValue(mockDerivedAddress); + mockedUtil.toEthSig.mockReturnValue(mockEthSignature); + + mockCreateScopedSessionId.mockImplementation( + (partyIds: string[], nonce: string) => + `session:${partyIds.join('|')}:${nonce}`, + ); + mockThresholdKeyToJson.mockImplementation((value) => value); + mockThresholdKeyFromJson.mockImplementation((value) => value); + mockNetworkIdentityToJson.mockImplementation((value) => value); + mockNetworkIdentityFromJson.mockImplementation((value) => value); + mockGetNetId.mockResolvedValue('cloud-user'); + mockStartCreateKey.mockResolvedValue(undefined); + mockRegisterClient.mockResolvedValue(undefined); + mockStartSign.mockResolvedValue(undefined); + mockStartRotateKeyShares.mockResolvedValue(undefined); + mockStoreKeyShareBackup.mockResolvedValue(undefined); + mockCheckKeyShareBackupId.mockResolvedValue(mockBackupId); + mockLoadKeyShareBackup.mockResolvedValue({ + encryptedKeyShare: new TextEncoder().encode(JSON.stringify({ ok: true })), + backupId: mockBackupId, + }); + mockDklsSetup.mockResolvedValue(new Uint8Array([1, 2, 3])); + mockDklsSign.mockResolvedValue({ signature: new Uint8Array(64).fill(9) }); + }); + + it('exposes the expected type constant', () => { + const keyring = makeKeyring(); + expect(keyring.type).toBe('MPC Keyring'); + }); + + it('wires network manager options and random byte adapter', () => { + const transportToken = jest.fn().mockResolvedValue('transport-token'); + const webSocket = { send: jest.fn() }; + const randomBytes = jest + .fn() + .mockReturnValueOnce(new Uint8Array([1, 2, 3, 4])); + + const keyring = new MPCKeyring({ + getRandomBytes: randomBytes, + dkls23Lib: {} as never, + cloudURL: 'https://cloud.example', + relayerURL: 'https://relayer.example', + getProfileToken: jest.fn().mockResolvedValue('verifier-token'), + getBackupEncryptionKey: jest.fn().mockResolvedValue(mockBackupKey), + getTransportToken: transportToken, + webSocket, + }); + expect(keyring.type).toBe('MPC Keyring'); + + expect(lastNetworkManagerOptions).toStrictEqual( + expect.objectContaining({ + url: 'https://relayer.example', + getToken: transportToken, + websocket: webSocket, + }), + ); + + const randomBytesAdapter = lastNetworkManagerOptions?.randomBytes as { + getRandomValues: (array: Uint8Array) => Uint8Array; + }; + const output = randomBytesAdapter.getRandomValues(new Uint8Array(4)); + expect(output).toStrictEqual(new Uint8Array([1, 2, 3, 4])); + expect(randomBytes).toHaveBeenCalledWith(4); + }); + + it('serializes to an empty object before initialization', async () => { + const keyring = makeKeyring(); + expect(await keyring.serialize()).toStrictEqual({}); + expect(await keyring.getAccounts()).toStrictEqual([]); + }); + + it('deserializes and re-serializes valid state', async () => { + const keyring = makeKeyring(); + const state = makeSerializedState(); + + await deserializeState(keyring, state); + + expect(await keyring.serialize()).toStrictEqual(state); + expect(await keyring.getAccounts()).toStrictEqual([mockDerivedAddress]); + }); + + it('round-trips null tssSetup', async () => { + const keyring = makeKeyring(); + const state = makeSerializedState({ tssSetup: null }); + await deserializeState(keyring, state); + expect(await keyring.serialize()).toStrictEqual(state); + }); + + it('throws on invalid deserialize input', async () => { + const keyring = makeKeyring(); + await expect(keyring.deserialize(null as never)).rejects.toThrow( + 'Invalid state', + ); + }); + + it('throws on invalid setup params in deserialize', async () => { + const keyring = makeKeyring(); + + await expect( + keyring.deserialize({ + mode: 'join', + } as never), + ).rejects.toThrow("Invalid setup mode: expected 'create' or 'import'"); + }); + + it('does not initialize from incomplete serialized state', async () => { + const keyring = makeKeyring(); + await keyring.deserialize({ backupId: 'only-backup-id' }); + await expect(keyring.checkKeyShare()).rejects.toThrow( + 'Keyring not initialized', + ); + }); + + it('creates a key via deserialize(init args) + init(create mode)', async () => { + const getProfileToken = jest.fn().mockResolvedValue('token'); + const keyring = makeKeyring(getProfileToken); + const rootSession = makeRootSession(); + + mockCreateIdentity.mockResolvedValueOnce({ partyId: 'local-user' }); + mockCreateSession.mockResolvedValueOnce(rootSession); + mockCreateKey.mockResolvedValueOnce(makeThresholdKey()); + + await keyring.deserialize({ mode: 'create' }); + expect(await keyring.serialize()).toStrictEqual({ mode: 'create' }); + await keyring.init(); + + expect(getProfileToken).toHaveBeenCalledWith({ twoFactor: true }); + expect(mockGetNetId).toHaveBeenCalledWith({ + baseURL: 'https://cloud.example', + token: 'token', + }); + expect(mockStartCreateKey).toHaveBeenCalledWith({ + baseURL: 'https://cloud.example', + token: 'token', + clientNetId: 'local-user', + nonce: mockSessionNonce, + }); + expect(mockCreateScopedSessionId).toHaveBeenCalledWith( + ['cloud-user', 'local-user'], + mockSessionNonce, + ); + expect(mockCreateKey).toHaveBeenCalledWith( + expect.objectContaining({ + custodians: ['local-user', 'cloud-user'], + threshold: 2, + networkSession: { label: 'create-key' }, + }), + ); + expect(mockDklsSetup).toHaveBeenCalledWith( + expect.objectContaining({ + networkSession: { label: 'tss-setup' }, + }), + ); + expect(rootSession.createSubsession).toHaveBeenCalledWith('create-key'); + expect(rootSession.createSubsession).toHaveBeenCalledWith('tss-setup'); + expect(mockStoreKeyShareBackup).toHaveBeenCalledWith( + expect.objectContaining({ + token: 'token', + backupId: mockBackupId, + }), + ); + expect(await keyring.serialize()).toStrictEqual({ + netCreds: { partyId: 'local-user' }, + keyShare: makeThresholdKey(), + serverNetId: 'cloud-user', + backupId: mockBackupId, + tssSetup: '0x010203', + }); + }); + + it('imports a key from the backend backup', async () => { + const getProfileToken = jest.fn().mockResolvedValue('token'); + const keyring = makeKeyring(getProfileToken); + mockCreateIdentity.mockResolvedValueOnce({ partyId: 'imported-user' }); + mockThresholdKeyFromJson.mockReturnValueOnce(makeThresholdKey()); + + await keyring.deserialize({ mode: 'import' }); + expect(await keyring.serialize()).toStrictEqual({ mode: 'import' }); + await keyring.init(); + + expect(mockLoadKeyShareBackup).toHaveBeenCalledWith({ + baseURL: 'https://cloud.example', + token: 'token', + }); + expect(mockRegisterClient).toHaveBeenCalledWith({ + baseURL: 'https://cloud.example', + token: 'token', + clientNetId: 'imported-user', + }); + expect(mockDklsSetup).not.toHaveBeenCalled(); + expect(await keyring.serialize()).toStrictEqual({ + netCreds: { partyId: 'imported-user' }, + keyShare: makeThresholdKey(), + serverNetId: 'cloud-user', + backupId: mockBackupId, + tssSetup: null, + }); + }); + + it('init is a no-op when already initialized', async () => { + const keyring = makeKeyring(); + await deserializeState(keyring); + + expect(await keyring.init()).toBeUndefined(); + expect(mockStartCreateKey).not.toHaveBeenCalled(); + expect(mockLoadKeyShareBackup).not.toHaveBeenCalled(); + }); + + it('init is a no-op without setup params or mode', async () => { + const keyring = makeKeyring(); + expect(await keyring.init()).toBeUndefined(); + expect(mockStartCreateKey).not.toHaveBeenCalled(); + }); + + it('init can take create mode without prior deserialize', async () => { + const keyring = makeKeyring(); + const rootSession = makeRootSession(); + mockCreateIdentity.mockResolvedValueOnce({ partyId: 'local-user' }); + mockCreateSession.mockResolvedValueOnce(rootSession); + mockCreateKey.mockResolvedValueOnce(makeThresholdKey()); + + await keyring.init('create'); + expect(mockStartCreateKey).toHaveBeenCalledTimes(1); + expect(await keyring.getAccounts()).toStrictEqual([mockDerivedAddress]); + }); + + it('rotates key shares without regenerating tssSetup', async () => { + const getProfileToken = jest.fn().mockResolvedValue('token'); + const keyring = makeKeyring(getProfileToken); + await deserializeState(keyring); + + const rotatedKey = { + ...makeThresholdKey(), + privateKeyShare: new Uint8Array([9, 9, 9]), + }; + const newBackupId = + '0xcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc'; + const mockedUtil = jest.requireMock('./util'); + mockedUtil.createBackupId.mockReturnValueOnce(newBackupId); + + const rootSession = makeRootSession(); + mockCreateSession.mockResolvedValueOnce(rootSession); + mockRotateKeyShares.mockResolvedValueOnce(rotatedKey); + + await keyring.rotateKeyShares(); + + expect(getProfileToken).toHaveBeenCalledWith({ twoFactor: true }); + expect(mockStartRotateKeyShares).toHaveBeenCalledWith({ + baseURL: 'https://cloud.example', + token: 'token', + clientNetId: 'local-user', + nonce: mockSessionNonce, + }); + expect(mockRotateKeyShares).toHaveBeenCalledWith( + expect.objectContaining({ + networkSession: { label: 'rotate-key-shares' }, + }), + ); + expect(rootSession.createSubsession).toHaveBeenCalledWith( + 'rotate-key-shares', + ); + expect(mockDklsSetup).not.toHaveBeenCalled(); + expect(mockStoreKeyShareBackup).toHaveBeenCalledWith( + expect.objectContaining({ + backupId: newBackupId, + token: 'token', + }), + ); + expect(await keyring.serialize()).toStrictEqual({ + netCreds: { partyId: 'local-user' }, + keyShare: rotatedKey, + serverNetId: 'cloud-user', + backupId: newBackupId, + tssSetup: '0x0102', + }); + }); + + it('checks whether the local backup id matches the backend', async () => { + const getProfileToken = jest.fn().mockResolvedValue('token'); + const keyring = makeKeyring(getProfileToken); + await deserializeState(keyring); + + expect(await keyring.checkKeyShare()).toBe(true); + expect(getProfileToken).toHaveBeenCalledWith(); + expect(mockCheckKeyShareBackupId).toHaveBeenCalledWith({ + baseURL: 'https://cloud.example', + token: 'token', + }); + + mockCheckKeyShareBackupId.mockResolvedValueOnce('other-backup-id'); + expect(await keyring.checkKeyShare()).toBe(false); + }); + + it('syncs key share and backup id from the backend', async () => { + const getProfileToken = jest.fn().mockResolvedValue('token'); + const keyring = makeKeyring(getProfileToken); + await deserializeState(keyring); + + const syncedKey = { + ...makeThresholdKey(), + privateKeyShare: new Uint8Array([1, 1, 1]), + }; + mockLoadKeyShareBackup.mockResolvedValueOnce({ + encryptedKeyShare: new TextEncoder().encode(JSON.stringify({ ok: true })), + backupId: 'synced-backup-id', + }); + mockThresholdKeyFromJson.mockReturnValueOnce(syncedKey); + + await keyring.syncKeyShare(); + + expect(getProfileToken).toHaveBeenCalledWith({ twoFactor: true }); + expect(await keyring.serialize()).toStrictEqual({ + netCreds: { partyId: 'local-user' }, + keyShare: syncedKey, + serverNetId: 'cloud-user', + backupId: 'synced-backup-id', + tssSetup: '0x0102', + }); + }); + + it('signs personal messages and transactions through the MPC flow', async () => { + const getProfileToken = jest.fn().mockResolvedValue('token'); + const keyring = makeKeyring(getProfileToken); + await deserializeState(keyring); + + const signSession = makeRootSession(); + mockCreateSession.mockResolvedValue(signSession); + + const messageHex = '0x68656c6c6f'; + const signatureHex = await keyring.signPersonalMessage( + mockDerivedAddress, + messageHex, + ); + expect(signatureHex).toBe(bytesToHex(mockEthSignature)); + expect(getProfileToken).toHaveBeenCalledWith({ + twoFactor: true, + challenge: hashPersonalMessage(new TextEncoder().encode('hello')), + }); + expect(mockStartSign).toHaveBeenCalledWith( + expect.objectContaining({ + clientNetId: 'local-user', + token: 'token', + data: hashPersonalMessage(new TextEncoder().encode('hello')), + }), + ); + expect(mockDklsSetup).not.toHaveBeenCalled(); + expect(mockDklsSign).toHaveBeenCalledWith( + expect.objectContaining({ + networkSession: { label: 'tss-sign' }, + }), + ); + expect(signSession.createSubsession).toHaveBeenCalledWith('tss-sign'); + expect(signSession.createSubsession).not.toHaveBeenCalledWith('tss-setup'); + + const tx = { + getHashedMessageToSign: jest.fn().mockReturnValue(new Uint8Array([1, 2])), + addSignature: jest.fn().mockReturnValue('signed-tx'), + }; + + expect(await keyring.signTransaction(mockDerivedAddress, tx as never)).toBe( + 'signed-tx', + ); + expect(tx.addSignature).toHaveBeenCalledWith( + 27n, + expect.any(Uint8Array), + expect.any(Uint8Array), + ); + }); + + it('runs TSS setup when the peer has discarded setup', async () => { + const keyring = makeKeyring(); + await deserializeState(keyring); + + const signSession = makeRootSession(); + signSession.receiveMessage.mockResolvedValueOnce( + new TextEncoder().encode(JSON.stringify({ haveSetup: false })), + ); + mockCreateSession.mockResolvedValue(signSession); + mockDklsSetup.mockResolvedValueOnce(new Uint8Array([9, 9, 9])); + + await keyring.signPersonalMessage(mockDerivedAddress, '0x68656c6c6f'); + + expect(mockDklsSetup).toHaveBeenCalledWith( + expect.objectContaining({ + networkSession: { label: 'tss-setup' }, + }), + ); + expect(mockDklsSign).toHaveBeenCalledWith( + expect.objectContaining({ + networkSession: { label: 'tss-sign' }, + }), + ); + expect(signSession.createSubsession).toHaveBeenCalledWith('tss-setup'); + expect(signSession.createSubsession).toHaveBeenCalledWith('tss-sign'); + expect(await keyring.serialize()).toStrictEqual( + expect.objectContaining({ tssSetup: '0x090909' }), + ); + }); + + it('runs TSS setup on first sign after import', async () => { + const keyring = makeKeyring(); + await deserializeState(keyring, makeSerializedState({ tssSetup: null })); + + const signSession = makeRootSession(); + mockCreateSession.mockResolvedValue(signSession); + + await keyring.signPersonalMessage(mockDerivedAddress, '0x68656c6c6f'); + expect(mockDklsSetup).toHaveBeenCalledWith( + expect.objectContaining({ + networkSession: { label: 'tss-setup' }, + }), + ); + expect(signSession.createSubsession).toHaveBeenCalledWith('tss-setup'); + expect(signSession.createSubsession).toHaveBeenCalledWith('tss-sign'); + }); + + it('discards tssSetup when TSS.sign fails', async () => { + const keyring = makeKeyring(); + await deserializeState(keyring); + + const signSession = makeRootSession(); + mockCreateSession.mockResolvedValue(signSession); + mockDklsSign.mockRejectedValueOnce(new Error('sign failed')); + + await expect( + keyring.signPersonalMessage(mockDerivedAddress, '0x68656c6c6f'), + ).rejects.toThrow('sign failed'); + + expect(await keyring.serialize()).toStrictEqual( + expect.objectContaining({ tssSetup: null }), + ); + }); + + it('serializes concurrent sign calls', async () => { + const keyring = makeKeyring(); + await deserializeState(keyring); + + let inFlight = 0; + let maxInFlight = 0; + mockDklsSign.mockImplementation(async () => { + inFlight += 1; + maxInFlight = Math.max(maxInFlight, inFlight); + await new Promise((resolve) => setTimeout(resolve, 20)); + inFlight -= 1; + return { signature: new Uint8Array(64).fill(9) }; + }); + mockCreateSession.mockImplementation(async () => makeRootSession()); + + await Promise.all([ + keyring.signPersonalMessage(mockDerivedAddress, '0x68656c6c6f'), + keyring.signPersonalMessage(mockDerivedAddress, '0x68656c6c6f'), + ]); + + expect(maxInFlight).toBe(1); + }); + + it('signs typed data and validates signer constraints', async () => { + const keyring = makeKeyring(); + await deserializeState(keyring); + + mockCreateSession.mockResolvedValue(makeRootSession()); + + const signature = await keyring.signTypedData( + mockDerivedAddress, + [{ type: 'string', name: 'message', value: 'hello' }], + {}, + ); + expect(signature).toBe(bytesToHex(mockEthSignature)); + }); + + it('throws for signing with an unknown account', async () => { + const keyring = makeKeyring(); + await deserializeState(keyring); + + await expect( + keyring.signPersonalMessage( + '0x2222222222222222222222222222222222222222', + '0x68656c6c6f', + ), + ).rejects.toThrow( + 'account 0x2222222222222222222222222222222222222222 not found', + ); + }); + + it('throws for unsupported account APIs that are not implemented', async () => { + const keyring = makeKeyring(); + + await expect(keyring.addAccounts()).rejects.toThrow( + 'addAccounts(1): not implemented', + ); + await expect(keyring.addAccounts(2)).rejects.toThrow( + 'addAccounts(2): not implemented', + ); + await expect( + keyring.getAppKeyAddress(mockDerivedAddress, 'example.com'), + ).rejects.toThrow( + `getAppKeyAddress(${mockDerivedAddress}, example.com): not implemented`, + ); + }); +}); diff --git a/packages/keyring-eth-mpc/src/mpc-keyring.ts b/packages/keyring-eth-mpc/src/mpc-keyring.ts new file mode 100644 index 000000000..e8012c10e --- /dev/null +++ b/packages/keyring-eth-mpc/src/mpc-keyring.ts @@ -0,0 +1,686 @@ +import type { TypedTransaction } from '@ethereumjs/tx'; +import { hashPersonalMessage } from '@ethereumjs/util'; +import type { + TypedDataV1, + TypedMessage, + SignTypedDataVersion, + MessageTypes, +} from '@metamask/eth-sig-util'; +import type { Keyring } from '@metamask/keyring-utils'; +import { + CL24DKM, + CL24ThresholdKeySerializer, + dealersFromCL24Key, + secp256k1 as secp256k1Curve, + type CL24ThresholdKey, +} from '@metamask/mfa-wallet-cl24-lib'; +import { Dkls23TssLib } from '@metamask/mfa-wallet-dkls23-lib'; +import type { + PartyId, + RandomNumberGenerator, + RootNetworkSession, + ShareBinding, +} from '@metamask/mfa-wallet-interface'; +import type { MfaNetworkIdentity } from '@metamask/mfa-wallet-network'; +import { + MfaNetworkIdentitySerializer, + MfaNetworkManager, + createScopedSessionId, +} from '@metamask/mfa-wallet-network'; +import { bytesToHex, hexToBytes, type Hex, type Json } from '@metamask/utils'; + +import { + checkKeyShareBackupId, + createKey as startCreateKey, + getNetId, + loadKeyShareBackup, + registerClient, + rotateKeyShares as startRotateKeyShares, + sign as startSign, + storeKeyShareBackup, +} from './cloud'; +import { + type MPCKeyringOpts, + type MPCKeyringSerializer, + type MPCKeyringSetupParams, + type MPCKeyringState, + type MPCKeyringStorageState, + type ProfileTokenOpts, +} from './types'; +import { + AES_GCM_IV_LENGTH, + createBackupId, + decryptBytes, + encryptBytes, + equalAddresses, + generateSessionNonce, + getSignedTypedDataHash, + parseBackupId, + parseEthSig, + parseServerNetId, + parseSignedTypedDataVersion, + parseTssSetup, + publicKeyToAddressHex, + toEthSig, +} from './util'; + +const mpcKeyringType = 'MPC Keyring'; +const TSS_HAVE_SETUP_MESSAGE_TYPE = 'tss-have-setup'; +const CLIENT_SHARE_INDEX = 0; +const SERVER_SHARE_INDEX = 1; + +/** + * Party net ids indexed by 0-based share slot. + * + * @param clientNetId - Client (share 0) network id. + * @param serverNetId - Server (share 1) network id. + * @returns Net ids in share-slot order. + */ +function partyNetIds(clientNetId: PartyId, serverNetId: PartyId): PartyId[] { + const netIds: PartyId[] = []; + netIds[CLIENT_SHARE_INDEX] = clientNetId; + netIds[SERVER_SHARE_INDEX] = serverNetId; + return netIds; +} + +/** + * Share bindings for the client/server pair. + * + * @param clientNetId - Client (share 0) network id. + * @param serverNetId - Server (share 1) network id. + * @returns Bindings with fixed share indexes. + */ +function shareBindings( + clientNetId: PartyId, + serverNetId: PartyId, +): ShareBinding[] { + return [ + { netId: clientNetId, shareIndex: CLIENT_SHARE_INDEX }, + { netId: serverNetId, shareIndex: SERVER_SHARE_INDEX }, + ]; +} + +export class MPCKeyring implements Keyring { + readonly type: string = mpcKeyringType; + + readonly #rng: RandomNumberGenerator; + + readonly #networkManager: MfaNetworkManager; + + readonly #tss: Dkls23TssLib; + + readonly #dkm: CL24DKM; + + #state?: MPCKeyringStorageState; + + readonly #cloudURL: string; + + readonly #serializer: MPCKeyringSerializer; + + readonly #getProfileToken: (opts?: ProfileTokenOpts) => Promise; + + readonly #getBackupEncryptionKey: () => Promise; + + #signQueue: Promise = Promise.resolve(); + + constructor(opts: MPCKeyringOpts) { + this.#rng = { + generateRandomBytes: opts.getRandomBytes, + }; + this.#dkm = new CL24DKM(secp256k1Curve, this.#rng); + this.#tss = new Dkls23TssLib(opts.dkls23Lib); + this.#cloudURL = opts.cloudURL; + this.#serializer = { + thresholdKey: new CL24ThresholdKeySerializer(), + networkIdentity: new MfaNetworkIdentitySerializer(), + }; + this.#networkManager = new MfaNetworkManager({ + url: opts.relayerURL, + randomBytes: { + getRandomValues: (array: Uint8Array): Uint8Array => { + const bytes = opts.getRandomBytes(array.length); + array.set(bytes); + return array; + }, + }, + ...(opts.getTransportToken && { + getToken: opts.getTransportToken, + }), + ...(opts.webSocket === undefined ? {} : { websocket: opts.webSocket }), + }); + this.#getProfileToken = opts.getProfileToken; + this.#getBackupEncryptionKey = opts.getBackupEncryptionKey; + } + + /** + * Return the serialized state of the keyring. + * + * @returns The serialized state of the keyring. + */ + async serialize(): Promise { + if (!this.#state) { + return {}; + } + if (this.#state.status === 'uninitialized') { + return this.#state.setup; + } + + const { netCreds, keyShare, serverNetId, backupId, tssSetup } = this.#state; + return { + netCreds: this.#serializer.networkIdentity.toJson(netCreds), + keyShare: this.#serializer.thresholdKey.toJson(keyShare), + serverNetId, + backupId, + tssSetup: tssSetup === null ? null : bytesToHex(tssSetup), + }; + } + + /** + * Initialize the keyring with the given serialized state. + * + * @param state - The serialized state of the keyring. + */ + async deserialize(state: Json): Promise { + if (!state || typeof state !== 'object') { + throw new Error('Invalid state'); + } + const stateObj = state as Record; + + if ( + 'netCreds' in stateObj && + 'keyShare' in stateObj && + 'serverNetId' in stateObj && + 'backupId' in stateObj && + 'tssSetup' in stateObj + ) { + this.#state = { + status: 'initialized', + netCreds: this.#serializer.networkIdentity.fromJson(stateObj.netCreds), + keyShare: this.#serializer.thresholdKey.fromJson(stateObj.keyShare), + serverNetId: parseServerNetId(stateObj.serverNetId), + backupId: parseBackupId(stateObj.backupId), + tssSetup: parseTssSetup(stateObj.tssSetup), + }; + return; + } + + const setup = this.#parseSetupParams(stateObj); + if (setup) { + this.#state = { + status: 'uninitialized', + setup, + }; + } + } + + /** + * Run key generation or import. `mode` may be passed directly, or taken + * from setup params previously stored via {@link deserialize}. + * + * @param mode - Create a new key or import from the backend backup. + */ + async init(mode?: MPCKeyringSetupParams['mode']): Promise { + if (this.#state?.status === 'initialized') { + return; + } + + const resolvedMode = + mode ?? + (this.#state?.status === 'uninitialized' + ? this.#state.setup.mode + : undefined); + if (resolvedMode === undefined) { + return; + } + + if (resolvedMode === 'create') { + await this.#setupCreate(); + } else { + await this.#setupImport(); + } + } + + /** + * Rotate client and server shares. Existing TSS setup remains valid. + */ + async rotateKeyShares(): Promise { + const state = this.#assertState(); + const { netCreds, serverNetId } = state; + let { keyShare } = state; + + const token = await this.#getProfileToken({ twoFactor: true }); + const nonce = generateSessionNonce(this.#rng); + await startRotateKeyShares({ + baseURL: this.#cloudURL, + token, + clientNetId: netCreds.partyId, + nonce, + }); + + const netSession = await this.#createNetworkSession( + netCreds, + serverNetId, + nonce, + ); + try { + const custodians = partyNetIds(netCreds.partyId, serverNetId); + keyShare = await this.#dkm.rotateKeyShares({ + key: keyShare, + dealers: dealersFromCL24Key(keyShare, custodians), + custodians, + networkSession: netSession.createSubsession('rotate-key-shares'), + }); + } finally { + await netSession.disconnect(); + } + + const backupId = createBackupId(this.#rng); + await storeKeyShareBackup({ + baseURL: this.#cloudURL, + token, + backupId, + encryptedKeyShare: await this.#encryptKeyShare(keyShare), + }); + + this.#applyKeyState({ + ...state, + keyShare, + backupId, + }); + } + + /** + * Compare the local backup id with the id stored on the backend. + * + * @returns Whether the backup ids match. + */ + async checkKeyShare(): Promise { + const { backupId } = this.#assertState(); + const token = await this.#getProfileToken(); + const serverBackupId = await checkKeyShareBackupId({ + baseURL: this.#cloudURL, + token, + }); + return backupId === serverBackupId; + } + + /** + * Refresh `keyShare` and `backupId` from the backend backup. + * `netCreds`, `serverNetId`, and `tssSetup` are unchanged. + */ + async syncKeyShare(): Promise { + const state = this.#assertState(); + const token = await this.#getProfileToken({ twoFactor: true }); + const { encryptedKeyShare, backupId } = await loadKeyShareBackup({ + baseURL: this.#cloudURL, + token, + }); + const keyShare = await this.#decryptKeyShare(encryptedKeyShare); + this.#applyKeyState({ + ...state, + keyShare, + backupId, + }); + } + + /** + * Add new accounts to the keyring. The accounts will be derived + * sequentially from the root HD wallet, using increasing indices. + * + * @param numberOfAccounts - The number of accounts to add. + * @returns The addresses of the new accounts. + */ + async addAccounts(numberOfAccounts = 1): Promise { + throw new Error(`addAccounts(${numberOfAccounts}): not implemented`); + } + + /** + * Get the addresses of all accounts in the keyring. + * + * @returns The addresses of all accounts in the keyring. + */ + async getAccounts(): Promise { + if (!this.#state || this.#state.status !== 'initialized') { + return []; + } + + return [this.#address()]; + } + + /** + * Get the public address of the account for the given app key origin. + * + * @param address - The address of the account. + * @param origin - The origin of the app requesting the account. + * @returns The public address of the account. + */ + async getAppKeyAddress(address: Hex, origin: string): Promise { + throw new Error(`getAppKeyAddress(${address}, ${origin}): not implemented`); + } + + /** + * Sign a transaction using the specified account. + * + * @param address - The address of the account. + * @param tx - The transaction to sign. + * @param _opts - The options for signing the transaction. + * @returns The signed transaction. + */ + async signTransaction( + address: Hex, + tx: TypedTransaction, + _opts = {}, + ): Promise { + const message = tx.getHashedMessageToSign(); + + const signature = await this.#signHash(address, message); + + const { r, s, v } = parseEthSig(signature); + + const signedTx = tx.addSignature(v, r, s); + return signedTx; + } + + /** + * Sign a personal message using the specified account. + * This method is compatible with the `personal_sign` RPC method. + * + * @param address - The address of the account. + * @param msgHex - The message to sign. + * @param _opts - The options for signing the message. + * @returns The signature of the message. + */ + async signPersonalMessage( + address: Hex, + msgHex: string, + _opts?: Record, + ): Promise { + const rawMsg = hexToBytes(msgHex); + const msgHash = hashPersonalMessage(rawMsg); + + const signature = await this.#signHash(address, msgHash); + return bytesToHex(signature); + } + + /** + * Sign a typed message using the specified account. + * This method is compatible with the `eth_signTypedData` RPC method. + * + * @param address - The address of the account. + * @param data - The typed data to sign. + * @param options - The options for signing the message. + * @returns The signature of the message. + */ + async signTypedData< + Version extends SignTypedDataVersion, + Types extends MessageTypes, + Options extends { version?: Version }, + >( + address: Hex, + data: Version extends 'V1' ? TypedDataV1 : TypedMessage, + options?: Options, + ): Promise { + const version = parseSignedTypedDataVersion(options); + + const messageHash = getSignedTypedDataHash(data, version); + + const signature = await this.#signHash(address, messageHash); + return bytesToHex(signature); + } + + async #setupCreate(): Promise { + const token = await this.#getProfileToken({ twoFactor: true }); + const netCreds = await this.#networkManager.createIdentity(); + const serverNetId = await getNetId({ + baseURL: this.#cloudURL, + token, + }); + + const nonce = generateSessionNonce(this.#rng); + await startCreateKey({ + baseURL: this.#cloudURL, + token, + clientNetId: netCreds.partyId, + nonce, + }); + + const netSession = await this.#createNetworkSession( + netCreds, + serverNetId, + nonce, + ); + let keyShare: CL24ThresholdKey; + let tssSetup: Uint8Array; + try { + const custodians = partyNetIds(netCreds.partyId, serverNetId); + const bindings = shareBindings(netCreds.partyId, serverNetId); + const createKeySession = netSession.createSubsession('create-key'); + const tssSetupSession = netSession.createSubsession('tss-setup'); + [keyShare, tssSetup] = await Promise.all([ + this.#dkm.createKey({ + custodians, + threshold: 2, + networkSession: createKeySession, + }), + this.#tss.setup({ + signers: bindings, + networkSession: tssSetupSession, + }), + ]); + } finally { + await netSession.disconnect(); + } + + const backupId = createBackupId(this.#rng); + await storeKeyShareBackup({ + baseURL: this.#cloudURL, + token, + backupId, + encryptedKeyShare: await this.#encryptKeyShare(keyShare), + }); + + this.#applyKeyState({ + keyShare, + netCreds, + serverNetId, + backupId, + tssSetup, + }); + } + + async #setupImport(): Promise { + const token = await this.#getProfileToken({ twoFactor: true }); + const netCreds = await this.#networkManager.createIdentity(); + const serverNetId = await getNetId({ + baseURL: this.#cloudURL, + token, + }); + + const loaded = await loadKeyShareBackup({ + baseURL: this.#cloudURL, + token, + }); + const keyShare = await this.#decryptKeyShare(loaded.encryptedKeyShare); + + await registerClient({ + baseURL: this.#cloudURL, + token, + clientNetId: netCreds.partyId, + }); + + this.#applyKeyState({ + keyShare, + netCreds, + serverNetId, + backupId: loaded.backupId, + tssSetup: null, + }); + } + + async #signHash(address: Hex, hash: Uint8Array): Promise { + return this.#serializeSign(async () => { + const state = this.#assertState(); + const { keyShare, netCreds, serverNetId } = state; + let { tssSetup } = state; + + const addr = this.#address(); + if (!equalAddresses(address, addr)) { + throw new Error(`account ${address} not found`); + } + + const token = await this.#getProfileToken({ + twoFactor: true, + challenge: hash, + }); + const nonce = generateSessionNonce(this.#rng); + await startSign({ + baseURL: this.#cloudURL, + token, + data: hash, + clientNetId: netCreds.partyId, + nonce, + }); + + const netSession = await this.#createNetworkSession( + netCreds, + serverNetId, + nonce, + ); + const bindings = shareBindings(netCreds.partyId, serverNetId); + + try { + tssSetup = await this.#ensureTssSetup( + netSession, + serverNetId, + bindings, + tssSetup, + ); + this.#applyKeyState({ ...state, tssSetup }); + + try { + const { signature } = await this.#tss.sign({ + key: keyShare, + signers: bindings, + message: hash, + networkSession: netSession.createSubsession('tss-sign'), + setup: tssSetup, + }); + return toEthSig(signature, hash, keyShare.publicKey); + } catch (error) { + this.#applyKeyState({ ...state, tssSetup: null }); + throw error; + } + } finally { + await netSession.disconnect(); + } + }); + } + + async #ensureTssSetup( + netSession: RootNetworkSession, + peerNetId: PartyId, + bindings: ShareBinding[], + storedSetup: Uint8Array | null, + ): Promise { + const haveSetup = storedSetup !== null; + netSession.sendMessage( + peerNetId, + TSS_HAVE_SETUP_MESSAGE_TYPE, + new TextEncoder().encode(JSON.stringify({ haveSetup })), + ); + const peerBytes = await netSession.receiveMessage( + peerNetId, + TSS_HAVE_SETUP_MESSAGE_TYPE, + ); + const peerPayload = JSON.parse(new TextDecoder().decode(peerBytes)) as { + haveSetup?: unknown; + }; + const peerHaveSetup = peerPayload.haveSetup === true; + if (haveSetup && peerHaveSetup) { + return storedSetup; + } + + return this.#tss.setup({ + signers: bindings, + networkSession: netSession.createSubsession('tss-setup'), + }); + } + + async #createNetworkSession( + netCreds: MfaNetworkIdentity, + serverNetId: PartyId, + nonce: string, + ): Promise { + const sessionId = createScopedSessionId( + [serverNetId, netCreds.partyId], + nonce, + ); + return this.#networkManager.createSession(netCreds, sessionId); + } + + async #encryptKeyShare(keyShare: CL24ThresholdKey): Promise { + const key = await this.#getBackupEncryptionKey(); + const plaintext = new TextEncoder().encode( + JSON.stringify(this.#serializer.thresholdKey.toJson(keyShare)), + ); + const iv = this.#rng.generateRandomBytes(AES_GCM_IV_LENGTH); + return encryptBytes(key, plaintext, iv); + } + + async #decryptKeyShare( + encryptedKeyShare: Uint8Array, + ): Promise { + const key = await this.#getBackupEncryptionKey(); + const plaintext = await decryptBytes(key, encryptedKeyShare); + return this.#serializer.thresholdKey.fromJson( + JSON.parse(new TextDecoder().decode(plaintext)) as Json, + ); + } + + async #serializeSign( + operation: () => Promise, + ): Promise { + const previous = this.#signQueue; + let release!: () => void; + this.#signQueue = new Promise((resolve) => { + release = resolve; + }); + await previous; + try { + return await operation(); + } finally { + release(); + } + } + + #parseSetupParams( + state: Record, + ): MPCKeyringSetupParams | undefined { + if (!('mode' in state)) { + return undefined; + } + const { mode } = state; + if (mode === 'create' || mode === 'import') { + return { mode }; + } + throw new Error("Invalid setup mode: expected 'create' or 'import'"); + } + + #applyKeyState(state: MPCKeyringState): void { + this.#state = { + status: 'initialized', + ...state, + }; + } + + #assertState(): MPCKeyringState { + if (!this.#state || this.#state.status !== 'initialized') { + throw new Error('Keyring not initialized'); + } + return this.#state; + } + + #address(): Hex { + return publicKeyToAddressHex(this.#assertState().keyShare.publicKey); + } +} diff --git a/packages/keyring-eth-mpc/src/types.ts b/packages/keyring-eth-mpc/src/types.ts new file mode 100644 index 000000000..3eef8f851 --- /dev/null +++ b/packages/keyring-eth-mpc/src/types.ts @@ -0,0 +1,57 @@ +import type { CL24ThresholdKey } from '@metamask/mfa-wallet-cl24-lib'; +import type { Dkls23TssLib } from '@metamask/mfa-wallet-dkls23-lib'; +import type { MfaNetworkIdentity } from '@metamask/mfa-wallet-network'; +import type { Json } from '@metamask/utils'; + +export type ProfileTokenOpts = { + twoFactor?: boolean; + challenge?: Uint8Array; +}; + +export type Dkls23Lib = ConstructorParameters[0]; + +export type MPCKeyringOpts = { + getRandomBytes: (size: number) => Uint8Array; + dkls23Lib: Dkls23Lib; + cloudURL: string; + relayerURL: string; + getTransportToken?: () => Promise; + getProfileToken: (opts?: ProfileTokenOpts) => Promise; + getBackupEncryptionKey: () => Promise; + webSocket?: unknown; +}; + +export type MPCKeyringState = { + keyShare: CL24ThresholdKey; + netCreds: MfaNetworkIdentity; + serverNetId: string; + backupId: string; + tssSetup: Uint8Array | null; +}; + +export type MPCKeyringSetupParams = { + mode: 'create' | 'import'; +}; + +type JsonSerializer = { + toJson: (value: Value) => Json; + fromJson: (value: Json) => Value; +}; + +export type MPCKeyringInitializedState = { + status: 'initialized'; +} & MPCKeyringState; + +export type MPCKeyringUninitializedState = { + status: 'uninitialized'; + setup: MPCKeyringSetupParams; +}; + +export type MPCKeyringStorageState = + | MPCKeyringInitializedState + | MPCKeyringUninitializedState; + +export type MPCKeyringSerializer = { + thresholdKey: JsonSerializer; + networkIdentity: JsonSerializer; +}; diff --git a/packages/keyring-eth-mpc/src/util.test.ts b/packages/keyring-eth-mpc/src/util.test.ts new file mode 100644 index 000000000..d0a3db9a6 --- /dev/null +++ b/packages/keyring-eth-mpc/src/util.test.ts @@ -0,0 +1,297 @@ +import { + ecsign, + privateToAddress, + privateToPublic, + type ECDSASignature, +} from '@ethereumjs/util'; +import { + SignTypedDataVersion, + TypedDataUtils, + typedSignatureHash, +} from '@metamask/eth-sig-util'; +import { bytesToHex, hexToBytes } from '@metamask/utils'; + +import { + AES_GCM_IV_LENGTH, + createBackupId, + decryptBytes, + encryptBytes, + equalAddresses, + generateSessionNonce, + getSignedTypedDataHash, + normalizeAddress, + parseBackupId, + parseEthSig, + parseServerNetId, + parseSignedTypedDataVersion, + parseTssSetup, + publicKeyToAddressHex, + publicToAddressHex, + toEthSig, +} from './util'; + +describe('util', () => { + const privateKey = hexToBytes( + '0x6969696969696969696969696969696969696969696969696969696969696969', + ); + const publicKey = privateToPublic(privateKey); + const address = bytesToHex(privateToAddress(privateKey)); + + const SECP256K1_N = BigInt( + '0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141', + ); + const SECP256K1_HALF_N = SECP256K1_N / 2n; + + const toBytes32 = (value: bigint): Uint8Array => { + return hexToBytes(`0x${value.toString(16).padStart(64, '0')}`); + }; + + const toCompactSignature = (signature: ECDSASignature): Uint8Array => { + const compact = new Uint8Array(64); + compact.set(signature.r, 0); + compact.set(signature.s, 32); + return compact; + }; + + const findSignatureByV = ( + targetV: bigint, + ): { hash: Uint8Array; signature: ECDSASignature } => { + for (let index = 0; index < 512; index += 1) { + const hash = new Uint8Array(32); + hash[31] = index; + const signature = ecsign(hash, privateKey); + if (signature.v === targetV) { + return { hash, signature }; + } + } + + throw new Error(`Could not find signature with v=${targetV.toString()}`); + }; + + it('generates a session nonce from RNG bytes', () => { + const bytes = new Uint8Array(32).fill(1); + const rng = { generateRandomBytes: jest.fn().mockReturnValue(bytes) }; + + expect(generateSessionNonce(rng)).toBe(bytesToHex(bytes)); + expect(rng.generateRandomBytes).toHaveBeenCalledWith(32); + }); + + it('converts public keys to address hex', () => { + expect(publicToAddressHex(publicKey)).toBe(address); + expect(publicKeyToAddressHex(publicKey)).toBe(address); + }); + + it('normalizes and compares addresses', () => { + expect(normalizeAddress('0x1111111111111111111111111111111111111111')).toBe( + '0x1111111111111111111111111111111111111111', + ); + expect( + equalAddresses( + '0x1111111111111111111111111111111111111111', + '0x1111111111111111111111111111111111111111', + ), + ).toBe(true); + expect( + equalAddresses( + '0x1111111111111111111111111111111111111111', + '0x2222222222222222222222222222222222222222', + ), + ).toBe(false); + }); + + it('converts compact signatures to ethereum signatures with both parities', () => { + const sigWithParity0 = findSignatureByV(27n); + const ethSignature0 = toEthSig( + toCompactSignature(sigWithParity0.signature), + sigWithParity0.hash, + publicKey, + ); + expect(ethSignature0).toHaveLength(65); + expect(ethSignature0[64]).toBe(27); + + const sigWithParity1 = findSignatureByV(28n); + const ethSignature1 = toEthSig( + toCompactSignature(sigWithParity1.signature), + sigWithParity1.hash, + publicKey, + ); + expect(ethSignature1).toHaveLength(65); + expect(ethSignature1[64]).toBe(28); + }); + + it('enforces low-s for high-s compact signatures', () => { + const { hash, signature } = findSignatureByV(27n); + const highS = SECP256K1_N - BigInt(bytesToHex(signature.s)); + expect(highS).toBeGreaterThan(SECP256K1_HALF_N); + + const compactSignature = new Uint8Array(64); + compactSignature.set(signature.r, 0); + compactSignature.set(toBytes32(highS), 32); + + const ethSignature = toEthSig(compactSignature, hash, publicKey); + const parsed = parseEthSig(ethSignature); + const normalizedS = BigInt(bytesToHex(parsed.s)); + + expect(ethSignature).toHaveLength(65); + expect(normalizedS).toBeLessThanOrEqual(SECP256K1_HALF_N); + }); + + it('pads normalized s to 32 bytes when needed', () => { + const { hash, signature } = findSignatureByV(27n); + const compactSignature = new Uint8Array(64); + compactSignature.set(signature.r, 0); + compactSignature.set(toBytes32(SECP256K1_N - 1n), 32); + + const ethSignature = toEthSig(compactSignature, hash, publicKey); + const parsed = parseEthSig(ethSignature); + expect(parsed.s).toStrictEqual(toBytes32(1n)); + }); + + it('falls back to parity=1 if public key recovery throws', () => { + const signature = new Uint8Array(64); + const invalidHash = new Uint8Array(32).fill(8); + const ethSignature = toEthSig(signature, invalidHash, publicKey); + expect(ethSignature).toHaveLength(65); + expect(ethSignature[64]).toBe(28); + }); + + it('throws for invalid compact signature lengths', () => { + expect(() => + toEthSig(new Uint8Array(63), new Uint8Array(32), new Uint8Array([4])), + ).toThrow('Invalid signature length'); + }); + + it('parses ethereum signatures and validates edge cases', () => { + const signature = new Uint8Array(65).fill(1); + signature[64] = 28; + const parsed = parseEthSig(signature); + expect(parsed.v).toBe(28n); + expect(parsed.r).toHaveLength(32); + expect(parsed.s).toHaveLength(32); + + expect(() => parseEthSig(new Uint8Array(64))).toThrow( + 'Invalid signature length', + ); + + const malformedSignature = { + length: 65, + 64: undefined, + slice: jest.fn().mockReturnValue(new Uint8Array(32)), + } as unknown as Uint8Array; + + expect(() => parseEthSig(malformedSignature)).toThrow( + 'Invalid signature v value', + ); + }); + + it('parses signed typed data versions with sane defaults', () => { + expect(parseSignedTypedDataVersion()).toBe(SignTypedDataVersion.V1); + expect(parseSignedTypedDataVersion({ version: 'NOPE' })).toBe( + SignTypedDataVersion.V1, + ); + expect( + parseSignedTypedDataVersion({ version: SignTypedDataVersion.V4 }), + ).toBe(SignTypedDataVersion.V4); + }); + + it('hashes signed typed data for V1 and EIP-712 versions', () => { + const typedDataV1 = [{ name: 'value', type: 'string', value: 'hello' }]; + + const v1Hash = getSignedTypedDataHash(typedDataV1, SignTypedDataVersion.V1); + expect(v1Hash).toStrictEqual(hexToBytes(typedSignatureHash(typedDataV1))); + + const typedDataV4 = { + types: { EIP712Domain: [] }, + domain: {}, + primaryType: 'EIP712Domain', + message: {}, + } as const; + + const v4Hash = getSignedTypedDataHash( + typedDataV4 as never, + SignTypedDataVersion.V4, + ); + expect(v4Hash).toStrictEqual( + new Uint8Array( + TypedDataUtils.eip712Hash( + typedDataV4 as never, + SignTypedDataVersion.V4, + ), + ), + ); + }); + + it('creates an opaque backup id from RNG bytes', () => { + const bytes = new Uint8Array(32).fill(2); + const rng = { generateRandomBytes: jest.fn().mockReturnValue(bytes) }; + + expect(createBackupId(rng)).toBe(bytesToHex(bytes)); + expect(rng.generateRandomBytes).toHaveBeenCalledWith(32); + }); + + it('encrypts and decrypts bytes with AES-GCM', async () => { + const key = new Uint8Array(32).fill(9); + const iv = new Uint8Array(AES_GCM_IV_LENGTH).fill(1); + const plaintext = new TextEncoder().encode('key-share'); + + const payload = await encryptBytes(key, plaintext, iv); + expect(payload.slice(0, AES_GCM_IV_LENGTH)).toStrictEqual(iv); + + const decrypted = await decryptBytes(key, payload); + expect(decrypted).toStrictEqual(plaintext); + }); + + it('encrypts with a 16-byte AES key', async () => { + const key = new Uint8Array(16).fill(3); + const iv = new Uint8Array(AES_GCM_IV_LENGTH).fill(2); + const plaintext = new Uint8Array([4, 5, 6]); + + const decrypted = await decryptBytes( + key, + await encryptBytes(key, plaintext, iv), + ); + expect(decrypted).toStrictEqual(plaintext); + }); + + it('throws for invalid AES-GCM parameters', async () => { + const key = new Uint8Array(32).fill(1); + const plaintext = new Uint8Array([1]); + + await expect( + encryptBytes(key, plaintext, new Uint8Array(11)), + ).rejects.toThrow('Invalid IV length'); + await expect( + encryptBytes(new Uint8Array(15), plaintext, new Uint8Array(12)), + ).rejects.toThrow('Invalid backup encryption key length'); + await expect(decryptBytes(key, new Uint8Array(12))).rejects.toThrow( + 'Invalid ciphertext', + ); + await expect( + decryptBytes(new Uint8Array(15), new Uint8Array(20)), + ).rejects.toThrow('Invalid backup encryption key length'); + }); + + it('parses and validates serialized keyring fields', () => { + expect(parseServerNetId('server-1')).toBe('server-1'); + expect(() => parseServerNetId(1 as never)).toThrow( + 'Invalid server network id: expected a string', + ); + expect(() => parseServerNetId('')).toThrow( + 'Invalid server network id: expected a non-empty string', + ); + + expect(parseBackupId('backup-1')).toBe('backup-1'); + expect(() => parseBackupId(1 as never)).toThrow( + 'Invalid backup id: expected a string', + ); + expect(() => parseBackupId('')).toThrow( + 'Invalid backup id: expected a non-empty string', + ); + + expect(parseTssSetup('0x1234')).toStrictEqual(new Uint8Array([0x12, 0x34])); + expect(parseTssSetup(null)).toBeNull(); + expect(() => parseTssSetup(123 as never)).toThrow( + 'Invalid tss setup: expected a hex string or null', + ); + }); +}); diff --git a/packages/keyring-eth-mpc/src/util.ts b/packages/keyring-eth-mpc/src/util.ts new file mode 100644 index 000000000..c80cffaef --- /dev/null +++ b/packages/keyring-eth-mpc/src/util.ts @@ -0,0 +1,349 @@ +import { + bigIntToBytes, + concatBytes, + ecrecover, + publicToAddress, + pubToAddress, +} from '@ethereumjs/util'; +import type { + MessageTypes, + TypedDataV1, + TypedMessage, +} from '@metamask/eth-sig-util'; +import { + normalize, + SignTypedDataVersion, + TypedDataUtils, + typedSignatureHash, +} from '@metamask/eth-sig-util'; +import type { RandomNumberGenerator } from '@metamask/mfa-wallet-interface'; +import type { Hex, Json } from '@metamask/utils'; +import { add0x, assert, bytesToHex, hexToBytes } from '@metamask/utils'; + +const SESSION_NONCE_BYTE_LENGTH = 32; +const BACKUP_ID_BYTE_LENGTH = 32; +export const AES_GCM_IV_LENGTH = 12; + +/** + * Generate a session nonce: random bytes from the RNG, hex-encoded. + * + * @param rng - The random number generator. + * @returns Hex-encoded 32-byte random nonce. + */ +export function generateSessionNonce(rng: RandomNumberGenerator): Hex { + return bytesToHex(rng.generateRandomBytes(SESSION_NONCE_BYTE_LENGTH)); +} + +/** + * Mint an opaque backup id. Not a counter. + * + * @param rng - The random number generator. + * @returns Hex-encoded 32-byte random id. + */ +export function createBackupId(rng: RandomNumberGenerator): string { + return bytesToHex(rng.generateRandomBytes(BACKUP_ID_BYTE_LENGTH)); +} + +/** + * Encrypt plaintext with AES-GCM. The IV is prepended to the ciphertext. + * + * @param key - 16- or 32-byte AES key. + * @param plaintext - Bytes to encrypt. + * @param iv - 12-byte IV. + * @returns `iv || ciphertext || tag`. + */ +export async function encryptBytes( + key: Uint8Array, + plaintext: Uint8Array, + iv: Uint8Array, +): Promise { + if (iv.length !== AES_GCM_IV_LENGTH) { + throw new Error('Invalid IV length'); + } + if (key.length !== 16 && key.length !== 32) { + throw new Error('Invalid backup encryption key length'); + } + + const cryptoKey = await globalThis.crypto.subtle.importKey( + 'raw', + key, + 'AES-GCM', + false, + ['encrypt'], + ); + const ciphertext = await globalThis.crypto.subtle.encrypt( + { name: 'AES-GCM', iv }, + cryptoKey, + plaintext, + ); + return concatBytes(iv, new Uint8Array(ciphertext)); +} + +/** + * Decrypt a payload produced by {@link encryptBytes}. + * + * @param key - 16- or 32-byte AES key. + * @param payload - `iv || ciphertext || tag`. + * @returns The plaintext bytes. + */ +export async function decryptBytes( + key: Uint8Array, + payload: Uint8Array, +): Promise { + if (payload.length <= AES_GCM_IV_LENGTH) { + throw new Error('Invalid ciphertext'); + } + if (key.length !== 16 && key.length !== 32) { + throw new Error('Invalid backup encryption key length'); + } + + const iv = payload.slice(0, AES_GCM_IV_LENGTH); + const ciphertext = payload.slice(AES_GCM_IV_LENGTH); + const cryptoKey = await globalThis.crypto.subtle.importKey( + 'raw', + key, + 'AES-GCM', + false, + ['decrypt'], + ); + const plaintext = await globalThis.crypto.subtle.decrypt( + { name: 'AES-GCM', iv }, + cryptoKey, + ciphertext, + ); + return new Uint8Array(plaintext); +} + +const SECP256K1_N = BigInt( + '0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141', +); +const SECP256K1_HALF_N = SECP256K1_N / 2n; + +/** + * Convert a public key to an address. + * + * @param pubKey - The public key to convert. + * @returns The address. + */ +export function publicToAddressHex(pubKey: Uint8Array): Hex { + const addrBytes = publicToAddress(pubKey); + return bytesToHex(addrBytes); +} + +/** + * Normalize an address. + * + * @param address - The address to normalize. + * @returns The normalized address. + */ +export function normalizeAddress(address: string): Hex { + const normalized = normalize(address); + assert(normalized, 'Expected address to be set'); + return add0x(normalized); +} + +/** + * Check if two addresses are equal. + * + * @param address1 - The first address. + * @param address2 - The second address. + * @returns Whether the addresses are equal. + */ +export function equalAddresses(address1: string, address2: string): boolean { + return normalizeAddress(address1) === normalizeAddress(address2); +} + +/** + * Convert an ECDSA signature in compact format (64 bytes) to a signature in + * Ethereum extended format (65 bytes). + * + * @param signature - The signature to convert. + * @param hash - The hash of the message. + * @param pubKey - The public key of the signer. + * @returns The Ethereum signature. + */ +export function toEthSig( + signature: Uint8Array, + hash: Uint8Array, + pubKey: Uint8Array, +): Uint8Array { + if (signature.length !== 64) { + throw new Error('Invalid signature length'); + } + + // Enforce low `s` + + const rBuf = signature.slice(0, 32); + let sBuf = signature.slice(32, 64); + + const sInt = BigInt(add0x(bytesToHex(sBuf))); + if (sInt > SECP256K1_HALF_N) { + const newSInt = SECP256K1_N - sInt; + const newSBytes = bigIntToBytes(newSInt); + + if (newSBytes.length < 32) { + sBuf = new Uint8Array(32); + sBuf.set(newSBytes, 32 - newSBytes.length); + } else { + sBuf = new Uint8Array(newSBytes); + } + } + + // Compute `v` + // --------------------------------------------------------------------------- + // NOTE: If the signing library provided the parity of R.y, we could compute + // `v` directly and skip the costly ecrecover operation. + // --------------------------------------------------------------------------- + + const expectedAddr = publicKeyToAddressHex(pubKey); + + const checkParity = (parity: bigint): boolean => { + try { + const candidatePubKey = ecrecover(hash, parity, rBuf, sBuf); + return publicToAddressHex(candidatePubKey) === expectedAddr; + } catch { + return false; + } + }; + + const parity = checkParity(0n) ? 0n : 1n; + + // Ethereum's recovery value: `v = parity(R.y) + 27` + const vInt = parity + 27n; + + // Ethereum's extended signature format: `[r | s | v]` + return concatBytes(rBuf, sBuf, bigIntToBytes(vInt)); +} + +/** + * Parse an extended ECDSA signature. + * + * @param signature - The signature to parse. + * @returns The parsed signature. + */ +export function parseEthSig(signature: Uint8Array): { + r: Uint8Array; + s: Uint8Array; + v: bigint; +} { + if (signature.length !== 65) { + throw new Error('Invalid signature length'); + } + + const rBuf = signature.slice(0, 32); + const sBuf = signature.slice(32, 64); + const vByte = signature[64]; + + // This check is technically redundant because length is 65, but satisfies TS + if (vByte === undefined) { + throw new Error('Invalid signature v value'); + } + const vInt = BigInt(vByte); + + return { r: rBuf, s: sBuf, v: vInt }; +} + +/** + * Parse the version of a signed typed data object. + * + * @param opts - The options object. + * @returns The version of the signed typed data object. + */ +export function parseSignedTypedDataVersion( + opts?: Record, +): SignTypedDataVersion { + let version = opts?.version as SignTypedDataVersion | undefined; + if (!version || !Object.keys(SignTypedDataVersion).includes(version)) { + version = SignTypedDataVersion.V1; + } + return version; +} + +/** + * Get the hash of a signed typed data object. + * + * @param data - The data to hash. + * @param version - The version of the signed typed data object. + * @returns The hash of the signed typed data object. + */ +export function getSignedTypedDataHash< + Version extends SignTypedDataVersion, + MessageType extends MessageTypes, +>( + data: Version extends 'V1' ? TypedDataV1 : TypedMessage, + version: Version, +): Uint8Array { + if (version === SignTypedDataVersion.V1) { + const hash = typedSignatureHash(data as unknown as TypedDataV1); + return hexToBytes(hash); + } + + const hash = TypedDataUtils.eip712Hash( + data as TypedMessage, + version, + ); + return new Uint8Array(hash); +} + +/** + * Parse a non-empty string field from JSON. + * + * @param value - The value to parse. + * @param fieldName - Field name for error messages. + * @returns The parsed string. + */ +function parseNonEmptyString(value: Json, fieldName: string): string { + if (typeof value !== 'string') { + throw new Error(`Invalid ${fieldName}: expected a string`); + } + if (value.length < 1) { + throw new Error(`Invalid ${fieldName}: expected a non-empty string`); + } + return value; +} + +/** + * Parse a server network id from a JSON value. + * + * @param serverNetId - The server network id to parse. + * @returns The parsed server network id. + */ +export function parseServerNetId(serverNetId: Json): string { + return parseNonEmptyString(serverNetId, 'server network id'); +} + +/** + * Parse a backup id from a JSON value. + * + * @param backupId - The backup id to parse. + * @returns The parsed backup id. + */ +export function parseBackupId(backupId: Json): string { + return parseNonEmptyString(backupId, 'backup id'); +} + +/** + * Parse TSS setup from a JSON value. + * + * @param tssSetup - Hex-encoded setup, or `null` when unset. + * @returns The parsed setup bytes, or `null`. + */ +export function parseTssSetup(tssSetup: Json): Uint8Array | null { + if (tssSetup === null) { + return null; + } + if (typeof tssSetup !== 'string') { + throw new Error('Invalid tss setup: expected a hex string or null'); + } + return hexToBytes(tssSetup); +} + +/** + * Convert a public key to an address. + * + * @param publicKey - The public key to convert. + * @returns The address. + */ +export function publicKeyToAddressHex(publicKey: Uint8Array): Hex { + return bytesToHex(pubToAddress(publicKey, true)); +} diff --git a/packages/keyring-eth-mpc/tsconfig.build.json b/packages/keyring-eth-mpc/tsconfig.build.json new file mode 100644 index 000000000..b34e78e32 --- /dev/null +++ b/packages/keyring-eth-mpc/tsconfig.build.json @@ -0,0 +1,16 @@ +{ + "extends": "../../tsconfig.packages.build.json", + "compilerOptions": { + "baseUrl": "./", + "outDir": "dist", + "rootDir": "src", + // NOTE: @msgpack/msgpack uses Uint8Array which requires TypeScript 5.7+. + // skipLibCheck bypasses type-checking of .d.ts files in node_modules. + "skipLibCheck": true + }, + "references": [ + { "path": "../keyring-utils/tsconfig.build.json" } + ], + "include": ["./src/**/*.ts"], + "exclude": ["./src/**/*.test.ts"] +} diff --git a/packages/keyring-eth-mpc/tsconfig.json b/packages/keyring-eth-mpc/tsconfig.json new file mode 100644 index 000000000..a30efa086 --- /dev/null +++ b/packages/keyring-eth-mpc/tsconfig.json @@ -0,0 +1,20 @@ +{ + "extends": "../../tsconfig.packages.json", + "compilerOptions": { + "baseUrl": "./", + // NOTE: @msgpack/msgpack uses Uint8Array which requires TypeScript 5.7+. + // skipLibCheck bypasses type-checking of .d.ts files in node_modules. + "skipLibCheck": true + }, + "references": [ + { + "path": "../keyring-utils" + } + ], + "include": [ + "./src" + ], + "exclude": [ + "./dist/**/*" + ] +} \ No newline at end of file diff --git a/tsconfig.build.json b/tsconfig.build.json index 29029bd74..a9160f780 100644 --- a/tsconfig.build.json +++ b/tsconfig.build.json @@ -6,6 +6,7 @@ { "path": "./packages/keyring-eth-hd/tsconfig.build.json" }, { "path": "./packages/keyring-eth-money/tsconfig.build.json" }, { "path": "./packages/keyring-eth-ledger-bridge/tsconfig.build.json" }, + { "path": "./packages/keyring-eth-mpc/tsconfig.build.json" }, { "path": "./packages/keyring-eth-qr/tsconfig.build.json" }, { "path": "./packages/keyring-eth-simple/tsconfig.build.json" }, { "path": "./packages/keyring-eth-trezor/tsconfig.build.json" }, diff --git a/tsconfig.json b/tsconfig.json index aa0a2a8db..3a7166454 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -5,6 +5,7 @@ { "path": "./packages/keyring-api" }, { "path": "./packages/keyring-eth-hd" }, { "path": "./packages/keyring-eth-ledger-bridge" }, + { "path": "./packages/keyring-eth-mpc" }, { "path": "./packages/keyring-eth-simple" }, { "path": "./packages/keyring-eth-trezor" }, { "path": "./packages/keyring-internal-api" }, diff --git a/yarn.lock b/yarn.lock index 7755a4495..148a3c5d1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1986,6 +1986,32 @@ __metadata: languageName: unknown linkType: soft +"@metamask/eth-mpc-keyring@workspace:packages/keyring-eth-mpc": + version: 0.0.0-use.local + resolution: "@metamask/eth-mpc-keyring@workspace:packages/keyring-eth-mpc" + dependencies: + "@ethereumjs/tx": "npm:^5.4.0" + "@ethereumjs/util": "npm:^9.1.0" + "@lavamoat/allow-scripts": "npm:^3.2.1" + "@lavamoat/preinstall-always-fail": "npm:^2.1.0" + "@metamask/auto-changelog": "npm:^6.1.0" + "@metamask/eth-sig-util": "npm:^9.0.0" + "@metamask/keyring-utils": "workspace:^" + "@metamask/mfa-wallet-cl24-lib": "npm:^0.0.0" + "@metamask/mfa-wallet-dkls23-lib": "npm:^0.0.0" + "@metamask/mfa-wallet-e2ee": "npm:^0.0.0" + "@metamask/mfa-wallet-interface": "npm:^0.0.0" + "@metamask/mfa-wallet-network": "npm:^0.0.0" + "@metamask/mfa-wallet-util": "npm:^0.0.0" + "@metamask/utils": "npm:^11.11.0" + "@ts-bridge/cli": "npm:^0.6.3" + "@types/jest": "npm:^29.5.12" + deepmerge: "npm:^4.2.2" + jest: "npm:^29.5.0" + typescript: "npm:~5.3.3" + languageName: unknown + linkType: soft + "@metamask/eth-qr-keyring@workspace:packages/keyring-eth-qr": version: 0.0.0-use.local resolution: "@metamask/eth-qr-keyring@workspace:packages/keyring-eth-qr" @@ -2435,7 +2461,7 @@ __metadata: languageName: unknown linkType: soft -"@metamask/keyring-utils@npm:^5.0.0, @metamask/keyring-utils@workspace:packages/keyring-utils": +"@metamask/keyring-utils@npm:^5.0.0, @metamask/keyring-utils@workspace:^, @metamask/keyring-utils@workspace:packages/keyring-utils": version: 0.0.0-use.local resolution: "@metamask/keyring-utils@workspace:packages/keyring-utils" dependencies: @@ -2476,6 +2502,64 @@ __metadata: languageName: node linkType: hard +"@metamask/mfa-wallet-cl24-lib@file:./packages/keyring-eth-mpc/metamask-mfa-wallet-cl24-lib-0.0.0.tgz::locator=%40metamask%2Faccounts-monorepo%40workspace%3A.": + version: 0.0.0 + resolution: "@metamask/mfa-wallet-cl24-lib@file:./packages/keyring-eth-mpc/metamask-mfa-wallet-cl24-lib-0.0.0.tgz#./packages/keyring-eth-mpc/metamask-mfa-wallet-cl24-lib-0.0.0.tgz::hash=4e48d0&locator=%40metamask%2Faccounts-monorepo%40workspace%3A." + dependencies: + "@msgpack/msgpack": "npm:^3.1.2" + "@noble/curves": "npm:^1.9.2" + "@noble/hashes": "npm:^1.8.0" + checksum: 10/8d1c5e32823fa97b656ab4287e4f17ed0a7fc3a00ab3d2d9ea0ff161a701176355f03d4317132edc7c9736e95459e745ceaf33d89953140297148264fef839de + languageName: node + linkType: hard + +"@metamask/mfa-wallet-dkls23-lib@file:./packages/keyring-eth-mpc/metamask-mfa-wallet-dkls23-lib-0.0.0.tgz::locator=%40metamask%2Faccounts-monorepo%40workspace%3A.": + version: 0.0.0 + resolution: "@metamask/mfa-wallet-dkls23-lib@file:./packages/keyring-eth-mpc/metamask-mfa-wallet-dkls23-lib-0.0.0.tgz#./packages/keyring-eth-mpc/metamask-mfa-wallet-dkls23-lib-0.0.0.tgz::hash=5a83f7&locator=%40metamask%2Faccounts-monorepo%40workspace%3A." + dependencies: + "@metamask/mfa-wallet-util": "npm:^0.0.0" + "@noble/curves": "npm:^1.9.2" + checksum: 10/cab98dc3f6de7b065d5854aa8e23cd928dc628f4d40c78417e511c50b4b08aeb80e1a5a1a5a5cdce8d2f9271bd2928c23b79ee6614221784b24c032ef77a2b0f + languageName: node + linkType: hard + +"@metamask/mfa-wallet-e2ee@file:./packages/keyring-eth-mpc/metamask-mfa-wallet-e2ee-0.0.0.tgz::locator=%40metamask%2Faccounts-monorepo%40workspace%3A.": + version: 0.0.0 + resolution: "@metamask/mfa-wallet-e2ee@file:./packages/keyring-eth-mpc/metamask-mfa-wallet-e2ee-0.0.0.tgz#./packages/keyring-eth-mpc/metamask-mfa-wallet-e2ee-0.0.0.tgz::hash=b1f8ae&locator=%40metamask%2Faccounts-monorepo%40workspace%3A." + dependencies: + "@msgpack/msgpack": "npm:^3.1.2" + "@noble/ciphers": "npm:^1.3.0" + "@noble/curves": "npm:^1.9.2" + "@noble/hashes": "npm:^1.8.0" + checksum: 10/33df44ec33e032f457978685b05b91cedb87f9da2453d336d4090cc82ad70a882b61d177b970ac03a70c7d7ec439146afdb5a5d2860789905132bbcaee568f70 + languageName: node + linkType: hard + +"@metamask/mfa-wallet-interface@file:./packages/keyring-eth-mpc/metamask-mfa-wallet-interface-0.0.0.tgz::locator=%40metamask%2Faccounts-monorepo%40workspace%3A.": + version: 0.0.0 + resolution: "@metamask/mfa-wallet-interface@file:./packages/keyring-eth-mpc/metamask-mfa-wallet-interface-0.0.0.tgz#./packages/keyring-eth-mpc/metamask-mfa-wallet-interface-0.0.0.tgz::hash=309a1e&locator=%40metamask%2Faccounts-monorepo%40workspace%3A." + checksum: 10/27046deb25db1a7d4fdca63e5bf069b8107b2206ce30985f5453aa51a4f2d6c26575b422b7a80b59f78bf6b44dc613bb1ad9f29a32205a75e6a92ae23adb5f3a + languageName: node + linkType: hard + +"@metamask/mfa-wallet-network@file:./packages/keyring-eth-mpc/metamask-mfa-wallet-network-0.0.0.tgz::locator=%40metamask%2Faccounts-monorepo%40workspace%3A.": + version: 0.0.0 + resolution: "@metamask/mfa-wallet-network@file:./packages/keyring-eth-mpc/metamask-mfa-wallet-network-0.0.0.tgz#./packages/keyring-eth-mpc/metamask-mfa-wallet-network-0.0.0.tgz::hash=5e5b38&locator=%40metamask%2Faccounts-monorepo%40workspace%3A." + dependencies: + "@metamask/mfa-wallet-e2ee": "npm:^0.0.0" + "@noble/hashes": "npm:^1.8.0" + centrifuge: "npm:^5.5.2" + checksum: 10/98cb8c5cad46af2d1aa87a8885ace59e0e75cec5609d2f2152417927262f72cdfe0586b32af8a255bb3217f1ffdfee07bc81cf1b2940f530f61c451eefb4a286 + languageName: node + linkType: hard + +"@metamask/mfa-wallet-util@file:./packages/keyring-eth-mpc/metamask-mfa-wallet-util-0.0.0.tgz::locator=%40metamask%2Faccounts-monorepo%40workspace%3A.": + version: 0.0.0 + resolution: "@metamask/mfa-wallet-util@file:./packages/keyring-eth-mpc/metamask-mfa-wallet-util-0.0.0.tgz#./packages/keyring-eth-mpc/metamask-mfa-wallet-util-0.0.0.tgz::hash=3f0779&locator=%40metamask%2Faccounts-monorepo%40workspace%3A." + checksum: 10/a1c4ab9188b7df9ecc77b9fe37b1f16b0897fc0334f917b8ade80d1d09dcf03cf9cdbf0cd160f0dcea8be0394c45c186a2e8429452c572cc3370257f35f2c1f6 + languageName: node + linkType: hard + "@metamask/number-to-bn@npm:^1.7.1": version: 1.7.1 resolution: "@metamask/number-to-bn@npm:1.7.1" @@ -2820,6 +2904,13 @@ __metadata: languageName: node linkType: hard +"@msgpack/msgpack@npm:^3.1.2": + version: 3.1.3 + resolution: "@msgpack/msgpack@npm:3.1.3" + checksum: 10/cf597b7ed1fcedc2101b145885e7da591c5ed8aeba3a2579b99da8dd15ef13595c807f64f052da0a0dd74704097f6299fc2e2fb4165029a60a1d1df3843c03ce + languageName: node + linkType: hard + "@ngraveio/bc-ur@npm:^1.1.5": version: 1.1.13 resolution: "@ngraveio/bc-ur@npm:1.1.13" @@ -2835,7 +2926,7 @@ __metadata: languageName: node linkType: hard -"@noble/ciphers@npm:1.3.0": +"@noble/ciphers@npm:1.3.0, @noble/ciphers@npm:^1.3.0": version: 1.3.0 resolution: "@noble/ciphers@npm:1.3.0" checksum: 10/051660051e3e9e2ca5fb9dece2885532b56b7e62946f89afa7284a0fb8bc02e2bd1c06554dba68162ff42d295b54026456084198610f63c296873b2f1cd7a586 @@ -2878,6 +2969,15 @@ __metadata: languageName: node linkType: hard +"@noble/curves@npm:^1.9.2": + version: 1.9.7 + resolution: "@noble/curves@npm:1.9.7" + dependencies: + "@noble/hashes": "npm:1.8.0" + checksum: 10/3cfe2735ea94972988ca9e217e0ebb2044372a7160b2079bf885da789492a6291fc8bf76ca3d8bf8dee477847ee2d6fac267d1e6c4f555054059f5e8c4865d44 + languageName: node + linkType: hard + "@noble/hashes@npm:1.3.2": version: 1.3.2 resolution: "@noble/hashes@npm:1.3.2" @@ -3344,6 +3444,13 @@ __metadata: languageName: node linkType: hard +"@protobufjs/codegen@npm:^2.0.5": + version: 2.0.5 + resolution: "@protobufjs/codegen@npm:2.0.5" + checksum: 10/290335fa114f26202abc0695f279d53e2fd516b01cfd8298923591e0bda011295ff40e3582a1cda0a0f27cbc5039a0292082d5ad08872bb5d6243a614ac15c88 + languageName: node + linkType: hard + "@protobufjs/eventemitter@npm:^1.1.0": version: 1.1.0 resolution: "@protobufjs/eventemitter@npm:1.1.0" @@ -3351,6 +3458,13 @@ __metadata: languageName: node linkType: hard +"@protobufjs/eventemitter@npm:^1.1.1": + version: 1.1.1 + resolution: "@protobufjs/eventemitter@npm:1.1.1" + checksum: 10/a54dc1aff4475ffad4fdf3235c71a553f5e40e3b4cf6a2e217151895a61cb4eb0be20d63791db22441ca25e594671f1021977133f9939540750231ff7d8e9dd6 + languageName: node + linkType: hard + "@protobufjs/fetch@npm:^1.1.0": version: 1.1.0 resolution: "@protobufjs/fetch@npm:1.1.0" @@ -3361,6 +3475,15 @@ __metadata: languageName: node linkType: hard +"@protobufjs/fetch@npm:^1.1.1": + version: 1.1.1 + resolution: "@protobufjs/fetch@npm:1.1.1" + dependencies: + "@protobufjs/aspromise": "npm:^1.1.1" + checksum: 10/427cf2da8c69b494b0df3b2fb1f43c97f0f71ca2c8ef8232dac7e44f2527ad0cc9cecb243eda14a918e86018bfa6d54d92252240d2b37ed205b13adb5506fa1d + languageName: node + linkType: hard + "@protobufjs/float@npm:^1.0.2": version: 1.0.2 resolution: "@protobufjs/float@npm:1.0.2" @@ -3396,6 +3519,13 @@ __metadata: languageName: node linkType: hard +"@protobufjs/utf8@npm:^1.1.1": + version: 1.1.2 + resolution: "@protobufjs/utf8@npm:1.1.2" + checksum: 10/ff759348d60e8f65137d3a7a16e00cf69abd9a6dede75e50ec377c6aebb4ac400a4a70af2e77eb2bf75e2accf30abbea81803e9403004b1922ea70776bfdc3aa + languageName: node + linkType: hard + "@scure/base@npm:^1.0.0, @scure/base@npm:^1.1.1, @scure/base@npm:^1.1.3, @scure/base@npm:~1.2.5": version: 1.2.6 resolution: "@scure/base@npm:1.2.6" @@ -6183,6 +6313,16 @@ __metadata: languageName: node linkType: hard +"centrifuge@npm:^5.5.2": + version: 5.7.2 + resolution: "centrifuge@npm:5.7.2" + dependencies: + events: "npm:^3.3.0" + protobufjs: "npm:^7.6.0" + checksum: 10/a5c376b88938800aa5afc164fe6c3f2da52c74838c10428b8846f69db7fd7bd6988fb143cdca187fc529ade8c579565eb221aa5125f05a130ae57e4fbea697df + languageName: node + linkType: hard + "chalk@npm:^4.0.0, chalk@npm:^4.0.2, chalk@npm:^4.1.0, chalk@npm:^4.1.2": version: 4.1.2 resolution: "chalk@npm:4.1.2" @@ -9965,6 +10105,13 @@ __metadata: languageName: node linkType: hard +"long@npm:^5.3.2": + version: 5.3.2 + resolution: "long@npm:5.3.2" + checksum: 10/b6b55ddae56fcce2864d37119d6b02fe28f6dd6d9e44fd22705f86a9254b9321bd69e9ffe35263b4846d54aba197c64882adcb8c543f2383c1e41284b321ea64 + languageName: node + linkType: hard + "loose-envify@npm:^1.1.0": version: 1.4.0 resolution: "loose-envify@npm:1.4.0" @@ -11340,6 +11487,25 @@ __metadata: languageName: node linkType: hard +"protobufjs@npm:^7.6.0": + version: 7.6.6 + resolution: "protobufjs@npm:7.6.6" + dependencies: + "@protobufjs/aspromise": "npm:^1.1.2" + "@protobufjs/base64": "npm:^1.1.2" + "@protobufjs/codegen": "npm:^2.0.5" + "@protobufjs/eventemitter": "npm:^1.1.1" + "@protobufjs/fetch": "npm:^1.1.1" + "@protobufjs/float": "npm:^1.0.2" + "@protobufjs/path": "npm:^1.1.2" + "@protobufjs/pool": "npm:^1.1.0" + "@protobufjs/utf8": "npm:^1.1.1" + "@types/node": "npm:>=13.7.0" + long: "npm:^5.3.2" + checksum: 10/a894f38c793a0d741f77a7fbf8595141618e8c1cb3433637d2d0309ea9baca59bd9c44ec95f46ee839d063de5d5ae1bc78ef8d474359866af52ee4ceef7fec4f + languageName: node + linkType: hard + "proxy-addr@npm:~2.0.7": version: 2.0.7 resolution: "proxy-addr@npm:2.0.7" From 1027e2083e5fa74d7669462ca7ff065e7a1ca46c Mon Sep 17 00:00:00 2001 From: Matthias Geihs Date: Wed, 2 Sep 2026 15:53:20 +0200 Subject: [PATCH 02/38] feat: add EIP-7702 authorization signing to MPC keyring Co-authored-by: Cursor --- .../keyring-eth-mpc/src/mpc-keyring.test.ts | 48 ++++++++++++++++++- packages/keyring-eth-mpc/src/mpc-keyring.ts | 39 +++++++++++---- 2 files changed, 77 insertions(+), 10 deletions(-) diff --git a/packages/keyring-eth-mpc/src/mpc-keyring.test.ts b/packages/keyring-eth-mpc/src/mpc-keyring.test.ts index a502ab8cb..7fb56e59d 100644 --- a/packages/keyring-eth-mpc/src/mpc-keyring.test.ts +++ b/packages/keyring-eth-mpc/src/mpc-keyring.test.ts @@ -1,6 +1,7 @@ /* eslint-disable @typescript-eslint/explicit-function-return-type */ import { hashPersonalMessage } from '@ethereumjs/util'; -import { type Hex, type Json, bytesToHex } from '@metamask/utils'; +import { bytesToHex } from '@metamask/utils'; +import type { Hex, Json } from '@metamask/utils'; import { MPCKeyring } from './mpc-keyring'; @@ -590,6 +591,51 @@ describe('MPCKeyring', () => { ); }); + it('signs EIP-7702 authorizations through the MPC flow', async () => { + const getProfileToken = jest.fn().mockResolvedValue('token'); + const keyring = makeKeyring(getProfileToken); + await deserializeState(keyring); + + const signSession = makeRootSession(); + mockCreateSession.mockResolvedValue(signSession); + + const { hashEIP7702Authorization } = jest.requireActual( + '@metamask/eth-sig-util', + ); + const authorization = [ + 1, + '0x1234567890abcdef1234567890abcdef12345678', + 1, + ] as const; + const expectedHash = new Uint8Array( + hashEIP7702Authorization(authorization), + ); + + const signatureHex = await keyring.signEip7702Authorization( + mockDerivedAddress, + [...authorization], + ); + + expect(signatureHex).toBe(bytesToHex(mockEthSignature)); + expect(getProfileToken).toHaveBeenCalledWith({ + twoFactor: true, + challenge: expectedHash, + }); + expect(mockStartSign).toHaveBeenCalledWith( + expect.objectContaining({ + clientNetId: 'local-user', + token: 'token', + data: expectedHash, + }), + ); + expect(mockDklsSign).toHaveBeenCalledWith( + expect.objectContaining({ + message: expectedHash, + networkSession: { label: 'tss-sign' }, + }), + ); + }); + it('runs TSS setup when the peer has discarded setup', async () => { const keyring = makeKeyring(); await deserializeState(keyring); diff --git a/packages/keyring-eth-mpc/src/mpc-keyring.ts b/packages/keyring-eth-mpc/src/mpc-keyring.ts index e8012c10e..542ddd1f4 100644 --- a/packages/keyring-eth-mpc/src/mpc-keyring.ts +++ b/packages/keyring-eth-mpc/src/mpc-keyring.ts @@ -5,15 +5,17 @@ import type { TypedMessage, SignTypedDataVersion, MessageTypes, + EIP7702Authorization, } from '@metamask/eth-sig-util'; +import { hashEIP7702Authorization } from '@metamask/eth-sig-util'; import type { Keyring } from '@metamask/keyring-utils'; import { CL24DKM, CL24ThresholdKeySerializer, dealersFromCL24Key, secp256k1 as secp256k1Curve, - type CL24ThresholdKey, } from '@metamask/mfa-wallet-cl24-lib'; +import type { CL24ThresholdKey } from '@metamask/mfa-wallet-cl24-lib'; import { Dkls23TssLib } from '@metamask/mfa-wallet-dkls23-lib'; import type { PartyId, @@ -27,7 +29,8 @@ import { MfaNetworkManager, createScopedSessionId, } from '@metamask/mfa-wallet-network'; -import { bytesToHex, hexToBytes, type Hex, type Json } from '@metamask/utils'; +import { bytesToHex, hexToBytes } from '@metamask/utils'; +import type { Hex, Json } from '@metamask/utils'; import { checkKeyShareBackupId, @@ -39,13 +42,13 @@ import { sign as startSign, storeKeyShareBackup, } from './cloud'; -import { - type MPCKeyringOpts, - type MPCKeyringSerializer, - type MPCKeyringSetupParams, - type MPCKeyringState, - type MPCKeyringStorageState, - type ProfileTokenOpts, +import type { + MPCKeyringOpts, + MPCKeyringSerializer, + MPCKeyringSetupParams, + MPCKeyringState, + MPCKeyringStorageState, + ProfileTokenOpts, } from './types'; import { AES_GCM_IV_LENGTH, @@ -428,6 +431,24 @@ export class MPCKeyring implements Keyring { return bytesToHex(signature); } + /** + * Sign an EIP-7702 authorization using the specified account. + * + * @param address - The address of the account. + * @param authorization - The EIP-7702 authorization to sign. + * @param _opts - The options for signing the authorization. + * @returns The signature of the authorization. + */ + async signEip7702Authorization( + address: Hex, + authorization: EIP7702Authorization, + _opts?: Record, + ): Promise { + const messageHash = new Uint8Array(hashEIP7702Authorization(authorization)); + const signature = await this.#signHash(address, messageHash); + return bytesToHex(signature); + } + async #setupCreate(): Promise { const token = await this.#getProfileToken({ twoFactor: true }); const netCreds = await this.#networkManager.createIdentity(); From 86dfe5521967366a835f50683488c3eaacb1767f Mon Sep 17 00:00:00 2001 From: Matthias Geihs Date: Wed, 2 Sep 2026 16:12:15 +0200 Subject: [PATCH 03/38] fix: satisfy constraints and changelog checks for MPC keyring Co-authored-by: Cursor --- packages/keyring-eth-mpc/CHANGELOG.md | 8 ++++- packages/keyring-eth-mpc/package.json | 40 ++++++++++++++--------- packages/keyring-eth-mpc/src/util.test.ts | 5 +-- yarn.lock | 4 +-- 4 files changed, 36 insertions(+), 21 deletions(-) diff --git a/packages/keyring-eth-mpc/CHANGELOG.md b/packages/keyring-eth-mpc/CHANGELOG.md index e7c894b17..e2ba55abb 100644 --- a/packages/keyring-eth-mpc/CHANGELOG.md +++ b/packages/keyring-eth-mpc/CHANGELOG.md @@ -7,4 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] -[Unreleased]: https://github.com/MetaMask/accounts +### Added + +- Initial release of `@metamask/eth-mpc-keyring` ([#627](https://github.com/MetaMask/accounts/pull/627)) + - 2-party client/server MPC keyring with DKLS23 TSS and cloud backup sync. + - Supports create/import, key-share rotate/check/sync, and signing (transactions, personal_sign, typed data, EIP-7702 authorizations). + +[Unreleased]: https://github.com/MetaMask/accounts/ diff --git a/packages/keyring-eth-mpc/package.json b/packages/keyring-eth-mpc/package.json index aad463f31..8af4a6bd8 100644 --- a/packages/keyring-eth-mpc/package.json +++ b/packages/keyring-eth-mpc/package.json @@ -1,7 +1,7 @@ { "name": "@metamask/eth-mpc-keyring", "version": "0.0.0", - "description": "A Keyring for Ethereum accounts that uses Multi-Party Computation (MPC) for key management and signing.", + "description": "A Keyring for Ethereum accounts that uses Multi-Party Computation (MPC) for key management and signing", "keywords": [ "ethereum", "keyring" @@ -10,11 +10,17 @@ "bugs": { "url": "https://github.com/MetaMask/accounts/issues" }, + "license": "ISC", "repository": { "type": "git", "url": "https://github.com/MetaMask/accounts.git" }, - "license": "ISC", + "files": [ + "dist/" + ], + "sideEffects": false, + "main": "./dist/index.cjs", + "types": "./dist/index.d.cts", "exports": { ".": { "import": { @@ -25,22 +31,28 @@ "types": "./dist/index.d.cts", "default": "./dist/index.cjs" } - } + }, + "./package.json": "./package.json" + }, + "publishConfig": { + "access": "public", + "registry": "https://registry.npmjs.org/" }, - "main": "./dist/index.cjs", - "types": "./dist/index.d.cts", - "files": [ - "dist/" - ], "scripts": { - "build": "ts-bridge --project tsconfig.build.json --no-references", + "build": "ts-bridge --project tsconfig.build.json --verbose --clean --no-references", "build:clean": "yarn build --clean", "build:docs": "typedoc", "changelog:update": "../../scripts/update-changelog.sh @metamask/eth-mpc-keyring", "changelog:validate": "../../scripts/validate-changelog.sh @metamask/eth-mpc-keyring", "publish:preview": "yarn npm publish --tag preview", - "test": "jest", - "test:clean": "jest --clearCache" + "test": "yarn test:source && yarn test:types", + "test:clean": "NODE_OPTIONS=--experimental-vm-modules jest --clearCache", + "build:all": "ts-bridge --project tsconfig.build.json --verbose --clean", + "since-latest-release": "../../scripts/since-latest-release.sh", + "test:source": "NODE_OPTIONS=--experimental-vm-modules jest --reporters=jest-silent-reporter", + "test:types": "../../scripts/tsd-test.sh ./src", + "test:verbose": "NODE_OPTIONS=--experimental-vm-modules jest --verbose", + "test:watch": "NODE_OPTIONS=--experimental-vm-modules jest --watch" }, "dependencies": { "@ethereumjs/util": "^9.1.0", @@ -56,7 +68,7 @@ "@lavamoat/allow-scripts": "^3.2.1", "@lavamoat/preinstall-always-fail": "^2.1.0", "@metamask/auto-changelog": "^6.1.0", - "@metamask/keyring-utils": "workspace:^", + "@metamask/keyring-utils": "^5.0.0", "@metamask/mfa-wallet-interface": "^0.0.0", "@metamask/utils": "^11.11.0", "@ts-bridge/cli": "^0.6.3", @@ -68,10 +80,6 @@ "engines": { "node": ">=22" }, - "publishConfig": { - "access": "public", - "registry": "https://registry.npmjs.org/" - }, "lavamoat": { "allowScripts": { "@lavamoat/preinstall-always-fail": false, diff --git a/packages/keyring-eth-mpc/src/util.test.ts b/packages/keyring-eth-mpc/src/util.test.ts index d0a3db9a6..949a1270a 100644 --- a/packages/keyring-eth-mpc/src/util.test.ts +++ b/packages/keyring-eth-mpc/src/util.test.ts @@ -1,9 +1,10 @@ import { ecsign, privateToAddress, - privateToPublic, - type ECDSASignature, + privateToPublic + } from '@ethereumjs/util'; +import type {ECDSASignature} from '@ethereumjs/util'; import { SignTypedDataVersion, TypedDataUtils, diff --git a/yarn.lock b/yarn.lock index 148a3c5d1..14e8de6df 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1996,7 +1996,7 @@ __metadata: "@lavamoat/preinstall-always-fail": "npm:^2.1.0" "@metamask/auto-changelog": "npm:^6.1.0" "@metamask/eth-sig-util": "npm:^9.0.0" - "@metamask/keyring-utils": "workspace:^" + "@metamask/keyring-utils": "npm:^5.0.0" "@metamask/mfa-wallet-cl24-lib": "npm:^0.0.0" "@metamask/mfa-wallet-dkls23-lib": "npm:^0.0.0" "@metamask/mfa-wallet-e2ee": "npm:^0.0.0" @@ -2461,7 +2461,7 @@ __metadata: languageName: unknown linkType: soft -"@metamask/keyring-utils@npm:^5.0.0, @metamask/keyring-utils@workspace:^, @metamask/keyring-utils@workspace:packages/keyring-utils": +"@metamask/keyring-utils@npm:^5.0.0, @metamask/keyring-utils@workspace:packages/keyring-utils": version: 0.0.0-use.local resolution: "@metamask/keyring-utils@workspace:packages/keyring-utils" dependencies: From 952442e59d3622f7dff3a248d07f24b83ba8de52 Mon Sep 17 00:00:00 2001 From: Matthias Geihs Date: Wed, 2 Sep 2026 16:29:20 +0200 Subject: [PATCH 04/38] fix: apply oxfmt to MPC keyring package files Co-authored-by: Cursor --- packages/keyring-eth-mpc/README.md | 7 ------- packages/keyring-eth-mpc/src/util.test.ts | 9 ++------- packages/keyring-eth-mpc/tsconfig.build.json | 4 +--- packages/keyring-eth-mpc/tsconfig.json | 10 +++------- 4 files changed, 6 insertions(+), 24 deletions(-) diff --git a/packages/keyring-eth-mpc/README.md b/packages/keyring-eth-mpc/README.md index 00bcfb153..9cfde3bd7 100644 --- a/packages/keyring-eth-mpc/README.md +++ b/packages/keyring-eth-mpc/README.md @@ -94,35 +94,28 @@ Run `yarn lint` to run the linter, or run `yarn lint:fix` to run the linter and The project follows the same release process as the other libraries in the MetaMask organization. The GitHub Actions [`action-create-release-pr`](https://github.com/MetaMask/action-create-release-pr) and [`action-publish-release`](https://github.com/MetaMask/action-publish-release) are used to automate the release process; see those repositories for more information about how they work. 1. Choose a release version. - - The release version should be chosen according to SemVer. Analyze the changes to see whether they include any breaking changes, new features, or deprecations, then choose the appropriate SemVer version. See [the SemVer specification](https://semver.org/) for more information. 2. If this release is backporting changes onto a previous release, then ensure there is a major version branch for that version (e.g. `1.x` for a `v1` backport release). - - The major version branch should be set to the most recent release with that major version. For example, when backporting a `v1.0.2` release, you'd want to ensure there was a `1.x` branch that was set to the `v1.0.1` tag. 3. Trigger the [`workflow_dispatch`](https://docs.github.com/en/actions/reference/events-that-trigger-workflows#workflow_dispatch) event [manually](https://docs.github.com/en/actions/managing-workflow-runs/manually-running-a-workflow) for the `Create Release Pull Request` action to create the release PR. - - For a backport release, the base branch should be the major version branch that you ensured existed in step 2. For a normal release, the base branch should be the main branch for that repository (which should be the default value). - This should trigger the [`action-create-release-pr`](https://github.com/MetaMask/action-create-release-pr) workflow to create the release PR. 4. Update the changelog to move each change entry into the appropriate change category ([See here](https://keepachangelog.com/en/1.0.0/#types) for the full list of change categories, and the correct ordering), and edit them to be more easily understood by users of the package. - - Generally any changes that don't affect consumers of the package (e.g. lockfile changes or development environment changes) are omitted. Exceptions may be made for changes that might be of interest despite not having an effect upon the published package (e.g. major test improvements, security improvements, improved documentation, etc.). - Try to explain each change in terms that users of the package would understand (e.g. avoid referencing internal variables/concepts). - Consolidate related changes into one change entry if it makes it easier to explain. - Run `yarn auto-changelog validate --rc` to check that the changelog is correctly formatted. 5. Review and QA the release. - - If changes are made to the base branch, the release branch will need to be updated with these changes and review/QA will need to restart again. As such, it's probably best to avoid merging other PRs into the base branch while review is underway. 6. Squash & Merge the release. - - This should trigger the [`action-publish-release`](https://github.com/MetaMask/action-publish-release) workflow to tag the final release commit and publish the release on GitHub. 7. Publish the release on npm. - - Be very careful to use a clean local environment to publish the release, and follow exactly the same steps used during CI. - Use `npm publish --dry-run` to examine the release contents to ensure the correct files are included. Compare to previous releases if necessary (e.g. using `https://unpkg.com/browse/[package name]@[package version]/`). - Once you are confident the release contents are correct, publish the release using `npm publish`. diff --git a/packages/keyring-eth-mpc/src/util.test.ts b/packages/keyring-eth-mpc/src/util.test.ts index 949a1270a..220ba121a 100644 --- a/packages/keyring-eth-mpc/src/util.test.ts +++ b/packages/keyring-eth-mpc/src/util.test.ts @@ -1,10 +1,5 @@ -import { - ecsign, - privateToAddress, - privateToPublic - -} from '@ethereumjs/util'; -import type {ECDSASignature} from '@ethereumjs/util'; +import { ecsign, privateToAddress, privateToPublic } from '@ethereumjs/util'; +import type { ECDSASignature } from '@ethereumjs/util'; import { SignTypedDataVersion, TypedDataUtils, diff --git a/packages/keyring-eth-mpc/tsconfig.build.json b/packages/keyring-eth-mpc/tsconfig.build.json index b34e78e32..57e7224cc 100644 --- a/packages/keyring-eth-mpc/tsconfig.build.json +++ b/packages/keyring-eth-mpc/tsconfig.build.json @@ -8,9 +8,7 @@ // skipLibCheck bypasses type-checking of .d.ts files in node_modules. "skipLibCheck": true }, - "references": [ - { "path": "../keyring-utils/tsconfig.build.json" } - ], + "references": [{ "path": "../keyring-utils/tsconfig.build.json" }], "include": ["./src/**/*.ts"], "exclude": ["./src/**/*.test.ts"] } diff --git a/packages/keyring-eth-mpc/tsconfig.json b/packages/keyring-eth-mpc/tsconfig.json index a30efa086..d5ab8a4f0 100644 --- a/packages/keyring-eth-mpc/tsconfig.json +++ b/packages/keyring-eth-mpc/tsconfig.json @@ -11,10 +11,6 @@ "path": "../keyring-utils" } ], - "include": [ - "./src" - ], - "exclude": [ - "./dist/**/*" - ] -} \ No newline at end of file + "include": ["./src"], + "exclude": ["./dist/**/*"] +} From ae37af370c4cc9bd41f730d5386efaf76e386390 Mon Sep 17 00:00:00 2001 From: Matthias Geihs Date: Wed, 2 Sep 2026 16:33:33 +0200 Subject: [PATCH 05/38] fix: convert transaction signature v for ethereumjs typed txs Pass convertV so recovery id 27|28 becomes yParity or EIP-155 v. Co-authored-by: Cursor --- packages/keyring-eth-mpc/src/mpc-keyring.test.ts | 1 + packages/keyring-eth-mpc/src/mpc-keyring.ts | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/keyring-eth-mpc/src/mpc-keyring.test.ts b/packages/keyring-eth-mpc/src/mpc-keyring.test.ts index 7fb56e59d..dee1e08b5 100644 --- a/packages/keyring-eth-mpc/src/mpc-keyring.test.ts +++ b/packages/keyring-eth-mpc/src/mpc-keyring.test.ts @@ -588,6 +588,7 @@ describe('MPCKeyring', () => { 27n, expect.any(Uint8Array), expect.any(Uint8Array), + true, ); }); diff --git a/packages/keyring-eth-mpc/src/mpc-keyring.ts b/packages/keyring-eth-mpc/src/mpc-keyring.ts index 542ddd1f4..e0d672dc3 100644 --- a/packages/keyring-eth-mpc/src/mpc-keyring.ts +++ b/packages/keyring-eth-mpc/src/mpc-keyring.ts @@ -380,7 +380,9 @@ export class MPCKeyring implements Keyring { const { r, s, v } = parseEthSig(signature); - const signedTx = tx.addSignature(v, r, s); + // convertV adapts the message-style recovery id (27|28) to typed-tx + // yParity (0|1) or legacy EIP-155 v, matching `TypedTransaction.sign()`. + const signedTx = tx.addSignature(v, r, s, true); return signedTx; } From faca5e6f5ee9a0616c642001bbcb61c209cdfe1b Mon Sep 17 00:00:00 2001 From: Matthias Geihs Date: Wed, 2 Sep 2026 16:45:21 +0200 Subject: [PATCH 06/38] fix: sort root package.json resolutions for oxfmt Co-authored-by: Cursor --- package.json | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index 58317f678..258efb8d1 100644 --- a/package.json +++ b/package.json @@ -82,6 +82,12 @@ "typescript-eslint": "^8.48.0" }, "resolutions": { + "@metamask/mfa-wallet-cl24-lib": "file:./packages/keyring-eth-mpc/metamask-mfa-wallet-cl24-lib-0.0.0.tgz", + "@metamask/mfa-wallet-dkls23-lib": "file:./packages/keyring-eth-mpc/metamask-mfa-wallet-dkls23-lib-0.0.0.tgz", + "@metamask/mfa-wallet-e2ee": "file:./packages/keyring-eth-mpc/metamask-mfa-wallet-e2ee-0.0.0.tgz", + "@metamask/mfa-wallet-interface": "file:./packages/keyring-eth-mpc/metamask-mfa-wallet-interface-0.0.0.tgz", + "@metamask/mfa-wallet-network": "file:./packages/keyring-eth-mpc/metamask-mfa-wallet-network-0.0.0.tgz", + "@metamask/mfa-wallet-util": "file:./packages/keyring-eth-mpc/metamask-mfa-wallet-util-0.0.0.tgz", "@types/node": "^20.12.12", "@types/web": "^0.0.69", "@typescript/lib-dom": "npm:@types/web@^0.0.69", @@ -89,13 +95,7 @@ "eslint-import-resolver-typescript": "<=3.7.0", "eslint-plugin-import-x": "<=4.6.1", "napi-postinstall": "npm:npm-empty-package@^1.0.0", - "ws@7.4.6": "^7.5.10", - "@metamask/mfa-wallet-cl24-lib": "file:./packages/keyring-eth-mpc/metamask-mfa-wallet-cl24-lib-0.0.0.tgz", - "@metamask/mfa-wallet-dkls23-lib": "file:./packages/keyring-eth-mpc/metamask-mfa-wallet-dkls23-lib-0.0.0.tgz", - "@metamask/mfa-wallet-e2ee": "file:./packages/keyring-eth-mpc/metamask-mfa-wallet-e2ee-0.0.0.tgz", - "@metamask/mfa-wallet-interface": "file:./packages/keyring-eth-mpc/metamask-mfa-wallet-interface-0.0.0.tgz", - "@metamask/mfa-wallet-network": "file:./packages/keyring-eth-mpc/metamask-mfa-wallet-network-0.0.0.tgz", - "@metamask/mfa-wallet-util": "file:./packages/keyring-eth-mpc/metamask-mfa-wallet-util-0.0.0.tgz" + "ws@7.4.6": "^7.5.10" }, "engines": { "node": ">=22" From 68ca3ba23e0ec6ccbcaa27b49e993789a848e477 Mon Sep 17 00:00:00 2001 From: Matthias Geihs Date: Wed, 2 Sep 2026 16:48:10 +0200 Subject: [PATCH 07/38] fix: add static type on MPCKeyring for controller registration Co-authored-by: Cursor --- packages/keyring-eth-mpc/src/mpc-keyring.test.ts | 1 + packages/keyring-eth-mpc/src/mpc-keyring.ts | 2 ++ 2 files changed, 3 insertions(+) diff --git a/packages/keyring-eth-mpc/src/mpc-keyring.test.ts b/packages/keyring-eth-mpc/src/mpc-keyring.test.ts index dee1e08b5..f51cb3ea6 100644 --- a/packages/keyring-eth-mpc/src/mpc-keyring.test.ts +++ b/packages/keyring-eth-mpc/src/mpc-keyring.test.ts @@ -249,6 +249,7 @@ describe('MPCKeyring', () => { it('exposes the expected type constant', () => { const keyring = makeKeyring(); + expect(MPCKeyring.type).toBe('MPC Keyring'); expect(keyring.type).toBe('MPC Keyring'); }); diff --git a/packages/keyring-eth-mpc/src/mpc-keyring.ts b/packages/keyring-eth-mpc/src/mpc-keyring.ts index e0d672dc3..05e3a493c 100644 --- a/packages/keyring-eth-mpc/src/mpc-keyring.ts +++ b/packages/keyring-eth-mpc/src/mpc-keyring.ts @@ -104,6 +104,8 @@ function shareBindings( } export class MPCKeyring implements Keyring { + static type: string = mpcKeyringType; + readonly type: string = mpcKeyringType; readonly #rng: RandomNumberGenerator; From 870ccb575241b008d2a41ddc5f83522bf89210fa Mon Sep 17 00:00:00 2001 From: Matthias Geihs Date: Wed, 2 Sep 2026 16:49:12 +0200 Subject: [PATCH 08/38] fix: dedupe yarn.lock after MPC MFA dependencies Co-authored-by: Cursor --- yarn.lock | 54 +++++++----------------------------------------------- 1 file changed, 7 insertions(+), 47 deletions(-) diff --git a/yarn.lock b/yarn.lock index 14e8de6df..26a68d7ce 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2960,16 +2960,7 @@ __metadata: languageName: node linkType: hard -"@noble/curves@npm:^1.0.0, @noble/curves@npm:^1.2.0, @noble/curves@npm:^1.8.1, @noble/curves@npm:~1.9.0": - version: 1.9.2 - resolution: "@noble/curves@npm:1.9.2" - dependencies: - "@noble/hashes": "npm:1.8.0" - checksum: 10/f60f00ad86296054566b67be08fd659999bb64b692bfbf11dbe3be1f422ad4d826bf5ebb2015ce2e246538eab2b677707e0a46ffa8323a6fae7a9a30ec1fe318 - languageName: node - linkType: hard - -"@noble/curves@npm:^1.9.2": +"@noble/curves@npm:^1.0.0, @noble/curves@npm:^1.2.0, @noble/curves@npm:^1.8.1, @noble/curves@npm:^1.9.2, @noble/curves@npm:~1.9.0": version: 1.9.7 resolution: "@noble/curves@npm:1.9.7" dependencies: @@ -3437,45 +3428,21 @@ __metadata: languageName: node linkType: hard -"@protobufjs/codegen@npm:^2.0.4": - version: 2.0.4 - resolution: "@protobufjs/codegen@npm:2.0.4" - checksum: 10/c6ee5fa172a8464f5253174d3c2353ea520c2573ad7b6476983d9b1346f4d8f2b44aa29feb17a949b83c1816bc35286a5ea265ed9d8fdd2865acfa09668c0447 - languageName: node - linkType: hard - -"@protobufjs/codegen@npm:^2.0.5": +"@protobufjs/codegen@npm:^2.0.4, @protobufjs/codegen@npm:^2.0.5": version: 2.0.5 resolution: "@protobufjs/codegen@npm:2.0.5" checksum: 10/290335fa114f26202abc0695f279d53e2fd516b01cfd8298923591e0bda011295ff40e3582a1cda0a0f27cbc5039a0292082d5ad08872bb5d6243a614ac15c88 languageName: node linkType: hard -"@protobufjs/eventemitter@npm:^1.1.0": - version: 1.1.0 - resolution: "@protobufjs/eventemitter@npm:1.1.0" - checksum: 10/03af3e99f17ad421283d054c88a06a30a615922a817741b43ca1b13e7c6b37820a37f6eba9980fb5150c54dba6e26cb6f7b64a6f7d8afa83596fafb3afa218c3 - languageName: node - linkType: hard - -"@protobufjs/eventemitter@npm:^1.1.1": +"@protobufjs/eventemitter@npm:^1.1.0, @protobufjs/eventemitter@npm:^1.1.1": version: 1.1.1 resolution: "@protobufjs/eventemitter@npm:1.1.1" checksum: 10/a54dc1aff4475ffad4fdf3235c71a553f5e40e3b4cf6a2e217151895a61cb4eb0be20d63791db22441ca25e594671f1021977133f9939540750231ff7d8e9dd6 languageName: node linkType: hard -"@protobufjs/fetch@npm:^1.1.0": - version: 1.1.0 - resolution: "@protobufjs/fetch@npm:1.1.0" - dependencies: - "@protobufjs/aspromise": "npm:^1.1.1" - "@protobufjs/inquire": "npm:^1.1.0" - checksum: 10/67ae40572ad536e4ef94269199f252c024b66e3059850906bdaee161ca1d75c73d04d35cd56f147a8a5a079f5808e342b99e61942c1dae15604ff0600b09a958 - languageName: node - linkType: hard - -"@protobufjs/fetch@npm:^1.1.1": +"@protobufjs/fetch@npm:^1.1.0, @protobufjs/fetch@npm:^1.1.1": version: 1.1.1 resolution: "@protobufjs/fetch@npm:1.1.1" dependencies: @@ -3512,14 +3479,7 @@ __metadata: languageName: node linkType: hard -"@protobufjs/utf8@npm:^1.1.0": - version: 1.1.0 - resolution: "@protobufjs/utf8@npm:1.1.0" - checksum: 10/131e289c57534c1d73a0e55782d6751dd821db1583cb2f7f7e017c9d6747addaebe79f28120b2e0185395d990aad347fb14ffa73ef4096fa38508d61a0e64602 - languageName: node - linkType: hard - -"@protobufjs/utf8@npm:^1.1.1": +"@protobufjs/utf8@npm:^1.1.0, @protobufjs/utf8@npm:^1.1.1": version: 1.1.2 resolution: "@protobufjs/utf8@npm:1.1.2" checksum: 10/ff759348d60e8f65137d3a7a16e00cf69abd9a6dede75e50ec377c6aebb4ac400a4a70af2e77eb2bf75e2accf30abbea81803e9403004b1922ea70776bfdc3aa @@ -10098,14 +10058,14 @@ __metadata: languageName: node linkType: hard -"long@npm:5.2.5, long@npm:^5.0.0": +"long@npm:5.2.5": version: 5.2.5 resolution: "long@npm:5.2.5" checksum: 10/972589d04a564ef4c066069d5ed06db14cd63de2a08d4f6c989512fa414bc2239479564e3a85de3efd42eb533ce142cdcaa28f12f4ecd051670015d36cbbb10b languageName: node linkType: hard -"long@npm:^5.3.2": +"long@npm:^5.0.0, long@npm:^5.3.2": version: 5.3.2 resolution: "long@npm:5.3.2" checksum: 10/b6b55ddae56fcce2864d37119d6b02fe28f6dd6d9e44fd22705f86a9254b9321bd69e9ffe35263b4846d54aba197c64882adcb8c543f2383c1e41284b321ea64 From cb37f580af1072bfceea36aab893d26e033f6f39 Mon Sep 17 00:00:00 2001 From: Matthias Geihs Date: Thu, 3 Sep 2026 13:02:29 +0200 Subject: [PATCH 09/38] feat: use share epochs for MPC create, rotate, and sync Replace backupId with shareEpoch so create/rotate append and activate epochs only after backup readiness, matching the robust MPC architecture. Co-authored-by: Cursor --- packages/keyring-eth-mpc/CHANGELOG.md | 3 +- packages/keyring-eth-mpc/src/cloud.test.ts | 87 +++++++++---- packages/keyring-eth-mpc/src/cloud.ts | 74 ++++++++--- .../keyring-eth-mpc/src/mpc-keyring.test.ts | 112 +++++++++++------ packages/keyring-eth-mpc/src/mpc-keyring.ts | 117 +++++++++++++----- packages/keyring-eth-mpc/src/types.ts | 2 +- packages/keyring-eth-mpc/src/util.test.ts | 24 ++-- packages/keyring-eth-mpc/src/util.ts | 27 ++-- 8 files changed, 307 insertions(+), 139 deletions(-) diff --git a/packages/keyring-eth-mpc/CHANGELOG.md b/packages/keyring-eth-mpc/CHANGELOG.md index e2ba55abb..2d47d874d 100644 --- a/packages/keyring-eth-mpc/CHANGELOG.md +++ b/packages/keyring-eth-mpc/CHANGELOG.md @@ -11,6 +11,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Initial release of `@metamask/eth-mpc-keyring` ([#627](https://github.com/MetaMask/accounts/pull/627)) - 2-party client/server MPC keyring with DKLS23 TSS and cloud backup sync. - - Supports create/import, key-share rotate/check/sync, and signing (transactions, personal_sign, typed data, EIP-7702 authorizations). + - Supports create/import, share-epoch rotate/check/sync, and signing (transactions, personal_sign, typed data, EIP-7702 authorizations). + - Create and rotate append a share epoch, store backup, assert readiness, then `setActiveEpoch` before updating local state. [Unreleased]: https://github.com/MetaMask/accounts/ diff --git a/packages/keyring-eth-mpc/src/cloud.test.ts b/packages/keyring-eth-mpc/src/cloud.test.ts index 380aaac27..efe9be94d 100644 --- a/packages/keyring-eth-mpc/src/cloud.test.ts +++ b/packages/keyring-eth-mpc/src/cloud.test.ts @@ -1,12 +1,13 @@ import { bytesToBase64 } from '@metamask/utils'; import { - checkKeyShareBackupId, + checkKeyShare, createKey, getNetId, loadKeyShareBackup, registerClient, rotateKeyShares, + setActiveEpoch, sign, storeKeyShareBackup, } from './cloud'; @@ -133,7 +134,7 @@ describe('cloud helpers', () => { ).rejects.toThrow('Failed to register client: Forbidden'); }); - it('starts a cloud sign session with a base64-encoded message', async () => { + it('starts a cloud sign session with epoch and base64-encoded message', async () => { okEmpty(); const data = new Uint8Array([104, 105]); // "hi" @@ -143,12 +144,14 @@ describe('cloud helpers', () => { clientNetId: 'local-1', nonce: '0xnonce', data, + shareEpoch: 1, }); const body = JSON.parse( (fetchSpy.mock.calls[0]?.[1] as { body: string }).body, - ) as { data: string }; + ) as { data: string; shareEpoch: number }; expect(body.data).toBe('aGk='); + expect(body.shareEpoch).toBe(1); }); it('throws when cloud sign initialization fails', async () => { @@ -164,6 +167,7 @@ describe('cloud helpers', () => { clientNetId: 'local-1', nonce: '0xnonce', data: new Uint8Array([1]), + shareEpoch: 1, }), ).rejects.toThrow('Failed to initialize cloud sign session: Server Error'); }); @@ -176,8 +180,13 @@ describe('cloud helpers', () => { token: 'token-1', clientNetId: 'local-1', nonce: '0xnonce', + expectedActiveEpoch: 1, }); + const body = JSON.parse( + (fetchSpy.mock.calls[0]?.[1] as { body: string }).body, + ) as { expectedActiveEpoch: number }; + expect(body.expectedActiveEpoch).toBe(1); expect(fetchSpy).toHaveBeenCalledWith( 'https://cloud.example/rotate-key-shares', expect.objectContaining({ method: 'POST' }), @@ -196,27 +205,28 @@ describe('cloud helpers', () => { token: 'token-1', clientNetId: 'local-1', nonce: '0xnonce', + expectedActiveEpoch: 1, }), ).rejects.toThrow( 'Failed to initialize cloud key rotation session: Forbidden', ); }); - it('stores an encrypted key share backup', async () => { + it('stores an encrypted key share backup for an epoch', async () => { okEmpty(); const encryptedKeyShare = new Uint8Array([1, 2, 3]); await storeKeyShareBackup({ baseURL: 'https://cloud.example', token: 'token-1', - backupId: 'backup-1', + epoch: 2, encryptedKeyShare, }); const body = JSON.parse( (fetchSpy.mock.calls[0]?.[1] as { body: string }).body, - ) as { encryptedKeyShare: string; backupId: string }; - expect(body.backupId).toBe('backup-1'); + ) as { encryptedKeyShare: string; epoch: number }; + expect(body.epoch).toBe(2); expect(body.encryptedKeyShare).toBe(bytesToBase64(encryptedKeyShare)); }); @@ -230,53 +240,84 @@ describe('cloud helpers', () => { storeKeyShareBackup({ baseURL: 'https://cloud.example', token: 'token-1', - backupId: 'backup-1', + epoch: 1, encryptedKeyShare: new Uint8Array([1]), }), ).rejects.toThrow('Failed to store key share backup: Bad Request'); }); - it('checks the stored backup id', async () => { - okJson({ backupId: 'backup-1' }); + it('checks key share epochs', async () => { + okJson({ + latestShareEpoch: 2, + latestBackupEpoch: 2, + activeEpoch: 1, + }); expect( - await checkKeyShareBackupId({ + await checkKeyShare({ baseURL: 'https://cloud.example', token: 'token-1', }), - ).toBe('backup-1'); + ).toStrictEqual({ + latestShareEpoch: 2, + latestBackupEpoch: 2, + activeEpoch: 1, + }); }); - it('returns null when the backend has no backup id', async () => { - okJson({}); + it('throws when checking key share fails', async () => { + fetchSpy.mockResolvedValue({ + ok: false, + statusText: 'Not Found', + } as never); - expect( - await checkKeyShareBackupId({ + await expect( + checkKeyShare({ baseURL: 'https://cloud.example', token: 'token-1', }), - ).toBeNull(); + ).rejects.toThrow('Failed to check key share: Not Found'); + }); + + it('sets the active epoch', async () => { + okEmpty(); + + await setActiveEpoch({ + baseURL: 'https://cloud.example', + token: 'token-1', + epoch: 2, + }); + + const body = JSON.parse( + (fetchSpy.mock.calls[0]?.[1] as { body: string }).body, + ) as { epoch: number }; + expect(body.epoch).toBe(2); + expect(fetchSpy).toHaveBeenCalledWith( + 'https://cloud.example/set-active-epoch', + expect.objectContaining({ method: 'POST' }), + ); }); - it('throws when checking the backup id fails', async () => { + it('throws when setting the active epoch fails', async () => { fetchSpy.mockResolvedValue({ ok: false, - statusText: 'Not Found', + statusText: 'Conflict', } as never); await expect( - checkKeyShareBackupId({ + setActiveEpoch({ baseURL: 'https://cloud.example', token: 'token-1', + epoch: 2, }), - ).rejects.toThrow('Failed to check key share backup id: Not Found'); + ).rejects.toThrow('Failed to set active epoch: Conflict'); }); it('loads an encrypted key share backup', async () => { const encryptedKeyShare = new Uint8Array([9, 8, 7]); okJson({ encryptedKeyShare: bytesToBase64(encryptedKeyShare), - backupId: 'backup-1', + epoch: 3, }); expect( @@ -286,7 +327,7 @@ describe('cloud helpers', () => { }), ).toStrictEqual({ encryptedKeyShare, - backupId: 'backup-1', + epoch: 3, }); }); diff --git a/packages/keyring-eth-mpc/src/cloud.ts b/packages/keyring-eth-mpc/src/cloud.ts index 192076362..525116ce4 100644 --- a/packages/keyring-eth-mpc/src/cloud.ts +++ b/packages/keyring-eth-mpc/src/cloud.ts @@ -3,7 +3,13 @@ import { base64ToBytes, bytesToBase64 } from '@metamask/utils'; export type LoadKeyShareBackupResult = { encryptedKeyShare: Uint8Array; - backupId: string; + epoch: number; +}; + +export type CheckKeyShareResult = { + latestShareEpoch?: number; + latestBackupEpoch?: number; + activeEpoch?: number; }; /** @@ -59,7 +65,7 @@ export async function getNetId(opts: { } /** - * Start DKG on the backend for a new key. + * Start DKG on the backend for a new key (appends epoch 1; does not activate). * * @param opts - Request options. * @param opts.baseURL - MPC backend base URL. @@ -108,7 +114,7 @@ export async function registerClient(opts: { } /** - * Start a backend signing session. + * Start a backend signing session for the active share epoch. * * @param opts - Request options. * @param opts.baseURL - MPC backend base URL. @@ -116,6 +122,7 @@ export async function registerClient(opts: { * @param opts.data - Message hash to sign. * @param opts.clientNetId - Client network id. * @param opts.nonce - Client session nonce. + * @param opts.shareEpoch - Local share epoch (must equal backend activeEpoch). */ export async function sign(opts: { baseURL: string; @@ -123,6 +130,7 @@ export async function sign(opts: { data: Uint8Array; clientNetId: PartyId; nonce: string; + shareEpoch: number; }): Promise { await postJson( `${opts.baseURL}/sign`, @@ -131,25 +139,28 @@ export async function sign(opts: { data: bytesToBase64(opts.data), clientNetId: opts.clientNetId, nonce: opts.nonce, + shareEpoch: opts.shareEpoch, }, 'Failed to initialize cloud sign session', ); } /** - * Start a backend share-rotation session. + * Start a backend share-rotation session (appends next epoch; does not activate). * * @param opts - Request options. * @param opts.baseURL - MPC backend base URL. * @param opts.token - Profile token with 2FA. * @param opts.clientNetId - Client network id. * @param opts.nonce - Client session nonce. + * @param opts.expectedActiveEpoch - Current active epoch on client and server. */ export async function rotateKeyShares(opts: { baseURL: string; token: string; clientNetId: PartyId; nonce: string; + expectedActiveEpoch: number; }): Promise { await postJson( `${opts.baseURL}/rotate-key-shares`, @@ -157,31 +168,32 @@ export async function rotateKeyShares(opts: { token: opts.token, clientNetId: opts.clientNetId, nonce: opts.nonce, + expectedActiveEpoch: opts.expectedActiveEpoch, }, 'Failed to initialize cloud key rotation session', ); } /** - * Store an encrypted key-share backup and its client-minted id. + * Store an encrypted key-share backup for a share epoch. * * @param opts - Request options. * @param opts.baseURL - MPC backend base URL. * @param opts.token - Profile token with 2FA. - * @param opts.backupId - Opaque backup id minted by the client. + * @param opts.epoch - Share epoch this backup belongs to. * @param opts.encryptedKeyShare - Encrypted key share ciphertext. */ export async function storeKeyShareBackup(opts: { baseURL: string; token: string; - backupId: string; + epoch: number; encryptedKeyShare: Uint8Array; }): Promise { await postJson( `${opts.baseURL}/store-key-share-backup`, { token: opts.token, - backupId: opts.backupId, + epoch: opts.epoch, encryptedKeyShare: bytesToBase64(opts.encryptedKeyShare), }, 'Failed to store key share backup', @@ -189,32 +201,54 @@ export async function storeKeyShareBackup(opts: { } /** - * Return the backup id currently stored on the backend. + * Return the latest share/backup epochs and the active epoch from the backend. * * @param opts - Request options. * @param opts.baseURL - MPC backend base URL. * @param opts.token - Profile token (2FA not required). - * @returns The stored backup id, or `null` if none exists. + * @returns Epoch metadata from the backend. */ -export async function checkKeyShareBackupId(opts: { +export async function checkKeyShare(opts: { baseURL: string; token: string; -}): Promise { - const data = await postJson<{ backupId?: string | null }>( - `${opts.baseURL}/check-key-share-backup-id`, +}): Promise { + return await postJson( + `${opts.baseURL}/check-key-share`, { token: opts.token }, - 'Failed to check key share backup id', + 'Failed to check key share', + ); +} + +/** + * Activate a share epoch after its share and backup are present. + * + * @param opts - Request options. + * @param opts.baseURL - MPC backend base URL. + * @param opts.token - Profile token with 2FA. + * @param opts.epoch - Epoch to activate. + */ +export async function setActiveEpoch(opts: { + baseURL: string; + token: string; + epoch: number; +}): Promise { + await postJson( + `${opts.baseURL}/set-active-epoch`, + { + token: opts.token, + epoch: opts.epoch, + }, + 'Failed to set active epoch', ); - return typeof data.backupId === 'string' ? data.backupId : null; } /** - * Load the encrypted key-share backup from the backend. + * Load the encrypted key-share backup for the active epoch. * * @param opts - Request options. * @param opts.baseURL - MPC backend base URL. * @param opts.token - Profile token with 2FA. - * @returns The ciphertext and backup id. + * @returns The ciphertext and share epoch. */ export async function loadKeyShareBackup(opts: { baseURL: string; @@ -222,7 +256,7 @@ export async function loadKeyShareBackup(opts: { }): Promise { const data = await postJson<{ encryptedKeyShare: string; - backupId: string; + epoch: number; }>( `${opts.baseURL}/load-key-share-backup`, { token: opts.token }, @@ -230,6 +264,6 @@ export async function loadKeyShareBackup(opts: { ); return { encryptedKeyShare: base64ToBytes(data.encryptedKeyShare), - backupId: data.backupId, + epoch: data.epoch, }; } diff --git a/packages/keyring-eth-mpc/src/mpc-keyring.test.ts b/packages/keyring-eth-mpc/src/mpc-keyring.test.ts index f51cb3ea6..a8757689b 100644 --- a/packages/keyring-eth-mpc/src/mpc-keyring.test.ts +++ b/packages/keyring-eth-mpc/src/mpc-keyring.test.ts @@ -22,15 +22,15 @@ const mockRegisterClient = jest.fn(); const mockStartSign = jest.fn(); const mockStartRotateKeyShares = jest.fn(); const mockStoreKeyShareBackup = jest.fn(); -const mockCheckKeyShareBackupId = jest.fn(); +const mockCheckKeyShare = jest.fn(); +const mockSetActiveEpoch = jest.fn(); const mockLoadKeyShareBackup = jest.fn(); let lastNetworkManagerOptions: Record | undefined; const mockDerivedAddress = '0x1111111111111111111111111111111111111111' as Hex; const mockSessionNonce = '0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' as Hex; -const mockBackupId = - '0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb'; +const mockShareEpoch = 1; const mockTypedDataHash = new Uint8Array([9, 8, 7, 6]); const mockEthSignature = new Uint8Array(65); mockEthSignature[64] = 27; @@ -127,8 +127,8 @@ jest.mock('./cloud', () => ({ sign: (...args: unknown[]) => mockStartSign(...args), rotateKeyShares: (...args: unknown[]) => mockStartRotateKeyShares(...args), storeKeyShareBackup: (...args: unknown[]) => mockStoreKeyShareBackup(...args), - checkKeyShareBackupId: (...args: unknown[]) => - mockCheckKeyShareBackupId(...args), + checkKeyShare: (...args: unknown[]) => mockCheckKeyShare(...args), + setActiveEpoch: (...args: unknown[]) => mockSetActiveEpoch(...args), loadKeyShareBackup: (...args: unknown[]) => mockLoadKeyShareBackup(...args), })); @@ -137,7 +137,6 @@ jest.mock('./util', () => { return { ...actual, generateSessionNonce: jest.fn(() => mockSessionNonce), - createBackupId: jest.fn(() => mockBackupId), encryptBytes: jest.fn(async (_key: Uint8Array, plaintext: Uint8Array) => { return plaintext; }), @@ -165,7 +164,7 @@ const makeSerializedState = (overrides: Record = {}) => ({ netCreds: { partyId: 'local-user' }, keyShare: makeThresholdKey(), serverNetId: 'cloud-user', - backupId: mockBackupId, + shareEpoch: mockShareEpoch, tssSetup: '0x0102', ...overrides, }); @@ -213,7 +212,6 @@ describe('MPCKeyring', () => { const mockedUtil = jest.requireMock('./util'); mockedUtil.generateSessionNonce.mockReturnValue(mockSessionNonce); - mockedUtil.createBackupId.mockReturnValue(mockBackupId); mockedUtil.encryptBytes.mockImplementation( async (_key: Uint8Array, plaintext: Uint8Array) => plaintext, ); @@ -238,10 +236,15 @@ describe('MPCKeyring', () => { mockStartSign.mockResolvedValue(undefined); mockStartRotateKeyShares.mockResolvedValue(undefined); mockStoreKeyShareBackup.mockResolvedValue(undefined); - mockCheckKeyShareBackupId.mockResolvedValue(mockBackupId); + mockCheckKeyShare.mockResolvedValue({ + latestShareEpoch: mockShareEpoch, + latestBackupEpoch: mockShareEpoch, + activeEpoch: mockShareEpoch, + }); + mockSetActiveEpoch.mockResolvedValue(undefined); mockLoadKeyShareBackup.mockResolvedValue({ encryptedKeyShare: new TextEncoder().encode(JSON.stringify({ ok: true })), - backupId: mockBackupId, + epoch: mockShareEpoch, }); mockDklsSetup.mockResolvedValue(new Uint8Array([1, 2, 3])); mockDklsSign.mockResolvedValue({ signature: new Uint8Array(64).fill(9) }); @@ -330,7 +333,7 @@ describe('MPCKeyring', () => { it('does not initialize from incomplete serialized state', async () => { const keyring = makeKeyring(); - await keyring.deserialize({ backupId: 'only-backup-id' }); + await keyring.deserialize({ shareEpoch: 1 }); await expect(keyring.checkKeyShare()).rejects.toThrow( 'Keyring not initialized', ); @@ -368,7 +371,7 @@ describe('MPCKeyring', () => { expect.objectContaining({ custodians: ['local-user', 'cloud-user'], threshold: 2, - networkSession: { label: 'create-key' }, + networkSession: { label: 'dkg-create' }, }), ); expect(mockDklsSetup).toHaveBeenCalledWith( @@ -376,23 +379,51 @@ describe('MPCKeyring', () => { networkSession: { label: 'tss-setup' }, }), ); - expect(rootSession.createSubsession).toHaveBeenCalledWith('create-key'); + expect(rootSession.createSubsession).toHaveBeenCalledWith('dkg-create'); expect(rootSession.createSubsession).toHaveBeenCalledWith('tss-setup'); expect(mockStoreKeyShareBackup).toHaveBeenCalledWith( expect.objectContaining({ token: 'token', - backupId: mockBackupId, + epoch: 1, }), ); + expect(mockCheckKeyShare).toHaveBeenCalledWith({ + baseURL: 'https://cloud.example', + token: 'token', + }); + expect(mockSetActiveEpoch).toHaveBeenCalledWith({ + baseURL: 'https://cloud.example', + token: 'token', + epoch: 1, + }); expect(await keyring.serialize()).toStrictEqual({ netCreds: { partyId: 'local-user' }, keyShare: makeThresholdKey(), serverNetId: 'cloud-user', - backupId: mockBackupId, + shareEpoch: 1, tssSetup: '0x010203', }); }); + it('throws when create cannot activate an incomplete epoch', async () => { + const keyring = makeKeyring(); + const rootSession = makeRootSession(); + mockCreateIdentity.mockResolvedValueOnce({ partyId: 'local-user' }); + mockCreateSession.mockResolvedValueOnce(rootSession); + mockCreateKey.mockResolvedValueOnce(makeThresholdKey()); + mockCheckKeyShare.mockResolvedValueOnce({ + latestShareEpoch: 1, + latestBackupEpoch: undefined, + activeEpoch: undefined, + }); + + await expect(keyring.init('create')).rejects.toThrow( + 'Share epoch 1 is not ready', + ); + expect(mockSetActiveEpoch).not.toHaveBeenCalled(); + expect(await keyring.serialize()).toStrictEqual({}); + }); + it('imports a key from the backend backup', async () => { const getProfileToken = jest.fn().mockResolvedValue('token'); const keyring = makeKeyring(getProfileToken); @@ -417,7 +448,7 @@ describe('MPCKeyring', () => { netCreds: { partyId: 'imported-user' }, keyShare: makeThresholdKey(), serverNetId: 'cloud-user', - backupId: mockBackupId, + shareEpoch: mockShareEpoch, tssSetup: null, }); }); @@ -449,7 +480,7 @@ describe('MPCKeyring', () => { expect(await keyring.getAccounts()).toStrictEqual([mockDerivedAddress]); }); - it('rotates key shares without regenerating tssSetup', async () => { + it('rotates key shares, activates the next epoch, and clears tssSetup', async () => { const getProfileToken = jest.fn().mockResolvedValue('token'); const keyring = makeKeyring(getProfileToken); await deserializeState(keyring); @@ -458,14 +489,15 @@ describe('MPCKeyring', () => { ...makeThresholdKey(), privateKeyShare: new Uint8Array([9, 9, 9]), }; - const newBackupId = - '0xcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc'; - const mockedUtil = jest.requireMock('./util'); - mockedUtil.createBackupId.mockReturnValueOnce(newBackupId); const rootSession = makeRootSession(); mockCreateSession.mockResolvedValueOnce(rootSession); mockRotateKeyShares.mockResolvedValueOnce(rotatedKey); + mockCheckKeyShare.mockResolvedValueOnce({ + latestShareEpoch: 2, + latestBackupEpoch: 2, + activeEpoch: 1, + }); await keyring.rotateKeyShares(); @@ -475,48 +507,56 @@ describe('MPCKeyring', () => { token: 'token', clientNetId: 'local-user', nonce: mockSessionNonce, + expectedActiveEpoch: 1, }); expect(mockRotateKeyShares).toHaveBeenCalledWith( expect.objectContaining({ - networkSession: { label: 'rotate-key-shares' }, + networkSession: { label: 'dkg-rotate' }, }), ); - expect(rootSession.createSubsession).toHaveBeenCalledWith( - 'rotate-key-shares', - ); + expect(rootSession.createSubsession).toHaveBeenCalledWith('dkg-rotate'); expect(mockDklsSetup).not.toHaveBeenCalled(); expect(mockStoreKeyShareBackup).toHaveBeenCalledWith( expect.objectContaining({ - backupId: newBackupId, + epoch: 2, token: 'token', }), ); + expect(mockSetActiveEpoch).toHaveBeenCalledWith({ + baseURL: 'https://cloud.example', + token: 'token', + epoch: 2, + }); expect(await keyring.serialize()).toStrictEqual({ netCreds: { partyId: 'local-user' }, keyShare: rotatedKey, serverNetId: 'cloud-user', - backupId: newBackupId, - tssSetup: '0x0102', + shareEpoch: 2, + tssSetup: null, }); }); - it('checks whether the local backup id matches the backend', async () => { + it('checks whether local and backend epochs match', async () => { const getProfileToken = jest.fn().mockResolvedValue('token'); const keyring = makeKeyring(getProfileToken); await deserializeState(keyring); expect(await keyring.checkKeyShare()).toBe(true); expect(getProfileToken).toHaveBeenCalledWith(); - expect(mockCheckKeyShareBackupId).toHaveBeenCalledWith({ + expect(mockCheckKeyShare).toHaveBeenCalledWith({ baseURL: 'https://cloud.example', token: 'token', }); - mockCheckKeyShareBackupId.mockResolvedValueOnce('other-backup-id'); + mockCheckKeyShare.mockResolvedValueOnce({ + latestShareEpoch: 2, + latestBackupEpoch: 1, + activeEpoch: 1, + }); expect(await keyring.checkKeyShare()).toBe(false); }); - it('syncs key share and backup id from the backend', async () => { + it('syncs key share and epoch from the backend and clears tssSetup', async () => { const getProfileToken = jest.fn().mockResolvedValue('token'); const keyring = makeKeyring(getProfileToken); await deserializeState(keyring); @@ -527,7 +567,7 @@ describe('MPCKeyring', () => { }; mockLoadKeyShareBackup.mockResolvedValueOnce({ encryptedKeyShare: new TextEncoder().encode(JSON.stringify({ ok: true })), - backupId: 'synced-backup-id', + epoch: 3, }); mockThresholdKeyFromJson.mockReturnValueOnce(syncedKey); @@ -538,8 +578,8 @@ describe('MPCKeyring', () => { netCreds: { partyId: 'local-user' }, keyShare: syncedKey, serverNetId: 'cloud-user', - backupId: 'synced-backup-id', - tssSetup: '0x0102', + shareEpoch: 3, + tssSetup: null, }); }); @@ -566,6 +606,7 @@ describe('MPCKeyring', () => { clientNetId: 'local-user', token: 'token', data: hashPersonalMessage(new TextEncoder().encode('hello')), + shareEpoch: 1, }), ); expect(mockDklsSetup).not.toHaveBeenCalled(); @@ -628,6 +669,7 @@ describe('MPCKeyring', () => { clientNetId: 'local-user', token: 'token', data: expectedHash, + shareEpoch: 1, }), ); expect(mockDklsSign).toHaveBeenCalledWith( diff --git a/packages/keyring-eth-mpc/src/mpc-keyring.ts b/packages/keyring-eth-mpc/src/mpc-keyring.ts index 05e3a493c..ab967fa73 100644 --- a/packages/keyring-eth-mpc/src/mpc-keyring.ts +++ b/packages/keyring-eth-mpc/src/mpc-keyring.ts @@ -32,13 +32,15 @@ import { import { bytesToHex, hexToBytes } from '@metamask/utils'; import type { Hex, Json } from '@metamask/utils'; +import type { CheckKeyShareResult } from './cloud'; import { - checkKeyShareBackupId, + checkKeyShare as checkKeyShareRemote, createKey as startCreateKey, getNetId, loadKeyShareBackup, registerClient, rotateKeyShares as startRotateKeyShares, + setActiveEpoch, sign as startSign, storeKeyShareBackup, } from './cloud'; @@ -52,15 +54,14 @@ import type { } from './types'; import { AES_GCM_IV_LENGTH, - createBackupId, decryptBytes, encryptBytes, equalAddresses, generateSessionNonce, getSignedTypedDataHash, - parseBackupId, parseEthSig, parseServerNetId, + parseShareEpoch, parseSignedTypedDataVersion, parseTssSetup, publicKeyToAddressHex, @@ -71,6 +72,29 @@ const mpcKeyringType = 'MPC Keyring'; const TSS_HAVE_SETUP_MESSAGE_TYPE = 'tss-have-setup'; const CLIENT_SHARE_INDEX = 0; const SERVER_SHARE_INDEX = 1; +const INITIAL_SHARE_EPOCH = 1; + +/** + * Assert that the latest share and backup epochs both equal `expectedEpoch`. + * + * @param check - Backend epoch metadata. + * @param expectedEpoch - Epoch that must be ready for activation. + */ +function assertEpochReady( + check: CheckKeyShareResult, + expectedEpoch: number, +): void { + if ( + check.latestShareEpoch !== expectedEpoch || + check.latestBackupEpoch !== expectedEpoch + ) { + throw new Error( + `Share epoch ${expectedEpoch} is not ready (latestShareEpoch=${String( + check.latestShareEpoch, + )}, latestBackupEpoch=${String(check.latestBackupEpoch)})`, + ); + } +} /** * Party net ids indexed by 0-based share slot. @@ -170,12 +194,13 @@ export class MPCKeyring implements Keyring { return this.#state.setup; } - const { netCreds, keyShare, serverNetId, backupId, tssSetup } = this.#state; + const { netCreds, keyShare, serverNetId, shareEpoch, tssSetup } = + this.#state; return { netCreds: this.#serializer.networkIdentity.toJson(netCreds), keyShare: this.#serializer.thresholdKey.toJson(keyShare), serverNetId, - backupId, + shareEpoch, tssSetup: tssSetup === null ? null : bytesToHex(tssSetup), }; } @@ -195,7 +220,7 @@ export class MPCKeyring implements Keyring { 'netCreds' in stateObj && 'keyShare' in stateObj && 'serverNetId' in stateObj && - 'backupId' in stateObj && + 'shareEpoch' in stateObj && 'tssSetup' in stateObj ) { this.#state = { @@ -203,7 +228,7 @@ export class MPCKeyring implements Keyring { netCreds: this.#serializer.networkIdentity.fromJson(stateObj.netCreds), keyShare: this.#serializer.thresholdKey.fromJson(stateObj.keyShare), serverNetId: parseServerNetId(stateObj.serverNetId), - backupId: parseBackupId(stateObj.backupId), + shareEpoch: parseShareEpoch(stateObj.shareEpoch), tssSetup: parseTssSetup(stateObj.tssSetup), }; return; @@ -246,12 +271,14 @@ export class MPCKeyring implements Keyring { } /** - * Rotate client and server shares. Existing TSS setup remains valid. + * Rotate client and server shares to the next epoch, then activate it. + * Clears local TSS setup so it is rebuilt against the new shares. */ async rotateKeyShares(): Promise { const state = this.#assertState(); - const { netCreds, serverNetId } = state; + const { netCreds, serverNetId, shareEpoch } = state; let { keyShare } = state; + const nextEpoch = shareEpoch + 1; const token = await this.#getProfileToken({ twoFactor: true }); const nonce = generateSessionNonce(this.#rng); @@ -260,6 +287,7 @@ export class MPCKeyring implements Keyring { token, clientNetId: netCreds.partyId, nonce, + expectedActiveEpoch: shareEpoch, }); const netSession = await this.#createNetworkSession( @@ -273,50 +301,68 @@ export class MPCKeyring implements Keyring { key: keyShare, dealers: dealersFromCL24Key(keyShare, custodians), custodians, - networkSession: netSession.createSubsession('rotate-key-shares'), + networkSession: netSession.createSubsession('dkg-rotate'), }); } finally { await netSession.disconnect(); } - const backupId = createBackupId(this.#rng); await storeKeyShareBackup({ baseURL: this.#cloudURL, token, - backupId, + epoch: nextEpoch, encryptedKeyShare: await this.#encryptKeyShare(keyShare), }); + assertEpochReady( + await checkKeyShareRemote({ + baseURL: this.#cloudURL, + token, + }), + nextEpoch, + ); + + await setActiveEpoch({ + baseURL: this.#cloudURL, + token, + epoch: nextEpoch, + }); + this.#applyKeyState({ ...state, keyShare, - backupId, + shareEpoch: nextEpoch, + tssSetup: null, }); } /** - * Compare the local backup id with the id stored on the backend. + * Compare the local share epoch with backend share/backup/active epochs. * - * @returns Whether the backup ids match. + * @returns Whether all remote epochs match the local share epoch. */ async checkKeyShare(): Promise { - const { backupId } = this.#assertState(); + const { shareEpoch } = this.#assertState(); const token = await this.#getProfileToken(); - const serverBackupId = await checkKeyShareBackupId({ + const check = await checkKeyShareRemote({ baseURL: this.#cloudURL, token, }); - return backupId === serverBackupId; + return ( + check.latestShareEpoch === shareEpoch && + check.latestBackupEpoch === shareEpoch && + check.activeEpoch === shareEpoch + ); } /** - * Refresh `keyShare` and `backupId` from the backend backup. - * `netCreds`, `serverNetId`, and `tssSetup` are unchanged. + * Refresh `keyShare` and `shareEpoch` from the active-epoch backend backup. + * Clears `tssSetup`; `netCreds` and `serverNetId` are unchanged. */ async syncKeyShare(): Promise { const state = this.#assertState(); const token = await this.#getProfileToken({ twoFactor: true }); - const { encryptedKeyShare, backupId } = await loadKeyShareBackup({ + const { encryptedKeyShare, epoch } = await loadKeyShareBackup({ baseURL: this.#cloudURL, token, }); @@ -324,7 +370,8 @@ export class MPCKeyring implements Keyring { this.#applyKeyState({ ...state, keyShare, - backupId, + shareEpoch: epoch, + tssSetup: null, }); } @@ -479,7 +526,7 @@ export class MPCKeyring implements Keyring { try { const custodians = partyNetIds(netCreds.partyId, serverNetId); const bindings = shareBindings(netCreds.partyId, serverNetId); - const createKeySession = netSession.createSubsession('create-key'); + const createKeySession = netSession.createSubsession('dkg-create'); const tssSetupSession = netSession.createSubsession('tss-setup'); [keyShare, tssSetup] = await Promise.all([ this.#dkm.createKey({ @@ -496,19 +543,32 @@ export class MPCKeyring implements Keyring { await netSession.disconnect(); } - const backupId = createBackupId(this.#rng); await storeKeyShareBackup({ baseURL: this.#cloudURL, token, - backupId, + epoch: INITIAL_SHARE_EPOCH, encryptedKeyShare: await this.#encryptKeyShare(keyShare), }); + assertEpochReady( + await checkKeyShareRemote({ + baseURL: this.#cloudURL, + token, + }), + INITIAL_SHARE_EPOCH, + ); + + await setActiveEpoch({ + baseURL: this.#cloudURL, + token, + epoch: INITIAL_SHARE_EPOCH, + }); + this.#applyKeyState({ keyShare, netCreds, serverNetId, - backupId, + shareEpoch: INITIAL_SHARE_EPOCH, tssSetup, }); } @@ -537,7 +597,7 @@ export class MPCKeyring implements Keyring { keyShare, netCreds, serverNetId, - backupId: loaded.backupId, + shareEpoch: loaded.epoch, tssSetup: null, }); } @@ -545,7 +605,7 @@ export class MPCKeyring implements Keyring { async #signHash(address: Hex, hash: Uint8Array): Promise { return this.#serializeSign(async () => { const state = this.#assertState(); - const { keyShare, netCreds, serverNetId } = state; + const { keyShare, netCreds, serverNetId, shareEpoch } = state; let { tssSetup } = state; const addr = this.#address(); @@ -564,6 +624,7 @@ export class MPCKeyring implements Keyring { data: hash, clientNetId: netCreds.partyId, nonce, + shareEpoch, }); const netSession = await this.#createNetworkSession( diff --git a/packages/keyring-eth-mpc/src/types.ts b/packages/keyring-eth-mpc/src/types.ts index 3eef8f851..6aa478b15 100644 --- a/packages/keyring-eth-mpc/src/types.ts +++ b/packages/keyring-eth-mpc/src/types.ts @@ -23,9 +23,9 @@ export type MPCKeyringOpts = { export type MPCKeyringState = { keyShare: CL24ThresholdKey; + shareEpoch: number; netCreds: MfaNetworkIdentity; serverNetId: string; - backupId: string; tssSetup: Uint8Array | null; }; diff --git a/packages/keyring-eth-mpc/src/util.test.ts b/packages/keyring-eth-mpc/src/util.test.ts index 220ba121a..0cabdca10 100644 --- a/packages/keyring-eth-mpc/src/util.test.ts +++ b/packages/keyring-eth-mpc/src/util.test.ts @@ -9,16 +9,15 @@ import { bytesToHex, hexToBytes } from '@metamask/utils'; import { AES_GCM_IV_LENGTH, - createBackupId, decryptBytes, encryptBytes, equalAddresses, generateSessionNonce, getSignedTypedDataHash, normalizeAddress, - parseBackupId, parseEthSig, parseServerNetId, + parseShareEpoch, parseSignedTypedDataVersion, parseTssSetup, publicKeyToAddressHex, @@ -217,14 +216,6 @@ describe('util', () => { ); }); - it('creates an opaque backup id from RNG bytes', () => { - const bytes = new Uint8Array(32).fill(2); - const rng = { generateRandomBytes: jest.fn().mockReturnValue(bytes) }; - - expect(createBackupId(rng)).toBe(bytesToHex(bytes)); - expect(rng.generateRandomBytes).toHaveBeenCalledWith(32); - }); - it('encrypts and decrypts bytes with AES-GCM', async () => { const key = new Uint8Array(32).fill(9); const iv = new Uint8Array(AES_GCM_IV_LENGTH).fill(1); @@ -276,12 +267,15 @@ describe('util', () => { 'Invalid server network id: expected a non-empty string', ); - expect(parseBackupId('backup-1')).toBe('backup-1'); - expect(() => parseBackupId(1 as never)).toThrow( - 'Invalid backup id: expected a string', + expect(parseShareEpoch(3)).toBe(3); + expect(() => parseShareEpoch('1' as never)).toThrow( + 'Invalid share epoch: expected an integer', + ); + expect(() => parseShareEpoch(1.5)).toThrow( + 'Invalid share epoch: expected an integer', ); - expect(() => parseBackupId('')).toThrow( - 'Invalid backup id: expected a non-empty string', + expect(() => parseShareEpoch(0)).toThrow( + 'Invalid share epoch: expected a positive integer', ); expect(parseTssSetup('0x1234')).toStrictEqual(new Uint8Array([0x12, 0x34])); diff --git a/packages/keyring-eth-mpc/src/util.ts b/packages/keyring-eth-mpc/src/util.ts index c80cffaef..a63338333 100644 --- a/packages/keyring-eth-mpc/src/util.ts +++ b/packages/keyring-eth-mpc/src/util.ts @@ -21,7 +21,6 @@ import type { Hex, Json } from '@metamask/utils'; import { add0x, assert, bytesToHex, hexToBytes } from '@metamask/utils'; const SESSION_NONCE_BYTE_LENGTH = 32; -const BACKUP_ID_BYTE_LENGTH = 32; export const AES_GCM_IV_LENGTH = 12; /** @@ -34,16 +33,6 @@ export function generateSessionNonce(rng: RandomNumberGenerator): Hex { return bytesToHex(rng.generateRandomBytes(SESSION_NONCE_BYTE_LENGTH)); } -/** - * Mint an opaque backup id. Not a counter. - * - * @param rng - The random number generator. - * @returns Hex-encoded 32-byte random id. - */ -export function createBackupId(rng: RandomNumberGenerator): string { - return bytesToHex(rng.generateRandomBytes(BACKUP_ID_BYTE_LENGTH)); -} - /** * Encrypt plaintext with AES-GCM. The IV is prepended to the ciphertext. * @@ -313,13 +302,19 @@ export function parseServerNetId(serverNetId: Json): string { } /** - * Parse a backup id from a JSON value. + * Parse a share epoch from a JSON value. * - * @param backupId - The backup id to parse. - * @returns The parsed backup id. + * @param shareEpoch - The share epoch to parse. + * @returns The parsed share epoch. */ -export function parseBackupId(backupId: Json): string { - return parseNonEmptyString(backupId, 'backup id'); +export function parseShareEpoch(shareEpoch: Json): number { + if (typeof shareEpoch !== 'number' || !Number.isInteger(shareEpoch)) { + throw new Error('Invalid share epoch: expected an integer'); + } + if (shareEpoch < 1) { + throw new Error('Invalid share epoch: expected a positive integer'); + } + return shareEpoch; } /** From e5a53ee5dbd2561e773d806583b044118f906318 Mon Sep 17 00:00:00 2001 From: Matthias Geihs Date: Thu, 3 Sep 2026 14:10:00 +0200 Subject: [PATCH 10/38] fix: serialize MPC sign, rotate, and sync on one op queue Prevent mid-sign rotate/sync from being overwritten by stale Co-authored-by: Cursor #applyKeyState snapshots from concurrent signing. --- packages/keyring-eth-mpc/CHANGELOG.md | 1 + .../keyring-eth-mpc/src/mpc-keyring.test.ts | 72 +++++++++ packages/keyring-eth-mpc/src/mpc-keyring.ts | 144 ++++++++++-------- 3 files changed, 150 insertions(+), 67 deletions(-) diff --git a/packages/keyring-eth-mpc/CHANGELOG.md b/packages/keyring-eth-mpc/CHANGELOG.md index 2d47d874d..25141ed1f 100644 --- a/packages/keyring-eth-mpc/CHANGELOG.md +++ b/packages/keyring-eth-mpc/CHANGELOG.md @@ -13,5 +13,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - 2-party client/server MPC keyring with DKLS23 TSS and cloud backup sync. - Supports create/import, share-epoch rotate/check/sync, and signing (transactions, personal_sign, typed data, EIP-7702 authorizations). - Create and rotate append a share epoch, store backup, assert readiness, then `setActiveEpoch` before updating local state. + - Serialize sign, rotate, and sync on one op queue to avoid stale local state overwrites. [Unreleased]: https://github.com/MetaMask/accounts/ diff --git a/packages/keyring-eth-mpc/src/mpc-keyring.test.ts b/packages/keyring-eth-mpc/src/mpc-keyring.test.ts index a8757689b..65bea2eae 100644 --- a/packages/keyring-eth-mpc/src/mpc-keyring.test.ts +++ b/packages/keyring-eth-mpc/src/mpc-keyring.test.ts @@ -767,6 +767,78 @@ describe('MPCKeyring', () => { expect(maxInFlight).toBe(1); }); + it('serializes sign, rotate, and sync on one op queue', async () => { + const keyring = makeKeyring(); + await deserializeState(keyring); + + const order: string[] = []; + let inFlight = 0; + let maxInFlight = 0; + + const track = async (label: string, work: () => Promise) => { + inFlight += 1; + maxInFlight = Math.max(maxInFlight, inFlight); + order.push(`${label}-start`); + await new Promise((resolve) => setTimeout(resolve, 20)); + await work(); + order.push(`${label}-end`); + inFlight -= 1; + }; + + mockCreateSession.mockImplementation(async () => makeRootSession()); + mockDklsSign.mockImplementation(async () => { + await track('sign', async () => undefined); + return { signature: new Uint8Array(64).fill(9) }; + }); + mockRotateKeyShares.mockImplementation(async () => { + await track('rotate', async () => undefined); + return { + ...makeThresholdKey(), + privateKeyShare: new Uint8Array([9, 9, 9]), + }; + }); + mockCheckKeyShare.mockResolvedValue({ + latestShareEpoch: 2, + latestBackupEpoch: 2, + activeEpoch: 1, + }); + mockLoadKeyShareBackup.mockImplementation(async () => { + await track('sync', async () => undefined); + return { + encryptedKeyShare: new TextEncoder().encode( + JSON.stringify({ ok: true }), + ), + epoch: 2, + }; + }); + mockThresholdKeyFromJson.mockReturnValue({ + ...makeThresholdKey(), + privateKeyShare: new Uint8Array([1, 1, 1]), + }); + + await Promise.all([ + keyring.signPersonalMessage(mockDerivedAddress, '0x68656c6c6f'), + keyring.rotateKeyShares(), + keyring.syncKeyShare(), + ]); + + expect(maxInFlight).toBe(1); + expect(order).toStrictEqual([ + 'sign-start', + 'sign-end', + 'rotate-start', + 'rotate-end', + 'sync-start', + 'sync-end', + ]); + expect(await keyring.serialize()).toStrictEqual( + expect.objectContaining({ + shareEpoch: 2, + tssSetup: null, + }), + ); + }); + it('signs typed data and validates signer constraints', async () => { const keyring = makeKeyring(); await deserializeState(keyring); diff --git a/packages/keyring-eth-mpc/src/mpc-keyring.ts b/packages/keyring-eth-mpc/src/mpc-keyring.ts index ab967fa73..5c882295e 100644 --- a/packages/keyring-eth-mpc/src/mpc-keyring.ts +++ b/packages/keyring-eth-mpc/src/mpc-keyring.ts @@ -150,7 +150,7 @@ export class MPCKeyring implements Keyring { readonly #getBackupEncryptionKey: () => Promise; - #signQueue: Promise = Promise.resolve(); + #opQueue: Promise = Promise.resolve(); constructor(opts: MPCKeyringOpts) { this.#rng = { @@ -273,66 +273,71 @@ export class MPCKeyring implements Keyring { /** * Rotate client and server shares to the next epoch, then activate it. * Clears local TSS setup so it is rebuilt against the new shares. + * Serialized with sign and sync so mid-flight state writes cannot race. + * + * @returns Resolves when rotation and activation complete. */ async rotateKeyShares(): Promise { - const state = this.#assertState(); - const { netCreds, serverNetId, shareEpoch } = state; - let { keyShare } = state; - const nextEpoch = shareEpoch + 1; - - const token = await this.#getProfileToken({ twoFactor: true }); - const nonce = generateSessionNonce(this.#rng); - await startRotateKeyShares({ - baseURL: this.#cloudURL, - token, - clientNetId: netCreds.partyId, - nonce, - expectedActiveEpoch: shareEpoch, - }); + return this.#serializeOp(async () => { + const state = this.#assertState(); + const { netCreds, serverNetId, shareEpoch } = state; + let { keyShare } = state; + const nextEpoch = shareEpoch + 1; - const netSession = await this.#createNetworkSession( - netCreds, - serverNetId, - nonce, - ); - try { - const custodians = partyNetIds(netCreds.partyId, serverNetId); - keyShare = await this.#dkm.rotateKeyShares({ - key: keyShare, - dealers: dealersFromCL24Key(keyShare, custodians), - custodians, - networkSession: netSession.createSubsession('dkg-rotate'), + const token = await this.#getProfileToken({ twoFactor: true }); + const nonce = generateSessionNonce(this.#rng); + await startRotateKeyShares({ + baseURL: this.#cloudURL, + token, + clientNetId: netCreds.partyId, + nonce, + expectedActiveEpoch: shareEpoch, }); - } finally { - await netSession.disconnect(); - } - await storeKeyShareBackup({ - baseURL: this.#cloudURL, - token, - epoch: nextEpoch, - encryptedKeyShare: await this.#encryptKeyShare(keyShare), - }); + const netSession = await this.#createNetworkSession( + netCreds, + serverNetId, + nonce, + ); + try { + const custodians = partyNetIds(netCreds.partyId, serverNetId); + keyShare = await this.#dkm.rotateKeyShares({ + key: keyShare, + dealers: dealersFromCL24Key(keyShare, custodians), + custodians, + networkSession: netSession.createSubsession('dkg-rotate'), + }); + } finally { + await netSession.disconnect(); + } - assertEpochReady( - await checkKeyShareRemote({ + await storeKeyShareBackup({ baseURL: this.#cloudURL, token, - }), - nextEpoch, - ); + epoch: nextEpoch, + encryptedKeyShare: await this.#encryptKeyShare(keyShare), + }); - await setActiveEpoch({ - baseURL: this.#cloudURL, - token, - epoch: nextEpoch, - }); + assertEpochReady( + await checkKeyShareRemote({ + baseURL: this.#cloudURL, + token, + }), + nextEpoch, + ); - this.#applyKeyState({ - ...state, - keyShare, - shareEpoch: nextEpoch, - tssSetup: null, + await setActiveEpoch({ + baseURL: this.#cloudURL, + token, + epoch: nextEpoch, + }); + + this.#applyKeyState({ + ...state, + keyShare, + shareEpoch: nextEpoch, + tssSetup: null, + }); }); } @@ -358,20 +363,25 @@ export class MPCKeyring implements Keyring { /** * Refresh `keyShare` and `shareEpoch` from the active-epoch backend backup. * Clears `tssSetup`; `netCreds` and `serverNetId` are unchanged. + * Serialized with sign and rotate so mid-flight state writes cannot race. + * + * @returns Resolves when the local share has been refreshed. */ async syncKeyShare(): Promise { - const state = this.#assertState(); - const token = await this.#getProfileToken({ twoFactor: true }); - const { encryptedKeyShare, epoch } = await loadKeyShareBackup({ - baseURL: this.#cloudURL, - token, - }); - const keyShare = await this.#decryptKeyShare(encryptedKeyShare); - this.#applyKeyState({ - ...state, - keyShare, - shareEpoch: epoch, - tssSetup: null, + return this.#serializeOp(async () => { + const state = this.#assertState(); + const token = await this.#getProfileToken({ twoFactor: true }); + const { encryptedKeyShare, epoch } = await loadKeyShareBackup({ + baseURL: this.#cloudURL, + token, + }); + const keyShare = await this.#decryptKeyShare(encryptedKeyShare); + this.#applyKeyState({ + ...state, + keyShare, + shareEpoch: epoch, + tssSetup: null, + }); }); } @@ -603,7 +613,7 @@ export class MPCKeyring implements Keyring { } async #signHash(address: Hex, hash: Uint8Array): Promise { - return this.#serializeSign(async () => { + return this.#serializeOp(async () => { const state = this.#assertState(); const { keyShare, netCreds, serverNetId, shareEpoch } = state; let { tssSetup } = state; @@ -723,12 +733,12 @@ export class MPCKeyring implements Keyring { ); } - async #serializeSign( + async #serializeOp( operation: () => Promise, ): Promise { - const previous = this.#signQueue; + const previous = this.#opQueue; let release!: () => void; - this.#signQueue = new Promise((resolve) => { + this.#opQueue = new Promise((resolve) => { release = resolve; }); await previous; From f56ee36b992dfd6fc2f21ec0fa9cb83284dcc061 Mon Sep 17 00:00:00 2001 From: Matthias Geihs Date: Thu, 3 Sep 2026 14:42:05 +0200 Subject: [PATCH 11/38] fix: bind MPC key-share backups to the DKG attempt nonce 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 --- packages/keyring-eth-mpc/CHANGELOG.md | 1 + packages/keyring-eth-mpc/src/cloud.test.ts | 5 ++++- packages/keyring-eth-mpc/src/cloud.ts | 3 +++ packages/keyring-eth-mpc/src/mpc-keyring.test.ts | 2 ++ packages/keyring-eth-mpc/src/mpc-keyring.ts | 2 ++ 5 files changed, 12 insertions(+), 1 deletion(-) diff --git a/packages/keyring-eth-mpc/CHANGELOG.md b/packages/keyring-eth-mpc/CHANGELOG.md index 25141ed1f..b93dd7d5f 100644 --- a/packages/keyring-eth-mpc/CHANGELOG.md +++ b/packages/keyring-eth-mpc/CHANGELOG.md @@ -13,6 +13,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - 2-party client/server MPC keyring with DKLS23 TSS and cloud backup sync. - Supports create/import, share-epoch rotate/check/sync, and signing (transactions, personal_sign, typed data, EIP-7702 authorizations). - Create and rotate append a share epoch, store backup, assert readiness, then `setActiveEpoch` before updating local state. + - Bind key-share backups to the DKG attempt nonce so a delayed backup cannot attach to a retried share. - Serialize sign, rotate, and sync on one op queue to avoid stale local state overwrites. [Unreleased]: https://github.com/MetaMask/accounts/ diff --git a/packages/keyring-eth-mpc/src/cloud.test.ts b/packages/keyring-eth-mpc/src/cloud.test.ts index efe9be94d..ebcf97bff 100644 --- a/packages/keyring-eth-mpc/src/cloud.test.ts +++ b/packages/keyring-eth-mpc/src/cloud.test.ts @@ -220,13 +220,15 @@ describe('cloud helpers', () => { baseURL: 'https://cloud.example', token: 'token-1', epoch: 2, + attemptNonce: '0xnonce', encryptedKeyShare, }); const body = JSON.parse( (fetchSpy.mock.calls[0]?.[1] as { body: string }).body, - ) as { encryptedKeyShare: string; epoch: number }; + ) as { encryptedKeyShare: string; epoch: number; attemptNonce: string }; expect(body.epoch).toBe(2); + expect(body.attemptNonce).toBe('0xnonce'); expect(body.encryptedKeyShare).toBe(bytesToBase64(encryptedKeyShare)); }); @@ -241,6 +243,7 @@ describe('cloud helpers', () => { baseURL: 'https://cloud.example', token: 'token-1', epoch: 1, + attemptNonce: '0xnonce', encryptedKeyShare: new Uint8Array([1]), }), ).rejects.toThrow('Failed to store key share backup: Bad Request'); diff --git a/packages/keyring-eth-mpc/src/cloud.ts b/packages/keyring-eth-mpc/src/cloud.ts index 525116ce4..eabdb0c36 100644 --- a/packages/keyring-eth-mpc/src/cloud.ts +++ b/packages/keyring-eth-mpc/src/cloud.ts @@ -181,12 +181,14 @@ export async function rotateKeyShares(opts: { * @param opts.baseURL - MPC backend base URL. * @param opts.token - Profile token with 2FA. * @param opts.epoch - Share epoch this backup belongs to. + * @param opts.attemptNonce - DKG client nonce for that epoch (rejects stale backups). * @param opts.encryptedKeyShare - Encrypted key share ciphertext. */ export async function storeKeyShareBackup(opts: { baseURL: string; token: string; epoch: number; + attemptNonce: string; encryptedKeyShare: Uint8Array; }): Promise { await postJson( @@ -194,6 +196,7 @@ export async function storeKeyShareBackup(opts: { { token: opts.token, epoch: opts.epoch, + attemptNonce: opts.attemptNonce, encryptedKeyShare: bytesToBase64(opts.encryptedKeyShare), }, 'Failed to store key share backup', diff --git a/packages/keyring-eth-mpc/src/mpc-keyring.test.ts b/packages/keyring-eth-mpc/src/mpc-keyring.test.ts index 65bea2eae..2e3b489ee 100644 --- a/packages/keyring-eth-mpc/src/mpc-keyring.test.ts +++ b/packages/keyring-eth-mpc/src/mpc-keyring.test.ts @@ -385,6 +385,7 @@ describe('MPCKeyring', () => { expect.objectContaining({ token: 'token', epoch: 1, + attemptNonce: mockSessionNonce, }), ); expect(mockCheckKeyShare).toHaveBeenCalledWith({ @@ -520,6 +521,7 @@ describe('MPCKeyring', () => { expect.objectContaining({ epoch: 2, token: 'token', + attemptNonce: mockSessionNonce, }), ); expect(mockSetActiveEpoch).toHaveBeenCalledWith({ diff --git a/packages/keyring-eth-mpc/src/mpc-keyring.ts b/packages/keyring-eth-mpc/src/mpc-keyring.ts index 5c882295e..48e4dd4b2 100644 --- a/packages/keyring-eth-mpc/src/mpc-keyring.ts +++ b/packages/keyring-eth-mpc/src/mpc-keyring.ts @@ -315,6 +315,7 @@ export class MPCKeyring implements Keyring { baseURL: this.#cloudURL, token, epoch: nextEpoch, + attemptNonce: nonce, encryptedKeyShare: await this.#encryptKeyShare(keyShare), }); @@ -557,6 +558,7 @@ export class MPCKeyring implements Keyring { baseURL: this.#cloudURL, token, epoch: INITIAL_SHARE_EPOCH, + attemptNonce: nonce, encryptedKeyShare: await this.#encryptKeyShare(keyShare), }); From 16e4e992fbbf00c29d8b063637d70978f3a060cc Mon Sep 17 00:00:00 2001 From: ieow <4881057+ieow@users.noreply.github.com> Date: Fri, 4 Sep 2026 18:45:09 +0800 Subject: [PATCH 12/38] feat: use bearer token in requests (#630) ## Summary - MPC cloud HTTP calls now send the profile token in an `Authorization: Bearer ` 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 --- > [!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 `** 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). > > Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit 400e5b142902f4cc90c24b32ae88770366102899. Bugbot is set up for automated code reviews on this repo. Configure [here](https://www.cursor.com/dashboard/bugbot). --------- Co-authored-by: Matthias Geihs --- packages/keyring-eth-mpc/CHANGELOG.md | 5 ---- packages/keyring-eth-mpc/src/cloud.test.ts | 35 +++++++++++++++++----- packages/keyring-eth-mpc/src/cloud.ts | 24 +++++++++------ 3 files changed, 43 insertions(+), 21 deletions(-) diff --git a/packages/keyring-eth-mpc/CHANGELOG.md b/packages/keyring-eth-mpc/CHANGELOG.md index b93dd7d5f..859dea8b7 100644 --- a/packages/keyring-eth-mpc/CHANGELOG.md +++ b/packages/keyring-eth-mpc/CHANGELOG.md @@ -10,10 +10,5 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added - Initial release of `@metamask/eth-mpc-keyring` ([#627](https://github.com/MetaMask/accounts/pull/627)) - - 2-party client/server MPC keyring with DKLS23 TSS and cloud backup sync. - - Supports create/import, share-epoch rotate/check/sync, and signing (transactions, personal_sign, typed data, EIP-7702 authorizations). - - Create and rotate append a share epoch, store backup, assert readiness, then `setActiveEpoch` before updating local state. - - Bind key-share backups to the DKG attempt nonce so a delayed backup cannot attach to a retried share. - - Serialize sign, rotate, and sync on one op queue to avoid stale local state overwrites. [Unreleased]: https://github.com/MetaMask/accounts/ diff --git a/packages/keyring-eth-mpc/src/cloud.test.ts b/packages/keyring-eth-mpc/src/cloud.test.ts index ebcf97bff..fa2cdba39 100644 --- a/packages/keyring-eth-mpc/src/cloud.test.ts +++ b/packages/keyring-eth-mpc/src/cloud.test.ts @@ -51,7 +51,11 @@ describe('cloud helpers', () => { 'https://cloud.example/net-id', expect.objectContaining({ method: 'POST', - headers: { 'Content-Type': 'application/json' }, + headers: { + 'Content-Type': 'application/json', + Authorization: 'Bearer token-1', + }, + body: '{}', }), ); }); @@ -147,11 +151,19 @@ describe('cloud helpers', () => { shareEpoch: 1, }); - const body = JSON.parse( - (fetchSpy.mock.calls[0]?.[1] as { body: string }).body, - ) as { data: string; shareEpoch: number }; + const init = fetchSpy.mock.calls[0]?.[1] as { + body: string; + headers: Record; + }; + expect(init.headers.Authorization).toBe('Bearer token-1'); + const body = JSON.parse(init.body) as { + data: string; + shareEpoch: number; + token?: string; + }; expect(body.data).toBe('aGk='); expect(body.shareEpoch).toBe(1); + expect(body.token).toBeUndefined(); }); it('throws when cloud sign initialization fails', async () => { @@ -224,12 +236,21 @@ describe('cloud helpers', () => { encryptedKeyShare, }); - const body = JSON.parse( - (fetchSpy.mock.calls[0]?.[1] as { body: string }).body, - ) as { encryptedKeyShare: string; epoch: number; attemptNonce: string }; + const init = fetchSpy.mock.calls[0]?.[1] as { + body: string; + headers: Record; + }; + expect(init.headers.Authorization).toBe('Bearer token-1'); + const body = JSON.parse(init.body) as { + encryptedKeyShare: string; + epoch: number; + attemptNonce: string; + token?: string; + }; expect(body.epoch).toBe(2); expect(body.attemptNonce).toBe('0xnonce'); expect(body.encryptedKeyShare).toBe(bytesToBase64(encryptedKeyShare)); + expect(body.token).toBeUndefined(); }); it('throws when storing a key share backup fails', async () => { diff --git a/packages/keyring-eth-mpc/src/cloud.ts b/packages/keyring-eth-mpc/src/cloud.ts index eabdb0c36..a07437802 100644 --- a/packages/keyring-eth-mpc/src/cloud.ts +++ b/packages/keyring-eth-mpc/src/cloud.ts @@ -16,12 +16,14 @@ export type CheckKeyShareResult = { * Fetch JSON from the MPC backend, throwing on non-OK responses. * * @param url - The request URL. + * @param token - Profile token sent as a Bearer header. * @param body - The JSON request body. * @param errorPrefix - Prefix for the thrown error message. * @returns The parsed JSON body, or `undefined` when the response is empty. */ async function postJson( url: string, + token: string, body: Record, errorPrefix: string, ): Promise { @@ -29,6 +31,7 @@ async function postJson( method: 'POST', headers: { 'Content-Type': 'application/json', + Authorization: `Bearer ${token}`, }, body: JSON.stringify(body), }); @@ -58,7 +61,8 @@ export async function getNetId(opts: { }): Promise { const data = await postJson<{ netId: string }>( `${opts.baseURL}/net-id`, - { token: opts.token }, + opts.token, + {}, 'Failed to get server network id', ); return data.netId; @@ -81,8 +85,8 @@ export async function createKey(opts: { }): Promise { await postJson( `${opts.baseURL}/create-key`, + opts.token, { - token: opts.token, clientNetId: opts.clientNetId, nonce: opts.nonce, }, @@ -105,8 +109,8 @@ export async function registerClient(opts: { }): Promise { await postJson( `${opts.baseURL}/register-client`, + opts.token, { - token: opts.token, clientNetId: opts.clientNetId, }, 'Failed to register client', @@ -134,8 +138,8 @@ export async function sign(opts: { }): Promise { await postJson( `${opts.baseURL}/sign`, + opts.token, { - token: opts.token, data: bytesToBase64(opts.data), clientNetId: opts.clientNetId, nonce: opts.nonce, @@ -164,8 +168,8 @@ export async function rotateKeyShares(opts: { }): Promise { await postJson( `${opts.baseURL}/rotate-key-shares`, + opts.token, { - token: opts.token, clientNetId: opts.clientNetId, nonce: opts.nonce, expectedActiveEpoch: opts.expectedActiveEpoch, @@ -193,8 +197,8 @@ export async function storeKeyShareBackup(opts: { }): Promise { await postJson( `${opts.baseURL}/store-key-share-backup`, + opts.token, { - token: opts.token, epoch: opts.epoch, attemptNonce: opts.attemptNonce, encryptedKeyShare: bytesToBase64(opts.encryptedKeyShare), @@ -217,7 +221,8 @@ export async function checkKeyShare(opts: { }): Promise { return await postJson( `${opts.baseURL}/check-key-share`, - { token: opts.token }, + opts.token, + {}, 'Failed to check key share', ); } @@ -237,8 +242,8 @@ export async function setActiveEpoch(opts: { }): Promise { await postJson( `${opts.baseURL}/set-active-epoch`, + opts.token, { - token: opts.token, epoch: opts.epoch, }, 'Failed to set active epoch', @@ -262,7 +267,8 @@ export async function loadKeyShareBackup(opts: { epoch: number; }>( `${opts.baseURL}/load-key-share-backup`, - { token: opts.token }, + opts.token, + {}, 'Failed to load key share backup', ); return { From ab3f2a0199df8bdd05debdbe5b0275ef6c217ccd Mon Sep 17 00:00:00 2001 From: ieow <4881057+ieow@users.noreply.github.com> Date: Fri, 4 Sep 2026 18:59:41 +0800 Subject: [PATCH 13/38] feat: loadKeyShare use getJson (#631) ## 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. --- > [!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. > > Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit 2690e548a50e64fc378a92293bb89daa93e69030. Bugbot is set up for automated code reviews on this repo. Configure [here](https://www.cursor.com/dashboard/bugbot). --------- Co-authored-by: Matthias Geihs Co-authored-by: Cursor --- packages/keyring-eth-mpc/src/cloud.test.ts | 8 +++ packages/keyring-eth-mpc/src/cloud.ts | 64 +++++++++++++++++----- 2 files changed, 57 insertions(+), 15 deletions(-) diff --git a/packages/keyring-eth-mpc/src/cloud.test.ts b/packages/keyring-eth-mpc/src/cloud.test.ts index fa2cdba39..814957f07 100644 --- a/packages/keyring-eth-mpc/src/cloud.test.ts +++ b/packages/keyring-eth-mpc/src/cloud.test.ts @@ -353,6 +353,14 @@ describe('cloud helpers', () => { encryptedKeyShare, epoch: 3, }); + + expect(fetchSpy).toHaveBeenCalledWith( + 'https://cloud.example/load-key-share-backup', + expect.objectContaining({ + method: 'GET', + headers: { Authorization: 'Bearer token-1' }, + }), + ); }); it('throws when loading a key share backup fails', async () => { diff --git a/packages/keyring-eth-mpc/src/cloud.ts b/packages/keyring-eth-mpc/src/cloud.ts index a07437802..dac2d75db 100644 --- a/packages/keyring-eth-mpc/src/cloud.ts +++ b/packages/keyring-eth-mpc/src/cloud.ts @@ -13,7 +13,51 @@ export type CheckKeyShareResult = { }; /** - * Fetch JSON from the MPC backend, throwing on non-OK responses. + * Parse a fetch response as JSON, throwing on non-OK status. + * + * @param response - The fetch response. + * @param errorPrefix - Prefix for the thrown error message. + * @returns The parsed JSON body, or `undefined` when the response is empty. + */ +async function parseJsonResponse( + response: Response, + errorPrefix: string, +): Promise { + if (!response.ok) { + throw new Error(`${errorPrefix}: ${response.statusText}`); + } + + const text = await response.text(); + if (text.length === 0) { + return undefined as Result; + } + return JSON.parse(text) as Result; +} + +/** + * GET JSON from the MPC backend, throwing on non-OK responses. + * + * @param url - The request URL. + * @param token - Profile token sent as a Bearer header. + * @param errorPrefix - Prefix for the thrown error message. + * @returns The parsed JSON body, or `undefined` when the response is empty. + */ +async function getJson( + url: string, + token: string, + errorPrefix: string, +): Promise { + const response = await fetch(url, { + method: 'GET', + headers: { + Authorization: `Bearer ${token}`, + }, + }); + return parseJsonResponse(response, errorPrefix); +} + +/** + * POST JSON to the MPC backend, throwing on non-OK responses. * * @param url - The request URL. * @param token - Profile token sent as a Bearer header. @@ -21,12 +65,12 @@ export type CheckKeyShareResult = { * @param errorPrefix - Prefix for the thrown error message. * @returns The parsed JSON body, or `undefined` when the response is empty. */ -async function postJson( +async function postJson( url: string, token: string, body: Record, errorPrefix: string, -): Promise { +): Promise { const response = await fetch(url, { method: 'POST', headers: { @@ -35,16 +79,7 @@ async function postJson( }, body: JSON.stringify(body), }); - - if (!response.ok) { - throw new Error(`${errorPrefix}: ${response.statusText}`); - } - - const text = await response.text(); - if (text.length === 0) { - return undefined as Response; - } - return JSON.parse(text) as Response; + return parseJsonResponse(response, errorPrefix); } /** @@ -262,13 +297,12 @@ export async function loadKeyShareBackup(opts: { baseURL: string; token: string; }): Promise { - const data = await postJson<{ + const data = await getJson<{ encryptedKeyShare: string; epoch: number; }>( `${opts.baseURL}/load-key-share-backup`, opts.token, - {}, 'Failed to load key share backup', ); return { From 236bce380798e2f9723b3319feb37b7694253a79 Mon Sep 17 00:00:00 2001 From: Matthias Geihs Date: Fri, 18 Sep 2026 15:07:11 +0200 Subject: [PATCH 14/38] feat: implement MPC addAccounts for the single initialized account Co-authored-by: Cursor --- .../keyring-eth-mpc/src/mpc-keyring.test.ts | 33 +++++++++++++++---- packages/keyring-eth-mpc/src/mpc-keyring.ts | 21 +++++++++--- 2 files changed, 43 insertions(+), 11 deletions(-) diff --git a/packages/keyring-eth-mpc/src/mpc-keyring.test.ts b/packages/keyring-eth-mpc/src/mpc-keyring.test.ts index 2e3b489ee..d28be9baa 100644 --- a/packages/keyring-eth-mpc/src/mpc-keyring.test.ts +++ b/packages/keyring-eth-mpc/src/mpc-keyring.test.ts @@ -869,15 +869,36 @@ describe('MPCKeyring', () => { ); }); + describe('addAccounts', () => { + it('throws if called before initialization', async () => { + const keyring = makeKeyring(); + + await expect(keyring.addAccounts()).rejects.toThrow( + 'MPCKeyring: has no account', + ); + }); + + it('throws if numberOfAccounts is not 1', async () => { + const keyring = makeKeyring(); + await deserializeState(keyring); + + await expect(keyring.addAccounts(2)).rejects.toThrow( + 'MPCKeyring: supports adding exactly one account', + ); + }); + + it('returns the existing account after initialization', async () => { + const keyring = makeKeyring(); + await deserializeState(keyring); + + expect(await keyring.addAccounts()).toStrictEqual([mockDerivedAddress]); + expect(await keyring.getAccounts()).toStrictEqual([mockDerivedAddress]); + }); + }); + it('throws for unsupported account APIs that are not implemented', async () => { const keyring = makeKeyring(); - await expect(keyring.addAccounts()).rejects.toThrow( - 'addAccounts(1): not implemented', - ); - await expect(keyring.addAccounts(2)).rejects.toThrow( - 'addAccounts(2): not implemented', - ); await expect( keyring.getAppKeyAddress(mockDerivedAddress, 'example.com'), ).rejects.toThrow( diff --git a/packages/keyring-eth-mpc/src/mpc-keyring.ts b/packages/keyring-eth-mpc/src/mpc-keyring.ts index 48e4dd4b2..acf5f8f11 100644 --- a/packages/keyring-eth-mpc/src/mpc-keyring.ts +++ b/packages/keyring-eth-mpc/src/mpc-keyring.ts @@ -387,14 +387,25 @@ export class MPCKeyring implements Keyring { } /** - * Add new accounts to the keyring. The accounts will be derived - * sequentially from the root HD wallet, using increasing indices. + * Return the single MPC account. The account is created during + * {@link MPCKeyring.init}, not by this method. * - * @param numberOfAccounts - The number of accounts to add. - * @returns The addresses of the new accounts. + * @param numberOfAccounts - Must be 1 (the only supported value). + * @returns The address of the existing account. + * @throws If `numberOfAccounts` is not 1 or the keyring has no account. */ async addAccounts(numberOfAccounts = 1): Promise { - throw new Error(`addAccounts(${numberOfAccounts}): not implemented`); + if (numberOfAccounts !== 1) { + throw new Error('MPCKeyring: supports adding exactly one account'); + } + + const accounts = await this.getAccounts(); + const account = accounts[0]; + if (!account) { + throw new Error('MPCKeyring: has no account'); + } + + return [account]; } /** From 4463a0e21a714d6bccfa61cb4f802f94716102a5 Mon Sep 17 00:00:00 2001 From: ieow <4881057+ieow@users.noreply.github.com> Date: Fri, 25 Sep 2026 21:33:29 +0800 Subject: [PATCH 15/38] feat: wait for backend status completion in MPC create and rotate (#635) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Implemented a new function `waitForDoneStatus` to ensure the backend has completed the create and rotate operations by checking for a `status: done` message. - Updated the `MPCKeyring` class to call this function after initiating create and rotate sessions. - Enhanced tests to verify behavior when receiving non-done status messages during the create process. ## Examples --- > [!NOTE] > **Medium Risk** > Changes ordering and failure modes for MPC key creation, rotation, and signing against the backend; mistakes could block wallet setup or drop signatures, though signing is explicitly lenient. > > **Overview** > MPC key create and share rotation now **block until the cloud peer sends a `status` message with payload `done`**, via new `waitForDoneStatus`, before disconnecting and continuing with backup storage / epoch activation. If the backend reports anything else (e.g. `running`), **create and rotate fail** with `Expected status done, received …`, so backups are not written when persistence is incomplete. > > **Signing** still requests the same status after TSS sign, but **non-`done` status is ignored** so a late backend signal does not discard an already-computed signature (signing does not mutate shares). Tests and the changelog document this split behavior. > > Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit d8b464a0502b2a83f346c3bc52b8b81ac9b2b513. Bugbot is set up for automated code reviews on this repo. Configure [here](https://www.cursor.com/dashboard/bugbot). --- .../keyring-eth-mpc/src/mpc-keyring.test.ts | 90 ++++++++++++++++--- packages/keyring-eth-mpc/src/mpc-keyring.ts | 46 +++++++++- 2 files changed, 125 insertions(+), 11 deletions(-) diff --git a/packages/keyring-eth-mpc/src/mpc-keyring.test.ts b/packages/keyring-eth-mpc/src/mpc-keyring.test.ts index d28be9baa..a925efde8 100644 --- a/packages/keyring-eth-mpc/src/mpc-keyring.test.ts +++ b/packages/keyring-eth-mpc/src/mpc-keyring.test.ts @@ -169,14 +169,20 @@ const makeSerializedState = (overrides: Record = {}) => ({ ...overrides, }); -const makeRootSession = () => { +const encodeText = (value: string): Uint8Array => + new TextEncoder().encode(value); + +const makeRootSession = (statusPayload = 'data persisted') => { const session = { sendMessage: jest.fn(), receiveMessage: jest .fn() - .mockResolvedValue( - new TextEncoder().encode(JSON.stringify({ haveSetup: true })), - ), + .mockImplementation(async (_peer: string, type: string) => { + if (type === 'status') { + return Promise.resolve(encodeText(statusPayload)); + } + return Promise.resolve(encodeText(JSON.stringify({ haveSetup: true }))); + }), createSubsession: jest .fn() .mockImplementation((label: string) => ({ label })), @@ -381,6 +387,11 @@ describe('MPCKeyring', () => { ); expect(rootSession.createSubsession).toHaveBeenCalledWith('dkg-create'); expect(rootSession.createSubsession).toHaveBeenCalledWith('tss-setup'); + expect(rootSession.receiveMessage).toHaveBeenCalledWith( + 'cloud-user', + 'status', + ); + expect(rootSession.disconnect).toHaveBeenCalled(); expect(mockStoreKeyShareBackup).toHaveBeenCalledWith( expect.objectContaining({ token: 'token', @@ -481,6 +492,27 @@ describe('MPCKeyring', () => { expect(await keyring.getAccounts()).toStrictEqual([mockDerivedAddress]); }); + it('throws when create status is not data persisted', async () => { + const keyring = makeKeyring(); + const rootSession = makeRootSession(); + rootSession.receiveMessage.mockImplementation( + async (_peer: string, type: string) => { + if (type === 'status') { + return encodeText('running'); + } + return encodeText(JSON.stringify({ haveSetup: true })); + }, + ); + mockCreateIdentity.mockResolvedValueOnce({ partyId: 'local-user' }); + mockCreateSession.mockResolvedValueOnce(rootSession); + mockCreateKey.mockResolvedValueOnce(makeThresholdKey()); + + await expect(keyring.init('create')).rejects.toThrow( + 'Expected status data persisted, received running', + ); + expect(mockStoreKeyShareBackup).not.toHaveBeenCalled(); + }); + it('rotates key shares, activates the next epoch, and clears tssSetup', async () => { const getProfileToken = jest.fn().mockResolvedValue('token'); const keyring = makeKeyring(getProfileToken); @@ -516,6 +548,11 @@ describe('MPCKeyring', () => { }), ); expect(rootSession.createSubsession).toHaveBeenCalledWith('dkg-rotate'); + expect(rootSession.receiveMessage).toHaveBeenCalledWith( + 'cloud-user', + 'status', + ); + expect(rootSession.disconnect).toHaveBeenCalled(); expect(mockDklsSetup).not.toHaveBeenCalled(); expect(mockStoreKeyShareBackup).toHaveBeenCalledWith( expect.objectContaining({ @@ -590,7 +627,7 @@ describe('MPCKeyring', () => { const keyring = makeKeyring(getProfileToken); await deserializeState(keyring); - const signSession = makeRootSession(); + const signSession = makeRootSession('signing completed'); mockCreateSession.mockResolvedValue(signSession); const messageHex = '0x68656c6c6f'; @@ -619,6 +656,10 @@ describe('MPCKeyring', () => { ); expect(signSession.createSubsession).toHaveBeenCalledWith('tss-sign'); expect(signSession.createSubsession).not.toHaveBeenCalledWith('tss-setup'); + expect(signSession.receiveMessage).toHaveBeenCalledWith( + 'cloud-user', + 'status', + ); const tx = { getHashedMessageToSign: jest.fn().mockReturnValue(new Uint8Array([1, 2])), @@ -636,12 +677,39 @@ describe('MPCKeyring', () => { ); }); + it('returns the signature when sign status is not signing completed', async () => { + const keyring = makeKeyring(); + await deserializeState(keyring); + + const signSession = makeRootSession(); + signSession.receiveMessage.mockImplementation( + async (_peer: string, type: string) => { + if (type === 'status') { + return encodeText('running'); + } + return encodeText(JSON.stringify({ haveSetup: true })); + }, + ); + mockCreateSession.mockResolvedValue(signSession); + + const signatureHex = await keyring.signPersonalMessage( + mockDerivedAddress, + '0x68656c6c6f', + ); + + expect(signatureHex).toBe(bytesToHex(mockEthSignature)); + expect(signSession.disconnect).toHaveBeenCalled(); + expect(await keyring.serialize()).toStrictEqual( + expect.objectContaining({ tssSetup: '0x0102' }), + ); + }); + it('signs EIP-7702 authorizations through the MPC flow', async () => { const getProfileToken = jest.fn().mockResolvedValue('token'); const keyring = makeKeyring(getProfileToken); await deserializeState(keyring); - const signSession = makeRootSession(); + const signSession = makeRootSession('signing completed'); mockCreateSession.mockResolvedValue(signSession); const { hashEIP7702Authorization } = jest.requireActual( @@ -686,7 +754,7 @@ describe('MPCKeyring', () => { const keyring = makeKeyring(); await deserializeState(keyring); - const signSession = makeRootSession(); + const signSession = makeRootSession('signing completed'); signSession.receiveMessage.mockResolvedValueOnce( new TextEncoder().encode(JSON.stringify({ haveSetup: false })), ); @@ -716,7 +784,7 @@ describe('MPCKeyring', () => { const keyring = makeKeyring(); await deserializeState(keyring, makeSerializedState({ tssSetup: null })); - const signSession = makeRootSession(); + const signSession = makeRootSession('signing completed'); mockCreateSession.mockResolvedValue(signSession); await keyring.signPersonalMessage(mockDerivedAddress, '0x68656c6c6f'); @@ -759,7 +827,9 @@ describe('MPCKeyring', () => { inFlight -= 1; return { signature: new Uint8Array(64).fill(9) }; }); - mockCreateSession.mockImplementation(async () => makeRootSession()); + mockCreateSession.mockImplementation(async () => + makeRootSession('signing completed'), + ); await Promise.all([ keyring.signPersonalMessage(mockDerivedAddress, '0x68656c6c6f'), @@ -845,7 +915,7 @@ describe('MPCKeyring', () => { const keyring = makeKeyring(); await deserializeState(keyring); - mockCreateSession.mockResolvedValue(makeRootSession()); + mockCreateSession.mockResolvedValue(makeRootSession('signing completed')); const signature = await keyring.signTypedData( mockDerivedAddress, diff --git a/packages/keyring-eth-mpc/src/mpc-keyring.ts b/packages/keyring-eth-mpc/src/mpc-keyring.ts index acf5f8f11..81ec6efa5 100644 --- a/packages/keyring-eth-mpc/src/mpc-keyring.ts +++ b/packages/keyring-eth-mpc/src/mpc-keyring.ts @@ -70,10 +70,33 @@ import { const mpcKeyringType = 'MPC Keyring'; const TSS_HAVE_SETUP_MESSAGE_TYPE = 'tss-have-setup'; +const STATUS_MESSAGE_TYPE = 'status'; +const STATUS_DATA_PERSISTED_PAYLOAD = 'data persisted'; +const STATUS_SIGNING_COMPLETED_PAYLOAD = 'signing completed'; const CLIENT_SHARE_INDEX = 0; const SERVER_SHARE_INDEX = 1; const INITIAL_SHARE_EPOCH = 1; +/** + * Wait for a backend `status` message and assert it matches `expectedStatus`. + * + * @param networkSession - Root network session shared with the backend. + * @param peerNetId - Server network id. + * @param expectedStatus - Payload the backend must send for this operation. + */ +async function waitForDoneStatus( + networkSession: RootNetworkSession, + peerNetId: PartyId, + expectedStatus: string, +): Promise { + const status = new TextDecoder().decode( + await networkSession.receiveMessage(peerNetId, STATUS_MESSAGE_TYPE), + ); + if (status !== expectedStatus) { + throw new Error(`Expected status ${expectedStatus}, received ${status}`); + } +} + /** * Assert that the latest share and backup epochs both equal `expectedEpoch`. * @@ -307,6 +330,11 @@ export class MPCKeyring implements Keyring { custodians, networkSession: netSession.createSubsession('dkg-rotate'), }); + await waitForDoneStatus( + netSession, + serverNetId, + STATUS_DATA_PERSISTED_PAYLOAD, + ); } finally { await netSession.disconnect(); } @@ -561,6 +589,11 @@ export class MPCKeyring implements Keyring { networkSession: tssSetupSession, }), ]); + await waitForDoneStatus( + netSession, + serverNetId, + STATUS_DATA_PERSISTED_PAYLOAD, + ); } finally { await netSession.disconnect(); } @@ -666,6 +699,7 @@ export class MPCKeyring implements Keyring { ); this.#applyKeyState({ ...state, tssSetup }); + let ethSignature: Uint8Array; try { const { signature } = await this.#tss.sign({ key: keyShare, @@ -674,11 +708,21 @@ export class MPCKeyring implements Keyring { networkSession: netSession.createSubsession('tss-sign'), setup: tssSetup, }); - return toEthSig(signature, hash, keyShare.publicKey); + ethSignature = toEthSig(signature, hash, keyShare.publicKey); } catch (error) { this.#applyKeyState({ ...state, tssSetup: null }); throw error; } + try { + await waitForDoneStatus( + netSession, + serverNetId, + STATUS_SIGNING_COMPLETED_PAYLOAD, + ); + } catch { + // Signing does not mutate shares, so a late status failure must not drop the signature. + } + return ethSignature; } finally { await netSession.disconnect(); } From 6a89027c3e31f9a23f0680bd1f937bfd6230b67c Mon Sep 17 00:00:00 2001 From: Matthias Geihs Date: Mon, 28 Sep 2026 09:55:17 +0200 Subject: [PATCH 16/38] fix: time out hung MPC cloud HTTP requests A backend that never responds would otherwise hold the keyring mutex until the client restarts. Co-authored-by: Cursor --- packages/keyring-eth-mpc/CHANGELOG.md | 4 ++ packages/keyring-eth-mpc/src/cloud.test.ts | 43 +++++++++++++ packages/keyring-eth-mpc/src/cloud.ts | 75 ++++++++++++++++++---- 3 files changed, 110 insertions(+), 12 deletions(-) diff --git a/packages/keyring-eth-mpc/CHANGELOG.md b/packages/keyring-eth-mpc/CHANGELOG.md index 859dea8b7..82ed0b058 100644 --- a/packages/keyring-eth-mpc/CHANGELOG.md +++ b/packages/keyring-eth-mpc/CHANGELOG.md @@ -11,4 +11,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Initial release of `@metamask/eth-mpc-keyring` ([#627](https://github.com/MetaMask/accounts/pull/627)) +### Changed + +- Abort MPC cloud HTTP requests after 30 seconds so a hung backend cannot hold the keyring mutex indefinitely ([#627](https://github.com/MetaMask/accounts/pull/627)) + [Unreleased]: https://github.com/MetaMask/accounts/ diff --git a/packages/keyring-eth-mpc/src/cloud.test.ts b/packages/keyring-eth-mpc/src/cloud.test.ts index 814957f07..f93926e7e 100644 --- a/packages/keyring-eth-mpc/src/cloud.test.ts +++ b/packages/keyring-eth-mpc/src/cloud.test.ts @@ -60,6 +60,49 @@ describe('cloud helpers', () => { ); }); + it('rejects cloud requests that time out', async () => { + jest.useFakeTimers(); + try { + fetchSpy.mockImplementation(async (_url: string, init?: RequestInit) => { + const { signal } = init ?? {}; + if (!signal) { + throw new Error('missing abort signal'); + } + await new Promise((_resolve, reject) => { + signal.addEventListener('abort', () => { + reject( + new DOMException('The operation was aborted.', 'AbortError'), + ); + }); + }); + }); + + const pending = getNetId({ + baseURL: 'https://cloud.example', + token: 'token-1', + }); + await Promise.all([ + expect(pending).rejects.toThrow( + 'Failed to get server network id: timed out after 30000ms', + ), + jest.advanceTimersByTimeAsync(30_000), + ]); + } finally { + jest.useRealTimers(); + } + }); + + it('rethrows cloud network errors that are not timeouts', async () => { + fetchSpy.mockRejectedValue(new TypeError('Failed to fetch')); + + await expect( + loadKeyShareBackup({ + baseURL: 'https://cloud.example', + token: 'token-1', + }), + ).rejects.toThrow('Failed to fetch'); + }); + it('throws when getting the server network id fails', async () => { fetchSpy.mockResolvedValue({ ok: false, diff --git a/packages/keyring-eth-mpc/src/cloud.ts b/packages/keyring-eth-mpc/src/cloud.ts index dac2d75db..f16a0ba59 100644 --- a/packages/keyring-eth-mpc/src/cloud.ts +++ b/packages/keyring-eth-mpc/src/cloud.ts @@ -12,6 +12,49 @@ export type CheckKeyShareResult = { activeEpoch?: number; }; +/** + * Cloud HTTP calls must finish within this window. Keyring methods run under + * the controller mutex, so a backend that never responds would block every + * keyring operation until the client restarts. + */ +const CLOUD_REQUEST_TIMEOUT_MS = 30_000; + +/** + * Fetch a URL, aborting if the backend does not respond in time. + * + * @param url - The request URL. + * @param init - Fetch options. `signal` is set by this function. + * @param errorPrefix - Prefix for the thrown timeout error. + * @returns The fetch response. + * @throws If the request exceeds `CLOUD_REQUEST_TIMEOUT_MS`. + */ +async function fetchWithTimeout( + url: string, + init: RequestInit, + errorPrefix: string, +): Promise { + const controller = new AbortController(); + const timeoutId = setTimeout(() => { + controller.abort(); + }, CLOUD_REQUEST_TIMEOUT_MS); + + try { + return await fetch(url, { + ...init, + signal: controller.signal, + }); + } catch (error) { + if (controller.signal.aborted) { + throw new Error( + `${errorPrefix}: timed out after ${CLOUD_REQUEST_TIMEOUT_MS}ms`, + ); + } + throw error; + } finally { + clearTimeout(timeoutId); + } +} + /** * Parse a fetch response as JSON, throwing on non-OK status. * @@ -47,12 +90,16 @@ async function getJson( token: string, errorPrefix: string, ): Promise { - const response = await fetch(url, { - method: 'GET', - headers: { - Authorization: `Bearer ${token}`, + const response = await fetchWithTimeout( + url, + { + method: 'GET', + headers: { + Authorization: `Bearer ${token}`, + }, }, - }); + errorPrefix, + ); return parseJsonResponse(response, errorPrefix); } @@ -71,14 +118,18 @@ async function postJson( body: Record, errorPrefix: string, ): Promise { - const response = await fetch(url, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - Authorization: `Bearer ${token}`, + const response = await fetchWithTimeout( + url, + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + Authorization: `Bearer ${token}`, + }, + body: JSON.stringify(body), }, - body: JSON.stringify(body), - }); + errorPrefix, + ); return parseJsonResponse(response, errorPrefix); } From 2761e18b37d6248444f4b264b1c620c6879939c4 Mon Sep 17 00:00:00 2001 From: Matthias Geihs Date: Mon, 28 Sep 2026 09:55:31 +0200 Subject: [PATCH 17/38] docs: note that any sign error drops the MPC TSS setup A failed sign may have consumed the cached setup, so the next sign rebuilds it with the peer. Co-authored-by: Cursor --- packages/keyring-eth-mpc/src/mpc-keyring.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/keyring-eth-mpc/src/mpc-keyring.ts b/packages/keyring-eth-mpc/src/mpc-keyring.ts index 81ec6efa5..dfcc21243 100644 --- a/packages/keyring-eth-mpc/src/mpc-keyring.ts +++ b/packages/keyring-eth-mpc/src/mpc-keyring.ts @@ -710,6 +710,9 @@ export class MPCKeyring implements Keyring { }); ethSignature = toEthSig(signature, hash, keyShare.publicKey); } catch (error) { + // Any error drops the cached TSS setup. A failed sign may have + // consumed it, including a transport failure, so the next sign + // rebuilds setup with the peer instead of reusing it. this.#applyKeyState({ ...state, tssSetup: null }); throw error; } From 6e65c53686d7cf4e1e98b85c9855c6e9c3bdb46c Mon Sep 17 00:00:00 2001 From: Matthias Geihs Date: Mon, 28 Sep 2026 09:55:42 +0200 Subject: [PATCH 18/38] refactor: name the MPC signing threshold constant Keep the 2-of-2 threshold next to the other share constants. Co-authored-by: Cursor --- packages/keyring-eth-mpc/src/mpc-keyring.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/keyring-eth-mpc/src/mpc-keyring.ts b/packages/keyring-eth-mpc/src/mpc-keyring.ts index dfcc21243..f886ad186 100644 --- a/packages/keyring-eth-mpc/src/mpc-keyring.ts +++ b/packages/keyring-eth-mpc/src/mpc-keyring.ts @@ -75,6 +75,7 @@ const STATUS_DATA_PERSISTED_PAYLOAD = 'data persisted'; const STATUS_SIGNING_COMPLETED_PAYLOAD = 'signing completed'; const CLIENT_SHARE_INDEX = 0; const SERVER_SHARE_INDEX = 1; +const SIGNING_THRESHOLD = 2; const INITIAL_SHARE_EPOCH = 1; /** @@ -581,7 +582,7 @@ export class MPCKeyring implements Keyring { [keyShare, tssSetup] = await Promise.all([ this.#dkm.createKey({ custodians, - threshold: 2, + threshold: SIGNING_THRESHOLD, networkSession: createKeySession, }), this.#tss.setup({ From 24590c8d5bf1f195398347f181b393819e22b50b Mon Sep 17 00:00:00 2001 From: Matthias Geihs Date: Mon, 28 Sep 2026 09:56:16 +0200 Subject: [PATCH 19/38] refactor: rename MPC keyring types to Mpc Match the Dkls23-style casing. The persisted keyring type string stays 'MPC Keyring'. Co-authored-by: Cursor --- packages/keyring-eth-mpc/CHANGELOG.md | 1 + packages/keyring-eth-mpc/src/index.ts | 10 +++--- .../keyring-eth-mpc/src/mpc-keyring.test.ts | 16 +++++----- packages/keyring-eth-mpc/src/mpc-keyring.ts | 32 +++++++++---------- packages/keyring-eth-mpc/src/types.ts | 22 ++++++------- 5 files changed, 41 insertions(+), 40 deletions(-) diff --git a/packages/keyring-eth-mpc/CHANGELOG.md b/packages/keyring-eth-mpc/CHANGELOG.md index 82ed0b058..e948df882 100644 --- a/packages/keyring-eth-mpc/CHANGELOG.md +++ b/packages/keyring-eth-mpc/CHANGELOG.md @@ -14,5 +14,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed - Abort MPC cloud HTTP requests after 30 seconds so a hung backend cannot hold the keyring mutex indefinitely ([#627](https://github.com/MetaMask/accounts/pull/627)) +- Rename `MPCKeyring` and the `MPC*` option types to `MpcKeyring` and `Mpc*` ([#627](https://github.com/MetaMask/accounts/pull/627)) [Unreleased]: https://github.com/MetaMask/accounts/ diff --git a/packages/keyring-eth-mpc/src/index.ts b/packages/keyring-eth-mpc/src/index.ts index dcc422a8f..135e59207 100644 --- a/packages/keyring-eth-mpc/src/index.ts +++ b/packages/keyring-eth-mpc/src/index.ts @@ -1,9 +1,9 @@ -export { MPCKeyring } from './mpc-keyring'; +export { MpcKeyring } from './mpc-keyring'; export type { - MPCKeyringOpts, - MPCKeyringSerializer, - MPCKeyringSetupParams, - MPCKeyringState, + MpcKeyringOpts, + MpcKeyringSerializer, + MpcKeyringSetupParams, + MpcKeyringState, ProfileTokenOpts, } from './types'; diff --git a/packages/keyring-eth-mpc/src/mpc-keyring.test.ts b/packages/keyring-eth-mpc/src/mpc-keyring.test.ts index a925efde8..a193a953e 100644 --- a/packages/keyring-eth-mpc/src/mpc-keyring.test.ts +++ b/packages/keyring-eth-mpc/src/mpc-keyring.test.ts @@ -3,7 +3,7 @@ import { hashPersonalMessage } from '@ethereumjs/util'; import { bytesToHex } from '@metamask/utils'; import type { Hex, Json } from '@metamask/utils'; -import { MPCKeyring } from './mpc-keyring'; +import { MpcKeyring } from './mpc-keyring'; const mockCreateKey = jest.fn(); const mockRotateKeyShares = jest.fn(); @@ -195,7 +195,7 @@ const makeKeyring = ( getProfileToken = jest.fn().mockResolvedValue('token'), getBackupEncryptionKey = jest.fn().mockResolvedValue(mockBackupKey), ) => - new MPCKeyring({ + new MpcKeyring({ getRandomBytes: (size) => new Uint8Array(size).fill(3), dkls23Lib: {} as never, cloudURL: 'https://cloud.example', @@ -205,13 +205,13 @@ const makeKeyring = ( }); const deserializeState = async ( - keyring: MPCKeyring, + keyring: MpcKeyring, state = makeSerializedState(), ) => { await keyring.deserialize(state as unknown as Json); }; -describe('MPCKeyring', () => { +describe('MpcKeyring', () => { beforeEach(() => { lastNetworkManagerOptions = undefined; @@ -258,7 +258,7 @@ describe('MPCKeyring', () => { it('exposes the expected type constant', () => { const keyring = makeKeyring(); - expect(MPCKeyring.type).toBe('MPC Keyring'); + expect(MpcKeyring.type).toBe('MPC Keyring'); expect(keyring.type).toBe('MPC Keyring'); }); @@ -269,7 +269,7 @@ describe('MPCKeyring', () => { .fn() .mockReturnValueOnce(new Uint8Array([1, 2, 3, 4])); - const keyring = new MPCKeyring({ + const keyring = new MpcKeyring({ getRandomBytes: randomBytes, dkls23Lib: {} as never, cloudURL: 'https://cloud.example', @@ -944,7 +944,7 @@ describe('MPCKeyring', () => { const keyring = makeKeyring(); await expect(keyring.addAccounts()).rejects.toThrow( - 'MPCKeyring: has no account', + 'MpcKeyring: has no account', ); }); @@ -953,7 +953,7 @@ describe('MPCKeyring', () => { await deserializeState(keyring); await expect(keyring.addAccounts(2)).rejects.toThrow( - 'MPCKeyring: supports adding exactly one account', + 'MpcKeyring: supports adding exactly one account', ); }); diff --git a/packages/keyring-eth-mpc/src/mpc-keyring.ts b/packages/keyring-eth-mpc/src/mpc-keyring.ts index f886ad186..3398fbbc6 100644 --- a/packages/keyring-eth-mpc/src/mpc-keyring.ts +++ b/packages/keyring-eth-mpc/src/mpc-keyring.ts @@ -45,11 +45,11 @@ import { storeKeyShareBackup, } from './cloud'; import type { - MPCKeyringOpts, - MPCKeyringSerializer, - MPCKeyringSetupParams, - MPCKeyringState, - MPCKeyringStorageState, + MpcKeyringOpts, + MpcKeyringSerializer, + MpcKeyringSetupParams, + MpcKeyringState, + MpcKeyringStorageState, ProfileTokenOpts, } from './types'; import { @@ -151,7 +151,7 @@ function shareBindings( ]; } -export class MPCKeyring implements Keyring { +export class MpcKeyring implements Keyring { static type: string = mpcKeyringType; readonly type: string = mpcKeyringType; @@ -164,11 +164,11 @@ export class MPCKeyring implements Keyring { readonly #dkm: CL24DKM; - #state?: MPCKeyringStorageState; + #state?: MpcKeyringStorageState; readonly #cloudURL: string; - readonly #serializer: MPCKeyringSerializer; + readonly #serializer: MpcKeyringSerializer; readonly #getProfileToken: (opts?: ProfileTokenOpts) => Promise; @@ -176,7 +176,7 @@ export class MPCKeyring implements Keyring { #opQueue: Promise = Promise.resolve(); - constructor(opts: MPCKeyringOpts) { + constructor(opts: MpcKeyringOpts) { this.#rng = { generateRandomBytes: opts.getRandomBytes, }; @@ -273,7 +273,7 @@ export class MPCKeyring implements Keyring { * * @param mode - Create a new key or import from the backend backup. */ - async init(mode?: MPCKeyringSetupParams['mode']): Promise { + async init(mode?: MpcKeyringSetupParams['mode']): Promise { if (this.#state?.status === 'initialized') { return; } @@ -417,7 +417,7 @@ export class MPCKeyring implements Keyring { /** * Return the single MPC account. The account is created during - * {@link MPCKeyring.init}, not by this method. + * {@link MpcKeyring.init}, not by this method. * * @param numberOfAccounts - Must be 1 (the only supported value). * @returns The address of the existing account. @@ -425,13 +425,13 @@ export class MPCKeyring implements Keyring { */ async addAccounts(numberOfAccounts = 1): Promise { if (numberOfAccounts !== 1) { - throw new Error('MPCKeyring: supports adding exactly one account'); + throw new Error('MpcKeyring: supports adding exactly one account'); } const accounts = await this.getAccounts(); const account = accounts[0]; if (!account) { - throw new Error('MPCKeyring: has no account'); + throw new Error('MpcKeyring: has no account'); } return [account]; @@ -812,7 +812,7 @@ export class MPCKeyring implements Keyring { #parseSetupParams( state: Record, - ): MPCKeyringSetupParams | undefined { + ): MpcKeyringSetupParams | undefined { if (!('mode' in state)) { return undefined; } @@ -823,14 +823,14 @@ export class MPCKeyring implements Keyring { throw new Error("Invalid setup mode: expected 'create' or 'import'"); } - #applyKeyState(state: MPCKeyringState): void { + #applyKeyState(state: MpcKeyringState): void { this.#state = { status: 'initialized', ...state, }; } - #assertState(): MPCKeyringState { + #assertState(): MpcKeyringState { if (!this.#state || this.#state.status !== 'initialized') { throw new Error('Keyring not initialized'); } diff --git a/packages/keyring-eth-mpc/src/types.ts b/packages/keyring-eth-mpc/src/types.ts index 6aa478b15..b1b1a1fd6 100644 --- a/packages/keyring-eth-mpc/src/types.ts +++ b/packages/keyring-eth-mpc/src/types.ts @@ -10,7 +10,7 @@ export type ProfileTokenOpts = { export type Dkls23Lib = ConstructorParameters[0]; -export type MPCKeyringOpts = { +export type MpcKeyringOpts = { getRandomBytes: (size: number) => Uint8Array; dkls23Lib: Dkls23Lib; cloudURL: string; @@ -21,7 +21,7 @@ export type MPCKeyringOpts = { webSocket?: unknown; }; -export type MPCKeyringState = { +export type MpcKeyringState = { keyShare: CL24ThresholdKey; shareEpoch: number; netCreds: MfaNetworkIdentity; @@ -29,7 +29,7 @@ export type MPCKeyringState = { tssSetup: Uint8Array | null; }; -export type MPCKeyringSetupParams = { +export type MpcKeyringSetupParams = { mode: 'create' | 'import'; }; @@ -38,20 +38,20 @@ type JsonSerializer = { fromJson: (value: Json) => Value; }; -export type MPCKeyringInitializedState = { +export type MpcKeyringInitializedState = { status: 'initialized'; -} & MPCKeyringState; +} & MpcKeyringState; -export type MPCKeyringUninitializedState = { +export type MpcKeyringUninitializedState = { status: 'uninitialized'; - setup: MPCKeyringSetupParams; + setup: MpcKeyringSetupParams; }; -export type MPCKeyringStorageState = - | MPCKeyringInitializedState - | MPCKeyringUninitializedState; +export type MpcKeyringStorageState = + | MpcKeyringInitializedState + | MpcKeyringUninitializedState; -export type MPCKeyringSerializer = { +export type MpcKeyringSerializer = { thresholdKey: JsonSerializer; networkIdentity: JsonSerializer; }; From 28459131641a46140f6de35d2be88f3afb77e96f Mon Sep 17 00:00:00 2001 From: Matthias Geihs Date: Mon, 28 Sep 2026 09:56:49 +0200 Subject: [PATCH 20/38] docs: document the MpcKeyring class and constructor Public instance methods already had JSDoc. This covers the class, static type, and constructor. Co-authored-by: Cursor --- packages/keyring-eth-mpc/src/mpc-keyring.ts | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/packages/keyring-eth-mpc/src/mpc-keyring.ts b/packages/keyring-eth-mpc/src/mpc-keyring.ts index 3398fbbc6..84273ec46 100644 --- a/packages/keyring-eth-mpc/src/mpc-keyring.ts +++ b/packages/keyring-eth-mpc/src/mpc-keyring.ts @@ -151,7 +151,16 @@ function shareBindings( ]; } +/** + * 2-of-2 Ethereum keyring. The client holds one DKLS23 share and signs + * with a cloud peer. Shares are stored as encrypted epochs on the backend. + * + * The controller keyring type is `'MPC Keyring'`. + */ export class MpcKeyring implements Keyring { + /** + * Keyring type registered with the controller. + */ static type: string = mpcKeyringType; readonly type: string = mpcKeyringType; @@ -176,6 +185,14 @@ export class MpcKeyring implements Keyring { #opQueue: Promise = Promise.resolve(); + /** + * Create a keyring bound to the given cloud and relayer endpoints. + * + * The keyring stays uninitialized until {@link MpcKeyring.init} or + * {@link MpcKeyring.deserialize}. + * + * @param opts - Randomness, TSS library, backend URLs, and token callbacks. + */ constructor(opts: MpcKeyringOpts) { this.#rng = { generateRandomBytes: opts.getRandomBytes, From 2182cf2c80c7ebb643e73ddb5987b167ab6b5093 Mon Sep 17 00:00:00 2001 From: Matthias Geihs Date: Mon, 28 Sep 2026 09:57:58 +0200 Subject: [PATCH 21/38] docs: keep the MPC keyring changelog to the initial release Co-authored-by: Cursor --- packages/keyring-eth-mpc/CHANGELOG.md | 5 ----- 1 file changed, 5 deletions(-) diff --git a/packages/keyring-eth-mpc/CHANGELOG.md b/packages/keyring-eth-mpc/CHANGELOG.md index e948df882..859dea8b7 100644 --- a/packages/keyring-eth-mpc/CHANGELOG.md +++ b/packages/keyring-eth-mpc/CHANGELOG.md @@ -11,9 +11,4 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Initial release of `@metamask/eth-mpc-keyring` ([#627](https://github.com/MetaMask/accounts/pull/627)) -### Changed - -- Abort MPC cloud HTTP requests after 30 seconds so a hung backend cannot hold the keyring mutex indefinitely ([#627](https://github.com/MetaMask/accounts/pull/627)) -- Rename `MPCKeyring` and the `MPC*` option types to `MpcKeyring` and `Mpc*` ([#627](https://github.com/MetaMask/accounts/pull/627)) - [Unreleased]: https://github.com/MetaMask/accounts/ From 4d574d3de7aea88ac7392466a2005321188159af Mon Sep 17 00:00:00 2001 From: Matthias Geihs Date: Mon, 28 Sep 2026 10:23:23 +0200 Subject: [PATCH 22/38] feat: validate MPC responses and persisted state with superstruct Reject a drifted cloud body or malformed keyring state before it is used. Co-authored-by: Cursor --- packages/keyring-eth-mpc/package.json | 3 +- packages/keyring-eth-mpc/src/cloud.test.ts | 33 +++++++ packages/keyring-eth-mpc/src/cloud.ts | 92 ++++++++++++++---- .../keyring-eth-mpc/src/mpc-keyring.test.ts | 8 ++ packages/keyring-eth-mpc/src/mpc-keyring.ts | 94 ++++++++++++------- packages/keyring-eth-mpc/src/util.test.ts | 30 ------ packages/keyring-eth-mpc/src/util.ts | 61 +----------- yarn.lock | 1 + 8 files changed, 178 insertions(+), 144 deletions(-) diff --git a/packages/keyring-eth-mpc/package.json b/packages/keyring-eth-mpc/package.json index 8af4a6bd8..ee7260a20 100644 --- a/packages/keyring-eth-mpc/package.json +++ b/packages/keyring-eth-mpc/package.json @@ -61,7 +61,8 @@ "@metamask/mfa-wallet-dkls23-lib": "^0.0.0", "@metamask/mfa-wallet-e2ee": "^0.0.0", "@metamask/mfa-wallet-network": "^0.0.0", - "@metamask/mfa-wallet-util": "^0.0.0" + "@metamask/mfa-wallet-util": "^0.0.0", + "@metamask/superstruct": "^3.4.1" }, "devDependencies": { "@ethereumjs/tx": "^5.4.0", diff --git a/packages/keyring-eth-mpc/src/cloud.test.ts b/packages/keyring-eth-mpc/src/cloud.test.ts index f93926e7e..f8185b683 100644 --- a/packages/keyring-eth-mpc/src/cloud.test.ts +++ b/packages/keyring-eth-mpc/src/cloud.test.ts @@ -103,6 +103,17 @@ describe('cloud helpers', () => { ).rejects.toThrow('Failed to fetch'); }); + it('rejects a server network id response with the wrong shape', async () => { + okJson({ netId: '' }); + + await expect( + getNetId({ + baseURL: 'https://cloud.example', + token: 'token-1', + }), + ).rejects.toThrow(/^Failed to get server network id: bad response format$/u); + }); + it('throws when getting the server network id fails', async () => { fetchSpy.mockResolvedValue({ ok: false, @@ -332,6 +343,17 @@ describe('cloud helpers', () => { }); }); + it('rejects key share epoch metadata with the wrong shape', async () => { + okJson({ activeEpoch: '1' }); + + await expect( + checkKeyShare({ + baseURL: 'https://cloud.example', + token: 'token-1', + }), + ).rejects.toThrow(/^Failed to check key share: bad response format$/u); + }); + it('throws when checking key share fails', async () => { fetchSpy.mockResolvedValue({ ok: false, @@ -406,6 +428,17 @@ describe('cloud helpers', () => { ); }); + it('rejects a key share backup response without including the body', async () => { + okJson({ encryptedKeyShare: 'secret-ciphertext', epoch: 'nope' }); + + await expect( + loadKeyShareBackup({ + baseURL: 'https://cloud.example', + token: 'token-1', + }), + ).rejects.toThrow(/^Failed to load key share backup: bad response format$/u); + }); + it('throws when loading a key share backup fails', async () => { fetchSpy.mockResolvedValue({ ok: false, diff --git a/packages/keyring-eth-mpc/src/cloud.ts b/packages/keyring-eth-mpc/src/cloud.ts index f16a0ba59..b042f8273 100644 --- a/packages/keyring-eth-mpc/src/cloud.ts +++ b/packages/keyring-eth-mpc/src/cloud.ts @@ -1,4 +1,15 @@ import type { PartyId } from '@metamask/mfa-wallet-interface'; +import type { Infer, Struct } from '@metamask/superstruct'; +import { + exactOptional, + integer, + is, + min, + nonempty, + sensitive, + string, + type, +} from '@metamask/superstruct'; import { base64ToBytes, bytesToBase64 } from '@metamask/utils'; export type LoadKeyShareBackupResult = { @@ -6,11 +17,45 @@ export type LoadKeyShareBackupResult = { epoch: number; }; -export type CheckKeyShareResult = { - latestShareEpoch?: number; - latestBackupEpoch?: number; - activeEpoch?: number; -}; +const shareEpochStruct = min(integer(), 1); + +const NetIdResponseStruct = type({ + netId: nonempty(string()), +}); + +const CheckKeyShareResponseStruct = type({ + latestShareEpoch: exactOptional(shareEpochStruct), + latestBackupEpoch: exactOptional(shareEpochStruct), + activeEpoch: exactOptional(shareEpochStruct), +}); + +export type CheckKeyShareResult = Infer; + +const LoadKeyShareBackupResponseStruct = type({ + encryptedKeyShare: sensitive(nonempty(string())), + epoch: shareEpochStruct, +}); + +/** + * Accept `value` when it matches `struct`. + * + * Failures use a fixed message so the response body is not included. + * + * @param value - Parsed JSON body. + * @param struct - Expected response shape. + * @param errorPrefix - Prefix for the thrown error message. + * @returns The validated value. + */ +function readStruct( + value: unknown, + struct: Struct, + errorPrefix: string, +): Schema { + if (!is(value, struct)) { + throw new Error(`${errorPrefix}: bad response format`); + } + return value; +} /** * Cloud HTTP calls must finish within this window. Keyring methods run under @@ -145,10 +190,14 @@ export async function getNetId(opts: { baseURL: string; token: string; }): Promise { - const data = await postJson<{ netId: string }>( - `${opts.baseURL}/net-id`, - opts.token, - {}, + const data = readStruct( + await postJson( + `${opts.baseURL}/net-id`, + opts.token, + {}, + 'Failed to get server network id', + ), + NetIdResponseStruct, 'Failed to get server network id', ); return data.netId; @@ -305,10 +354,14 @@ export async function checkKeyShare(opts: { baseURL: string; token: string; }): Promise { - return await postJson( - `${opts.baseURL}/check-key-share`, - opts.token, - {}, + return readStruct( + await postJson( + `${opts.baseURL}/check-key-share`, + opts.token, + {}, + 'Failed to check key share', + ), + CheckKeyShareResponseStruct, 'Failed to check key share', ); } @@ -348,12 +401,13 @@ export async function loadKeyShareBackup(opts: { baseURL: string; token: string; }): Promise { - const data = await getJson<{ - encryptedKeyShare: string; - epoch: number; - }>( - `${opts.baseURL}/load-key-share-backup`, - opts.token, + const data = readStruct( + await getJson( + `${opts.baseURL}/load-key-share-backup`, + opts.token, + 'Failed to load key share backup', + ), + LoadKeyShareBackupResponseStruct, 'Failed to load key share backup', ); return { diff --git a/packages/keyring-eth-mpc/src/mpc-keyring.test.ts b/packages/keyring-eth-mpc/src/mpc-keyring.test.ts index a193a953e..439c71c0e 100644 --- a/packages/keyring-eth-mpc/src/mpc-keyring.test.ts +++ b/packages/keyring-eth-mpc/src/mpc-keyring.test.ts @@ -327,6 +327,14 @@ describe('MpcKeyring', () => { ); }); + it('throws on invalid initialized state', async () => { + const keyring = makeKeyring(); + + await expect( + keyring.deserialize(makeSerializedState({ shareEpoch: 0 }) as never), + ).rejects.toThrow('Invalid state'); + }); + it('throws on invalid setup params in deserialize', async () => { const keyring = makeKeyring(); diff --git a/packages/keyring-eth-mpc/src/mpc-keyring.ts b/packages/keyring-eth-mpc/src/mpc-keyring.ts index 84273ec46..793548965 100644 --- a/packages/keyring-eth-mpc/src/mpc-keyring.ts +++ b/packages/keyring-eth-mpc/src/mpc-keyring.ts @@ -29,7 +29,17 @@ import { MfaNetworkManager, createScopedSessionId, } from '@metamask/mfa-wallet-network'; -import { bytesToHex, hexToBytes } from '@metamask/utils'; +import { + enums, + integer, + is, + min, + nonempty, + nullable, + string, + type, +} from '@metamask/superstruct'; +import { bytesToHex, hexToBytes, JsonStruct } from '@metamask/utils'; import type { Hex, Json } from '@metamask/utils'; import type { CheckKeyShareResult } from './cloud'; @@ -60,10 +70,7 @@ import { generateSessionNonce, getSignedTypedDataHash, parseEthSig, - parseServerNetId, - parseShareEpoch, parseSignedTypedDataVersion, - parseTssSetup, publicKeyToAddressHex, toEthSig, } from './util'; @@ -78,6 +85,37 @@ const SERVER_SHARE_INDEX = 1; const SIGNING_THRESHOLD = 2; const INITIAL_SHARE_EPOCH = 1; +const SetupParamsStruct = type({ + mode: enums(['create', 'import'] as const), +}); + +const InitializedStorageStruct = type({ + netCreds: JsonStruct, + keyShare: JsonStruct, + serverNetId: nonempty(string()), + shareEpoch: min(integer(), 1), + tssSetup: nullable(string()), +}); + +/** + * Whether `state` carries the initialized-keyring fields. + * + * A payload with these fields that fails {@link InitializedStorageStruct} + * is rejected, instead of being treated as missing state. + * + * @param state - Candidate persisted state. + * @returns True when every initialized field is present. + */ +function hasInitializedFields(state: object): boolean { + return ( + 'netCreds' in state && + 'keyShare' in state && + 'serverNetId' in state && + 'shareEpoch' in state && + 'tssSetup' in state + ); +} + /** * Wait for a backend `status` message and assert it matches `expectedStatus`. * @@ -255,32 +293,33 @@ export class MpcKeyring implements Keyring { if (!state || typeof state !== 'object') { throw new Error('Invalid state'); } - const stateObj = state as Record; - - if ( - 'netCreds' in stateObj && - 'keyShare' in stateObj && - 'serverNetId' in stateObj && - 'shareEpoch' in stateObj && - 'tssSetup' in stateObj - ) { + + if (is(state, InitializedStorageStruct)) { this.#state = { status: 'initialized', - netCreds: this.#serializer.networkIdentity.fromJson(stateObj.netCreds), - keyShare: this.#serializer.thresholdKey.fromJson(stateObj.keyShare), - serverNetId: parseServerNetId(stateObj.serverNetId), - shareEpoch: parseShareEpoch(stateObj.shareEpoch), - tssSetup: parseTssSetup(stateObj.tssSetup), + netCreds: this.#serializer.networkIdentity.fromJson(state.netCreds), + keyShare: this.#serializer.thresholdKey.fromJson(state.keyShare), + serverNetId: state.serverNetId, + shareEpoch: state.shareEpoch, + tssSetup: state.tssSetup === null ? null : hexToBytes(state.tssSetup), }; return; } - const setup = this.#parseSetupParams(stateObj); - if (setup) { + if (is(state, SetupParamsStruct)) { this.#state = { status: 'uninitialized', - setup, + setup: { mode: state.mode }, }; + return; + } + + if (hasInitializedFields(state)) { + throw new Error('Invalid state'); + } + + if ('mode' in state) { + throw new Error("Invalid setup mode: expected 'create' or 'import'"); } } @@ -827,19 +866,6 @@ export class MpcKeyring implements Keyring { } } - #parseSetupParams( - state: Record, - ): MpcKeyringSetupParams | undefined { - if (!('mode' in state)) { - return undefined; - } - const { mode } = state; - if (mode === 'create' || mode === 'import') { - return { mode }; - } - throw new Error("Invalid setup mode: expected 'create' or 'import'"); - } - #applyKeyState(state: MpcKeyringState): void { this.#state = { status: 'initialized', diff --git a/packages/keyring-eth-mpc/src/util.test.ts b/packages/keyring-eth-mpc/src/util.test.ts index 0cabdca10..aa4e12667 100644 --- a/packages/keyring-eth-mpc/src/util.test.ts +++ b/packages/keyring-eth-mpc/src/util.test.ts @@ -16,10 +16,7 @@ import { getSignedTypedDataHash, normalizeAddress, parseEthSig, - parseServerNetId, - parseShareEpoch, parseSignedTypedDataVersion, - parseTssSetup, publicKeyToAddressHex, publicToAddressHex, toEthSig, @@ -257,31 +254,4 @@ describe('util', () => { decryptBytes(new Uint8Array(15), new Uint8Array(20)), ).rejects.toThrow('Invalid backup encryption key length'); }); - - it('parses and validates serialized keyring fields', () => { - expect(parseServerNetId('server-1')).toBe('server-1'); - expect(() => parseServerNetId(1 as never)).toThrow( - 'Invalid server network id: expected a string', - ); - expect(() => parseServerNetId('')).toThrow( - 'Invalid server network id: expected a non-empty string', - ); - - expect(parseShareEpoch(3)).toBe(3); - expect(() => parseShareEpoch('1' as never)).toThrow( - 'Invalid share epoch: expected an integer', - ); - expect(() => parseShareEpoch(1.5)).toThrow( - 'Invalid share epoch: expected an integer', - ); - expect(() => parseShareEpoch(0)).toThrow( - 'Invalid share epoch: expected a positive integer', - ); - - expect(parseTssSetup('0x1234')).toStrictEqual(new Uint8Array([0x12, 0x34])); - expect(parseTssSetup(null)).toBeNull(); - expect(() => parseTssSetup(123 as never)).toThrow( - 'Invalid tss setup: expected a hex string or null', - ); - }); }); diff --git a/packages/keyring-eth-mpc/src/util.ts b/packages/keyring-eth-mpc/src/util.ts index a63338333..df65b2ef4 100644 --- a/packages/keyring-eth-mpc/src/util.ts +++ b/packages/keyring-eth-mpc/src/util.ts @@ -17,7 +17,7 @@ import { typedSignatureHash, } from '@metamask/eth-sig-util'; import type { RandomNumberGenerator } from '@metamask/mfa-wallet-interface'; -import type { Hex, Json } from '@metamask/utils'; +import type { Hex } from '@metamask/utils'; import { add0x, assert, bytesToHex, hexToBytes } from '@metamask/utils'; const SESSION_NONCE_BYTE_LENGTH = 32; @@ -274,65 +274,6 @@ export function getSignedTypedDataHash< return new Uint8Array(hash); } -/** - * Parse a non-empty string field from JSON. - * - * @param value - The value to parse. - * @param fieldName - Field name for error messages. - * @returns The parsed string. - */ -function parseNonEmptyString(value: Json, fieldName: string): string { - if (typeof value !== 'string') { - throw new Error(`Invalid ${fieldName}: expected a string`); - } - if (value.length < 1) { - throw new Error(`Invalid ${fieldName}: expected a non-empty string`); - } - return value; -} - -/** - * Parse a server network id from a JSON value. - * - * @param serverNetId - The server network id to parse. - * @returns The parsed server network id. - */ -export function parseServerNetId(serverNetId: Json): string { - return parseNonEmptyString(serverNetId, 'server network id'); -} - -/** - * Parse a share epoch from a JSON value. - * - * @param shareEpoch - The share epoch to parse. - * @returns The parsed share epoch. - */ -export function parseShareEpoch(shareEpoch: Json): number { - if (typeof shareEpoch !== 'number' || !Number.isInteger(shareEpoch)) { - throw new Error('Invalid share epoch: expected an integer'); - } - if (shareEpoch < 1) { - throw new Error('Invalid share epoch: expected a positive integer'); - } - return shareEpoch; -} - -/** - * Parse TSS setup from a JSON value. - * - * @param tssSetup - Hex-encoded setup, or `null` when unset. - * @returns The parsed setup bytes, or `null`. - */ -export function parseTssSetup(tssSetup: Json): Uint8Array | null { - if (tssSetup === null) { - return null; - } - if (typeof tssSetup !== 'string') { - throw new Error('Invalid tss setup: expected a hex string or null'); - } - return hexToBytes(tssSetup); -} - /** * Convert a public key to an address. * diff --git a/yarn.lock b/yarn.lock index 26a68d7ce..c4495cd9a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2003,6 +2003,7 @@ __metadata: "@metamask/mfa-wallet-interface": "npm:^0.0.0" "@metamask/mfa-wallet-network": "npm:^0.0.0" "@metamask/mfa-wallet-util": "npm:^0.0.0" + "@metamask/superstruct": "npm:^3.4.1" "@metamask/utils": "npm:^11.11.0" "@ts-bridge/cli": "npm:^0.6.3" "@types/jest": "npm:^29.5.12" From 67e41256ea3ead863a9e35e9673df30fcc139f1d Mon Sep 17 00:00:00 2001 From: Matthias Geihs Date: Mon, 28 Sep 2026 10:46:35 +0200 Subject: [PATCH 23/38] fix: serialize MPC keyring init with the other state-writing operations Run init inside #serializeOp with the initialized check inside the queue, so overlapping init calls run key generation or import once. The second call waits, sees the initialized state and returns. Co-authored-by: Cursor --- .../keyring-eth-mpc/src/mpc-keyring.test.ts | 15 ++++++++ packages/keyring-eth-mpc/src/mpc-keyring.ts | 37 +++++++++++-------- 2 files changed, 36 insertions(+), 16 deletions(-) diff --git a/packages/keyring-eth-mpc/src/mpc-keyring.test.ts b/packages/keyring-eth-mpc/src/mpc-keyring.test.ts index 439c71c0e..229da99c0 100644 --- a/packages/keyring-eth-mpc/src/mpc-keyring.test.ts +++ b/packages/keyring-eth-mpc/src/mpc-keyring.test.ts @@ -500,6 +500,21 @@ describe('MpcKeyring', () => { expect(await keyring.getAccounts()).toStrictEqual([mockDerivedAddress]); }); + it('runs setup once when init is called concurrently', async () => { + const keyring = makeKeyring(); + const rootSession = makeRootSession(); + mockCreateIdentity.mockResolvedValueOnce({ partyId: 'local-user' }); + mockCreateSession.mockResolvedValueOnce(rootSession); + mockCreateKey.mockResolvedValueOnce(makeThresholdKey()); + + await Promise.all([keyring.init('create'), keyring.init('create')]); + + expect(mockCreateIdentity).toHaveBeenCalledTimes(1); + expect(mockStartCreateKey).toHaveBeenCalledTimes(1); + expect(mockCreateKey).toHaveBeenCalledTimes(1); + expect(await keyring.getAccounts()).toStrictEqual([mockDerivedAddress]); + }); + it('throws when create status is not data persisted', async () => { const keyring = makeKeyring(); const rootSession = makeRootSession(); diff --git a/packages/keyring-eth-mpc/src/mpc-keyring.ts b/packages/keyring-eth-mpc/src/mpc-keyring.ts index 793548965..a05739f10 100644 --- a/packages/keyring-eth-mpc/src/mpc-keyring.ts +++ b/packages/keyring-eth-mpc/src/mpc-keyring.ts @@ -326,28 +326,33 @@ export class MpcKeyring implements Keyring { /** * Run key generation or import. `mode` may be passed directly, or taken * from setup params previously stored via {@link deserialize}. + * Serialized with sign, rotate and sync so overlapping `init` calls run + * setup once: the second call waits, sees the initialized state and returns. * * @param mode - Create a new key or import from the backend backup. + * @returns Resolves when the keyring is initialized. */ async init(mode?: MpcKeyringSetupParams['mode']): Promise { - if (this.#state?.status === 'initialized') { - return; - } + return this.#serializeOp(async () => { + if (this.#state?.status === 'initialized') { + return; + } - const resolvedMode = - mode ?? - (this.#state?.status === 'uninitialized' - ? this.#state.setup.mode - : undefined); - if (resolvedMode === undefined) { - return; - } + const resolvedMode = + mode ?? + (this.#state?.status === 'uninitialized' + ? this.#state.setup.mode + : undefined); + if (resolvedMode === undefined) { + return; + } - if (resolvedMode === 'create') { - await this.#setupCreate(); - } else { - await this.#setupImport(); - } + if (resolvedMode === 'create') { + await this.#setupCreate(); + } else { + await this.#setupImport(); + } + }); } /** From 043a7088e89b1efd7b6919416d79658eed6a20d6 Mon Sep 17 00:00:00 2001 From: Matthias Geihs Date: Mon, 28 Sep 2026 11:10:31 +0200 Subject: [PATCH 24/38] lint --- packages/keyring-eth-mpc/src/cloud.test.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/keyring-eth-mpc/src/cloud.test.ts b/packages/keyring-eth-mpc/src/cloud.test.ts index f8185b683..730b762de 100644 --- a/packages/keyring-eth-mpc/src/cloud.test.ts +++ b/packages/keyring-eth-mpc/src/cloud.test.ts @@ -111,7 +111,9 @@ describe('cloud helpers', () => { baseURL: 'https://cloud.example', token: 'token-1', }), - ).rejects.toThrow(/^Failed to get server network id: bad response format$/u); + ).rejects.toThrow( + /^Failed to get server network id: bad response format$/u, + ); }); it('throws when getting the server network id fails', async () => { @@ -436,7 +438,9 @@ describe('cloud helpers', () => { baseURL: 'https://cloud.example', token: 'token-1', }), - ).rejects.toThrow(/^Failed to load key share backup: bad response format$/u); + ).rejects.toThrow( + /^Failed to load key share backup: bad response format$/u, + ); }); it('throws when loading a key share backup fails', async () => { From 4b24aef20a80aa4757a77be6a406c38190980c75 Mon Sep 17 00:00:00 2001 From: Matthias Geihs Date: Mon, 28 Sep 2026 16:17:28 +0200 Subject: [PATCH 25/38] refactor: adopt the renamed MFA wallet SDK packages The SDK dropped the -lib suffix and the util package. The keyring now uses the network package's identity serializer and scoped session id. Co-authored-by: Cursor --- package.json | 5 +- .../metamask-mfa-wallet-cl24-0.0.0.tgz | Bin 0 -> 77311 bytes .../metamask-mfa-wallet-cl24-lib-0.0.0.tgz | Bin 58336 -> 0 bytes .../metamask-mfa-wallet-dkls23-0.0.0.tgz | Bin 0 -> 8336 bytes .../metamask-mfa-wallet-dkls23-lib-0.0.0.tgz | Bin 8300 -> 0 bytes .../metamask-mfa-wallet-e2ee-0.0.0.tgz | Bin 38443 -> 38669 bytes .../metamask-mfa-wallet-interface-0.0.0.tgz | Bin 5627 -> 6027 bytes .../metamask-mfa-wallet-network-0.0.0.tgz | Bin 55472 -> 61361 bytes .../metamask-mfa-wallet-util-0.0.0.tgz | Bin 8276 -> 0 bytes packages/keyring-eth-mpc/package.json | 10 ++-- .../keyring-eth-mpc/src/mpc-keyring.test.ts | 12 ++-- packages/keyring-eth-mpc/src/mpc-keyring.ts | 20 +++---- packages/keyring-eth-mpc/src/types.ts | 10 ++-- yarn.lock | 52 +++++++++--------- 14 files changed, 53 insertions(+), 56 deletions(-) create mode 100644 packages/keyring-eth-mpc/metamask-mfa-wallet-cl24-0.0.0.tgz delete mode 100644 packages/keyring-eth-mpc/metamask-mfa-wallet-cl24-lib-0.0.0.tgz create mode 100644 packages/keyring-eth-mpc/metamask-mfa-wallet-dkls23-0.0.0.tgz delete mode 100644 packages/keyring-eth-mpc/metamask-mfa-wallet-dkls23-lib-0.0.0.tgz delete mode 100644 packages/keyring-eth-mpc/metamask-mfa-wallet-util-0.0.0.tgz diff --git a/package.json b/package.json index 258efb8d1..1ee011eeb 100644 --- a/package.json +++ b/package.json @@ -82,12 +82,11 @@ "typescript-eslint": "^8.48.0" }, "resolutions": { - "@metamask/mfa-wallet-cl24-lib": "file:./packages/keyring-eth-mpc/metamask-mfa-wallet-cl24-lib-0.0.0.tgz", - "@metamask/mfa-wallet-dkls23-lib": "file:./packages/keyring-eth-mpc/metamask-mfa-wallet-dkls23-lib-0.0.0.tgz", + "@metamask/mfa-wallet-cl24": "file:./packages/keyring-eth-mpc/metamask-mfa-wallet-cl24-0.0.0.tgz", + "@metamask/mfa-wallet-dkls23": "file:./packages/keyring-eth-mpc/metamask-mfa-wallet-dkls23-0.0.0.tgz", "@metamask/mfa-wallet-e2ee": "file:./packages/keyring-eth-mpc/metamask-mfa-wallet-e2ee-0.0.0.tgz", "@metamask/mfa-wallet-interface": "file:./packages/keyring-eth-mpc/metamask-mfa-wallet-interface-0.0.0.tgz", "@metamask/mfa-wallet-network": "file:./packages/keyring-eth-mpc/metamask-mfa-wallet-network-0.0.0.tgz", - "@metamask/mfa-wallet-util": "file:./packages/keyring-eth-mpc/metamask-mfa-wallet-util-0.0.0.tgz", "@types/node": "^20.12.12", "@types/web": "^0.0.69", "@typescript/lib-dom": "npm:@types/web@^0.0.69", diff --git a/packages/keyring-eth-mpc/metamask-mfa-wallet-cl24-0.0.0.tgz b/packages/keyring-eth-mpc/metamask-mfa-wallet-cl24-0.0.0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..8d7ed0426e9d3542fcdaad4d7dcc28cde0a622ab GIT binary patch literal 77311 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 gcj3Hs0Kp;^1poj5 literal 0 HcmV?d00001 diff --git a/packages/keyring-eth-mpc/metamask-mfa-wallet-cl24-lib-0.0.0.tgz b/packages/keyring-eth-mpc/metamask-mfa-wallet-cl24-lib-0.0.0.tgz deleted file mode 100644 index 81d332609bc1656a70da27be2a57eac323437dc2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 58336 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%0A&bGhrhqXIwRXTh87N1B;+ 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 diff --git a/packages/keyring-eth-mpc/metamask-mfa-wallet-e2ee-0.0.0.tgz b/packages/keyring-eth-mpc/metamask-mfa-wallet-e2ee-0.0.0.tgz index e910c6d8d2c90b38f4118da5ec66f4919c6595a0..cd06498630415e14fd71b8566d5c85cf4626bc39 100644 GIT binary patch literal 38669 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 literal 38443 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 z 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 BJPZH; literal 5627 zcmZWtWmMA-)Fwxl!znRR8l(gyN24MkDItiIG)R|2QfUNX#6~HgNKBMex*I2q6eN_6 zk#1wZ*Z2SJJ@5T=KiqrHJ?FX4d7gWDQ)tQl3-F%0SLl3mx7mOApv0AYKnVXXA*Rd0S<_xqSQvyl zaNv)NvBP}o6r#|vgXK#h)WDVj_n*g^+A$>;|!tY{Ql6x-|YM>n*s2H zM&bCdW{3Cog6muQ7wz87A=JumY+Gz=tr}C3_Zi(iCX>MHf%894vT9U&Z*>~3J7a?H z8)&9xMaL08?PN&I>gaE{C9O)Dy!7$OySgz1KK$K%l$9Wwb-=Diw4~wBMc)<180uSb zv3;vq+eudcZrIf7%5T=)vy+UQJ-#qKq_~86y|=Bbi_X$`b^@<#jYLcW^IChR+kkM% z5@(D&Mw3}Txvcdk(l1?v%9~^1ab;@*i}nlaoWS)3;RqYU4d``(iUPTw433Rr z|78IaJT=)uA@~n-*x*1d<)UF(p@qT=W=3qA`63(k>2CU9&Ay;!u>HWS!hK{x&SdLm z{Fwn01IW%LR zch_s(1sG=^I&VLO-fK1BxJLnzbq-Mt*qh5jJmfHn9_R)4&NDuWc{C#^A3u8A+{?>m zUkY0AOGPI;ofg}|KO?=w)!W}KG86F1!#^Z2n{&d`G+sod>9ELYv3;l8KWbiG_{a7( z=<2m`eKA?#?w;6($5_{6mjiDDrtGXQZ=$0K4JlT9b#yFI0+;(q9(<@f% z+9Wfjg;b46)|W3lY2KjvDHSg!hih-vW=eDdctRt|VgqNnKL1FOpQZeB?c1@hBV|2? z3h7%pt-Sw5Ma0%_hjF-MnjCp^(!mo+zS$Au?*3VV+JVs_C^AQ*BxJ(z+*U*yw4!(Z z@%<^jr1V7t#JkAjYxTHS398Ggjkchk$>i3|2i36BQ+C@la~g+llbaIryt`yo%(hF+ z(8T#Y#t2g=dsoQvL zh(MJBG?tj<%SUv0U^~UaIV&&E+fQ8*&DbR|13D?JRIBn;Mr`Kx*;ki+?Z8CSZ1(UE z9t@pc-T1aP*SRj5`xLiMXZk2f)fvNK-ehpendjBX6RrI%o7o#15WU{ws$U9IX#P{? zEJwxOISJh+GuZz@XQf2@m5z(DR{Tgn5FUQmYk;5BU)ZRdKqcZ$*7B3L7^jjx1tee> z3{WJj8NQ<}lJ68QXo`436_#Uv+pJacqa@4JV9;dCLBya)sNE(d6V9KFokRrxYE&(< ztum!5?o9JFdH`jGCwE?+WtqKKBcDa$L7qD(ca^o2pK}d&s)if))zAEeZt&RwSXE19 zykj+#=f(-Vu7A5OBmVDU+zwFL&9tl}@gp>ax^?pA4~8sm_GIeX33aScLIgiPjp0-& z;aN*;v|uJ@EW<%EwLz23T-%eb-@;@Qx5`nR%JGfAt*A3qSzeg zm!Z18kAT*US)4`GG^aokV%<0jI|GeQjXK-5KOcJJHHZ@1;6TK>TW#^AMqxp)JPGEy zi{mLf5k1tlAhN_fD72Q)n#KW1vn+^KLR`?A*n5Q~?^Dpz`pp(^YIJK)|K1wP58v7$ zJvwZVBE=`ZklAmz?YbR^l3{1UloGBVr9hD6Bn-EzHqD7U%dhu(w>>V~XSGa16Kj|9 z=ko?(TFkiMRlHN5hJd-W_SJ^L<43EUwQpA0E}$462;PtPZ-s9@Zx+jH;_a}ZGVS@+ z!+jF^ouhW*C2ua%rx{uqX_D&VvPnOjMpcfqKs)-O{%LIXnUZT%cCM0Kn~kEiOmnG` zsP0*AOM#$kZtmM}MjQ(^hN=Uj$%cw_cylnN_#5pae%94KvrArxcnmKKjLdUoX z0_L`N5Z}qVVrL7*PKq*pQKUL~ict&@x3uI!Y>E`^0DP$+z3}_YGwkHrv`$9~@pUPj z7LE`{t&3!h%j&0^PbVv#*tA}5V(x@t6Y33%$5XIOv~^r3bDr!3*0U55b~d-V3_c5F zVhpVRDlFk0aFaA0b10oS;>Rw{_jM(0weq9B&FLqUTV_L6k*O{Q6t5`wBZW4>7ESGx z0;7&gv<;{u|K(F&pT8n%4(tt_1Cf^Rfx?)&9$*1h4@__p?va+q&w(>f68!loO&28* zaIpLh_ojm2;dXd{cM@1AB$3RG2yhO-kCvk2cMMZ?S}Q9TAXlS#dalZWjdA|?5OQ7fF@9JT-bFeXfQk4OvP$9>zDfZqlMnh zrsj!1AGzZ6CN8&JJJVEVyD=lrL0;DjY>eIHRH3tR?n4|G(i)UHV6NIVzPKM{Y&xL17{}vq0*vO%57LCOB_2rAOsBDes5}TAB?2tNR8V1l}Y zEzaGY2YRCaUcv?I{V$uMKr3<*nz@vdiS=UuoyKYpm}H({`mT6Df~l05Kq{^c6rFKu zq1sZh{$QFEjWU^@5`F?bn<}1B_S6dQVEfIZnFd2EiW|ac3war8;-oLXp895%b=o$F z%)IS;M)B~J>LXSyAH^zAfJ)(irVar zF`2;cj13Yc!gr{5BsrbqFYh5?>f+82!IVqz*loC{*6D}4k!ldcn@yR5Q3Q?WgCx_8 zhmm5Vc6?N~l!W+MD!t{Lzjkf9%Q(Jgxqk7%Lojd`u$9;3y#kC7;EI%Tq`ae!RDf5V zNKJfK z`J>b;s{tp-tyWNgaNQGfO+*0 z;U9q2mK}{6_4E}$LI=@*PG)zrv?-(mu#k!c2*rRDMWsa>+!16124iGt z4Itm`aZ$(mBHqD|3pI2uN?n?3VYi@2K6|PrFa}}DX{6KiQB_kfkqjAQn{QS3v3;0z zA|UaoH13Y40&D39hNtpt)4fMOL^q3`tTG!db+P?cI=Jq81!Z0{perXp)sM}i>+Peg zb80&24#cAOFL>|E8c!jc8J*NEQ5w`;mU|j41P=GnC;3NKor-z9+Q^RqOG&E~;~eUm z?(SaX%q-ZMHMbb2xo3+ptac*1>)Rp93Yb^m))kK1N@+XGZU;hm|#rl z%uVshjwHu_jOQWL8cpe?F4wx#1|%-!E5GI0YeYD^qpDz!QLB`vQ4EiVTIh|Z%yFF! zb4&>3*v6OpsmP*@ew}mb!5@T!2+fg2ew-nNF3mr?#`f_yIs!x zGkkb&Z&iX!Fs0k8xB~5ku+6#t8^?+9nVqum7h&)Ep;}=Kg}e_oLmTCr&!>G#T?T+1 zb+Vjmz`=gyDzFqCPI4ElHzOij(Ji=>_n&@W*x85?tvWHop2~?sgN3gCLfU>PCIr+= zxM5yy)fW|*%VC8s3ySBwf*vdoQ8i9n(#rkS-CQ_rBX@}EQ_A3yed^u4fq%qnVS`L(ZY7#gE*=8CzRfQ z;)za-Ddfk0eOXuTkHfVTc09gRMfiH2dW%YQsE)=_9|7}- z+-m^#?DcuaJ~qUaw5thH1qHjopPNvS0oG>AeanyU(Iyi;290YjP!Kll_5H# zt>@?``bvg+%$S!j#n;Hh@J2!YF~#8kjn$!Uo0i@o-J|AUwOm#uHhH-7Jv+$^HJ-!! zu_rfF6O@%XbKST_ghU4Y(D(80>3`*1Ha|!J*{u1X(;G7TU8=pm$_6xoN^8&yO*9DqTnio;`~!HY zn*F;@Qn0{?1DWsyFmepwh#hKx^#4iW*?$1pz@Xm-NJMQzyCK=}0buwOXmeb6^9N9( za3qmBa!iMO;_GN3J3vH*xCy`#V!jNpc;Sf4`h0IP|DHC`glm&{dKJEEwK%VQ**6gZNPkzkcJxaIp!Ys`gLtSl8!m ziu2@Rx(e9@=5LY@V}Nf<>!fAU{)?|bs35D$;e>UoMWVX3a)l52gI)wg%;v3=#kZW6 z);IT=i>l4l0-v{=p>cY)3QCqTI@|CfRv{Ar+x5yG=*T9LLQS*(7lrzGz>#z%WO=dN<3Vby|uc>-84vdPWfC)#T5S0Jxc0Vaz1w}UQe~>&7`|L z{;KP@bHVvJgFmd#H17Fvj#7tyXj3h$H$f$=2ZBqeSCOD8DaoS4P5rnjO7_*+N4Pdk zEqau;n0576#5*~~A(sdnMf-u0Yv1G3l~KEI4KrE45Tk7v8y<~RScm916O6^!=Gve4VM zh_yX;I*rXB6%=UL)(Seeq%)QZ>TTAVqR`=AmqrU;W?9(E9ew()hDVrRy-{eH+=tjn z>-;q z$+kY{&Jta=~0%YBMq`J7+3-A^_4 zn8C#_ILb+fZLY>Rb!fXPtl^Gh(q_dgH9XBIv`07Av#_dv+h-XZB$y+eiUg|;vgrqTL3-el$yEn`r#*u9IA*rh95SNOSp04 zvZ{3(40Aa@dq0z<@4QAUi`h|r@EA=!aqO3#IT8n}%W#yyKhplr#5?ZlT SbTDorY}gN;`WL~5_tJfH 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�w%EDznS9j{pm4e3i*6@Delv6jJj{3MFtL+lFq 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 So*9<`!P)zQ>p;YzLH-XxI<#5< literal 55472 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 z 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 diff --git a/packages/keyring-eth-mpc/metamask-mfa-wallet-util-0.0.0.tgz b/packages/keyring-eth-mpc/metamask-mfa-wallet-util-0.0.0.tgz deleted file mode 100644 index 6d4a2b389376fb9c4738a1b85801c6c14647c46f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8276 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 SC`I{Z%KrmahvxGDE&%|uZK#<5 diff --git a/packages/keyring-eth-mpc/package.json b/packages/keyring-eth-mpc/package.json index ee7260a20..4fd93b4f6 100644 --- a/packages/keyring-eth-mpc/package.json +++ b/packages/keyring-eth-mpc/package.json @@ -57,12 +57,11 @@ "dependencies": { "@ethereumjs/util": "^9.1.0", "@metamask/eth-sig-util": "^9.0.0", - "@metamask/mfa-wallet-cl24-lib": "^0.0.0", - "@metamask/mfa-wallet-dkls23-lib": "^0.0.0", - "@metamask/mfa-wallet-e2ee": "^0.0.0", + "@metamask/mfa-wallet-cl24": "^0.0.0", + "@metamask/mfa-wallet-dkls23": "^0.0.0", "@metamask/mfa-wallet-network": "^0.0.0", - "@metamask/mfa-wallet-util": "^0.0.0", - "@metamask/superstruct": "^3.4.1" + "@metamask/superstruct": "^3.4.1", + "@metamask/utils": "^11.11.0" }, "devDependencies": { "@ethereumjs/tx": "^5.4.0", @@ -71,7 +70,6 @@ "@metamask/auto-changelog": "^6.1.0", "@metamask/keyring-utils": "^5.0.0", "@metamask/mfa-wallet-interface": "^0.0.0", - "@metamask/utils": "^11.11.0", "@ts-bridge/cli": "^0.6.3", "@types/jest": "^29.5.12", "deepmerge": "^4.2.2", diff --git a/packages/keyring-eth-mpc/src/mpc-keyring.test.ts b/packages/keyring-eth-mpc/src/mpc-keyring.test.ts index 229da99c0..745bb0ede 100644 --- a/packages/keyring-eth-mpc/src/mpc-keyring.test.ts +++ b/packages/keyring-eth-mpc/src/mpc-keyring.test.ts @@ -36,7 +36,7 @@ const mockEthSignature = new Uint8Array(65); mockEthSignature[64] = 27; const mockBackupKey = new Uint8Array(32).fill(7); -jest.mock('@metamask/mfa-wallet-cl24-lib', () => { +jest.mock('@metamask/mfa-wallet-cl24', () => { class MockCL24DKM { createKey(...args: unknown[]) { return mockCreateKey(...args); @@ -74,7 +74,7 @@ jest.mock('@metamask/mfa-wallet-cl24-lib', () => { }); jest.mock('@metamask/mfa-wallet-network', () => { - class MockMfaNetworkManager { + class MockCentrifugeNetworkManager { constructor(opts: Record) { lastNetworkManagerOptions = opts; } @@ -88,7 +88,7 @@ jest.mock('@metamask/mfa-wallet-network', () => { } } - class MockMfaNetworkIdentitySerializer { + class MockCentrifugeIdentitySerializer { toJson(value: unknown) { return mockNetworkIdentityToJson(value); } @@ -99,14 +99,14 @@ jest.mock('@metamask/mfa-wallet-network', () => { } return { - MfaNetworkManager: MockMfaNetworkManager, - MfaNetworkIdentitySerializer: MockMfaNetworkIdentitySerializer, + CentrifugeNetworkManager: MockCentrifugeNetworkManager, + CentrifugeIdentitySerializer: MockCentrifugeIdentitySerializer, createScopedSessionId: (...args: unknown[]) => mockCreateScopedSessionId(...args), }; }); -jest.mock('@metamask/mfa-wallet-dkls23-lib', () => { +jest.mock('@metamask/mfa-wallet-dkls23', () => { class MockDkls23TssLib { setup(...args: unknown[]) { return mockDklsSetup(...args); diff --git a/packages/keyring-eth-mpc/src/mpc-keyring.ts b/packages/keyring-eth-mpc/src/mpc-keyring.ts index a05739f10..0b75a7bd1 100644 --- a/packages/keyring-eth-mpc/src/mpc-keyring.ts +++ b/packages/keyring-eth-mpc/src/mpc-keyring.ts @@ -14,19 +14,19 @@ import { CL24ThresholdKeySerializer, dealersFromCL24Key, secp256k1 as secp256k1Curve, -} from '@metamask/mfa-wallet-cl24-lib'; -import type { CL24ThresholdKey } from '@metamask/mfa-wallet-cl24-lib'; -import { Dkls23TssLib } from '@metamask/mfa-wallet-dkls23-lib'; +} from '@metamask/mfa-wallet-cl24'; +import type { CL24ThresholdKey } from '@metamask/mfa-wallet-cl24'; +import { Dkls23TssLib } from '@metamask/mfa-wallet-dkls23'; import type { PartyId, RandomNumberGenerator, RootNetworkSession, ShareBinding, } from '@metamask/mfa-wallet-interface'; -import type { MfaNetworkIdentity } from '@metamask/mfa-wallet-network'; +import type { CentrifugeIdentity } from '@metamask/mfa-wallet-network'; import { - MfaNetworkIdentitySerializer, - MfaNetworkManager, + CentrifugeIdentitySerializer, + CentrifugeNetworkManager, createScopedSessionId, } from '@metamask/mfa-wallet-network'; import { @@ -205,7 +205,7 @@ export class MpcKeyring implements Keyring { readonly #rng: RandomNumberGenerator; - readonly #networkManager: MfaNetworkManager; + readonly #networkManager: CentrifugeNetworkManager; readonly #tss: Dkls23TssLib; @@ -240,9 +240,9 @@ export class MpcKeyring implements Keyring { this.#cloudURL = opts.cloudURL; this.#serializer = { thresholdKey: new CL24ThresholdKeySerializer(), - networkIdentity: new MfaNetworkIdentitySerializer(), + networkIdentity: new CentrifugeIdentitySerializer(), }; - this.#networkManager = new MfaNetworkManager({ + this.#networkManager = new CentrifugeNetworkManager({ url: opts.relayerURL, randomBytes: { getRandomValues: (array: Uint8Array): Uint8Array => { @@ -825,7 +825,7 @@ export class MpcKeyring implements Keyring { } async #createNetworkSession( - netCreds: MfaNetworkIdentity, + netCreds: CentrifugeIdentity, serverNetId: PartyId, nonce: string, ): Promise { diff --git a/packages/keyring-eth-mpc/src/types.ts b/packages/keyring-eth-mpc/src/types.ts index b1b1a1fd6..44c6de31a 100644 --- a/packages/keyring-eth-mpc/src/types.ts +++ b/packages/keyring-eth-mpc/src/types.ts @@ -1,6 +1,6 @@ -import type { CL24ThresholdKey } from '@metamask/mfa-wallet-cl24-lib'; -import type { Dkls23TssLib } from '@metamask/mfa-wallet-dkls23-lib'; -import type { MfaNetworkIdentity } from '@metamask/mfa-wallet-network'; +import type { CL24ThresholdKey } from '@metamask/mfa-wallet-cl24'; +import type { Dkls23TssLib } from '@metamask/mfa-wallet-dkls23'; +import type { CentrifugeIdentity } from '@metamask/mfa-wallet-network'; import type { Json } from '@metamask/utils'; export type ProfileTokenOpts = { @@ -24,7 +24,7 @@ export type MpcKeyringOpts = { export type MpcKeyringState = { keyShare: CL24ThresholdKey; shareEpoch: number; - netCreds: MfaNetworkIdentity; + netCreds: CentrifugeIdentity; serverNetId: string; tssSetup: Uint8Array | null; }; @@ -53,5 +53,5 @@ export type MpcKeyringStorageState = export type MpcKeyringSerializer = { thresholdKey: JsonSerializer; - networkIdentity: JsonSerializer; + networkIdentity: JsonSerializer; }; diff --git a/yarn.lock b/yarn.lock index c4495cd9a..7818fe1b7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1997,12 +1997,10 @@ __metadata: "@metamask/auto-changelog": "npm:^6.1.0" "@metamask/eth-sig-util": "npm:^9.0.0" "@metamask/keyring-utils": "npm:^5.0.0" - "@metamask/mfa-wallet-cl24-lib": "npm:^0.0.0" - "@metamask/mfa-wallet-dkls23-lib": "npm:^0.0.0" - "@metamask/mfa-wallet-e2ee": "npm:^0.0.0" + "@metamask/mfa-wallet-cl24": "npm:^0.0.0" + "@metamask/mfa-wallet-dkls23": "npm:^0.0.0" "@metamask/mfa-wallet-interface": "npm:^0.0.0" "@metamask/mfa-wallet-network": "npm:^0.0.0" - "@metamask/mfa-wallet-util": "npm:^0.0.0" "@metamask/superstruct": "npm:^3.4.1" "@metamask/utils": "npm:^11.11.0" "@ts-bridge/cli": "npm:^0.6.3" @@ -2503,61 +2501,63 @@ __metadata: languageName: node linkType: hard -"@metamask/mfa-wallet-cl24-lib@file:./packages/keyring-eth-mpc/metamask-mfa-wallet-cl24-lib-0.0.0.tgz::locator=%40metamask%2Faccounts-monorepo%40workspace%3A.": +"@metamask/mfa-wallet-cl24@file:./packages/keyring-eth-mpc/metamask-mfa-wallet-cl24-0.0.0.tgz::locator=%40metamask%2Faccounts-monorepo%40workspace%3A.": version: 0.0.0 - resolution: "@metamask/mfa-wallet-cl24-lib@file:./packages/keyring-eth-mpc/metamask-mfa-wallet-cl24-lib-0.0.0.tgz#./packages/keyring-eth-mpc/metamask-mfa-wallet-cl24-lib-0.0.0.tgz::hash=4e48d0&locator=%40metamask%2Faccounts-monorepo%40workspace%3A." + resolution: "@metamask/mfa-wallet-cl24@file:./packages/keyring-eth-mpc/metamask-mfa-wallet-cl24-0.0.0.tgz#./packages/keyring-eth-mpc/metamask-mfa-wallet-cl24-0.0.0.tgz::hash=c5c65e&locator=%40metamask%2Faccounts-monorepo%40workspace%3A." dependencies: "@msgpack/msgpack": "npm:^3.1.2" "@noble/curves": "npm:^1.9.2" "@noble/hashes": "npm:^1.8.0" - checksum: 10/8d1c5e32823fa97b656ab4287e4f17ed0a7fc3a00ab3d2d9ea0ff161a701176355f03d4317132edc7c9736e95459e745ceaf33d89953140297148264fef839de + checksum: 10/fa8f8f149546fcd3372eda3fa691698fe372d0208e3b64c3518a863054deb078d0b865516db807daecd310e177067777474953e9a2a8370255668e261b61c085 languageName: node linkType: hard -"@metamask/mfa-wallet-dkls23-lib@file:./packages/keyring-eth-mpc/metamask-mfa-wallet-dkls23-lib-0.0.0.tgz::locator=%40metamask%2Faccounts-monorepo%40workspace%3A.": +"@metamask/mfa-wallet-dkls23@file:./packages/keyring-eth-mpc/metamask-mfa-wallet-dkls23-0.0.0.tgz::locator=%40metamask%2Faccounts-monorepo%40workspace%3A.": version: 0.0.0 - resolution: "@metamask/mfa-wallet-dkls23-lib@file:./packages/keyring-eth-mpc/metamask-mfa-wallet-dkls23-lib-0.0.0.tgz#./packages/keyring-eth-mpc/metamask-mfa-wallet-dkls23-lib-0.0.0.tgz::hash=5a83f7&locator=%40metamask%2Faccounts-monorepo%40workspace%3A." + resolution: "@metamask/mfa-wallet-dkls23@file:./packages/keyring-eth-mpc/metamask-mfa-wallet-dkls23-0.0.0.tgz#./packages/keyring-eth-mpc/metamask-mfa-wallet-dkls23-0.0.0.tgz::hash=d7e4c4&locator=%40metamask%2Faccounts-monorepo%40workspace%3A." dependencies: - "@metamask/mfa-wallet-util": "npm:^0.0.0" + "@metamask/mpc-interface": "npm:^0.1.0" "@noble/curves": "npm:^1.9.2" - checksum: 10/cab98dc3f6de7b065d5854aa8e23cd928dc628f4d40c78417e511c50b4b08aeb80e1a5a1a5a5cdce8d2f9271bd2928c23b79ee6614221784b24c032ef77a2b0f + checksum: 10/903676420e9564880108723970cf738a940b8dea5cd40ac9481c39b75148121069fb33d44349843f1b604e7ac3baecdaaf1103f38b5cb6f368331981ac058173 languageName: node linkType: hard "@metamask/mfa-wallet-e2ee@file:./packages/keyring-eth-mpc/metamask-mfa-wallet-e2ee-0.0.0.tgz::locator=%40metamask%2Faccounts-monorepo%40workspace%3A.": version: 0.0.0 - resolution: "@metamask/mfa-wallet-e2ee@file:./packages/keyring-eth-mpc/metamask-mfa-wallet-e2ee-0.0.0.tgz#./packages/keyring-eth-mpc/metamask-mfa-wallet-e2ee-0.0.0.tgz::hash=b1f8ae&locator=%40metamask%2Faccounts-monorepo%40workspace%3A." + resolution: "@metamask/mfa-wallet-e2ee@file:./packages/keyring-eth-mpc/metamask-mfa-wallet-e2ee-0.0.0.tgz#./packages/keyring-eth-mpc/metamask-mfa-wallet-e2ee-0.0.0.tgz::hash=74f676&locator=%40metamask%2Faccounts-monorepo%40workspace%3A." dependencies: + "@metamask/mfa-wallet-interface": "npm:^0.0.0" "@msgpack/msgpack": "npm:^3.1.2" "@noble/ciphers": "npm:^1.3.0" "@noble/curves": "npm:^1.9.2" "@noble/hashes": "npm:^1.8.0" - checksum: 10/33df44ec33e032f457978685b05b91cedb87f9da2453d336d4090cc82ad70a882b61d177b970ac03a70c7d7ec439146afdb5a5d2860789905132bbcaee568f70 + checksum: 10/5caaad16babe2d7e0e092b7c6631178283734f94cbd2976acdaec08e23b1184daf091dbf927a7baf4a1c49d14ea97d3d50843146de6d332e300328ad2426b5f9 languageName: node linkType: hard "@metamask/mfa-wallet-interface@file:./packages/keyring-eth-mpc/metamask-mfa-wallet-interface-0.0.0.tgz::locator=%40metamask%2Faccounts-monorepo%40workspace%3A.": version: 0.0.0 - resolution: "@metamask/mfa-wallet-interface@file:./packages/keyring-eth-mpc/metamask-mfa-wallet-interface-0.0.0.tgz#./packages/keyring-eth-mpc/metamask-mfa-wallet-interface-0.0.0.tgz::hash=309a1e&locator=%40metamask%2Faccounts-monorepo%40workspace%3A." - checksum: 10/27046deb25db1a7d4fdca63e5bf069b8107b2206ce30985f5453aa51a4f2d6c26575b422b7a80b59f78bf6b44dc613bb1ad9f29a32205a75e6a92ae23adb5f3a + resolution: "@metamask/mfa-wallet-interface@file:./packages/keyring-eth-mpc/metamask-mfa-wallet-interface-0.0.0.tgz#./packages/keyring-eth-mpc/metamask-mfa-wallet-interface-0.0.0.tgz::hash=3a12d6&locator=%40metamask%2Faccounts-monorepo%40workspace%3A." + checksum: 10/99bee43e3c3cde5f9e53986c6dc9fe96414459abf5728f9171da5f5294fb94bd96832b05b0550e14eaa0008c6eb110829554646788e13e00bacc57cb27ca56b5 languageName: node linkType: hard "@metamask/mfa-wallet-network@file:./packages/keyring-eth-mpc/metamask-mfa-wallet-network-0.0.0.tgz::locator=%40metamask%2Faccounts-monorepo%40workspace%3A.": version: 0.0.0 - resolution: "@metamask/mfa-wallet-network@file:./packages/keyring-eth-mpc/metamask-mfa-wallet-network-0.0.0.tgz#./packages/keyring-eth-mpc/metamask-mfa-wallet-network-0.0.0.tgz::hash=5e5b38&locator=%40metamask%2Faccounts-monorepo%40workspace%3A." + resolution: "@metamask/mfa-wallet-network@file:./packages/keyring-eth-mpc/metamask-mfa-wallet-network-0.0.0.tgz#./packages/keyring-eth-mpc/metamask-mfa-wallet-network-0.0.0.tgz::hash=afa316&locator=%40metamask%2Faccounts-monorepo%40workspace%3A." dependencies: "@metamask/mfa-wallet-e2ee": "npm:^0.0.0" + "@metamask/mfa-wallet-interface": "npm:^0.0.0" "@noble/hashes": "npm:^1.8.0" - centrifuge: "npm:^5.5.2" - checksum: 10/98cb8c5cad46af2d1aa87a8885ace59e0e75cec5609d2f2152417927262f72cdfe0586b32af8a255bb3217f1ffdfee07bc81cf1b2940f530f61c451eefb4a286 + centrifuge: "npm:^5.7.2" + checksum: 10/6c09ee78cf98b66eb2aeb82ff47f682baa6cd2bf36b495ffbf537091f633401a90b9f793533fbadb947bb1e59cfac081ff10f36304f73f9fe460f3a31099b4de languageName: node linkType: hard -"@metamask/mfa-wallet-util@file:./packages/keyring-eth-mpc/metamask-mfa-wallet-util-0.0.0.tgz::locator=%40metamask%2Faccounts-monorepo%40workspace%3A.": - version: 0.0.0 - resolution: "@metamask/mfa-wallet-util@file:./packages/keyring-eth-mpc/metamask-mfa-wallet-util-0.0.0.tgz#./packages/keyring-eth-mpc/metamask-mfa-wallet-util-0.0.0.tgz::hash=3f0779&locator=%40metamask%2Faccounts-monorepo%40workspace%3A." - checksum: 10/a1c4ab9188b7df9ecc77b9fe37b1f16b0897fc0334f917b8ade80d1d09dcf03cf9cdbf0cd160f0dcea8be0394c45c186a2e8429452c572cc3370257f35f2c1f6 +"@metamask/mpc-interface@npm:^0.1.0": + version: 0.1.0 + resolution: "@metamask/mpc-interface@npm:0.1.0" + checksum: 10/a08be84ecc0216de39f89e4a7a21195891e904071f42a66a8d7382980e58754a242b1df32bbce827ecc292e5eedbf614f5fd52b4c8ba2c02b5e1e537e976608b languageName: node linkType: hard @@ -6274,13 +6274,13 @@ __metadata: languageName: node linkType: hard -"centrifuge@npm:^5.5.2": - version: 5.7.2 - resolution: "centrifuge@npm:5.7.2" +"centrifuge@npm:^5.7.2": + version: 5.7.4 + resolution: "centrifuge@npm:5.7.4" dependencies: events: "npm:^3.3.0" protobufjs: "npm:^7.6.0" - checksum: 10/a5c376b88938800aa5afc164fe6c3f2da52c74838c10428b8846f69db7fd7bd6988fb143cdca187fc529ade8c579565eb221aa5125f05a130ae57e4fbea697df + checksum: 10/ec541393391999b0ba1fb73d5645a9d23fa84cf9edbc3907b36b4d7b17bde2efdd6aa8dc6da74dc18b23c829f9a8d1488e450cad54654ddb18ebdaef5ca8be24 languageName: node linkType: hard From 47cafb017cd38a620ca98811b91bfb1764786d6c Mon Sep 17 00:00:00 2001 From: Charly Chevalier Date: Mon, 12 Oct 2026 14:20:02 +0200 Subject: [PATCH 26/38] fix(keyring-eth-mpc): re-align with MFA SDK (#666) Changes required after the changes made to the MFA SDK. --- jest.config.packages.js | 6 + package.json | 5 - .../{jest.config.js => jest.config.cjs} | 0 .../metamask-mfa-wallet-cl24-0.0.0.tgz | Bin 77311 -> 0 bytes .../metamask-mfa-wallet-dkls23-0.0.0.tgz | Bin 8336 -> 0 bytes .../metamask-mfa-wallet-e2ee-0.0.0.tgz | Bin 38669 -> 0 bytes .../metamask-mfa-wallet-interface-0.0.0.tgz | Bin 6027 -> 0 bytes .../metamask-mfa-wallet-network-0.0.0.tgz | Bin 61361 -> 0 bytes packages/keyring-eth-mpc/package.json | 46 +++---- .../keyring-eth-mpc/src/mpc-keyring.test.ts | 34 ++---- packages/keyring-eth-mpc/src/mpc-keyring.ts | 37 ++---- packages/keyring-eth-mpc/src/types.ts | 5 +- packages/keyring-eth-mpc/src/util.test.ts | 10 +- packages/keyring-eth-mpc/src/util.ts | 12 +- packages/keyring-eth-mpc/v2.js | 3 - yarn.config.cjs | 112 ++++++++++++------ yarn.lock | 91 ++++++-------- 17 files changed, 168 insertions(+), 193 deletions(-) rename packages/keyring-eth-mpc/{jest.config.js => jest.config.cjs} (100%) delete mode 100644 packages/keyring-eth-mpc/metamask-mfa-wallet-cl24-0.0.0.tgz delete mode 100644 packages/keyring-eth-mpc/metamask-mfa-wallet-dkls23-0.0.0.tgz delete mode 100644 packages/keyring-eth-mpc/metamask-mfa-wallet-e2ee-0.0.0.tgz delete mode 100644 packages/keyring-eth-mpc/metamask-mfa-wallet-interface-0.0.0.tgz delete mode 100644 packages/keyring-eth-mpc/metamask-mfa-wallet-network-0.0.0.tgz delete mode 100644 packages/keyring-eth-mpc/v2.js diff --git a/jest.config.packages.js b/jest.config.packages.js index e1bb76d07..45b20fbdb 100644 --- a/jest.config.packages.js +++ b/jest.config.packages.js @@ -97,6 +97,12 @@ module.exports = { // Some @metamask/* packages we are referencing aren't in this monorepo, // so in that case use their published versions '/../../node_modules/@metamask/$1', + // Some published @metamask/* packages are ESM-only and have no `main` + // field, so resolving their package directory fails. In that case, use + // their ESM entrypoint directly. This is only safe for modules that are + // mocked with `jest.mock`, since Jest's CommonJS runtime cannot execute + // native ESM. + '/../../node_modules/@metamask/$1/dist/index.js', ], }, diff --git a/package.json b/package.json index e7452e5e5..9045395a5 100644 --- a/package.json +++ b/package.json @@ -82,11 +82,6 @@ "typescript-eslint": "^8.48.0" }, "resolutions": { - "@metamask/mfa-wallet-cl24": "file:./packages/keyring-eth-mpc/metamask-mfa-wallet-cl24-0.0.0.tgz", - "@metamask/mfa-wallet-dkls23": "file:./packages/keyring-eth-mpc/metamask-mfa-wallet-dkls23-0.0.0.tgz", - "@metamask/mfa-wallet-e2ee": "file:./packages/keyring-eth-mpc/metamask-mfa-wallet-e2ee-0.0.0.tgz", - "@metamask/mfa-wallet-interface": "file:./packages/keyring-eth-mpc/metamask-mfa-wallet-interface-0.0.0.tgz", - "@metamask/mfa-wallet-network": "file:./packages/keyring-eth-mpc/metamask-mfa-wallet-network-0.0.0.tgz", "@types/node": "^20.12.12", "@types/web": "^0.0.69", "@typescript/lib-dom": "npm:@types/web@^0.0.69", diff --git a/packages/keyring-eth-mpc/jest.config.js b/packages/keyring-eth-mpc/jest.config.cjs similarity index 100% rename from packages/keyring-eth-mpc/jest.config.js rename to packages/keyring-eth-mpc/jest.config.cjs diff --git a/packages/keyring-eth-mpc/metamask-mfa-wallet-cl24-0.0.0.tgz b/packages/keyring-eth-mpc/metamask-mfa-wallet-cl24-0.0.0.tgz deleted file mode 100644 index 8d7ed0426e9d3542fcdaad4d7dcc28cde0a622ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 77311 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 gcj3Hs0Kp;^1poj5 diff --git a/packages/keyring-eth-mpc/metamask-mfa-wallet-dkls23-0.0.0.tgz b/packages/keyring-eth-mpc/metamask-mfa-wallet-dkls23-0.0.0.tgz deleted file mode 100644 index f9f9eb5c26ca527a941c4190f5695130a77fde3b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8336 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 diff --git a/packages/keyring-eth-mpc/metamask-mfa-wallet-interface-0.0.0.tgz b/packages/keyring-eth-mpc/metamask-mfa-wallet-interface-0.0.0.tgz deleted file mode 100644 index d547658695091ad032d4073cb993a4fe787c4af1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6027 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 BJPZH; diff --git a/packages/keyring-eth-mpc/metamask-mfa-wallet-network-0.0.0.tgz b/packages/keyring-eth-mpc/metamask-mfa-wallet-network-0.0.0.tgz deleted file mode 100644 index 5e2482f86dd9a7af99491d8f6d3aaa4657b05f64..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 61361 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�w%EDznS9j{pm4e3i*6@Delv6jJj{3MFtL+lFq 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 So*9<`!P)zQ>p;YzLH-XxI<#5< diff --git a/packages/keyring-eth-mpc/package.json b/packages/keyring-eth-mpc/package.json index e38fe09f9..8b88767ef 100644 --- a/packages/keyring-eth-mpc/package.json +++ b/packages/keyring-eth-mpc/package.json @@ -16,32 +16,18 @@ "url": "https://github.com/MetaMask/accounts.git" }, "files": [ - "dist/", - "v2.js" + "dist/" ], + "type": "module", "sideEffects": false, - "main": "./dist/index.cjs", - "types": "./dist/index.d.cts", "exports": { ".": { - "import": { - "types": "./dist/index.d.mts", - "default": "./dist/index.mjs" - }, - "require": { - "types": "./dist/index.d.cts", - "default": "./dist/index.cjs" - } + "types": "./dist/index.d.mts", + "default": "./dist/index.mjs" }, "./v2": { - "import": { - "types": "./dist/v2/index.d.mts", - "default": "./dist/v2/index.mjs" - }, - "require": { - "types": "./dist/v2/index.d.cts", - "default": "./dist/v2/index.cjs" - } + "types": "./dist/v2/index.d.mts", + "default": "./dist/v2/index.mjs" }, "./package.json": "./package.json" }, @@ -50,20 +36,20 @@ "registry": "https://registry.npmjs.org/" }, "scripts": { - "build": "ts-bridge --project tsconfig.build.json --verbose --clean --no-references", + "build": "ts-bridge --project tsconfig.build.json --verbose --clean --no-references --format module", "build:clean": "yarn build --clean", "build:docs": "typedoc", "changelog:update": "../../scripts/update-changelog.sh @metamask/eth-mpc-keyring", "changelog:validate": "../../scripts/validate-changelog.sh @metamask/eth-mpc-keyring", "publish:preview": "yarn npm publish --tag preview", "test": "yarn test:source && yarn test:types", - "test:clean": "NODE_OPTIONS=--experimental-vm-modules jest --clearCache", - "build:all": "ts-bridge --project tsconfig.build.json --verbose --clean", + "test:clean": "jest --clearCache", + "build:all": "ts-bridge --project tsconfig.build.json --verbose --clean --format module", "since-latest-release": "../../scripts/since-latest-release.sh", - "test:source": "NODE_OPTIONS=--experimental-vm-modules jest --reporters=jest-silent-reporter", + "test:source": "jest --reporters=jest-silent-reporter", "test:types": "../../scripts/tsd-test.sh ./src", - "test:verbose": "NODE_OPTIONS=--experimental-vm-modules jest --verbose", - "test:watch": "NODE_OPTIONS=--experimental-vm-modules jest --watch" + "test:verbose": "jest --verbose", + "test:watch": "jest --watch" }, "dependencies": { "@ethereumjs/util": "^9.1.0", @@ -71,9 +57,9 @@ "@metamask/keyring-api": "^24.1.0", "@metamask/keyring-sdk": "^3.1.0", "@metamask/keyring-utils": "^5.0.0", - "@metamask/mfa-wallet-cl24": "^0.0.0", - "@metamask/mfa-wallet-dkls23": "^0.0.0", - "@metamask/mfa-wallet-network": "^0.0.0", + "@metamask/mfa-wallet-cl24": "^0.1.0", + "@metamask/mfa-wallet-dkls23": "^0.1.0", + "@metamask/mfa-wallet-network": "^0.1.0", "@metamask/superstruct": "^3.4.1", "@metamask/utils": "^11.11.0" }, @@ -82,7 +68,7 @@ "@lavamoat/allow-scripts": "^3.2.1", "@lavamoat/preinstall-always-fail": "^2.1.0", "@metamask/auto-changelog": "^6.1.0", - "@metamask/mfa-wallet-interface": "^0.0.0", + "@metamask/mfa-wallet-interface": "^0.1.0", "@ts-bridge/cli": "^0.6.3", "@types/jest": "^29.5.12", "deepmerge": "^4.2.2", diff --git a/packages/keyring-eth-mpc/src/mpc-keyring.test.ts b/packages/keyring-eth-mpc/src/mpc-keyring.test.ts index 745bb0ede..84557a63b 100644 --- a/packages/keyring-eth-mpc/src/mpc-keyring.test.ts +++ b/packages/keyring-eth-mpc/src/mpc-keyring.test.ts @@ -58,18 +58,8 @@ jest.mock('@metamask/mfa-wallet-cl24', () => { } return { - secp256k1: {}, CL24DKM: MockCL24DKM, CL24ThresholdKeySerializer: MockCL24ThresholdKeySerializer, - dealersFromCL24Key: ( - key: { shareIndexes: number[] }, - custodians: string[], - ) => { - if (custodians.length !== key.shareIndexes.length) { - throw new Error('Custodians do not match share indexes'); - } - return custodians.map((netId, shareIndex) => ({ netId, shareIndex })); - }, }; }); @@ -153,10 +143,14 @@ const makeThresholdKey = () => { return { threshold: 2, shareIndex: 0, - shareIndexes: [1, 2], publicKey: new Uint8Array([4, 1, 2, 3]), privateKeyShare: new Uint8Array([5, 6, 7]), - secretPolynomialCommitment: [new Uint8Array([8])], + coefficientCommitments: [new Uint8Array([4, 1, 2, 3]), new Uint8Array([8])], + xCoordinates: [1, 2], + partyMapping: [ + { networkId: 'local-user', protocolId: 1 }, + { networkId: 'cloud-user', protocolId: 2 }, + ], }; }; @@ -196,7 +190,7 @@ const makeKeyring = ( getBackupEncryptionKey = jest.fn().mockResolvedValue(mockBackupKey), ) => new MpcKeyring({ - getRandomBytes: (size) => new Uint8Array(size).fill(3), + cl24Lib: {} as never, dkls23Lib: {} as never, cloudURL: 'https://cloud.example', relayerURL: 'https://relayer.example', @@ -262,15 +256,12 @@ describe('MpcKeyring', () => { expect(keyring.type).toBe('MPC Keyring'); }); - it('wires network manager options and random byte adapter', () => { + it('wires network manager options', () => { const transportToken = jest.fn().mockResolvedValue('transport-token'); const webSocket = { send: jest.fn() }; - const randomBytes = jest - .fn() - .mockReturnValueOnce(new Uint8Array([1, 2, 3, 4])); const keyring = new MpcKeyring({ - getRandomBytes: randomBytes, + cl24Lib: {} as never, dkls23Lib: {} as never, cloudURL: 'https://cloud.example', relayerURL: 'https://relayer.example', @@ -288,13 +279,6 @@ describe('MpcKeyring', () => { websocket: webSocket, }), ); - - const randomBytesAdapter = lastNetworkManagerOptions?.randomBytes as { - getRandomValues: (array: Uint8Array) => Uint8Array; - }; - const output = randomBytesAdapter.getRandomValues(new Uint8Array(4)); - expect(output).toStrictEqual(new Uint8Array([1, 2, 3, 4])); - expect(randomBytes).toHaveBeenCalledWith(4); }); it('serializes to an empty object before initialization', async () => { diff --git a/packages/keyring-eth-mpc/src/mpc-keyring.ts b/packages/keyring-eth-mpc/src/mpc-keyring.ts index d60406453..2360b8831 100644 --- a/packages/keyring-eth-mpc/src/mpc-keyring.ts +++ b/packages/keyring-eth-mpc/src/mpc-keyring.ts @@ -8,17 +8,11 @@ import type { EIP7702Authorization, } from '@metamask/eth-sig-util'; import { hashEIP7702Authorization } from '@metamask/eth-sig-util'; -import { - CL24DKM, - CL24ThresholdKeySerializer, - dealersFromCL24Key, - secp256k1 as secp256k1Curve, -} from '@metamask/mfa-wallet-cl24'; +import { CL24DKM, CL24ThresholdKeySerializer } from '@metamask/mfa-wallet-cl24'; import type { CL24ThresholdKey } from '@metamask/mfa-wallet-cl24'; import { Dkls23TssLib } from '@metamask/mfa-wallet-dkls23'; import type { PartyId, - RandomNumberGenerator, RootNetworkSession, ShareBinding, } from '@metamask/mfa-wallet-interface'; @@ -203,8 +197,6 @@ export class MpcKeyring implements MpcKeyringContract { readonly type: string = mpcKeyringType; - readonly #rng: RandomNumberGenerator; - readonly #networkManager: CentrifugeNetworkManager; readonly #tss: Dkls23TssLib; @@ -229,13 +221,10 @@ export class MpcKeyring implements MpcKeyringContract { * The keyring stays uninitialized until {@link MpcKeyring.init} or * {@link MpcKeyring.deserialize}. * - * @param opts - Randomness, TSS library, backend URLs, and token callbacks. + * @param opts - TSS libraries, backend URLs, and token callbacks. */ constructor(opts: MpcKeyringOpts) { - this.#rng = { - generateRandomBytes: opts.getRandomBytes, - }; - this.#dkm = new CL24DKM(secp256k1Curve, this.#rng); + this.#dkm = new CL24DKM(opts.cl24Lib); this.#tss = new Dkls23TssLib(opts.dkls23Lib); this.#cloudURL = opts.cloudURL; this.#serializer = { @@ -244,13 +233,6 @@ export class MpcKeyring implements MpcKeyringContract { }; this.#networkManager = new CentrifugeNetworkManager({ url: opts.relayerURL, - randomBytes: { - getRandomValues: (array: Uint8Array): Uint8Array => { - const bytes = opts.getRandomBytes(array.length); - array.set(bytes); - return array; - }, - }, ...(opts.getTransportToken && { getToken: opts.getTransportToken, }), @@ -370,7 +352,7 @@ export class MpcKeyring implements MpcKeyringContract { const nextEpoch = shareEpoch + 1; const token = await this.#getProfileToken({ twoFactor: true }); - const nonce = generateSessionNonce(this.#rng); + const nonce = generateSessionNonce(); await startRotateKeyShares({ baseURL: this.#cloudURL, token, @@ -386,9 +368,10 @@ export class MpcKeyring implements MpcKeyringContract { ); try { const custodians = partyNetIds(netCreds.partyId, serverNetId); + const bindings = shareBindings(netCreds.partyId, serverNetId); keyShare = await this.#dkm.rotateKeyShares({ key: keyShare, - dealers: dealersFromCL24Key(keyShare, custodians), + dealers: bindings, custodians, networkSession: netSession.createSubsession('dkg-rotate'), }); @@ -620,7 +603,7 @@ export class MpcKeyring implements MpcKeyringContract { token, }); - const nonce = generateSessionNonce(this.#rng); + const nonce = generateSessionNonce(); await startCreateKey({ baseURL: this.#cloudURL, token, @@ -735,7 +718,7 @@ export class MpcKeyring implements MpcKeyringContract { twoFactor: true, challenge: hash, }); - const nonce = generateSessionNonce(this.#rng); + const nonce = generateSessionNonce(); await startSign({ baseURL: this.#cloudURL, token, @@ -841,7 +824,9 @@ export class MpcKeyring implements MpcKeyringContract { const plaintext = new TextEncoder().encode( JSON.stringify(this.#serializer.thresholdKey.toJson(keyShare)), ); - const iv = this.#rng.generateRandomBytes(AES_GCM_IV_LENGTH); + const iv = globalThis.crypto.getRandomValues( + new Uint8Array(AES_GCM_IV_LENGTH), + ); return encryptBytes(key, plaintext, iv); } diff --git a/packages/keyring-eth-mpc/src/types.ts b/packages/keyring-eth-mpc/src/types.ts index 938d8cd1a..c8a42a181 100644 --- a/packages/keyring-eth-mpc/src/types.ts +++ b/packages/keyring-eth-mpc/src/types.ts @@ -1,5 +1,5 @@ import type { EthKeyring } from '@metamask/keyring-utils'; -import type { CL24ThresholdKey } from '@metamask/mfa-wallet-cl24'; +import type { CL24DKM, CL24ThresholdKey } from '@metamask/mfa-wallet-cl24'; import type { Dkls23TssLib } from '@metamask/mfa-wallet-dkls23'; import type { CentrifugeIdentity } from '@metamask/mfa-wallet-network'; import type { Json } from '@metamask/utils'; @@ -9,10 +9,11 @@ export type ProfileTokenOpts = { challenge?: Uint8Array; }; +export type Cl24Lib = ConstructorParameters[0]; export type Dkls23Lib = ConstructorParameters[0]; export type MpcKeyringOpts = { - getRandomBytes: (size: number) => Uint8Array; + cl24Lib: Cl24Lib; dkls23Lib: Dkls23Lib; cloudURL: string; relayerURL: string; diff --git a/packages/keyring-eth-mpc/src/util.test.ts b/packages/keyring-eth-mpc/src/util.test.ts index aa4e12667..506e1ec00 100644 --- a/packages/keyring-eth-mpc/src/util.test.ts +++ b/packages/keyring-eth-mpc/src/util.test.ts @@ -60,12 +60,10 @@ describe('util', () => { throw new Error(`Could not find signature with v=${targetV.toString()}`); }; - it('generates a session nonce from RNG bytes', () => { - const bytes = new Uint8Array(32).fill(1); - const rng = { generateRandomBytes: jest.fn().mockReturnValue(bytes) }; - - expect(generateSessionNonce(rng)).toBe(bytesToHex(bytes)); - expect(rng.generateRandomBytes).toHaveBeenCalledWith(32); + it('generates a random 32-byte hex session nonce', () => { + const nonce = generateSessionNonce(); + expect(nonce).toMatch(/^0x[0-9a-f]{64}$/u); + expect(generateSessionNonce()).not.toBe(nonce); }); it('converts public keys to address hex', () => { diff --git a/packages/keyring-eth-mpc/src/util.ts b/packages/keyring-eth-mpc/src/util.ts index df65b2ef4..a8a6b677c 100644 --- a/packages/keyring-eth-mpc/src/util.ts +++ b/packages/keyring-eth-mpc/src/util.ts @@ -16,7 +16,6 @@ import { TypedDataUtils, typedSignatureHash, } from '@metamask/eth-sig-util'; -import type { RandomNumberGenerator } from '@metamask/mfa-wallet-interface'; import type { Hex } from '@metamask/utils'; import { add0x, assert, bytesToHex, hexToBytes } from '@metamask/utils'; @@ -24,13 +23,16 @@ const SESSION_NONCE_BYTE_LENGTH = 32; export const AES_GCM_IV_LENGTH = 12; /** - * Generate a session nonce: random bytes from the RNG, hex-encoded. + * Generate a session nonce: random bytes from the platform RNG, hex-encoded. * - * @param rng - The random number generator. * @returns Hex-encoded 32-byte random nonce. */ -export function generateSessionNonce(rng: RandomNumberGenerator): Hex { - return bytesToHex(rng.generateRandomBytes(SESSION_NONCE_BYTE_LENGTH)); +export function generateSessionNonce(): Hex { + return bytesToHex( + globalThis.crypto.getRandomValues( + new Uint8Array(SESSION_NONCE_BYTE_LENGTH), + ), + ); } /** diff --git a/packages/keyring-eth-mpc/v2.js b/packages/keyring-eth-mpc/v2.js deleted file mode 100644 index faf7abd23..000000000 --- a/packages/keyring-eth-mpc/v2.js +++ /dev/null @@ -1,3 +0,0 @@ -// Re-exported for compatibility with Browserify. -// eslint-disable-next-line -module.exports = require('./dist/v2/index.cjs'); diff --git a/yarn.config.cjs b/yarn.config.cjs index 10ab49a76..15db67b1f 100644 --- a/yarn.config.cjs +++ b/yarn.config.cjs @@ -35,6 +35,20 @@ const ALLOWED_INCONSISTENT_DEPENDENCIES = {}; */ const PINNED_VERSION_EXCEPTIONS = []; +/** + * FIXME: These packages are ESM-only, which is not yet the standard package + * format across this monorepo. They deviate from the CommonJS-compatible + * (dual-format) package shape enforced by these constraints: ESM-only + * `exports` without a CommonJS fallback, a `ts-bridge` build using + * `--format module`, and Jest scripts without + * `NODE_OPTIONS=--experimental-vm-modules`. The checks they would fail are + * skipped until the monorepo-wide ESM migration lands and the constraints + * are updated. + * + * @type {string[]} + */ +const ESM_ONLY_PACKAGE_EXCEPTIONS = ['@metamask/eth-mpc-keyring']; + /** * Aliases for the Yarn type definitions, to make the code more readable. * @@ -67,6 +81,9 @@ module.exports = defineConfig({ const isPrivate = hasProperty(workspace.manifest, 'private') && workspace.manifest.private === true; + const isEsModuleOnlyPackage = ESM_ONLY_PACKAGE_EXCEPTIONS.includes( + workspace.manifest.name, + ); const dependenciesByIdentAndType = getDependenciesByIdentAndType( Yarn.dependencies({ workspace }), ); @@ -124,21 +141,31 @@ module.exports = defineConfig({ // All non-root packages must set up ESM- and CommonJS-compatible // exports correctly. - expectCorrectWorkspaceExports(workspace); + // FIXME: ESM-only packages use a different export shape and are + // skipped until the ESM migration lands + // (see ESM_ONLY_PACKAGE_EXCEPTIONS). + if (!isEsModuleOnlyPackage) { + expectCorrectWorkspaceExports(workspace); + } // All non-root packages must have the same "build" script. - expectWorkspaceField( - workspace, - 'scripts.build', - 'ts-bridge --project tsconfig.build.json --verbose --clean --no-references', - ); - - // All non-root packages must have the same "build:all" script. - expectWorkspaceField( - workspace, - 'scripts.build:all', - 'ts-bridge --project tsconfig.build.json --verbose --clean', - ); + // FIXME: ESM-only packages build with `--format module` and are + // skipped until the ESM migration lands + // (see ESM_ONLY_PACKAGE_EXCEPTIONS). + if (!isEsModuleOnlyPackage) { + expectWorkspaceField( + workspace, + 'scripts.build', + 'ts-bridge --project tsconfig.build.json --verbose --clean --no-references', + ); + + // All non-root packages must have the same "build:all" script. + expectWorkspaceField( + workspace, + 'scripts.build:all', + 'ts-bridge --project tsconfig.build.json --verbose --clean', + ); + } // All non-root packages must have the same "build:docs" script. expectWorkspaceField(workspace, 'scripts.build:docs', 'typedoc'); @@ -165,11 +192,16 @@ module.exports = defineConfig({ ); // All non-root packages must have the same "test:source" script. - expectWorkspaceField( - workspace, - 'scripts.test:source', - 'NODE_OPTIONS=--experimental-vm-modules jest --reporters=jest-silent-reporter', - ); + // FIXME: ESM-only packages run Jest without + // `NODE_OPTIONS=--experimental-vm-modules` and are skipped until the + // ESM migration lands (see ESM_ONLY_PACKAGE_EXCEPTIONS). + if (!isEsModuleOnlyPackage) { + expectWorkspaceField( + workspace, + 'scripts.test:source', + 'NODE_OPTIONS=--experimental-vm-modules jest --reporters=jest-silent-reporter', + ); + } // All non-root packages must have the same "test:types" script. expectWorkspaceField( @@ -178,26 +210,30 @@ module.exports = defineConfig({ '../../scripts/tsd-test.sh ./src', ); - // All non-root packages must have the same "test:clean" script. - expectWorkspaceField( - workspace, - 'scripts.test:clean', - 'NODE_OPTIONS=--experimental-vm-modules jest --clearCache', - ); - - // All non-root packages must have the same "test:verbose" script. - expectWorkspaceField( - workspace, - 'scripts.test:verbose', - 'NODE_OPTIONS=--experimental-vm-modules jest --verbose', - ); - - // All non-root packages must have the same "test:watch" script. - expectWorkspaceField( - workspace, - 'scripts.test:watch', - 'NODE_OPTIONS=--experimental-vm-modules jest --watch', - ); + // FIXME: ESM-only packages are skipped for the same reason as + // "test:source" above (see ESM_ONLY_PACKAGE_EXCEPTIONS). + if (!isEsModuleOnlyPackage) { + // All non-root packages must have the same "test:clean" script. + expectWorkspaceField( + workspace, + 'scripts.test:clean', + 'NODE_OPTIONS=--experimental-vm-modules jest --clearCache', + ); + + // All non-root packages must have the same "test:verbose" script. + expectWorkspaceField( + workspace, + 'scripts.test:verbose', + 'NODE_OPTIONS=--experimental-vm-modules jest --verbose', + ); + + // All non-root packages must have the same "test:watch" script. + expectWorkspaceField( + workspace, + 'scripts.test:watch', + 'NODE_OPTIONS=--experimental-vm-modules jest --watch', + ); + } } if (isChildWorkspace) { diff --git a/yarn.lock b/yarn.lock index fa563c19c..4b804def0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1832,6 +1832,13 @@ __metadata: languageName: node linkType: hard +"@metamask/cryptography@npm:^1.1.0": + version: 1.1.2 + resolution: "@metamask/cryptography@npm:1.1.2" + checksum: 10/567ab4d7a27bbf1be129a120bd0d6d1dfc1677ddc36c2e81c259bebd7824b493fbb67127b585d57f94d98463daa7f7a43296db8ff2d9ed85f440ecc7e9c83dc9 + languageName: node + linkType: hard + "@metamask/eslint-config-jest@npm:^15.0.0": version: 15.0.0 resolution: "@metamask/eslint-config-jest@npm:15.0.0" @@ -2008,10 +2015,10 @@ __metadata: "@metamask/keyring-api": "npm:^24.1.0" "@metamask/keyring-sdk": "npm:^3.1.0" "@metamask/keyring-utils": "npm:^5.0.0" - "@metamask/mfa-wallet-cl24": "npm:^0.0.0" - "@metamask/mfa-wallet-dkls23": "npm:^0.0.0" - "@metamask/mfa-wallet-interface": "npm:^0.0.0" - "@metamask/mfa-wallet-network": "npm:^0.0.0" + "@metamask/mfa-wallet-cl24": "npm:^0.1.0" + "@metamask/mfa-wallet-dkls23": "npm:^0.1.0" + "@metamask/mfa-wallet-interface": "npm:^0.1.0" + "@metamask/mfa-wallet-network": "npm:^0.1.0" "@metamask/superstruct": "npm:^3.4.1" "@metamask/utils": "npm:^11.11.0" "@ts-bridge/cli": "npm:^0.6.3" @@ -2523,63 +2530,48 @@ __metadata: languageName: node linkType: hard -"@metamask/mfa-wallet-cl24@file:./packages/keyring-eth-mpc/metamask-mfa-wallet-cl24-0.0.0.tgz::locator=%40metamask%2Faccounts-monorepo%40workspace%3A.": - version: 0.0.0 - resolution: "@metamask/mfa-wallet-cl24@file:./packages/keyring-eth-mpc/metamask-mfa-wallet-cl24-0.0.0.tgz#./packages/keyring-eth-mpc/metamask-mfa-wallet-cl24-0.0.0.tgz::hash=c5c65e&locator=%40metamask%2Faccounts-monorepo%40workspace%3A." - dependencies: - "@msgpack/msgpack": "npm:^3.1.2" - "@noble/curves": "npm:^1.9.2" - "@noble/hashes": "npm:^1.8.0" - checksum: 10/fa8f8f149546fcd3372eda3fa691698fe372d0208e3b64c3518a863054deb078d0b865516db807daecd310e177067777474953e9a2a8370255668e261b61c085 - languageName: node - linkType: hard - -"@metamask/mfa-wallet-dkls23@file:./packages/keyring-eth-mpc/metamask-mfa-wallet-dkls23-0.0.0.tgz::locator=%40metamask%2Faccounts-monorepo%40workspace%3A.": - version: 0.0.0 - resolution: "@metamask/mfa-wallet-dkls23@file:./packages/keyring-eth-mpc/metamask-mfa-wallet-dkls23-0.0.0.tgz#./packages/keyring-eth-mpc/metamask-mfa-wallet-dkls23-0.0.0.tgz::hash=d7e4c4&locator=%40metamask%2Faccounts-monorepo%40workspace%3A." +"@metamask/mfa-wallet-cl24@npm:^0.1.0": + version: 0.1.0 + resolution: "@metamask/mfa-wallet-cl24@npm:0.1.0" dependencies: - "@metamask/mpc-interface": "npm:^0.1.0" - "@noble/curves": "npm:^1.9.2" - checksum: 10/903676420e9564880108723970cf738a940b8dea5cd40ac9481c39b75148121069fb33d44349843f1b604e7ac3baecdaaf1103f38b5cb6f368331981ac058173 + "@metamask/cryptography": "npm:^1.1.0" + "@metamask/mpc-interface": "npm:^0.2.0" + checksum: 10/c5dead82d44f5297bf93b498a9b0feed655b73a1bf3847617f0aa6d4c548c4f5afb01705039e0308e4035aceac6df0600b5e2a1dae4a207c056b49280bd32ff1 languageName: node linkType: hard -"@metamask/mfa-wallet-e2ee@file:./packages/keyring-eth-mpc/metamask-mfa-wallet-e2ee-0.0.0.tgz::locator=%40metamask%2Faccounts-monorepo%40workspace%3A.": - version: 0.0.0 - resolution: "@metamask/mfa-wallet-e2ee@file:./packages/keyring-eth-mpc/metamask-mfa-wallet-e2ee-0.0.0.tgz#./packages/keyring-eth-mpc/metamask-mfa-wallet-e2ee-0.0.0.tgz::hash=74f676&locator=%40metamask%2Faccounts-monorepo%40workspace%3A." +"@metamask/mfa-wallet-dkls23@npm:^0.1.0": + version: 0.1.0 + resolution: "@metamask/mfa-wallet-dkls23@npm:0.1.0" dependencies: - "@metamask/mfa-wallet-interface": "npm:^0.0.0" - "@msgpack/msgpack": "npm:^3.1.2" - "@noble/ciphers": "npm:^1.3.0" - "@noble/curves": "npm:^1.9.2" - "@noble/hashes": "npm:^1.8.0" - checksum: 10/5caaad16babe2d7e0e092b7c6631178283734f94cbd2976acdaec08e23b1184daf091dbf927a7baf4a1c49d14ea97d3d50843146de6d332e300328ad2426b5f9 + "@metamask/mpc-interface": "npm:^0.2.0" + checksum: 10/668cfd6978647bc8ce2ca2008cdd1a08036d58545d3a461713504c47f2c5c8f082c7c370aa35fcea3a091a7721d811ed0927c0cd3d4e0128313cc784e22f9b65 languageName: node linkType: hard -"@metamask/mfa-wallet-interface@file:./packages/keyring-eth-mpc/metamask-mfa-wallet-interface-0.0.0.tgz::locator=%40metamask%2Faccounts-monorepo%40workspace%3A.": - version: 0.0.0 - resolution: "@metamask/mfa-wallet-interface@file:./packages/keyring-eth-mpc/metamask-mfa-wallet-interface-0.0.0.tgz#./packages/keyring-eth-mpc/metamask-mfa-wallet-interface-0.0.0.tgz::hash=3a12d6&locator=%40metamask%2Faccounts-monorepo%40workspace%3A." - checksum: 10/99bee43e3c3cde5f9e53986c6dc9fe96414459abf5728f9171da5f5294fb94bd96832b05b0550e14eaa0008c6eb110829554646788e13e00bacc57cb27ca56b5 +"@metamask/mfa-wallet-interface@npm:^0.1.0": + version: 0.1.0 + resolution: "@metamask/mfa-wallet-interface@npm:0.1.0" + checksum: 10/b034fcd27fcb54613811c840eaf2614273f7a38ccc5cad02e92197a70487306d1782588e7f205e9d05773f7987464f40fc3e5f4c12df27483d47797b4f90cba2 languageName: node linkType: hard -"@metamask/mfa-wallet-network@file:./packages/keyring-eth-mpc/metamask-mfa-wallet-network-0.0.0.tgz::locator=%40metamask%2Faccounts-monorepo%40workspace%3A.": - version: 0.0.0 - resolution: "@metamask/mfa-wallet-network@file:./packages/keyring-eth-mpc/metamask-mfa-wallet-network-0.0.0.tgz#./packages/keyring-eth-mpc/metamask-mfa-wallet-network-0.0.0.tgz::hash=afa316&locator=%40metamask%2Faccounts-monorepo%40workspace%3A." +"@metamask/mfa-wallet-network@npm:^0.1.0": + version: 0.1.0 + resolution: "@metamask/mfa-wallet-network@npm:0.1.0" dependencies: - "@metamask/mfa-wallet-e2ee": "npm:^0.0.0" - "@metamask/mfa-wallet-interface": "npm:^0.0.0" + "@metamask/cryptography": "npm:^1.1.0" + "@metamask/mfa-wallet-interface": "npm:^0.1.0" "@noble/hashes": "npm:^1.8.0" centrifuge: "npm:^5.7.2" - checksum: 10/6c09ee78cf98b66eb2aeb82ff47f682baa6cd2bf36b495ffbf537091f633401a90b9f793533fbadb947bb1e59cfac081ff10f36304f73f9fe460f3a31099b4de + checksum: 10/a32cc4b7b07b8666f4208b942a2df22548fa23996057c7d094d3ae20a90904d9d715ebb7c300c0a50f72ffefdd205aa1ad4129a740e7c155716678c751539508 languageName: node linkType: hard -"@metamask/mpc-interface@npm:^0.1.0": - version: 0.1.0 - resolution: "@metamask/mpc-interface@npm:0.1.0" - checksum: 10/a08be84ecc0216de39f89e4a7a21195891e904071f42a66a8d7382980e58754a242b1df32bbce827ecc292e5eedbf614f5fd52b4c8ba2c02b5e1e537e976608b +"@metamask/mpc-interface@npm:^0.2.0": + version: 0.2.0 + resolution: "@metamask/mpc-interface@npm:0.2.0" + checksum: 10/9762cd1e932ae392f32fe3bc48805f10dc52b7aa544c58242fc28d0663b82403dffe3bc93140c47ae7d12f147e7ca1a737aa4989151612bd66ece84d6e01a76b languageName: node linkType: hard @@ -2949,13 +2941,6 @@ __metadata: languageName: node linkType: hard -"@msgpack/msgpack@npm:^3.1.2": - version: 3.1.3 - resolution: "@msgpack/msgpack@npm:3.1.3" - checksum: 10/cf597b7ed1fcedc2101b145885e7da591c5ed8aeba3a2579b99da8dd15ef13595c807f64f052da0a0dd74704097f6299fc2e2fb4165029a60a1d1df3843c03ce - languageName: node - linkType: hard - "@ngraveio/bc-ur@npm:^1.1.5": version: 1.1.13 resolution: "@ngraveio/bc-ur@npm:1.1.13" @@ -2971,7 +2956,7 @@ __metadata: languageName: node linkType: hard -"@noble/ciphers@npm:1.3.0, @noble/ciphers@npm:^1.3.0": +"@noble/ciphers@npm:1.3.0": version: 1.3.0 resolution: "@noble/ciphers@npm:1.3.0" checksum: 10/051660051e3e9e2ca5fb9dece2885532b56b7e62946f89afa7284a0fb8bc02e2bd1c06554dba68162ff42d295b54026456084198610f63c296873b2f1cd7a586 @@ -3005,7 +2990,7 @@ __metadata: languageName: node linkType: hard -"@noble/curves@npm:^1.0.0, @noble/curves@npm:^1.2.0, @noble/curves@npm:^1.8.1, @noble/curves@npm:^1.9.2, @noble/curves@npm:~1.9.0": +"@noble/curves@npm:^1.0.0, @noble/curves@npm:^1.2.0, @noble/curves@npm:^1.8.1, @noble/curves@npm:~1.9.0": version: 1.9.7 resolution: "@noble/curves@npm:1.9.7" dependencies: From fc6b24f014cb47bbbf764fcf23b8eb41b9c1ce48 Mon Sep 17 00:00:00 2001 From: Matthias Geihs Date: Mon, 12 Oct 2026 15:38:09 +0200 Subject: [PATCH 27/38] esm only import --- packages/keyring-eth-mpc/src/cloud.test.ts | 2 +- packages/keyring-eth-mpc/src/index.ts | 6 +++--- packages/keyring-eth-mpc/src/mpc-keyring.test.ts | 2 +- packages/keyring-eth-mpc/src/mpc-keyring.ts | 8 ++++---- packages/keyring-eth-mpc/src/util.test.ts | 2 +- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/packages/keyring-eth-mpc/src/cloud.test.ts b/packages/keyring-eth-mpc/src/cloud.test.ts index 730b762de..d0c54f859 100644 --- a/packages/keyring-eth-mpc/src/cloud.test.ts +++ b/packages/keyring-eth-mpc/src/cloud.test.ts @@ -10,7 +10,7 @@ import { setActiveEpoch, sign, storeKeyShareBackup, -} from './cloud'; +} from './cloud.js'; describe('cloud helpers', () => { let fetchSpy: jest.SpyInstance; diff --git a/packages/keyring-eth-mpc/src/index.ts b/packages/keyring-eth-mpc/src/index.ts index 06e274cb7..c62d8b844 100644 --- a/packages/keyring-eth-mpc/src/index.ts +++ b/packages/keyring-eth-mpc/src/index.ts @@ -1,10 +1,10 @@ -export { MpcKeyring } from './mpc-keyring'; +export { MpcKeyring } from './mpc-keyring.js'; -export { MpcKeyringSetupMode } from './types'; +export { MpcKeyringSetupMode } from './types.js'; export type { MpcKeyringOpts, MpcKeyringSerializer, MpcKeyringSetupParams, MpcKeyringState, ProfileTokenOpts, -} from './types'; +} from './types.js'; diff --git a/packages/keyring-eth-mpc/src/mpc-keyring.test.ts b/packages/keyring-eth-mpc/src/mpc-keyring.test.ts index 84557a63b..7bfe78b04 100644 --- a/packages/keyring-eth-mpc/src/mpc-keyring.test.ts +++ b/packages/keyring-eth-mpc/src/mpc-keyring.test.ts @@ -3,7 +3,7 @@ import { hashPersonalMessage } from '@ethereumjs/util'; import { bytesToHex } from '@metamask/utils'; import type { Hex, Json } from '@metamask/utils'; -import { MpcKeyring } from './mpc-keyring'; +import { MpcKeyring } from './mpc-keyring.js'; const mockCreateKey = jest.fn(); const mockRotateKeyShares = jest.fn(); diff --git a/packages/keyring-eth-mpc/src/mpc-keyring.ts b/packages/keyring-eth-mpc/src/mpc-keyring.ts index 2360b8831..3587057d8 100644 --- a/packages/keyring-eth-mpc/src/mpc-keyring.ts +++ b/packages/keyring-eth-mpc/src/mpc-keyring.ts @@ -35,7 +35,7 @@ import { import { bytesToHex, hexToBytes, JsonStruct } from '@metamask/utils'; import type { Hex, Json } from '@metamask/utils'; -import type { CheckKeyShareResult } from './cloud'; +import type { CheckKeyShareResult } from './cloud.js'; import { checkKeyShare as checkKeyShareRemote, createKey as startCreateKey, @@ -46,7 +46,7 @@ import { setActiveEpoch, sign as startSign, storeKeyShareBackup, -} from './cloud'; +} from './cloud.js'; import type { MpcKeyring as MpcKeyringContract, MpcKeyringOpts, @@ -55,7 +55,7 @@ import type { MpcKeyringState, MpcKeyringStorageState, ProfileTokenOpts, -} from './types'; +} from './types.js'; import { AES_GCM_IV_LENGTH, decryptBytes, @@ -67,7 +67,7 @@ import { parseSignedTypedDataVersion, publicKeyToAddressHex, toEthSig, -} from './util'; +} from './util.js'; const mpcKeyringType = 'MPC Keyring'; const TSS_HAVE_SETUP_MESSAGE_TYPE = 'tss-have-setup'; diff --git a/packages/keyring-eth-mpc/src/util.test.ts b/packages/keyring-eth-mpc/src/util.test.ts index 506e1ec00..4949d73d9 100644 --- a/packages/keyring-eth-mpc/src/util.test.ts +++ b/packages/keyring-eth-mpc/src/util.test.ts @@ -20,7 +20,7 @@ import { publicKeyToAddressHex, publicToAddressHex, toEthSig, -} from './util'; +} from './util.js'; describe('util', () => { const privateKey = hexToBytes( From 0a1cc6dd82e3bca45305f42bfc214a8d14d257eb Mon Sep 17 00:00:00 2001 From: Matthias Geihs Date: Mon, 12 Oct 2026 16:03:40 +0200 Subject: [PATCH 28/38] fix(keyring-eth-mpc): resolve Node16 .js imports in Jest Map relative .js specifiers back to TypeScript sources so the MPC keyring tests can load. Also point the skipLibCheck note at the MFA network package. Co-authored-by: Cursor --- packages/keyring-eth-mpc/jest.config.cjs | 6 ++++++ packages/keyring-eth-mpc/tsconfig.build.json | 2 +- packages/keyring-eth-mpc/tsconfig.json | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/packages/keyring-eth-mpc/jest.config.cjs b/packages/keyring-eth-mpc/jest.config.cjs index afeeab368..5da45e460 100644 --- a/packages/keyring-eth-mpc/jest.config.cjs +++ b/packages/keyring-eth-mpc/jest.config.cjs @@ -14,6 +14,12 @@ module.exports = merge(baseConfig, { // The display name when running multiple projects displayName, + // Source files use Node16-style `.js` specifiers. Map them back to the + // TypeScript sources so Jest can load the modules under test. + moduleNameMapper: { + '^(\\.{1,2}/.*)\\.js$': '$1', + }, + // An array of regexp pattern strings used to skip coverage collection coveragePathIgnorePatterns: ['./src/tests'], diff --git a/packages/keyring-eth-mpc/tsconfig.build.json b/packages/keyring-eth-mpc/tsconfig.build.json index 0382afbab..985e1f884 100644 --- a/packages/keyring-eth-mpc/tsconfig.build.json +++ b/packages/keyring-eth-mpc/tsconfig.build.json @@ -4,7 +4,7 @@ "baseUrl": "./", "outDir": "dist", "rootDir": "src", - // NOTE: @msgpack/msgpack uses Uint8Array which requires TypeScript 5.7+. + // NOTE: @metamask/mfa-wallet-network uses Uint8Array which requires TypeScript 5.7+. // skipLibCheck bypasses type-checking of .d.ts files in node_modules. "skipLibCheck": true }, diff --git a/packages/keyring-eth-mpc/tsconfig.json b/packages/keyring-eth-mpc/tsconfig.json index 685f642d1..74c540af0 100644 --- a/packages/keyring-eth-mpc/tsconfig.json +++ b/packages/keyring-eth-mpc/tsconfig.json @@ -2,7 +2,7 @@ "extends": "../../tsconfig.packages.json", "compilerOptions": { "baseUrl": "./", - // NOTE: @msgpack/msgpack uses Uint8Array which requires TypeScript 5.7+. + // NOTE: @metamask/mfa-wallet-network uses Uint8Array which requires TypeScript 5.7+. // skipLibCheck bypasses type-checking of .d.ts files in node_modules. "skipLibCheck": true }, From b848adc3eb949f2f8c758fe97aa005dd543b6583 Mon Sep 17 00:00:00 2001 From: Matthias Geihs Date: Mon, 12 Oct 2026 16:28:10 +0200 Subject: [PATCH 29/38] fix(keyring-eth-mpc): reject corrupt key state that also includes a setup mode A payload with invalid initialized fields and mode was accepted as setup because extra keys are ignored, which dropped the key material. Co-authored-by: Cursor --- packages/keyring-eth-mpc/CHANGELOG.md | 4 ++++ packages/keyring-eth-mpc/src/mpc-keyring.test.ts | 10 ++++++++++ packages/keyring-eth-mpc/src/mpc-keyring.ts | 10 ++++++---- 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/packages/keyring-eth-mpc/CHANGELOG.md b/packages/keyring-eth-mpc/CHANGELOG.md index dd6a81356..7e337e517 100644 --- a/packages/keyring-eth-mpc/CHANGELOG.md +++ b/packages/keyring-eth-mpc/CHANGELOG.md @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Fixed + +- Reject deserialized state that carries initialized key fields and a setup `mode` when the key fields are invalid ([#TODO](https://github.com/MetaMask/accounts/pull/TODO)) + ### Added - Initial release of `@metamask/eth-mpc-keyring` ([#641](https://github.com/MetaMask/accounts/pull/641)), ([#653](https://github.com/MetaMask/accounts/pull/653)), ([#627](https://github.com/MetaMask/accounts/pull/627)) diff --git a/packages/keyring-eth-mpc/src/mpc-keyring.test.ts b/packages/keyring-eth-mpc/src/mpc-keyring.test.ts index 7bfe78b04..a61714fa1 100644 --- a/packages/keyring-eth-mpc/src/mpc-keyring.test.ts +++ b/packages/keyring-eth-mpc/src/mpc-keyring.test.ts @@ -319,6 +319,16 @@ describe('MpcKeyring', () => { ).rejects.toThrow('Invalid state'); }); + it('throws on invalid initialized state that also includes a setup mode', async () => { + const keyring = makeKeyring(); + + await expect( + keyring.deserialize( + makeSerializedState({ shareEpoch: 0, mode: 'create' }) as never, + ), + ).rejects.toThrow('Invalid state'); + }); + it('throws on invalid setup params in deserialize', async () => { const keyring = makeKeyring(); diff --git a/packages/keyring-eth-mpc/src/mpc-keyring.ts b/packages/keyring-eth-mpc/src/mpc-keyring.ts index 3587057d8..11401ee6a 100644 --- a/packages/keyring-eth-mpc/src/mpc-keyring.ts +++ b/packages/keyring-eth-mpc/src/mpc-keyring.ts @@ -288,6 +288,12 @@ export class MpcKeyring implements MpcKeyringContract { return; } + // `type()` ignores unknown keys, so a payload can match `mode` and still + // carry initialized fields. Reject that before treating it as setup. + if (hasInitializedFields(state)) { + throw new Error('Invalid state'); + } + if (is(state, SetupParamsStruct)) { this.#state = { status: 'uninitialized', @@ -296,10 +302,6 @@ export class MpcKeyring implements MpcKeyringContract { return; } - if (hasInitializedFields(state)) { - throw new Error('Invalid state'); - } - if ('mode' in state) { throw new Error("Invalid setup mode: expected 'create' or 'import'"); } From 8d36768c99a363ecdac0f3565a69697aa6a019f7 Mon Sep 17 00:00:00 2001 From: Matthias Geihs Date: Mon, 12 Oct 2026 16:45:56 +0200 Subject: [PATCH 30/38] refactor(keyring-eth-mpc): use one public-key-to-address helper Drop publicToAddressHex and compare recovered keys with publicKeyToAddressHex, which accepts raw and SEC1 keys. Co-authored-by: Cursor --- packages/keyring-eth-mpc/src/util.test.ts | 2 -- packages/keyring-eth-mpc/src/util.ts | 16 +++------------- 2 files changed, 3 insertions(+), 15 deletions(-) diff --git a/packages/keyring-eth-mpc/src/util.test.ts b/packages/keyring-eth-mpc/src/util.test.ts index 4949d73d9..79d5b9539 100644 --- a/packages/keyring-eth-mpc/src/util.test.ts +++ b/packages/keyring-eth-mpc/src/util.test.ts @@ -18,7 +18,6 @@ import { parseEthSig, parseSignedTypedDataVersion, publicKeyToAddressHex, - publicToAddressHex, toEthSig, } from './util.js'; @@ -67,7 +66,6 @@ describe('util', () => { }); it('converts public keys to address hex', () => { - expect(publicToAddressHex(publicKey)).toBe(address); expect(publicKeyToAddressHex(publicKey)).toBe(address); }); diff --git a/packages/keyring-eth-mpc/src/util.ts b/packages/keyring-eth-mpc/src/util.ts index a8a6b677c..d2e96fec9 100644 --- a/packages/keyring-eth-mpc/src/util.ts +++ b/packages/keyring-eth-mpc/src/util.ts @@ -2,7 +2,6 @@ import { bigIntToBytes, concatBytes, ecrecover, - publicToAddress, pubToAddress, } from '@ethereumjs/util'; import type { @@ -110,17 +109,6 @@ const SECP256K1_N = BigInt( ); const SECP256K1_HALF_N = SECP256K1_N / 2n; -/** - * Convert a public key to an address. - * - * @param pubKey - The public key to convert. - * @returns The address. - */ -export function publicToAddressHex(pubKey: Uint8Array): Hex { - const addrBytes = publicToAddress(pubKey); - return bytesToHex(addrBytes); -} - /** * Normalize an address. * @@ -191,7 +179,7 @@ export function toEthSig( const checkParity = (parity: bigint): boolean => { try { const candidatePubKey = ecrecover(hash, parity, rBuf, sBuf); - return publicToAddressHex(candidatePubKey) === expectedAddr; + return publicKeyToAddressHex(candidatePubKey) === expectedAddr; } catch { return false; } @@ -279,6 +267,8 @@ export function getSignedTypedDataHash< /** * Convert a public key to an address. * + * Accepts a raw 64-byte key, or a compressed or uncompressed SEC1 key. + * * @param publicKey - The public key to convert. * @returns The address. */ From a820df8ff9b185320da7f6552b0b562597b86877 Mon Sep 17 00:00:00 2001 From: Matthias Geihs Date: Mon, 12 Oct 2026 16:46:09 +0200 Subject: [PATCH 31/38] refactor(keyring-eth-mpc): encrypt backups with @metamask/cryptography Reuse the shared AES-GCM helpers for key-share backup encryption. Co-authored-by: Cursor --- jest.config.packages.js | 4 +++ packages/keyring-eth-mpc/CHANGELOG.md | 4 +++ packages/keyring-eth-mpc/jest.config.cjs | 10 ++++++ .../jest.cryptography-transform.cjs | 33 +++++++++++++++++++ packages/keyring-eth-mpc/package.json | 1 + packages/keyring-eth-mpc/src/util.ts | 32 +++--------------- tsconfig.packages.json | 3 ++ yarn.lock | 3 +- 8 files changed, 62 insertions(+), 28 deletions(-) create mode 100644 packages/keyring-eth-mpc/jest.cryptography-transform.cjs diff --git a/jest.config.packages.js b/jest.config.packages.js index 45b20fbdb..84a10f907 100644 --- a/jest.config.packages.js +++ b/jest.config.packages.js @@ -86,6 +86,10 @@ module.exports = { // Here we ensure that Jest resolves `@metamask/*` imports to the uncompiled source code for packages that live in this repo. // NOTE: This must be synchronized with the `paths` option in `tsconfig.packages.json`. moduleNameMapper: { + // Listed before the `@metamask/*` wildcard so the AES-GCM subpath is not + // rewritten to a workspace source directory. + '^@metamask/cryptography/aes-gcm$': + '/../../node_modules/@metamask/cryptography/dist/aes-gcm.js', '^@metamask/(.+)/v2$': [ '/../$1/src/v2', // Some @metamask/* packages we are referencing aren't in this monorepo, diff --git a/packages/keyring-eth-mpc/CHANGELOG.md b/packages/keyring-eth-mpc/CHANGELOG.md index 7e337e517..32cade015 100644 --- a/packages/keyring-eth-mpc/CHANGELOG.md +++ b/packages/keyring-eth-mpc/CHANGELOG.md @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Changed + +- Encrypt and decrypt key-share backups with `@metamask/cryptography` ([#TODO](https://github.com/MetaMask/accounts/pull/TODO)) + ### Fixed - Reject deserialized state that carries initialized key fields and a setup `mode` when the key fields are invalid ([#TODO](https://github.com/MetaMask/accounts/pull/TODO)) diff --git a/packages/keyring-eth-mpc/jest.config.cjs b/packages/keyring-eth-mpc/jest.config.cjs index 5da45e460..a6f0470d6 100644 --- a/packages/keyring-eth-mpc/jest.config.cjs +++ b/packages/keyring-eth-mpc/jest.config.cjs @@ -20,6 +20,16 @@ module.exports = merge(baseConfig, { '^(\\.{1,2}/.*)\\.js$': '$1', }, + // `@metamask/cryptography` is ESM-only. Transform it so Jest's CommonJS + // runtime can load the AES-GCM helpers. + transformIgnorePatterns: ['/node_modules/(?!@metamask/cryptography/)'], + transform: { + '/@metamask/cryptography/.+\\.js$': path.join( + __dirname, + 'jest.cryptography-transform.cjs', + ), + }, + // An array of regexp pattern strings used to skip coverage collection coveragePathIgnorePatterns: ['./src/tests'], diff --git a/packages/keyring-eth-mpc/jest.cryptography-transform.cjs b/packages/keyring-eth-mpc/jest.cryptography-transform.cjs new file mode 100644 index 000000000..68037ecaf --- /dev/null +++ b/packages/keyring-eth-mpc/jest.cryptography-transform.cjs @@ -0,0 +1,33 @@ +/** + * Jest runs this package as CommonJS, and `@metamask/cryptography` ships + * ESM only. Transpile those files when the test runtime loads them. + * + * This file is CommonJS because Jest loads transformers without the + * package's TypeScript build. + */ +const ts = require('typescript'); + +/** + * @type {import('@jest/transform').Transformer} + */ +module.exports = { + /** + * Transpile an ESM file to CommonJS. + * + * @param {string} sourceText - ESM source from `@metamask/cryptography`. + * @param {string} sourcePath - Absolute path of the source file. + * @returns {{ code: string }} CommonJS source Jest can execute. + */ + process(sourceText, sourcePath) { + const result = ts.transpileModule(sourceText, { + compilerOptions: { + esModuleInterop: true, + module: ts.ModuleKind.CommonJS, + target: ts.ScriptTarget.ES2020, + }, + fileName: sourcePath, + }); + + return { code: result.outputText }; + }, +}; diff --git a/packages/keyring-eth-mpc/package.json b/packages/keyring-eth-mpc/package.json index 87484198a..02f35fc1d 100644 --- a/packages/keyring-eth-mpc/package.json +++ b/packages/keyring-eth-mpc/package.json @@ -53,6 +53,7 @@ }, "dependencies": { "@ethereumjs/util": "^9.1.0", + "@metamask/cryptography": "^1.1.2", "@metamask/eth-sig-util": "^9.0.0", "@metamask/keyring-api": "^24.2.0", "@metamask/keyring-sdk": "^4.0.0", diff --git a/packages/keyring-eth-mpc/src/util.ts b/packages/keyring-eth-mpc/src/util.ts index d2e96fec9..f3f5d61df 100644 --- a/packages/keyring-eth-mpc/src/util.ts +++ b/packages/keyring-eth-mpc/src/util.ts @@ -4,6 +4,7 @@ import { ecrecover, pubToAddress, } from '@ethereumjs/util'; +import { decrypt, encrypt, IV_LENGTH } from '@metamask/cryptography/aes-gcm'; import type { MessageTypes, TypedDataV1, @@ -19,7 +20,7 @@ import type { Hex } from '@metamask/utils'; import { add0x, assert, bytesToHex, hexToBytes } from '@metamask/utils'; const SESSION_NONCE_BYTE_LENGTH = 32; -export const AES_GCM_IV_LENGTH = 12; +export const AES_GCM_IV_LENGTH = IV_LENGTH; /** * Generate a session nonce: random bytes from the platform RNG, hex-encoded. @@ -54,19 +55,8 @@ export async function encryptBytes( throw new Error('Invalid backup encryption key length'); } - const cryptoKey = await globalThis.crypto.subtle.importKey( - 'raw', - key, - 'AES-GCM', - false, - ['encrypt'], - ); - const ciphertext = await globalThis.crypto.subtle.encrypt( - { name: 'AES-GCM', iv }, - cryptoKey, - plaintext, - ); - return concatBytes(iv, new Uint8Array(ciphertext)); + const { ciphertext } = await encrypt(key, plaintext, { unsafeIv: iv }); + return concatBytes(iv, ciphertext); } /** @@ -89,19 +79,7 @@ export async function decryptBytes( const iv = payload.slice(0, AES_GCM_IV_LENGTH); const ciphertext = payload.slice(AES_GCM_IV_LENGTH); - const cryptoKey = await globalThis.crypto.subtle.importKey( - 'raw', - key, - 'AES-GCM', - false, - ['decrypt'], - ); - const plaintext = await globalThis.crypto.subtle.decrypt( - { name: 'AES-GCM', iv }, - cryptoKey, - ciphertext, - ); - return new Uint8Array(plaintext); + return decrypt(key, iv, ciphertext); } const SECP256K1_N = BigInt( diff --git a/tsconfig.packages.json b/tsconfig.packages.json index 9a395f32e..6442e0ec4 100644 --- a/tsconfig.packages.json +++ b/tsconfig.packages.json @@ -28,6 +28,9 @@ * `jest.config.packages.js`. */ "paths": { + "@metamask/cryptography/aes-gcm": [ + "../../node_modules/@metamask/cryptography/dist/aes-gcm.d.ts" + ], "@metamask/*/v2": ["../*/src/v2"], "@metamask/*": ["../*/src"] } diff --git a/yarn.lock b/yarn.lock index 89d7d39e2..c5b6a2bb8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1832,7 +1832,7 @@ __metadata: languageName: node linkType: hard -"@metamask/cryptography@npm:^1.1.0": +"@metamask/cryptography@npm:^1.1.0, @metamask/cryptography@npm:^1.1.2": version: 1.1.2 resolution: "@metamask/cryptography@npm:1.1.2" checksum: 10/567ab4d7a27bbf1be129a120bd0d6d1dfc1677ddc36c2e81c259bebd7824b493fbb67127b585d57f94d98463daa7f7a43296db8ff2d9ed85f440ecc7e9c83dc9 @@ -2012,6 +2012,7 @@ __metadata: "@lavamoat/allow-scripts": "npm:^3.2.1" "@lavamoat/preinstall-always-fail": "npm:^2.1.0" "@metamask/auto-changelog": "npm:^6.1.0" + "@metamask/cryptography": "npm:^1.1.2" "@metamask/eth-sig-util": "npm:^9.0.0" "@metamask/keyring-api": "npm:^24.2.0" "@metamask/keyring-sdk": "npm:^4.0.0" From 61a5e57584b8ffc164594018fc5c33ee50234177 Mon Sep 17 00:00:00 2001 From: Matthias Geihs Date: Mon, 12 Oct 2026 16:47:35 +0200 Subject: [PATCH 32/38] cleanup CHANGELOG --- packages/keyring-eth-mpc/CHANGELOG.md | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/packages/keyring-eth-mpc/CHANGELOG.md b/packages/keyring-eth-mpc/CHANGELOG.md index 32cade015..b826e58f7 100644 --- a/packages/keyring-eth-mpc/CHANGELOG.md +++ b/packages/keyring-eth-mpc/CHANGELOG.md @@ -7,22 +7,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] -### Changed - -- Encrypt and decrypt key-share backups with `@metamask/cryptography` ([#TODO](https://github.com/MetaMask/accounts/pull/TODO)) - -### Fixed - -- Reject deserialized state that carries initialized key fields and a setup `mode` when the key fields are invalid ([#TODO](https://github.com/MetaMask/accounts/pull/TODO)) - ### Added -- Initial release of `@metamask/eth-mpc-keyring` ([#641](https://github.com/MetaMask/accounts/pull/641)), ([#653](https://github.com/MetaMask/accounts/pull/653)), ([#627](https://github.com/MetaMask/accounts/pull/627)) - - V1 `MpcKeyring` implementation for create/import, key-share maintenance, and signing. - - V2 `MpcKeyring` implements the unified V2 `Keyring` interface with type `KeyringType.Mpc` (available via `/v2` export). - - Account creation uses custom options: `{ type: 'custom', mode: 'create' | 'import' }`, and the keyring declares `custom.createAccounts` in its capabilities. - - Account are created with `options: { entropy: { type: 'mpc' }}`. - - Exposes `rotateKeyShares`, `checkKeyShare`, and `syncKeyShare` maintenance operations. +- Initial release of `@metamask/eth-mpc-keyring` ([#627](https://github.com/MetaMask/accounts/pull/627)) ### Changed From abe312d834096ecf91569779825838a29320b3ab Mon Sep 17 00:00:00 2001 From: matthiasgeihs <62935430+matthiasgeihs@users.noreply.github.com> Date: Tue, 13 Oct 2026 21:24:35 +0200 Subject: [PATCH 33/38] refactor(keyring-eth-money-mpc): rename the MPC keyring for money accounts (#669) ## Summary - Rename the package from `keyring-eth-mpc` / `@metamask/eth-mpc-keyring` to `keyring-eth-money-mpc` / `@metamask/eth-money-mpc-keyring`. - Rename the V1 and V2 keyring classes to `MpcMoneyKeyring`, and the controller type to `MPC Money Keyring`. - Update the related public types, source filenames, and monorepo references (README, tsconfig, Yarn constraints, PR title scope). ## Test plan - [ ] `yarn workspace @metamask/eth-money-mpc-keyring test` - [ ] Confirm the controller still registers the keyring under `MPC Money Keyring` - [ ] Confirm `KeyringType.Mpc` and `KeyringAccountEntropyTypeOption.Mpc` are unchanged Made with [Cursor](https://cursor.com) Co-authored-by: Cursor --- .github/workflows/validate-pr-title.yml | 2 +- README.md | 10 ++-- .../CHANGELOG.md | 3 +- .../LICENSE | 0 packages/keyring-eth-money-mpc/README.md | 17 ++++++ .../jest.config.cjs | 0 .../jest.cryptography-transform.cjs | 0 .../package.json | 10 ++-- .../src/cloud.test.ts | 0 .../src/cloud.ts | 0 packages/keyring-eth-money-mpc/src/index.ts | 10 ++++ .../src/mpc-money-keyring.test.ts} | 20 +++---- .../src/mpc-money-keyring.ts} | 46 +++++++-------- .../src/types.ts | 38 ++++++------- .../src/util.test.ts | 0 .../src/util.ts | 0 .../keyring-eth-money-mpc/src/v2/index.ts | 5 ++ .../src/v2/mpc-money-keyring.test.ts} | 53 +++++++++--------- .../src/v2/mpc-money-keyring.ts} | 56 +++++++++---------- .../tsconfig.build.json | 0 .../tsconfig.json | 0 packages/keyring-eth-mpc/README.md | 17 ------ packages/keyring-eth-mpc/src/index.ts | 10 ---- packages/keyring-eth-mpc/src/v2/index.ts | 5 -- tsconfig.build.json | 2 +- tsconfig.json | 2 +- yarn.config.cjs | 2 +- yarn.lock | 4 +- 28 files changed, 158 insertions(+), 154 deletions(-) rename packages/{keyring-eth-mpc => keyring-eth-money-mpc}/CHANGELOG.md (64%) rename packages/{keyring-eth-mpc => keyring-eth-money-mpc}/LICENSE (100%) create mode 100644 packages/keyring-eth-money-mpc/README.md rename packages/{keyring-eth-mpc => keyring-eth-money-mpc}/jest.config.cjs (100%) rename packages/{keyring-eth-mpc => keyring-eth-money-mpc}/jest.cryptography-transform.cjs (100%) rename packages/{keyring-eth-mpc => keyring-eth-money-mpc}/package.json (90%) rename packages/{keyring-eth-mpc => keyring-eth-money-mpc}/src/cloud.test.ts (100%) rename packages/{keyring-eth-mpc => keyring-eth-money-mpc}/src/cloud.ts (100%) create mode 100644 packages/keyring-eth-money-mpc/src/index.ts rename packages/{keyring-eth-mpc/src/mpc-keyring.test.ts => keyring-eth-money-mpc/src/mpc-money-keyring.test.ts} (98%) rename packages/{keyring-eth-mpc/src/mpc-keyring.ts => keyring-eth-money-mpc/src/mpc-money-keyring.ts} (95%) rename packages/{keyring-eth-mpc => keyring-eth-money-mpc}/src/types.ts (66%) rename packages/{keyring-eth-mpc => keyring-eth-money-mpc}/src/util.test.ts (100%) rename packages/{keyring-eth-mpc => keyring-eth-money-mpc}/src/util.ts (100%) create mode 100644 packages/keyring-eth-money-mpc/src/v2/index.ts rename packages/{keyring-eth-mpc/src/v2/mpc-keyring.test.ts => keyring-eth-money-mpc/src/v2/mpc-money-keyring.test.ts} (91%) rename packages/{keyring-eth-mpc/src/v2/mpc-keyring.ts => keyring-eth-money-mpc/src/v2/mpc-money-keyring.ts} (72%) rename packages/{keyring-eth-mpc => keyring-eth-money-mpc}/tsconfig.build.json (100%) rename packages/{keyring-eth-mpc => keyring-eth-money-mpc}/tsconfig.json (100%) delete mode 100644 packages/keyring-eth-mpc/README.md delete mode 100644 packages/keyring-eth-mpc/src/index.ts delete mode 100644 packages/keyring-eth-mpc/src/v2/index.ts diff --git a/.github/workflows/validate-pr-title.yml b/.github/workflows/validate-pr-title.yml index e62e3fd92..702519919 100644 --- a/.github/workflows/validate-pr-title.yml +++ b/.github/workflows/validate-pr-title.yml @@ -44,10 +44,10 @@ jobs: keyring-api keyring-eth-hd keyring-eth-money + keyring-eth-money-mpc keyring-eth-ledger-bridge keyring-eth-simple keyring-eth-trezor - keyring-eth-mpc keyring-internal-api keyring-internal-snap-client keyring-sdk diff --git a/README.md b/README.md index d67e81de4..14571eef9 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ This repository contains the following packages [^fn1]: - [`@metamask/eth-hd-keyring`](packages/keyring-eth-hd) - [`@metamask/eth-ledger-bridge-keyring`](packages/keyring-eth-ledger-bridge) - [`@metamask/eth-money-keyring`](packages/keyring-eth-money) -- [`@metamask/eth-mpc-keyring`](packages/keyring-eth-mpc) +- [`@metamask/eth-money-mpc-keyring`](packages/keyring-eth-money-mpc) - [`@metamask/eth-qr-keyring`](packages/keyring-eth-qr) - [`@metamask/eth-simple-keyring`](packages/keyring-eth-simple) - [`@metamask/eth-snap-keyring`](packages/keyring-snap-bridge) @@ -53,7 +53,7 @@ linkStyle default opacity:0.5 eth_hd_keyring(["@metamask/eth-hd-keyring"]); eth_ledger_bridge_keyring(["@metamask/eth-ledger-bridge-keyring"]); eth_money_keyring(["@metamask/eth-money-keyring"]); - eth_mpc_keyring(["@metamask/eth-mpc-keyring"]); + eth_money_mpc_keyring(["@metamask/eth-money-mpc-keyring"]); eth_qr_keyring(["@metamask/eth-qr-keyring"]); eth_simple_keyring(["@metamask/eth-simple-keyring"]); eth_trezor_keyring(["@metamask/eth-trezor-keyring"]); @@ -81,9 +81,9 @@ linkStyle default opacity:0.5 eth_money_keyring --> keyring_api; eth_money_keyring --> keyring_sdk; eth_money_keyring --> keyring_utils; - eth_mpc_keyring --> keyring_api; - eth_mpc_keyring --> keyring_sdk; - eth_mpc_keyring --> keyring_utils; + eth_money_mpc_keyring --> keyring_api; + eth_money_mpc_keyring --> keyring_sdk; + eth_money_mpc_keyring --> keyring_utils; eth_qr_keyring --> keyring_api; eth_qr_keyring --> keyring_sdk; eth_qr_keyring --> keyring_utils; diff --git a/packages/keyring-eth-mpc/CHANGELOG.md b/packages/keyring-eth-money-mpc/CHANGELOG.md similarity index 64% rename from packages/keyring-eth-mpc/CHANGELOG.md rename to packages/keyring-eth-money-mpc/CHANGELOG.md index b826e58f7..57a2a6299 100644 --- a/packages/keyring-eth-mpc/CHANGELOG.md +++ b/packages/keyring-eth-money-mpc/CHANGELOG.md @@ -9,10 +9,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added -- Initial release of `@metamask/eth-mpc-keyring` ([#627](https://github.com/MetaMask/accounts/pull/627)) +- Initial release of `@metamask/eth-money-mpc-keyring` ([#627](https://github.com/MetaMask/accounts/pull/627)) ### Changed +- Rename the package to `@metamask/eth-money-mpc-keyring`, the keyring class to `MpcMoneyKeyring`, and the controller type to `MPC Money Keyring` ([#TODO](https://github.com/MetaMask/accounts/pull/TODO)) - Bump `@metamask/keyring-api` from `^24.1.0` to `^24.2.0` ([#660](https://github.com/MetaMask/accounts/pull/660)) - Bump `@metamask/keyring-sdk` from `^3.1.0` to `^4.0.0` ([#664](https://github.com/MetaMask/accounts/pull/664)) diff --git a/packages/keyring-eth-mpc/LICENSE b/packages/keyring-eth-money-mpc/LICENSE similarity index 100% rename from packages/keyring-eth-mpc/LICENSE rename to packages/keyring-eth-money-mpc/LICENSE diff --git a/packages/keyring-eth-money-mpc/README.md b/packages/keyring-eth-money-mpc/README.md new file mode 100644 index 000000000..3fa2232b8 --- /dev/null +++ b/packages/keyring-eth-money-mpc/README.md @@ -0,0 +1,17 @@ +# MPC Money Keyring + +A Keyring for Ethereum money accounts that uses Multi-Party Computation (MPC) for key management and signing, built on top of the [MFA Wallet SDK](https://github.com/MetaMask/mfa-wallet-sdk). + +The default export is the V1 `MpcMoneyKeyring` implementation. A V2 adapter that wraps it is available from `@metamask/eth-money-mpc-keyring/v2`. + +## Installation + +`yarn add @metamask/eth-money-mpc-keyring` + +or + +`npm install @metamask/eth-money-mpc-keyring` + +## Contributing + +This package is part of a monorepo. Instructions for contributing can be found in the [monorepo README](https://github.com/MetaMask/accounts#readme). diff --git a/packages/keyring-eth-mpc/jest.config.cjs b/packages/keyring-eth-money-mpc/jest.config.cjs similarity index 100% rename from packages/keyring-eth-mpc/jest.config.cjs rename to packages/keyring-eth-money-mpc/jest.config.cjs diff --git a/packages/keyring-eth-mpc/jest.cryptography-transform.cjs b/packages/keyring-eth-money-mpc/jest.cryptography-transform.cjs similarity index 100% rename from packages/keyring-eth-mpc/jest.cryptography-transform.cjs rename to packages/keyring-eth-money-mpc/jest.cryptography-transform.cjs diff --git a/packages/keyring-eth-mpc/package.json b/packages/keyring-eth-money-mpc/package.json similarity index 90% rename from packages/keyring-eth-mpc/package.json rename to packages/keyring-eth-money-mpc/package.json index 02f35fc1d..5d728d515 100644 --- a/packages/keyring-eth-mpc/package.json +++ b/packages/keyring-eth-money-mpc/package.json @@ -1,12 +1,12 @@ { - "name": "@metamask/eth-mpc-keyring", + "name": "@metamask/eth-money-mpc-keyring", "version": "0.0.0", - "description": "A Keyring for Ethereum accounts that uses Multi-Party Computation (MPC) for key management and signing", + "description": "A Keyring for Ethereum money accounts that uses Multi-Party Computation (MPC) for key management and signing", "keywords": [ "ethereum", "keyring" ], - "homepage": "https://github.com/MetaMask/accounts/tree/main/packages/keyring-eth-mpc#readme", + "homepage": "https://github.com/MetaMask/accounts/tree/main/packages/keyring-eth-money-mpc#readme", "bugs": { "url": "https://github.com/MetaMask/accounts/issues" }, @@ -39,8 +39,8 @@ "build": "ts-bridge --project tsconfig.build.json --verbose --clean --no-references --format module", "build:clean": "yarn build --clean", "build:docs": "typedoc", - "changelog:update": "../../scripts/update-changelog.sh @metamask/eth-mpc-keyring", - "changelog:validate": "../../scripts/validate-changelog.sh @metamask/eth-mpc-keyring", + "changelog:update": "../../scripts/update-changelog.sh @metamask/eth-money-mpc-keyring", + "changelog:validate": "../../scripts/validate-changelog.sh @metamask/eth-money-mpc-keyring", "publish:preview": "yarn npm publish --tag preview", "test": "yarn test:source && yarn test:types", "test:clean": "jest --clearCache", diff --git a/packages/keyring-eth-mpc/src/cloud.test.ts b/packages/keyring-eth-money-mpc/src/cloud.test.ts similarity index 100% rename from packages/keyring-eth-mpc/src/cloud.test.ts rename to packages/keyring-eth-money-mpc/src/cloud.test.ts diff --git a/packages/keyring-eth-mpc/src/cloud.ts b/packages/keyring-eth-money-mpc/src/cloud.ts similarity index 100% rename from packages/keyring-eth-mpc/src/cloud.ts rename to packages/keyring-eth-money-mpc/src/cloud.ts diff --git a/packages/keyring-eth-money-mpc/src/index.ts b/packages/keyring-eth-money-mpc/src/index.ts new file mode 100644 index 000000000..473fdb6ef --- /dev/null +++ b/packages/keyring-eth-money-mpc/src/index.ts @@ -0,0 +1,10 @@ +export { MpcMoneyKeyring } from './mpc-money-keyring.js'; + +export { MpcMoneyKeyringSetupMode } from './types.js'; +export type { + MpcMoneyKeyringOpts, + MpcMoneyKeyringSerializer, + MpcMoneyKeyringSetupParams, + MpcMoneyKeyringState, + ProfileTokenOpts, +} from './types.js'; diff --git a/packages/keyring-eth-mpc/src/mpc-keyring.test.ts b/packages/keyring-eth-money-mpc/src/mpc-money-keyring.test.ts similarity index 98% rename from packages/keyring-eth-mpc/src/mpc-keyring.test.ts rename to packages/keyring-eth-money-mpc/src/mpc-money-keyring.test.ts index a61714fa1..7ae91632c 100644 --- a/packages/keyring-eth-mpc/src/mpc-keyring.test.ts +++ b/packages/keyring-eth-money-mpc/src/mpc-money-keyring.test.ts @@ -3,7 +3,7 @@ import { hashPersonalMessage } from '@ethereumjs/util'; import { bytesToHex } from '@metamask/utils'; import type { Hex, Json } from '@metamask/utils'; -import { MpcKeyring } from './mpc-keyring.js'; +import { MpcMoneyKeyring } from './mpc-money-keyring.js'; const mockCreateKey = jest.fn(); const mockRotateKeyShares = jest.fn(); @@ -189,7 +189,7 @@ const makeKeyring = ( getProfileToken = jest.fn().mockResolvedValue('token'), getBackupEncryptionKey = jest.fn().mockResolvedValue(mockBackupKey), ) => - new MpcKeyring({ + new MpcMoneyKeyring({ cl24Lib: {} as never, dkls23Lib: {} as never, cloudURL: 'https://cloud.example', @@ -199,13 +199,13 @@ const makeKeyring = ( }); const deserializeState = async ( - keyring: MpcKeyring, + keyring: MpcMoneyKeyring, state = makeSerializedState(), ) => { await keyring.deserialize(state as unknown as Json); }; -describe('MpcKeyring', () => { +describe('MpcMoneyKeyring', () => { beforeEach(() => { lastNetworkManagerOptions = undefined; @@ -252,15 +252,15 @@ describe('MpcKeyring', () => { it('exposes the expected type constant', () => { const keyring = makeKeyring(); - expect(MpcKeyring.type).toBe('MPC Keyring'); - expect(keyring.type).toBe('MPC Keyring'); + expect(MpcMoneyKeyring.type).toBe('MPC Money Keyring'); + expect(keyring.type).toBe('MPC Money Keyring'); }); it('wires network manager options', () => { const transportToken = jest.fn().mockResolvedValue('transport-token'); const webSocket = { send: jest.fn() }; - const keyring = new MpcKeyring({ + const keyring = new MpcMoneyKeyring({ cl24Lib: {} as never, dkls23Lib: {} as never, cloudURL: 'https://cloud.example', @@ -270,7 +270,7 @@ describe('MpcKeyring', () => { getTransportToken: transportToken, webSocket, }); - expect(keyring.type).toBe('MPC Keyring'); + expect(keyring.type).toBe('MPC Money Keyring'); expect(lastNetworkManagerOptions).toStrictEqual( expect.objectContaining({ @@ -961,7 +961,7 @@ describe('MpcKeyring', () => { const keyring = makeKeyring(); await expect(keyring.addAccounts()).rejects.toThrow( - 'MpcKeyring: has no account', + 'MpcMoneyKeyring: has no account', ); }); @@ -970,7 +970,7 @@ describe('MpcKeyring', () => { await deserializeState(keyring); await expect(keyring.addAccounts(2)).rejects.toThrow( - 'MpcKeyring: supports adding exactly one account', + 'MpcMoneyKeyring: supports adding exactly one account', ); }); diff --git a/packages/keyring-eth-mpc/src/mpc-keyring.ts b/packages/keyring-eth-money-mpc/src/mpc-money-keyring.ts similarity index 95% rename from packages/keyring-eth-mpc/src/mpc-keyring.ts rename to packages/keyring-eth-money-mpc/src/mpc-money-keyring.ts index 11401ee6a..cc618da19 100644 --- a/packages/keyring-eth-mpc/src/mpc-keyring.ts +++ b/packages/keyring-eth-money-mpc/src/mpc-money-keyring.ts @@ -48,12 +48,12 @@ import { storeKeyShareBackup, } from './cloud.js'; import type { - MpcKeyring as MpcKeyringContract, - MpcKeyringOpts, - MpcKeyringSerializer, - MpcKeyringSetupParams, - MpcKeyringState, - MpcKeyringStorageState, + MpcMoneyKeyring as MpcMoneyKeyringContract, + MpcMoneyKeyringOpts, + MpcMoneyKeyringSerializer, + MpcMoneyKeyringSetupParams, + MpcMoneyKeyringState, + MpcMoneyKeyringStorageState, ProfileTokenOpts, } from './types.js'; import { @@ -69,7 +69,7 @@ import { toEthSig, } from './util.js'; -const mpcKeyringType = 'MPC Keyring'; +const mpcMoneyKeyringType = 'MPC Money Keyring'; const TSS_HAVE_SETUP_MESSAGE_TYPE = 'tss-have-setup'; const STATUS_MESSAGE_TYPE = 'status'; const STATUS_DATA_PERSISTED_PAYLOAD = 'data persisted'; @@ -184,18 +184,18 @@ function shareBindings( } /** - * 2-of-2 Ethereum keyring. The client holds one DKLS23 share and signs + * 2-of-2 Ethereum money keyring. The client holds one DKLS23 share and signs * with a cloud peer. Shares are stored as encrypted epochs on the backend. * - * The controller keyring type is `'MPC Keyring'`. + * The controller keyring type is `'MPC Money Keyring'`. */ -export class MpcKeyring implements MpcKeyringContract { +export class MpcMoneyKeyring implements MpcMoneyKeyringContract { /** * Keyring type registered with the controller. */ - static type: string = mpcKeyringType; + static type: string = mpcMoneyKeyringType; - readonly type: string = mpcKeyringType; + readonly type: string = mpcMoneyKeyringType; readonly #networkManager: CentrifugeNetworkManager; @@ -203,11 +203,11 @@ export class MpcKeyring implements MpcKeyringContract { readonly #dkm: CL24DKM; - #state?: MpcKeyringStorageState; + #state?: MpcMoneyKeyringStorageState; readonly #cloudURL: string; - readonly #serializer: MpcKeyringSerializer; + readonly #serializer: MpcMoneyKeyringSerializer; readonly #getProfileToken: (opts?: ProfileTokenOpts) => Promise; @@ -218,12 +218,12 @@ export class MpcKeyring implements MpcKeyringContract { /** * Create a keyring bound to the given cloud and relayer endpoints. * - * The keyring stays uninitialized until {@link MpcKeyring.init} or - * {@link MpcKeyring.deserialize}. + * The keyring stays uninitialized until {@link MpcMoneyKeyring.init} or + * {@link MpcMoneyKeyring.deserialize}. * * @param opts - TSS libraries, backend URLs, and token callbacks. */ - constructor(opts: MpcKeyringOpts) { + constructor(opts: MpcMoneyKeyringOpts) { this.#dkm = new CL24DKM(opts.cl24Lib); this.#tss = new Dkls23TssLib(opts.dkls23Lib); this.#cloudURL = opts.cloudURL; @@ -316,7 +316,7 @@ export class MpcKeyring implements MpcKeyringContract { * @param mode - Create a new key or import from the backend backup. * @returns Resolves when the keyring is initialized. */ - async init(mode?: MpcKeyringSetupParams['mode']): Promise { + async init(mode?: MpcMoneyKeyringSetupParams['mode']): Promise { return this.#serializeOp(async () => { if (this.#state?.status === 'initialized') { return; @@ -463,7 +463,7 @@ export class MpcKeyring implements MpcKeyringContract { /** * Return the single MPC account. The account is created during - * {@link MpcKeyring.init}, not by this method. + * {@link MpcMoneyKeyring.init}, not by this method. * * @param numberOfAccounts - Must be 1 (the only supported value). * @returns The address of the existing account. @@ -471,13 +471,13 @@ export class MpcKeyring implements MpcKeyringContract { */ async addAccounts(numberOfAccounts = 1): Promise { if (numberOfAccounts !== 1) { - throw new Error('MpcKeyring: supports adding exactly one account'); + throw new Error('MpcMoneyKeyring: supports adding exactly one account'); } const accounts = await this.getAccounts(); const account = accounts[0]; if (!account) { - throw new Error('MpcKeyring: has no account'); + throw new Error('MpcMoneyKeyring: has no account'); } return [account]; @@ -858,14 +858,14 @@ export class MpcKeyring implements MpcKeyringContract { } } - #applyKeyState(state: MpcKeyringState): void { + #applyKeyState(state: MpcMoneyKeyringState): void { this.#state = { status: 'initialized', ...state, }; } - #assertState(): MpcKeyringState { + #assertState(): MpcMoneyKeyringState { if (!this.#state || this.#state.status !== 'initialized') { throw new Error('Keyring not initialized'); } diff --git a/packages/keyring-eth-mpc/src/types.ts b/packages/keyring-eth-money-mpc/src/types.ts similarity index 66% rename from packages/keyring-eth-mpc/src/types.ts rename to packages/keyring-eth-money-mpc/src/types.ts index c8a42a181..10e959a1a 100644 --- a/packages/keyring-eth-mpc/src/types.ts +++ b/packages/keyring-eth-money-mpc/src/types.ts @@ -12,7 +12,7 @@ export type ProfileTokenOpts = { export type Cl24Lib = ConstructorParameters[0]; export type Dkls23Lib = ConstructorParameters[0]; -export type MpcKeyringOpts = { +export type MpcMoneyKeyringOpts = { cl24Lib: Cl24Lib; dkls23Lib: Dkls23Lib; cloudURL: string; @@ -23,7 +23,7 @@ export type MpcKeyringOpts = { webSocket?: unknown; }; -export type MpcKeyringState = { +export type MpcMoneyKeyringState = { keyShare: CL24ThresholdKey; shareEpoch: number; netCreds: CentrifugeIdentity; @@ -31,17 +31,17 @@ export type MpcKeyringState = { tssSetup: Uint8Array | null; }; -/** The MPC keyring setup modes. */ -export const MpcKeyringSetupMode = { +/** The MPC money keyring setup modes. */ +export const MpcMoneyKeyringSetupMode = { Create: 'create', Import: 'import', } as const; -export type MpcKeyringSetupMode = - `${(typeof MpcKeyringSetupMode)[keyof typeof MpcKeyringSetupMode]}`; +export type MpcMoneyKeyringSetupMode = + `${(typeof MpcMoneyKeyringSetupMode)[keyof typeof MpcMoneyKeyringSetupMode]}`; -export type MpcKeyringSetupParams = { - mode: MpcKeyringSetupMode; +export type MpcMoneyKeyringSetupParams = { + mode: MpcMoneyKeyringSetupMode; }; type JsonSerializer = { @@ -49,35 +49,35 @@ type JsonSerializer = { fromJson: (value: Json) => Value; }; -export type MpcKeyringInitializedState = { +export type MpcMoneyKeyringInitializedState = { status: 'initialized'; -} & MpcKeyringState; +} & MpcMoneyKeyringState; -export type MpcKeyringUninitializedState = { +export type MpcMoneyKeyringUninitializedState = { status: 'uninitialized'; - setup: MpcKeyringSetupParams; + setup: MpcMoneyKeyringSetupParams; }; -export type MpcKeyringStorageState = - | MpcKeyringInitializedState - | MpcKeyringUninitializedState; +export type MpcMoneyKeyringStorageState = + | MpcMoneyKeyringInitializedState + | MpcMoneyKeyringUninitializedState; -export type MpcKeyringSerializer = { +export type MpcMoneyKeyringSerializer = { thresholdKey: JsonSerializer; networkIdentity: JsonSerializer; }; /** - * The MPC keyring contract implemented by the V1 keyring class and consumed + * The MPC money keyring contract implemented by the V1 keyring class and consumed * by the V2 adapter. */ -export type MpcKeyring = EthKeyring & { +export type MpcMoneyKeyring = EthKeyring & { /** * Run key generation or import. * * @param mode - The MPC setup mode. */ - init(mode?: MpcKeyringSetupMode): Promise; + init(mode?: MpcMoneyKeyringSetupMode): Promise; /** * Rotate the MPC key shares. diff --git a/packages/keyring-eth-mpc/src/util.test.ts b/packages/keyring-eth-money-mpc/src/util.test.ts similarity index 100% rename from packages/keyring-eth-mpc/src/util.test.ts rename to packages/keyring-eth-money-mpc/src/util.test.ts diff --git a/packages/keyring-eth-mpc/src/util.ts b/packages/keyring-eth-money-mpc/src/util.ts similarity index 100% rename from packages/keyring-eth-mpc/src/util.ts rename to packages/keyring-eth-money-mpc/src/util.ts diff --git a/packages/keyring-eth-money-mpc/src/v2/index.ts b/packages/keyring-eth-money-mpc/src/v2/index.ts new file mode 100644 index 000000000..2a001b5f0 --- /dev/null +++ b/packages/keyring-eth-money-mpc/src/v2/index.ts @@ -0,0 +1,5 @@ +export { + MpcMoneyKeyring, + type MpcMoneyCreateAccountOptions, + type MpcMoneyKeyringOptions, +} from './mpc-money-keyring'; diff --git a/packages/keyring-eth-mpc/src/v2/mpc-keyring.test.ts b/packages/keyring-eth-money-mpc/src/v2/mpc-money-keyring.test.ts similarity index 91% rename from packages/keyring-eth-mpc/src/v2/mpc-keyring.test.ts rename to packages/keyring-eth-money-mpc/src/v2/mpc-money-keyring.test.ts index 16145ccf5..49638c45a 100644 --- a/packages/keyring-eth-mpc/src/v2/mpc-keyring.test.ts +++ b/packages/keyring-eth-money-mpc/src/v2/mpc-money-keyring.test.ts @@ -12,23 +12,26 @@ import { EthKeyringMethod } from '@metamask/keyring-sdk/v2'; import type { AccountId } from '@metamask/keyring-utils'; import type { Hex, Json } from '@metamask/utils'; -import type { MpcKeyring as MpcKeyringV1 } from '../types'; -import { MPC_KEYRING_METHODS, MpcKeyring } from './mpc-keyring'; -import type { MpcCreateAccountOptions } from './mpc-keyring'; +import type { MpcMoneyKeyring as MpcMoneyKeyringV1 } from '../types'; +import { + MPC_MONEY_KEYRING_METHODS, + MpcMoneyKeyring, +} from './mpc-money-keyring'; +import type { MpcMoneyCreateAccountOptions } from './mpc-money-keyring'; const MOCK_ADDRESS = '0x1111111111111111111111111111111111111111' as Hex; const OTHER_ADDRESS = '0x2222222222222222222222222222222222222222' as Hex; /** - * Expected methods supported by MPC keyring accounts. + * Expected methods supported by MPC money keyring accounts. */ -const EXPECTED_METHODS = MPC_KEYRING_METHODS; +const EXPECTED_METHODS = MPC_MONEY_KEYRING_METHODS; /** - * The legacy MPC keyring methods that the V2 wrapper delegates to, mocked + * The legacy MPC money keyring methods that the V2 wrapper delegates to, mocked * for testing. */ -type MockMpcKeyringV1 = { +type MockMpcMoneyKeyringV1 = { type: string; getAccounts: jest.Mock; init: jest.Mock; @@ -46,14 +49,14 @@ type MockMpcKeyringV1 = { }; /** - * Create a mock of the legacy MPC keyring with all the methods the V2 + * Create a mock of the legacy MPC money keyring with all the methods the V2 * wrapper delegates to. * * @returns The mocked inner keyring. */ -function createInner(): MockMpcKeyringV1 { +function createInner(): MockMpcMoneyKeyringV1 { return { - type: 'MPC Keyring', + type: 'MPC Money Keyring', getAccounts: jest.fn().mockResolvedValue([] as Hex[]), init: jest.fn().mockResolvedValue(undefined), serialize: jest.fn().mockResolvedValue({}), @@ -71,7 +74,7 @@ function createInner(): MockMpcKeyringV1 { } /** - * Create a V2 wrapper around a mocked legacy MPC keyring. + * Create a V2 wrapper around a mocked legacy MPC money keyring. * * @param args - Setup arguments. * @param args.accounts - The addresses reported by the inner keyring. @@ -82,14 +85,14 @@ function setup({ }: { accounts?: Hex[]; } = {}): { - wrapper: MpcKeyring; - inner: MockMpcKeyringV1; + wrapper: MpcMoneyKeyring; + inner: MockMpcMoneyKeyringV1; } { const inner = createInner(); inner.getAccounts.mockResolvedValue(accounts); - const wrapper = new MpcKeyring({ - legacyKeyring: inner as unknown as MpcKeyringV1, + const wrapper = new MpcMoneyKeyring({ + legacyKeyring: inner as unknown as MpcMoneyKeyringV1, }); return { wrapper, inner }; @@ -102,8 +105,8 @@ function setup({ * @returns The wrapper, the mocked inner keyring, and the account ID. */ async function createWrapperWithAccount(): Promise<{ - wrapper: MpcKeyring; - inner: MockMpcKeyringV1; + wrapper: MpcMoneyKeyring; + inner: MockMpcMoneyKeyringV1; accountId: AccountId; }> { const { wrapper, inner } = setup({ accounts: [MOCK_ADDRESS] }); @@ -137,7 +140,7 @@ function createMockRequest( }; } -describe('MpcKeyring (v2 wrapper)', () => { +describe('MpcMoneyKeyring (v2 wrapper)', () => { describe('constructor', () => { it('creates a wrapper with the correct type and capabilities', () => { const { wrapper } = setup(); @@ -194,7 +197,7 @@ describe('MpcKeyring (v2 wrapper)', () => { inner.getAccounts.mockResolvedValue([MOCK_ADDRESS, OTHER_ADDRESS]); await expect(wrapper.getAccounts()).rejects.toThrow( - 'MpcKeyring: supports at most one account', + 'MpcMoneyKeyring: supports at most one account', ); }); }); @@ -262,7 +265,7 @@ describe('MpcKeyring (v2 wrapper)', () => { await expect( wrapper.createAccounts({ type: 'custom', mode: 'create' }), - ).rejects.toThrow('MpcKeyring: account creation failed'); + ).rejects.toThrow('MpcMoneyKeyring: account creation failed'); expect(inner.init).toHaveBeenCalledWith('create'); }); @@ -274,10 +277,10 @@ describe('MpcKeyring (v2 wrapper)', () => { type: 'bip44:derive-index', entropySource: 'entropy-source', groupIndex: 0, - } as unknown as MpcCreateAccountOptions; + } as unknown as MpcMoneyCreateAccountOptions; await expect(wrapper.createAccounts(invalidOptions)).rejects.toThrow( - 'MpcKeyring: unsupported account creation type: bip44:derive-index', + 'MpcMoneyKeyring: unsupported account creation type: bip44:derive-index', ); expect(inner.init).not.toHaveBeenCalled(); }); @@ -288,10 +291,10 @@ describe('MpcKeyring (v2 wrapper)', () => { const invalidOptions = { type: 'custom', mode: 'bogus', - } as unknown as MpcCreateAccountOptions; + } as unknown as MpcMoneyCreateAccountOptions; await expect(wrapper.createAccounts(invalidOptions)).rejects.toThrow( - 'MpcKeyring: invalid mode: bogus', + 'MpcMoneyKeyring: invalid mode: bogus', ); expect(inner.init).not.toHaveBeenCalled(); }); @@ -327,7 +330,7 @@ describe('MpcKeyring (v2 wrapper)', () => { await expect( wrapper.deleteAccount(account?.id ?? ('' as AccountId)), - ).rejects.toThrow('MpcKeyring: deleting accounts is not supported'); + ).rejects.toThrow('MpcMoneyKeyring: deleting accounts is not supported'); }); }); diff --git a/packages/keyring-eth-mpc/src/v2/mpc-keyring.ts b/packages/keyring-eth-money-mpc/src/v2/mpc-money-keyring.ts similarity index 72% rename from packages/keyring-eth-mpc/src/v2/mpc-keyring.ts rename to packages/keyring-eth-money-mpc/src/v2/mpc-money-keyring.ts index 4e6b13608..afcf77085 100644 --- a/packages/keyring-eth-mpc/src/v2/mpc-keyring.ts +++ b/packages/keyring-eth-money-mpc/src/v2/mpc-money-keyring.ts @@ -11,14 +11,14 @@ import { EthKeyringMethod, EthKeyringWrapper } from '@metamask/keyring-sdk/v2'; import type { AccountId } from '@metamask/keyring-utils'; import type { Hex } from '@metamask/utils'; -import { MpcKeyringSetupMode } from '../types'; -import type { MpcKeyring as MpcKeyringV1 } from '../types'; +import { MpcMoneyKeyringSetupMode } from '../types'; +import type { MpcMoneyKeyring as MpcMoneyKeyringV1 } from '../types'; /** - * Methods supported by MPC keyring EOA accounts. - * MPC keyrings support signing methods, but not encryption or app keys. + * Methods supported by MPC money keyring EOA accounts. + * MPC money keyrings support signing methods, but not encryption or app keys. */ -export const MPC_KEYRING_METHODS = [ +export const MPC_MONEY_KEYRING_METHODS = [ EthMethod.SignTransaction, EthMethod.PersonalSign, EthMethod.SignTypedDataV1, @@ -28,9 +28,9 @@ export const MPC_KEYRING_METHODS = [ ]; /** - * Capabilities for the MPC keyring. + * Capabilities for the MPC money keyring. */ -const mpcKeyringCapabilities: KeyringCapabilities = { +const mpcMoneyKeyringCapabilities: KeyringCapabilities = { scopes: [EthScope.Eoa], custom: { createAccounts: true, @@ -38,9 +38,9 @@ const mpcKeyringCapabilities: KeyringCapabilities = { }; /** - * Options for creating an account in the MPC keyring. + * Options for creating an account in the MPC money keyring. */ -export type MpcCreateAccountOptions = { +export type MpcMoneyCreateAccountOptions = { /** * The type of the options. */ @@ -49,35 +49,35 @@ export type MpcCreateAccountOptions = { /** * The MPC setup mode. */ - mode?: MpcKeyringSetupMode; + mode?: MpcMoneyKeyringSetupMode; }; /** - * Options for constructing the V2 {@link MpcKeyring}. + * Options for constructing the V2 {@link MpcMoneyKeyring}. */ -export type MpcKeyringOptions = { +export type MpcMoneyKeyringOptions = { /** * The underlying "old" keyring instance that this wrapper adapts. */ - legacyKeyring: MpcKeyringV1; + legacyKeyring: MpcMoneyKeyringV1; }; /** - * Concrete {@link Keyring} adapter for a {@link MpcKeyringV1} + * Concrete {@link Keyring} adapter for a {@link MpcMoneyKeyringV1} * implementation. * * This wrapper exposes the accounts and signing capabilities of the legacy - * MPC keyring via the unified V2 interface. + * MPC money keyring via the unified V2 interface. */ -export class MpcKeyring - extends EthKeyringWrapper +export class MpcMoneyKeyring + extends EthKeyringWrapper implements Keyring { - constructor(options: MpcKeyringOptions) { + constructor(options: MpcMoneyKeyringOptions) { super({ type: KeyringType.Mpc, inner: options.legacyKeyring, - capabilities: mpcKeyringCapabilities, + capabilities: mpcMoneyKeyringCapabilities, }); } @@ -90,7 +90,7 @@ export class MpcKeyring const addresses = await this.inner.getAccounts(); if (addresses.length > 1) { - throw new Error('MpcKeyring: supports at most one account'); + throw new Error('MpcMoneyKeyring: supports at most one account'); } const [address] = addresses; @@ -112,7 +112,7 @@ export class MpcKeyring type: EthAccountType.Eoa, address, scopes: [...this.capabilities.scopes], - methods: [...MPC_KEYRING_METHODS], + methods: [...MPC_MONEY_KEYRING_METHODS], options: { entropy: { type: KeyringAccountEntropyTypeOption.Mpc, @@ -147,12 +147,12 @@ export class MpcKeyring * account. */ async createAccounts( - options: MpcCreateAccountOptions, + options: MpcMoneyCreateAccountOptions, ): Promise { return this.withLock(async () => { if (options.type !== 'custom') { throw new Error( - `MpcKeyring: unsupported account creation type: ${String( + `MpcMoneyKeyring: unsupported account creation type: ${String( options.type, )}`, ); @@ -161,10 +161,10 @@ export class MpcKeyring const { mode } = options; if ( mode !== undefined && - mode !== MpcKeyringSetupMode.Create && - mode !== MpcKeyringSetupMode.Import + mode !== MpcMoneyKeyringSetupMode.Create && + mode !== MpcMoneyKeyringSetupMode.Import ) { - throw new Error(`MpcKeyring: invalid mode: ${String(mode)}`); + throw new Error(`MpcMoneyKeyring: invalid mode: ${String(mode)}`); } const accounts = await this.getAccounts(); @@ -176,7 +176,7 @@ export class MpcKeyring const [createdAccount] = await this.getAccounts(); if (!createdAccount) { - throw new Error('MpcKeyring: account creation failed'); + throw new Error('MpcMoneyKeyring: account creation failed'); } return [createdAccount]; @@ -189,7 +189,7 @@ export class MpcKeyring * @param _accountId - The account ID to delete. */ async deleteAccount(_accountId: AccountId): Promise { - throw new Error('MpcKeyring: deleting accounts is not supported'); + throw new Error('MpcMoneyKeyring: deleting accounts is not supported'); } /** diff --git a/packages/keyring-eth-mpc/tsconfig.build.json b/packages/keyring-eth-money-mpc/tsconfig.build.json similarity index 100% rename from packages/keyring-eth-mpc/tsconfig.build.json rename to packages/keyring-eth-money-mpc/tsconfig.build.json diff --git a/packages/keyring-eth-mpc/tsconfig.json b/packages/keyring-eth-money-mpc/tsconfig.json similarity index 100% rename from packages/keyring-eth-mpc/tsconfig.json rename to packages/keyring-eth-money-mpc/tsconfig.json diff --git a/packages/keyring-eth-mpc/README.md b/packages/keyring-eth-mpc/README.md deleted file mode 100644 index 2eb1ae70c..000000000 --- a/packages/keyring-eth-mpc/README.md +++ /dev/null @@ -1,17 +0,0 @@ -# MPC Keyring - -A Keyring for Ethereum accounts that uses Multi-Party Computation (MPC) for key management and signing, built on top of the [MFA Wallet SDK](https://github.com/MetaMask/mfa-wallet-sdk). - -The default export is the V1 `MpcKeyring` implementation. A V2 adapter that wraps it is available from `@metamask/eth-mpc-keyring/v2`. - -## Installation - -`yarn add @metamask/eth-mpc-keyring` - -or - -`npm install @metamask/eth-mpc-keyring` - -## Contributing - -This package is part of a monorepo. Instructions for contributing can be found in the [monorepo README](https://github.com/MetaMask/accounts#readme). diff --git a/packages/keyring-eth-mpc/src/index.ts b/packages/keyring-eth-mpc/src/index.ts deleted file mode 100644 index c62d8b844..000000000 --- a/packages/keyring-eth-mpc/src/index.ts +++ /dev/null @@ -1,10 +0,0 @@ -export { MpcKeyring } from './mpc-keyring.js'; - -export { MpcKeyringSetupMode } from './types.js'; -export type { - MpcKeyringOpts, - MpcKeyringSerializer, - MpcKeyringSetupParams, - MpcKeyringState, - ProfileTokenOpts, -} from './types.js'; diff --git a/packages/keyring-eth-mpc/src/v2/index.ts b/packages/keyring-eth-mpc/src/v2/index.ts deleted file mode 100644 index 0a8efe443..000000000 --- a/packages/keyring-eth-mpc/src/v2/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -export { - MpcKeyring, - type MpcCreateAccountOptions, - type MpcKeyringOptions, -} from './mpc-keyring'; diff --git a/tsconfig.build.json b/tsconfig.build.json index 823d82643..493585fa3 100644 --- a/tsconfig.build.json +++ b/tsconfig.build.json @@ -6,7 +6,7 @@ { "path": "./packages/keyring-eth-hd/tsconfig.build.json" }, { "path": "./packages/keyring-eth-money/tsconfig.build.json" }, { "path": "./packages/keyring-eth-ledger-bridge/tsconfig.build.json" }, - { "path": "./packages/keyring-eth-mpc/tsconfig.build.json" }, + { "path": "./packages/keyring-eth-money-mpc/tsconfig.build.json" }, { "path": "./packages/keyring-eth-qr/tsconfig.build.json" }, { "path": "./packages/keyring-eth-simple/tsconfig.build.json" }, { "path": "./packages/keyring-eth-trezor/tsconfig.build.json" }, diff --git a/tsconfig.json b/tsconfig.json index 390d1290e..0727351dc 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -5,7 +5,7 @@ { "path": "./packages/keyring-api" }, { "path": "./packages/keyring-eth-hd" }, { "path": "./packages/keyring-eth-ledger-bridge" }, - { "path": "./packages/keyring-eth-mpc" }, + { "path": "./packages/keyring-eth-money-mpc" }, { "path": "./packages/keyring-eth-simple" }, { "path": "./packages/keyring-eth-trezor" }, { "path": "./packages/keyring-internal-api" }, diff --git a/yarn.config.cjs b/yarn.config.cjs index 15db67b1f..875c250d6 100644 --- a/yarn.config.cjs +++ b/yarn.config.cjs @@ -47,7 +47,7 @@ const PINNED_VERSION_EXCEPTIONS = []; * * @type {string[]} */ -const ESM_ONLY_PACKAGE_EXCEPTIONS = ['@metamask/eth-mpc-keyring']; +const ESM_ONLY_PACKAGE_EXCEPTIONS = ['@metamask/eth-money-mpc-keyring']; /** * Aliases for the Yarn type definitions, to make the code more readable. diff --git a/yarn.lock b/yarn.lock index c5b6a2bb8..5b174119f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2003,9 +2003,9 @@ __metadata: languageName: unknown linkType: soft -"@metamask/eth-mpc-keyring@workspace:packages/keyring-eth-mpc": +"@metamask/eth-money-mpc-keyring@workspace:packages/keyring-eth-money-mpc": version: 0.0.0-use.local - resolution: "@metamask/eth-mpc-keyring@workspace:packages/keyring-eth-mpc" + resolution: "@metamask/eth-money-mpc-keyring@workspace:packages/keyring-eth-money-mpc" dependencies: "@ethereumjs/tx": "npm:^5.4.0" "@ethereumjs/util": "npm:^9.1.0" From dfc96da2f8309d7a6508f66533b36aa064a6ba6d Mon Sep 17 00:00:00 2001 From: Matthias Geihs Date: Tue, 13 Oct 2026 21:31:07 +0200 Subject: [PATCH 34/38] cleanup CHANGELOG --- packages/keyring-eth-money-mpc/CHANGELOG.md | 6 ------ 1 file changed, 6 deletions(-) diff --git a/packages/keyring-eth-money-mpc/CHANGELOG.md b/packages/keyring-eth-money-mpc/CHANGELOG.md index 57a2a6299..00b43240a 100644 --- a/packages/keyring-eth-money-mpc/CHANGELOG.md +++ b/packages/keyring-eth-money-mpc/CHANGELOG.md @@ -11,10 +11,4 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Initial release of `@metamask/eth-money-mpc-keyring` ([#627](https://github.com/MetaMask/accounts/pull/627)) -### Changed - -- Rename the package to `@metamask/eth-money-mpc-keyring`, the keyring class to `MpcMoneyKeyring`, and the controller type to `MPC Money Keyring` ([#TODO](https://github.com/MetaMask/accounts/pull/TODO)) -- Bump `@metamask/keyring-api` from `^24.1.0` to `^24.2.0` ([#660](https://github.com/MetaMask/accounts/pull/660)) -- Bump `@metamask/keyring-sdk` from `^3.1.0` to `^4.0.0` ([#664](https://github.com/MetaMask/accounts/pull/664)) - [Unreleased]: https://github.com/MetaMask/accounts/ From 6638007943480e65334dab0534b6f69a1368a110 Mon Sep 17 00:00:00 2001 From: Matthias Geihs Date: Tue, 13 Oct 2026 21:40:22 +0200 Subject: [PATCH 35/38] refactor(keyring-eth-money-mpc): remove unsupported transaction signing Money accounts do not sign transactions, so drop signTransaction and the helpers that only existed for it. Co-authored-by: Cursor --- packages/keyring-eth-money-mpc/package.json | 1 - .../src/mpc-money-keyring.test.ts | 17 +--------- .../src/mpc-money-keyring.ts | 27 ---------------- .../keyring-eth-money-mpc/src/util.test.ts | 30 ++--------------- packages/keyring-eth-money-mpc/src/util.ts | 28 ---------------- .../src/v2/mpc-money-keyring.test.ts | 32 +++++-------------- .../src/v2/mpc-money-keyring.ts | 4 +-- yarn.lock | 1 - 8 files changed, 13 insertions(+), 127 deletions(-) diff --git a/packages/keyring-eth-money-mpc/package.json b/packages/keyring-eth-money-mpc/package.json index 5d728d515..48ee78f8a 100644 --- a/packages/keyring-eth-money-mpc/package.json +++ b/packages/keyring-eth-money-mpc/package.json @@ -65,7 +65,6 @@ "@metamask/utils": "^11.11.0" }, "devDependencies": { - "@ethereumjs/tx": "^5.4.0", "@lavamoat/allow-scripts": "^3.2.1", "@lavamoat/preinstall-always-fail": "^2.1.0", "@metamask/auto-changelog": "^6.1.0", diff --git a/packages/keyring-eth-money-mpc/src/mpc-money-keyring.test.ts b/packages/keyring-eth-money-mpc/src/mpc-money-keyring.test.ts index 7ae91632c..968ab2ab8 100644 --- a/packages/keyring-eth-money-mpc/src/mpc-money-keyring.test.ts +++ b/packages/keyring-eth-money-mpc/src/mpc-money-keyring.test.ts @@ -639,7 +639,7 @@ describe('MpcMoneyKeyring', () => { }); }); - it('signs personal messages and transactions through the MPC flow', async () => { + it('signs personal messages through the MPC flow', async () => { const getProfileToken = jest.fn().mockResolvedValue('token'); const keyring = makeKeyring(getProfileToken); await deserializeState(keyring); @@ -677,21 +677,6 @@ describe('MpcMoneyKeyring', () => { 'cloud-user', 'status', ); - - const tx = { - getHashedMessageToSign: jest.fn().mockReturnValue(new Uint8Array([1, 2])), - addSignature: jest.fn().mockReturnValue('signed-tx'), - }; - - expect(await keyring.signTransaction(mockDerivedAddress, tx as never)).toBe( - 'signed-tx', - ); - expect(tx.addSignature).toHaveBeenCalledWith( - 27n, - expect.any(Uint8Array), - expect.any(Uint8Array), - true, - ); }); it('returns the signature when sign status is not signing completed', async () => { diff --git a/packages/keyring-eth-money-mpc/src/mpc-money-keyring.ts b/packages/keyring-eth-money-mpc/src/mpc-money-keyring.ts index cc618da19..935930b4a 100644 --- a/packages/keyring-eth-money-mpc/src/mpc-money-keyring.ts +++ b/packages/keyring-eth-money-mpc/src/mpc-money-keyring.ts @@ -1,4 +1,3 @@ -import type { TypedTransaction } from '@ethereumjs/tx'; import { hashPersonalMessage } from '@ethereumjs/util'; import type { TypedDataV1, @@ -63,7 +62,6 @@ import { equalAddresses, generateSessionNonce, getSignedTypedDataHash, - parseEthSig, parseSignedTypedDataVersion, publicKeyToAddressHex, toEthSig, @@ -507,31 +505,6 @@ export class MpcMoneyKeyring implements MpcMoneyKeyringContract { throw new Error(`getAppKeyAddress(${address}, ${origin}): not implemented`); } - /** - * Sign a transaction using the specified account. - * - * @param address - The address of the account. - * @param tx - The transaction to sign. - * @param _opts - The options for signing the transaction. - * @returns The signed transaction. - */ - async signTransaction( - address: Hex, - tx: TypedTransaction, - _opts = {}, - ): Promise { - const message = tx.getHashedMessageToSign(); - - const signature = await this.#signHash(address, message); - - const { r, s, v } = parseEthSig(signature); - - // convertV adapts the message-style recovery id (27|28) to typed-tx - // yParity (0|1) or legacy EIP-155 v, matching `TypedTransaction.sign()`. - const signedTx = tx.addSignature(v, r, s, true); - return signedTx; - } - /** * Sign a personal message using the specified account. * This method is compatible with the `personal_sign` RPC method. diff --git a/packages/keyring-eth-money-mpc/src/util.test.ts b/packages/keyring-eth-money-mpc/src/util.test.ts index 79d5b9539..ffd74b162 100644 --- a/packages/keyring-eth-money-mpc/src/util.test.ts +++ b/packages/keyring-eth-money-mpc/src/util.test.ts @@ -15,7 +15,6 @@ import { generateSessionNonce, getSignedTypedDataHash, normalizeAddress, - parseEthSig, parseSignedTypedDataVersion, publicKeyToAddressHex, toEthSig, @@ -117,8 +116,7 @@ describe('util', () => { compactSignature.set(toBytes32(highS), 32); const ethSignature = toEthSig(compactSignature, hash, publicKey); - const parsed = parseEthSig(ethSignature); - const normalizedS = BigInt(bytesToHex(parsed.s)); + const normalizedS = BigInt(bytesToHex(ethSignature.slice(32, 64))); expect(ethSignature).toHaveLength(65); expect(normalizedS).toBeLessThanOrEqual(SECP256K1_HALF_N); @@ -131,8 +129,7 @@ describe('util', () => { compactSignature.set(toBytes32(SECP256K1_N - 1n), 32); const ethSignature = toEthSig(compactSignature, hash, publicKey); - const parsed = parseEthSig(ethSignature); - expect(parsed.s).toStrictEqual(toBytes32(1n)); + expect(ethSignature.slice(32, 64)).toStrictEqual(toBytes32(1n)); }); it('falls back to parity=1 if public key recovery throws', () => { @@ -149,29 +146,6 @@ describe('util', () => { ).toThrow('Invalid signature length'); }); - it('parses ethereum signatures and validates edge cases', () => { - const signature = new Uint8Array(65).fill(1); - signature[64] = 28; - const parsed = parseEthSig(signature); - expect(parsed.v).toBe(28n); - expect(parsed.r).toHaveLength(32); - expect(parsed.s).toHaveLength(32); - - expect(() => parseEthSig(new Uint8Array(64))).toThrow( - 'Invalid signature length', - ); - - const malformedSignature = { - length: 65, - 64: undefined, - slice: jest.fn().mockReturnValue(new Uint8Array(32)), - } as unknown as Uint8Array; - - expect(() => parseEthSig(malformedSignature)).toThrow( - 'Invalid signature v value', - ); - }); - it('parses signed typed data versions with sane defaults', () => { expect(parseSignedTypedDataVersion()).toBe(SignTypedDataVersion.V1); expect(parseSignedTypedDataVersion({ version: 'NOPE' })).toBe( diff --git a/packages/keyring-eth-money-mpc/src/util.ts b/packages/keyring-eth-money-mpc/src/util.ts index f3f5d61df..011b6651f 100644 --- a/packages/keyring-eth-money-mpc/src/util.ts +++ b/packages/keyring-eth-money-mpc/src/util.ts @@ -172,34 +172,6 @@ export function toEthSig( return concatBytes(rBuf, sBuf, bigIntToBytes(vInt)); } -/** - * Parse an extended ECDSA signature. - * - * @param signature - The signature to parse. - * @returns The parsed signature. - */ -export function parseEthSig(signature: Uint8Array): { - r: Uint8Array; - s: Uint8Array; - v: bigint; -} { - if (signature.length !== 65) { - throw new Error('Invalid signature length'); - } - - const rBuf = signature.slice(0, 32); - const sBuf = signature.slice(32, 64); - const vByte = signature[64]; - - // This check is technically redundant because length is 65, but satisfies TS - if (vByte === undefined) { - throw new Error('Invalid signature v value'); - } - const vInt = BigInt(vByte); - - return { r: rBuf, s: sBuf, v: vInt }; -} - /** * Parse the version of a signed typed data object. * diff --git a/packages/keyring-eth-money-mpc/src/v2/mpc-money-keyring.test.ts b/packages/keyring-eth-money-mpc/src/v2/mpc-money-keyring.test.ts index 49638c45a..fd43a5881 100644 --- a/packages/keyring-eth-money-mpc/src/v2/mpc-money-keyring.test.ts +++ b/packages/keyring-eth-money-mpc/src/v2/mpc-money-keyring.test.ts @@ -1,4 +1,3 @@ -import type { TypedTxData } from '@ethereumjs/tx'; import { SignTypedDataVersion } from '@metamask/eth-sig-util'; import { EthAccountType, @@ -39,7 +38,6 @@ type MockMpcMoneyKeyringV1 = { deserialize: jest.Mock; addAccounts: jest.Mock; getAppKeyAddress: jest.Mock; - signTransaction: jest.Mock; signPersonalMessage: jest.Mock; signTypedData: jest.Mock; signEip7702Authorization: jest.Mock; @@ -63,7 +61,6 @@ function createInner(): MockMpcMoneyKeyringV1 { deserialize: jest.fn().mockResolvedValue(undefined), addAccounts: jest.fn(), getAppKeyAddress: jest.fn(), - signTransaction: jest.fn(), signPersonalMessage: jest.fn(), signTypedData: jest.fn(), signEip7702Authorization: jest.fn(), @@ -448,30 +445,17 @@ describe('MpcMoneyKeyring (v2 wrapper)', () => { ); }); - it('signs a transaction via the inner keyring', async () => { + it('rejects transaction signing', async () => { const { wrapper, inner, accountId } = await createWrapperWithAccount(); - const signedTx = { serialized: '0xdeadbeef' }; - inner.signTransaction.mockResolvedValue(signedTx); - - const txParams: TypedTxData = { - nonce: '0x00', - gasPrice: '0x09184e72a000', - gasLimit: '0x2710', - to: '0x0000000000000000000000000000000000000001', - value: '0x1000', - }; - - const result = await wrapper.submitRequest( - createMockRequest(accountId, EthMethod.SignTransaction, [ - txParams as unknown as Json, - ]), - ); - expect(result).toStrictEqual(signedTx); - expect(inner.signTransaction).toHaveBeenCalledWith( - MOCK_ADDRESS, - expect.anything(), + await expect( + wrapper.submitRequest( + createMockRequest(accountId, EthMethod.SignTransaction), + ), + ).rejects.toThrow( + `Account ${accountId} cannot handle method: ${EthMethod.SignTransaction}`, ); + expect(inner.signPersonalMessage).not.toHaveBeenCalled(); }); it('signs an EIP-7702 authorization via the inner keyring', async () => { diff --git a/packages/keyring-eth-money-mpc/src/v2/mpc-money-keyring.ts b/packages/keyring-eth-money-mpc/src/v2/mpc-money-keyring.ts index afcf77085..7b8b5f581 100644 --- a/packages/keyring-eth-money-mpc/src/v2/mpc-money-keyring.ts +++ b/packages/keyring-eth-money-mpc/src/v2/mpc-money-keyring.ts @@ -16,10 +16,10 @@ import type { MpcMoneyKeyring as MpcMoneyKeyringV1 } from '../types'; /** * Methods supported by MPC money keyring EOA accounts. - * MPC money keyrings support signing methods, but not encryption or app keys. + * MPC money keyrings support message signing, but not transactions, + * encryption, or app keys. */ export const MPC_MONEY_KEYRING_METHODS = [ - EthMethod.SignTransaction, EthMethod.PersonalSign, EthMethod.SignTypedDataV1, EthMethod.SignTypedDataV3, diff --git a/yarn.lock b/yarn.lock index 5b174119f..35ffd32a8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2007,7 +2007,6 @@ __metadata: version: 0.0.0-use.local resolution: "@metamask/eth-money-mpc-keyring@workspace:packages/keyring-eth-money-mpc" dependencies: - "@ethereumjs/tx": "npm:^5.4.0" "@ethereumjs/util": "npm:^9.1.0" "@lavamoat/allow-scripts": "npm:^3.2.1" "@lavamoat/preinstall-always-fail": "npm:^2.1.0" From be2f86fa8440d5b113660d46a1cdb5eb393f96a6 Mon Sep 17 00:00:00 2001 From: Matthias Geihs Date: Tue, 13 Oct 2026 21:42:11 +0200 Subject: [PATCH 36/38] fix imports --- packages/keyring-eth-money-mpc/src/v2/index.ts | 2 +- .../keyring-eth-money-mpc/src/v2/mpc-money-keyring.test.ts | 6 +++--- packages/keyring-eth-money-mpc/src/v2/mpc-money-keyring.ts | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/keyring-eth-money-mpc/src/v2/index.ts b/packages/keyring-eth-money-mpc/src/v2/index.ts index 2a001b5f0..d5f85d1b5 100644 --- a/packages/keyring-eth-money-mpc/src/v2/index.ts +++ b/packages/keyring-eth-money-mpc/src/v2/index.ts @@ -2,4 +2,4 @@ export { MpcMoneyKeyring, type MpcMoneyCreateAccountOptions, type MpcMoneyKeyringOptions, -} from './mpc-money-keyring'; +} from './mpc-money-keyring.js'; diff --git a/packages/keyring-eth-money-mpc/src/v2/mpc-money-keyring.test.ts b/packages/keyring-eth-money-mpc/src/v2/mpc-money-keyring.test.ts index fd43a5881..2ea9696c2 100644 --- a/packages/keyring-eth-money-mpc/src/v2/mpc-money-keyring.test.ts +++ b/packages/keyring-eth-money-mpc/src/v2/mpc-money-keyring.test.ts @@ -11,12 +11,12 @@ import { EthKeyringMethod } from '@metamask/keyring-sdk/v2'; import type { AccountId } from '@metamask/keyring-utils'; import type { Hex, Json } from '@metamask/utils'; -import type { MpcMoneyKeyring as MpcMoneyKeyringV1 } from '../types'; +import type { MpcMoneyKeyring as MpcMoneyKeyringV1 } from '../types.js'; import { MPC_MONEY_KEYRING_METHODS, MpcMoneyKeyring, -} from './mpc-money-keyring'; -import type { MpcMoneyCreateAccountOptions } from './mpc-money-keyring'; +} from './mpc-money-keyring.js'; +import type { MpcMoneyCreateAccountOptions } from './mpc-money-keyring.js'; const MOCK_ADDRESS = '0x1111111111111111111111111111111111111111' as Hex; const OTHER_ADDRESS = '0x2222222222222222222222222222222222222222' as Hex; diff --git a/packages/keyring-eth-money-mpc/src/v2/mpc-money-keyring.ts b/packages/keyring-eth-money-mpc/src/v2/mpc-money-keyring.ts index 7b8b5f581..a052d63a2 100644 --- a/packages/keyring-eth-money-mpc/src/v2/mpc-money-keyring.ts +++ b/packages/keyring-eth-money-mpc/src/v2/mpc-money-keyring.ts @@ -11,8 +11,8 @@ import { EthKeyringMethod, EthKeyringWrapper } from '@metamask/keyring-sdk/v2'; import type { AccountId } from '@metamask/keyring-utils'; import type { Hex } from '@metamask/utils'; -import { MpcMoneyKeyringSetupMode } from '../types'; -import type { MpcMoneyKeyring as MpcMoneyKeyringV1 } from '../types'; +import { MpcMoneyKeyringSetupMode } from '../types.js'; +import type { MpcMoneyKeyring as MpcMoneyKeyringV1 } from '../types.js'; /** * Methods supported by MPC money keyring EOA accounts. From 59ebca86feaabed47eb3f435ade210694b8955dd Mon Sep 17 00:00:00 2001 From: Matthias Geihs Date: Tue, 13 Oct 2026 22:09:56 +0200 Subject: [PATCH 37/38] 1fa setup create --- packages/keyring-eth-money-mpc/src/mpc-money-keyring.test.ts | 2 +- packages/keyring-eth-money-mpc/src/mpc-money-keyring.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/keyring-eth-money-mpc/src/mpc-money-keyring.test.ts b/packages/keyring-eth-money-mpc/src/mpc-money-keyring.test.ts index 968ab2ab8..8c7fe10c3 100644 --- a/packages/keyring-eth-money-mpc/src/mpc-money-keyring.test.ts +++ b/packages/keyring-eth-money-mpc/src/mpc-money-keyring.test.ts @@ -360,7 +360,7 @@ describe('MpcMoneyKeyring', () => { expect(await keyring.serialize()).toStrictEqual({ mode: 'create' }); await keyring.init(); - expect(getProfileToken).toHaveBeenCalledWith({ twoFactor: true }); + expect(getProfileToken).toHaveBeenCalledWith(); expect(mockGetNetId).toHaveBeenCalledWith({ baseURL: 'https://cloud.example', token: 'token', diff --git a/packages/keyring-eth-money-mpc/src/mpc-money-keyring.ts b/packages/keyring-eth-money-mpc/src/mpc-money-keyring.ts index 935930b4a..6d1663ac8 100644 --- a/packages/keyring-eth-money-mpc/src/mpc-money-keyring.ts +++ b/packages/keyring-eth-money-mpc/src/mpc-money-keyring.ts @@ -571,7 +571,7 @@ export class MpcMoneyKeyring implements MpcMoneyKeyringContract { } async #setupCreate(): Promise { - const token = await this.#getProfileToken({ twoFactor: true }); + const token = await this.#getProfileToken(); const netCreds = await this.#networkManager.createIdentity(); const serverNetId = await getNetId({ baseURL: this.#cloudURL, From 47edb5163740f7829876a49f9ad02cd0000ced9f Mon Sep 17 00:00:00 2001 From: Matthias Geihs Date: Wed, 14 Oct 2026 12:36:37 +0200 Subject: [PATCH 38/38] fix(keyring-eth-money-mpc): point restored key shares at the local client Import and sync kept the party mapping of whichever device wrote the backup, so the next rotate rejected the new network id. Co-authored-by: Cursor --- .../src/mpc-money-keyring.test.ts | 68 +++++++++++++++++-- .../src/mpc-money-keyring.ts | 39 ++++++++++- 2 files changed, 99 insertions(+), 8 deletions(-) diff --git a/packages/keyring-eth-money-mpc/src/mpc-money-keyring.test.ts b/packages/keyring-eth-money-mpc/src/mpc-money-keyring.test.ts index 8c7fe10c3..1dbe10f8c 100644 --- a/packages/keyring-eth-money-mpc/src/mpc-money-keyring.test.ts +++ b/packages/keyring-eth-money-mpc/src/mpc-money-keyring.test.ts @@ -458,15 +458,36 @@ describe('MpcMoneyKeyring', () => { clientNetId: 'imported-user', }); expect(mockDklsSetup).not.toHaveBeenCalled(); + const importedKey = { + ...makeThresholdKey(), + partyMapping: [ + { networkId: 'imported-user', protocolId: 1 }, + { networkId: 'cloud-user', protocolId: 2 }, + ], + }; expect(await keyring.serialize()).toStrictEqual({ netCreds: { partyId: 'imported-user' }, - keyShare: makeThresholdKey(), + keyShare: importedKey, serverNetId: 'cloud-user', shareEpoch: mockShareEpoch, tssSetup: null, }); }); + it('rejects an imported key share with no client party', async () => { + const keyring = makeKeyring(); + mockCreateIdentity.mockResolvedValueOnce({ partyId: 'imported-user' }); + mockThresholdKeyFromJson.mockReturnValueOnce({ + ...makeThresholdKey(), + partyMapping: [], + }); + + await keyring.deserialize({ mode: 'import' }); + await expect(keyring.init()).rejects.toThrow( + 'Key share is missing the client party', + ); + }); + it('init is a no-op when already initialized', async () => { const keyring = makeKeyring(); await deserializeState(keyring); @@ -559,11 +580,15 @@ describe('MpcMoneyKeyring', () => { nonce: mockSessionNonce, expectedActiveEpoch: 1, }); - expect(mockRotateKeyShares).toHaveBeenCalledWith( - expect.objectContaining({ - networkSession: { label: 'dkg-rotate' }, - }), - ); + expect(mockRotateKeyShares).toHaveBeenCalledWith({ + key: makeThresholdKey(), + dealers: [ + { netId: 'local-user', shareIndex: 0 }, + { netId: 'cloud-user', shareIndex: 1 }, + ], + custodians: ['local-user', 'cloud-user'], + networkSession: { label: 'dkg-rotate' }, + }); expect(rootSession.createSubsession).toHaveBeenCalledWith('dkg-rotate'); expect(rootSession.receiveMessage).toHaveBeenCalledWith( 'cloud-user', @@ -639,6 +664,37 @@ describe('MpcMoneyKeyring', () => { }); }); + it('points a synced key share at the local client network id', async () => { + const keyring = makeKeyring(); + await deserializeState(keyring); + + const remoteKey = { + ...makeThresholdKey(), + partyMapping: [ + { networkId: 'other-device', protocolId: 1 }, + { networkId: 'cloud-user', protocolId: 2 }, + ], + }; + mockLoadKeyShareBackup.mockResolvedValueOnce({ + encryptedKeyShare: new TextEncoder().encode(JSON.stringify({ ok: true })), + epoch: 4, + }); + mockThresholdKeyFromJson.mockReturnValueOnce(remoteKey); + + await keyring.syncKeyShare(); + + expect(await keyring.serialize()).toMatchObject({ + keyShare: { + ...remoteKey, + partyMapping: [ + { networkId: 'local-user', protocolId: 1 }, + { networkId: 'cloud-user', protocolId: 2 }, + ], + }, + shareEpoch: 4, + }); + }); + it('signs personal messages through the MPC flow', async () => { const getProfileToken = jest.fn().mockResolvedValue('token'); const keyring = makeKeyring(getProfileToken); diff --git a/packages/keyring-eth-money-mpc/src/mpc-money-keyring.ts b/packages/keyring-eth-money-mpc/src/mpc-money-keyring.ts index 6d1663ac8..9d43cf6fe 100644 --- a/packages/keyring-eth-money-mpc/src/mpc-money-keyring.ts +++ b/packages/keyring-eth-money-mpc/src/mpc-money-keyring.ts @@ -181,6 +181,35 @@ function shareBindings( ]; } +/** + * Point the client share at a network id, keeping its protocol id. + * + * The stored mapping names whichever client last wrote the share. This device + * replaces that slot with its own network id. The server does the same for + * the client it is about to talk to. + * + * @param keyShare - The CL24 key share to rebind. + * @param clientNetId - Network id of the local client. + * @returns The key share, with the client party updated when the id differs. + */ +function withClientNetId( + keyShare: CL24ThresholdKey, + clientNetId: PartyId, +): CL24ThresholdKey { + const clientParty = keyShare.partyMapping[CLIENT_SHARE_INDEX]; + if (clientParty === undefined) { + throw new Error('Key share is missing the client party'); + } + if (clientParty.networkId === clientNetId) { + return keyShare; + } + + const partyMapping = keyShare.partyMapping.map((entry, index) => + index === CLIENT_SHARE_INDEX ? { ...entry, networkId: clientNetId } : entry, + ); + return { ...keyShare, partyMapping }; +} + /** * 2-of-2 Ethereum money keyring. The client holds one DKLS23 share and signs * with a cloud peer. Shares are stored as encrypted epochs on the backend. @@ -449,7 +478,10 @@ export class MpcMoneyKeyring implements MpcMoneyKeyringContract { baseURL: this.#cloudURL, token, }); - const keyShare = await this.#decryptKeyShare(encryptedKeyShare); + const keyShare = withClientNetId( + await this.#decryptKeyShare(encryptedKeyShare), + state.netCreds.partyId, + ); this.#applyKeyState({ ...state, keyShare, @@ -661,7 +693,10 @@ export class MpcMoneyKeyring implements MpcMoneyKeyringContract { baseURL: this.#cloudURL, token, }); - const keyShare = await this.#decryptKeyShare(loaded.encryptedKeyShare); + const keyShare = withClientNetId( + await this.#decryptKeyShare(loaded.encryptedKeyShare), + netCreds.partyId, + ); await registerClient({ baseURL: this.#cloudURL,