Production‑style multisig wallet: on‑chain confirmations + EIP‑712 meta‑confirm (relayer pays gas), ERC20/ETH execution via call, events/UI/scripts/tests, gas & coverage, and CI‑ready.
npm i
npm run node
npm run compile
npm run deploy # writes frontend/deployment.jsonFund the wallet:
WALLET=<addr> npm run fundSubmit ETH tx:
WALLET=<addr> TO=<recipient> VALUE=0.1 npm run submit:ethSubmit ERC20 tx:
WALLET=<addr> TOKEN=<token> TO=<recipient> AMOUNT=100 npm run submit:erc20Confirm/Execute in UI or CLI:
WALLET=<addr> TXID=0 npm run executeOpen UI:
npm run serve
# http://localhost:3000- Owners/threshold, per‑tx confirmations, revoke, auto‑execute on threshold.
- ERC20/ETH support via generic
to/value/data+call. - EIP‑712 typed confirmBySig: sign
{txId,wallet,txHash,deadline}and relayer submits. - Minimal UI (ethers UMD): submit/confirm/revoke/execute, meta‑sign + relay.
- Scripts for quick scenarios; tests, gas, coverage; optional relay server.
Relay server (optional):
cp .env.example .env # insert RELAYER_KEY
npm run relay:server # GET /healthIn UI: prepare & sign → send to relayer.

npm test
REPORT_GAS=true npm run gas
npm run coveragecontracts/ MultiSigWallet.sol, MockERC20.sol
scripts/ deploy, fund, submit_eth, submit_erc20, execute
frontend/ index.html + deployment.json
server/ Express relay (confirmBySig)
test/ multisig.test.js
Educational demo. Audit before production.



