All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- Add the
mm wallet sendcommand and a dedicated daemonsendTransactionRPC handler for sending a transaction through the daemon-hostedTransactionController(#9636)- The command converts the ether
--valueto wei, resolves the network client (--network-client-idor--chain-id) and sender (defaulting to the selected account), previews the resolved plan, and broadcasts after confirmation, printing the resulting transaction hash.--yesskips the prompt;--dry-runresolves and validates without broadcasting. - The
sendTransactionhandler awaits the broadcast server-side and returns a serializable{ transactionHash, transactionId, status }, becauseaddTransaction'sresultpromise cannot travel back over the genericcalldispatch. Transactions are submitted as internal (auto-approved by the daemon).
- The command converts the ether
- Auto-accept pending approval requests in the daemon so a transaction or signature flow resolves instead of hanging on the headless no-op
showApprovalRequest; the subscription is torn down ondispose(#9612)- Security note: the daemon approves every request without a per-request prompt; the trust boundary is its
0600, same-user Unix socket.
- Security note: the daemon approves every request without a per-request prompt; the trust boundary is its
- Wire the
transactionControllerslot in the daemon wallet's instance options, so the daemon runs theTransactionControllerwith an explicit CLI-appropriate configuration (swaps processing disabled, no client hooks) rather than relying on the controller's implicit defaults (#9509) - Wire the
gasFeeControllerslot in the daemon wallet's instance options, passingclientId: 'cli'so the CLI identifies itself to the gas estimation API, now that@metamask/walletrequires this option (#9527) - Add the
mm wallet unlockcommand, which dispatchesKeyringController:submitPasswordover the daemon socket, allowing the keyring to be unlocked after a daemon start with no password or after amm daemon call KeyringController:setLocked(#8821) - Add the
mm daemon listcommand, which prints the messenger actions the running daemon can dispatch viadaemon call, enumerated from the live messenger so the list cannot drift from whatcallaccepts (#9339) - Add the
mm daemoncommand suite (start,stop,status,purge, andcall) for running the wallet daemon and dispatching messenger actions over its socket (#9255) - Add a wallet factory and daemon entry point that construct a
@metamask/walletWalletbacked by the SQLite key-value store, hydrate it from persisted state, run controller initialization (aborting startup if any step fails), import the secret recovery phrase on first run, and expose adisposeteardown handle (#9226) - Add a daemon transport layer: a JSON-RPC client and server over a Unix socket, plus daemon spawn/stop lifecycle helpers (#9108)
- Add SQLite-backed persistence for wallet controller state (#9067)
- Initial package scaffold for
@metamask/wallet-cli, an oclif-basedmmCLI for@metamask/wallet(#9065). - Register no-op
AnalyticsControllerhandlers on the daemon wallet soNetworkController's RPC service analytics calls resolve; the daemon does not report analytics (#9270)
- BREAKING: Bump minimum Node.js version to 22 (#9976)
- The daemon client (
sendCommand) now retries only onECONNREFUSED, notECONNRESET, since a reset can drop after the daemon has already acted on a request — re-sending could execute a non-idempotent action (e.g. a transaction broadcast) twice (#9608) --password/MM_WALLET_PASSWORDis now optional onmm daemon start; on subsequent runs, omitting it starts the daemon with a locked keyring, and the persisted vault is auto-unlocked when a password is supplied (#8821)- The daemon RPC server now validates
paramsagainst each handler's superstruct before dispatch, returning a-32602 invalidParamserror on mismatch instead of passing raw params to the handler (#8846) - Report daemon socket connection errors consistently across
mm daemon callandmm daemon list(#9339) - Bump
@metamask/walletfrom^3.0.0to^14.0.0(#9218, #9263, #9349, #9396, #9470, #9609, #9629, #9735, #9809, #9903, #9938, #9945, #9969, #10137, #10160), (#10280) - Wrap daemon password and SRP in opaque
PasswordandSrptypes that redact on logging; validated and unwrapped only at trust boundaries (#8863) - Bump
@metamask/analytics-controllerfrom^1.2.1to^3.1.0(#9735, #10092, #10160, #10301) - Bump
@metamask/remote-feature-flag-controllerfrom^4.2.2to^7.0.0(#9735, #9945, #9980, #10129, #10160) - Bump
@metamask/superstructfrom^3.1.0to^3.4.1(#9754) - Bump
@metamask/config-registry-controllerfrom^3.0.0to^4.0.0(#9969, #10160) - Bump
@metamask/utilsfrom^11.11.0to^12.0.0(#10076, #10192) - Bump
@metamask/base-controllerfrom^9.1.0to^10.0.0(#10160) - Bump
@metamask/messengerfrom^2.0.0to^3.0.0(#10160) - Bump
@metamask/storage-servicefrom^1.0.2to^2.0.0(#10160)