diff --git a/.gitmodules b/.gitmodules index f6e778a..70fbf30 100644 --- a/.gitmodules +++ b/.gitmodules @@ -15,7 +15,9 @@ url = https://github.com/openzeppelin/openzeppelin-contracts [submodule "lib/webauthn-sol"] path = lib/webauthn-sol - url = https://github.com/base-org/webauthn-sol + url = https://github.com/amiecorso/webauthn-sol [submodule "lib/safe-singleton-deployer-sol"] path = lib/safe-singleton-deployer-sol url = https://github.com/wilsoncusack/safe-singleton-deployer-sol +[submodule "webauthn-sol"] + url = https://github.com/amiecorso/webauthn-sol diff --git a/README.md b/README.md index 9200da3..84e39de 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,42 @@ +# Smart Wallet + +## Branch note: Simulation bytecode for accurate Verification Gas Limit (VGL) estimation (not for merge) + +- **Purpose**: Provide simulation-only wallet bytecode that mimics the onchain “valid signature” verification path, so bundlers can estimate Verification Gas Limit (VGL) accurately without manual buffers. +- **Why**: Gas estimation in simulation usually uses invalid passkey signatures against the production wallet bytecode. Invalid signatures trigger different execution paths than real valid signatures onchain (e.g., falling back to FCL instead of using RIP-7212), leading to large deviations in measured gas. This branch supplies bytecode that fakes the “valid signature” path by hard-coding a known‑valid P‑256 vector inside the verifier, ensuring simulation follows the same path as real execution and yields sufficiently accurate VGL for bundler overrides. +- **Scope**: Simulation-only. Not intended for deployment. This branch will not be merged. + +### What changed (high level) +- `CoinbaseSmartWallet._isValidSignature` calls `WebAuthn.verifySim`, whose internal signature check uses a fixed valid vector to exercise the RIP-7212 precompile path when available (and FCL fallback otherwise). This produces gas that matches real executions when a valid passkey signature is used onchain. + +### Build settings used for bytecode (must match deploy settings) +- Foundry profile: `deploy` + - `optimizer = true` + - `optimizer_runs = 999999` + - `via_ir = true` + - `evm_version = "prague"` + - `solc_version = "0.8.23"` + +Build and extract the deployed/runtime bytecode: + +```bash +FOUNDRY_PROFILE=deploy forge build +FOUNDRY_PROFILE=deploy forge inspect src/CoinbaseSmartWallet.sol:CoinbaseSmartWallet deployedBytecode \ + > snapshots/SimulationOverrides/CoinbaseSmartWallet.runtime.hex +``` + +- **Output artifact location**: `snapshots/SimulationOverrides/CoinbaseSmartWallet.runtime.hex` (hex-encoded runtime bytecode, prefixed with `0x`). + +### Using this in a bundler (simulation overrides) +During `eth_estimateUserOperationGas` for passkey flows: +- Override `CoinbaseSmartWallet` implementation address(es) with the bytecode from `snapshots/SimulationOverrides/CoinbaseSmartWallet.runtime.hex`. +- Provide a dummy signature so calldata and control flow match production, but let `verifySim` ensure the signature path succeeds. + +### Notes +- On RIP-7212 chains, simulation follows the precompile success path. On non-7212 chains, it follows FCL. This mirrors real execution and stabilizes VGL estimation across chains. +- WebAuthn library commit pinned in this branch: `amiecorso/webauthn-sol@6ac7461cbb768d77d9798e6160cd05d70dee7586`. + + # Smart Wallet This repository contains code for a new, [ERC-4337](https://eips.ethereum.org/EIPS/eip-4337) compliant smart contract wallet from Coinbase. diff --git a/lib/webauthn-sol b/lib/webauthn-sol index 619f20a..6ac7461 160000 --- a/lib/webauthn-sol +++ b/lib/webauthn-sol @@ -1 +1 @@ -Subproject commit 619f20ab0f074fef41066ee4ab24849a913263b2 +Subproject commit 6ac7461cbb768d77d9798e6160cd05d70dee7586 diff --git a/snapshots/SimulationOverrides/CoinbaseSmartWallet.runtime.hex b/snapshots/SimulationOverrides/CoinbaseSmartWallet.runtime.hex new file mode 100644 index 0000000..9481469 --- /dev/null +++ b/snapshots/SimulationOverrides/CoinbaseSmartWallet.runtime.hex @@ -0,0 +1 @@ +0x6080604052600436101561001e575b361561001c5761001c611d66565b005b5f3560e01c8063066a1eb7146101cd5780630db02622146101c85780630f0f3f24146101c35780631626ba7e146101be5780631ca5393f146101b957806329565e3b146101b45780632c2abd1e146101af57806334fcd5be146101aa57806336d9cf9b146101a55780633a871cdd146101a05780634f1ef2861461019b5780634f6e7f221461019657806352d1902d146101915780635c60da1b1461018c5780636f2de70e1461018757806384b0196e1461018257806388ce4c7c1461017d57806389625b57146101785780638ea69029146101735780639f9bcb341461016e578063a2e1a8d814610169578063b0d691fe14610164578063b61d27f61461015f578063b81973671461015a578063ce1506be14610155578063d948fd2e146101505763f698da250361000e5761129b565b611241565b611205565b6111a2565b61110c565b6110c0565b61107b565b61100b565b610fba565b610f50565b610ec4565b610deb565b610bcf565b610b5f565b610ae0565b610a87565b610947565b61089e565b610835565b61079f565b6106a6565b6105dd565b610587565b61039c565b6102c7565b610269565b346102655760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261026557602060ff6102596040516102548161022860243560043588840160209093929193604081019481520152565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081018352826104a9565b6112ea565b54166040519015158152f35b5f80fd5b34610265575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102655760206102a161135c565b604051908152f35b73ffffffffffffffffffffffffffffffffffffffff81160361026557565b346102655760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102655761001c600435610305816102a9565b61030d611d92565b73ffffffffffffffffffffffffffffffffffffffff604051911660208201526020815261033981610450565b7f97e2c6aad4ce5d562ebfaa00db6b9e0fb66ea5d8162ed5b243f51a2e03086f0090815491610367836113b1565b9055611e32565b9181601f840112156102655782359167ffffffffffffffff8311610265576020838186019501011161026557565b346102655760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102655760243567ffffffffffffffff8111610265576103f96103f0602092369060040161036e565b906004356113de565b7fffffffff0000000000000000000000000000000000000000000000000000000060405191168152f35b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040810190811067ffffffffffffffff82111761046c57604052565b610423565b60c0810190811067ffffffffffffffff82111761046c57604052565b6060810190811067ffffffffffffffff82111761046c57604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761046c57604052565b604051906104f782610471565b565b67ffffffffffffffff811161046c57601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b92919261053f826104f9565b9161054d60405193846104a9565b829481845281830111610265578281602093845f960137010152565b9080601f830112156102655781602061058493359101610533565b90565b346102655760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102655760043567ffffffffffffffff81116102655760ff6102596102546020933690600401610569565b346102655760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261026557610614611d92565b6040805160043560208201526024359181019190915261001c906103398160608101610228565b9060207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8301126102655760043567ffffffffffffffff9283821161026557806023830112156102655781600401359384116102655760248460051b83010111610265576024019190565b6106af3661063b565b90735ff137d4b0fdcd49dca30c7cf57e578a026d27893303610775575f5b8281106106d657005b6106e58160051b83018361146a565b6106ef81836114bb565b6106f881611bb0565b1561071c575061071060019392610716923691610533565b3061235e565b016106cd565b6040517f3b06e1460000000000000000000000000000000000000000000000000000000081527fffffffff00000000000000000000000000000000000000000000000000000000919091166004820152602490fd5b0390fd5b60046040517f82b42900000000000000000000000000000000000000000000000000000000008152fd5b6107a83661063b565b90735ff137d4b0fdcd49dca30c7cf57e578a026d27893303610828575b5f5b8281106107d057005b806108226107e160019386866114ff565b356107eb816102a9565b60206107f88488886114ff565b013561081c61081561080b868a8a6114ff565b604081019061146a565b3691610533565b91612385565b016107c7565b610830611d92565b6107c5565b34610265575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102655760207f97e2c6aad4ce5d562ebfaa00db6b9e0fb66ea5d8162ed5b243f51a2e03086f0154604051908152f35b90816101609103126102655790565b346102655760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102655760043567ffffffffffffffff8111610265576108ed90369060040161088f565b604435735ff137d4b0fdcd49dca30c7cf57e578a026d27893303610775578061091c6109339360243590611677565b91610937575b506040519081529081906020820190565b0390f35b5f9081803892335af1505f610922565b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102655760043561097d816102a9565b60243567ffffffffffffffff81116102655761099d90369060040161036e565b9091307f000000000000000000000000000000000000000000000000000000000000000014610a7a5773ffffffffffffffffffffffffffffffffffffffff906109e4611d92565b166352d1902d6001527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80602060016004601d865afa5103610a6c57818391817fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b5f80a255610a4f57005b815f926040519485378338925af415610a6457005b3d5f823e3d90fd5b6355299b496001526004601dfd5b639f03a0265f526004601cfd5b346102655760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102655760043567ffffffffffffffff8111610265576102a1610adb602092369060040161088f565b61185e565b34610265575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261026557307f000000000000000000000000000000000000000000000000000000000000000003610a7a5760206040517f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8152f35b34610265575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102655760207f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5473ffffffffffffffffffffffffffffffffffffffff60405191168152f35b610bd83661063b565b7f97e2c6aad4ce5d562ebfaa00db6b9e0fb66ea5d8162ed5b243f51a2e03086f00549182610d5d57610c0b91369161157f565b905f5b8251811015610d3557602080610c248386611628565b5151141580610d1f575b610cdf57610c3c8285611628565b51511480610cb0575b610c705780610c6a610c5960019386611628565b5193610c64816113b1565b94611e32565b01610c0e565b610c7d6107719184611628565b516040519182917fbff1ac6500000000000000000000000000000000000000000000000000000000835260048301610fa9565b5073ffffffffffffffffffffffffffffffffffffffff610cd9610cd38386611628565b516120ce565b11610c45565b610771610cec8386611628565b516040519182917f4eeab72200000000000000000000000000000000000000000000000000000000835260048301610fa9565b506040610d2c8386611628565b51511415610c2e565b61001c827f97e2c6aad4ce5d562ebfaa00db6b9e0fb66ea5d8162ed5b243f51a2e03086f0055565b60046040517f5daa87a0000000000000000000000000000000000000000000000000000000008152fd5b5f5b838110610d985750505f910152565b8181015183820152602001610d89565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f602093610de481518092818752878088019101610d87565b0116010190565b34610265575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261026557610e73610e2461239b565b906040519283927f0f000000000000000000000000000000000000000000000000000000000000008452610e6560209360e0602087015260e0860190610da8565b908482036040860152610da8565b904660608401523060808401525f60a084015282820360c084015260206060519283815201916080915f5b828110610ead57505050500390f35b835185528695509381019392810192600101610e9e565b34610265575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102655760206040516121058152f35b9060407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc83011261026557600435916024359067ffffffffffffffff821161026557610f4c9160040161036e565b9091565b3461026557610f5e36610efe565b90610f67611d92565b6001610f7161135c565b14610f7f5761001c92612536565b60046040517f948bf897000000000000000000000000000000000000000000000000000000008152fd5b906020610584928181520190610da8565b346102655760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261026557610933610ff7600435611aca565b604051918291602083526020830190610da8565b346102655760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610265576004357fffffffff000000000000000000000000000000000000000000000000000000008116810361026557611071602091611bb0565b6040519015158152f35b346102655760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102655760206110716004356110bb816102a9565b611cc8565b34610265575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610265576020604051735ff137d4b0fdcd49dca30c7cf57e578a026d27898152f35b60607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261026557600435611142816102a9565b6044359067ffffffffffffffff82116102655761118b61116961001c93369060040161036e565b735ff137d4b0fdcd49dca30c7cf57e578a026d27893303611195573691610533565b9060243590612385565b61119d611d92565b610815565b34610265576111b036610efe565b906111b9611d92565b6111c161135c565b92600184116111d45761001c9350612536565b602484604051907f823f1aa80000000000000000000000000000000000000000000000000000000082526004820152fd5b346102655760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102655760206102a16004356126f2565b34610265575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102655760207f97e2c6aad4ce5d562ebfaa00db6b9e0fb66ea5d8162ed5b243f51a2e03086f0054604051908152f35b34610265575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102655760206102a1611cff565b906112e660209282815194859201610d87565b0190565b6020611303918160405193828580945193849201610d87565b81017f97e2c6aad4ce5d562ebfaa00db6b9e0fb66ea5d8162ed5b243f51a2e03086f0381520301902090565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b7f97e2c6aad4ce5d562ebfaa00db6b9e0fb66ea5d8162ed5b243f51a2e03086f00547f97e2c6aad4ce5d562ebfaa00db6b9e0fb66ea5d8162ed5b243f51a2e03086f015481039081116113ac5790565b61132f565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146113ac5760010190565b906113ec6113f193926126f2565b6121f7565b611419577fffffffff0000000000000000000000000000000000000000000000000000000090565b7f1626ba7e0000000000000000000000000000000000000000000000000000000090565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610265570180359067ffffffffffffffff82116102655760200191813603831361026557565b7fffffffff0000000000000000000000000000000000000000000000000000000090358181169392600481106114f057505050565b60040360031b82901b16169150565b919081101561153f5760051b810135907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa181360301821215610265570190565b61143d565b909291928360041161026557831161026557600401917ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0190565b90929167ffffffffffffffff80851161046c578460051b60209360206040516115aa828501826104a9565b8098815201918101938085116102655781925b8584106115cd5750505050505050565b83358581116102655787916115e58484938701610569565b8152019301926115bd565b6020818303126102655780359067ffffffffffffffff821161026557019080601f83011215610265578160206105849335910161157f565b805182101561153f5760209160051b010190565b90602082519201517fffffffff000000000000000000000000000000000000000000000000000000009081811693600481106114f057505050565b9190604091602084013560401c9160608501907f2c2abd1e000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000006116df6116d9858a61146a565b906114bb565b160361184257506116ef8561185e565b92612105810361180f575061171161170a611719928761146a565b8091611544565b8101906115f0565b915f5b83518110156117e35761172f8185611628565b517f4f1ef2860000000000000000000000000000000000000000000000000000000061178261175d8361163c565b7fffffffff000000000000000000000000000000000000000000000000000000001690565b14611791575b5060010161171c565b60240151803b6117885785517f0c76093700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff919091166004820152602490fd5b5091509261180292506117fc905b61014081019061146a565b916121f7565b61180b57600190565b5f90565b6040517f2ef378130000000000000000000000000000000000000000000000000000000081526004810191909152602490fd5b9350509290612105811461180f5750906117fc611802926117f1565b61187461186e604083018361146a565b90612c71565b9061188561186e606083018361146a565b9061193b61189a61186e61012084018461146a565b60405194859360208501956101008201359260e08301359260c08101359260a08201359260808301359273ffffffffffffffffffffffffffffffffffffffff60208201359135168c9693909a9998959261012098959273ffffffffffffffffffffffffffffffffffffffff6101408a019d168952602089015260408801526060870152608086015260a085015260c084015260e08301526101008201520152565b039161196d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938481018352826104a9565b519020906119b460405191826119a86020820195866020735ff137d4b0fdcd49dca30c7cf57e578a026d278991939293604081019481520152565b039081018352826104a9565b51902090565b90600182811c92168015611a01575b60208310146119d457565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b91607f16916119c9565b9060405191825f8254611a1d816119ba565b908184526020946001916001811690815f14611a895750600114611a4b575b5050506104f7925003836104a9565b5f90815285812095935091905b818310611a715750506104f793508201015f8080611a3c565b85548884018501529485019487945091830191611a58565b9150506104f79593507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b8201015f8080611a3c565b5f5260207f97e2c6aad4ce5d562ebfaa00db6b9e0fb66ea5d8162ed5b243f51a2e03086f02815260405f209060405180925f908054611b08816119ba565b80855291600191808316908115611b6f5750600114611b31575b505050610584925003826104a9565b5f90815285812095935091905b818310611b5757505061058493508201015f8080611b22565b85548784018501529485019486945091830191611b3e565b9150506105849593507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b8201015f8080611b22565b7fffffffff00000000000000000000000000000000000000000000000000000000167f29565e3b000000000000000000000000000000000000000000000000000000008114908115611c9e575b8115611c74575b8115611c4a575b8115611c20575b50611c1b575f90565b600190565b7f4f1ef286000000000000000000000000000000000000000000000000000000009150145f611c12565b7fb81973670000000000000000000000000000000000000000000000000000000081149150611c0b565b7f89625b570000000000000000000000000000000000000000000000000000000081149150611c04565b7f0f0f3f240000000000000000000000000000000000000000000000000000000081149150611bfd565b611cfa60ff9173ffffffffffffffffffffffffffffffffffffffff604051911660208201526020815261025481610450565b541690565b611d0761239b565b906020815191012090602081519101206040519060208201927f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8452604083015260608201524660808201523060a082015260a081526119b481610471565b5f3560e01c63bc197c81811463f23a6e6182141763150b7a02821417611d895750565b6020526020603cf35b611d9b33611cc8565b8015611dd0575b6104f75760046040517f82b42900000000000000000000000000000000000000000000000000000000008152fd5b50303314611da2565b818110611de4575050565b5f8155600101611dd9565b9190601f8111611dfe57505050565b6104f7925f5260205f20906020601f840160051c83019310611e28575b601f0160051c0190611dd9565b9091508190611e1b565b60ff611e3d826112ea565b541661202e57611e4c816112ea565b60019060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00825416179055825f526020907f97e2c6aad4ce5d562ebfaa00db6b9e0fb66ea5d8162ed5b243f51a2e03086f0260205260405f209183519167ffffffffffffffff831161046c57611ecd83611ec786546119ba565b86611def565b602091601f8411600114611f6057505091611f41827f38109edc26e166b5579352ce56a50813177eb25208fd90d61f2f3783862202209593611f50955f91611f55575b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790565b90555b60405191829182610fa9565b0390a2565b90508401515f611f10565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0841690611f93865f5260205f2090565b935f915b8383106120175750505092611f509492600192827f38109edc26e166b5579352ce56a50813177eb25208fd90d61f2f378386220220989610611fe0575b5050811b019055611f44565b8501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c191690555f80611fd4565b888501518655948501949381019391810191611f97565b610771906040519182917f8d16255a000000000000000000000000000000000000000000000000000000008352602060048401526024830190610da8565b9060208282031261026557813567ffffffffffffffff928382116102655701906040828203126102655760405192604084018481108282111761046c57604052823584526020830135908111610265576120c69201610569565b602082015290565b6020815191015190602081106120e2575090565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9060200360031b1b1690565b9190826040910312610265576020825192015190565b81601f8201121561026557805161213b816104f9565b9261214960405194856104a9565b81845260208284010111610265576105849160208085019101610d87565b9060208282031261026557815167ffffffffffffffff92838211610265570160c081830312610265576121986104ea565b92815181811161026557836121ae918401612125565b845260208201519081116102655760a0926121ca918301612125565b6020840152604081015160408401526060810151606084015260808101516080840152015160a082015290565b91906122059181019061206c565b61220f8151611aca565b91602091828451146122a157835160408114612259576040517f4eeab722000000000000000000000000000000000000000000000000000000008152806107718760048301610fa9565b8361229c92612275878380612287966105849b0101910161210f565b50500151848082518301019101612167565b60405193840192835292918290602001610228565b6129a1565b9173ffffffffffffffffffffffffffffffffffffffff6122c28596956120ce565b116122d857806105849495015192015191612795565b6040517fbff1ac65000000000000000000000000000000000000000000000000000000008152806107718760048301610fa9565b604051906020820182811067ffffffffffffffff82111761046c576040525f8252565b3d15612359573d90612340826104f9565b9161234e60405193846104a9565b82523d5f602084013e565b606090565b5f91829182602083519301915af161237461232f565b901561237d5750565b602081519101fd5b915f928392602083519301915af161237461232f565b6040516123a781610450565b601581527f436f696e6261736520536d6172742057616c6c657400000000000000000000006020820152906040516123de81610450565b600181527f3100000000000000000000000000000000000000000000000000000000000000602082015290565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe093818652868601375f8582860101520116010190565b9291610584949261246792855260606020860152606085019161240b565b916040818403910152610da8565b60209082604051938492833781017f97e2c6aad4ce5d562ebfaa00db6b9e0fb66ea5d8162ed5b243f51a2e03086f0381520301902090565b908160021b917f3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116036113ac57565b6124e781546119ba565b90816124f1575050565b81601f5f9311600114612502575055565b908083918252612521601f60208420940160051c840160018501611dd9565b5555565b91602061058493818152019161240b565b919061257161256c845f527f97e2c6aad4ce5d562ebfaa00db6b9e0fb66ea5d8162ed5b243f51a2e03086f0260205260405f2090565b611a0b565b8051156126c0578051602082012061258a368585610533565b6020815191012003612688575090816125ef6125c7837fcf95bbfe6f870f8cc40482dc3dccdafd268f0e9ce0a4f24ea1bea9be64e505ff95612475565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008154169055565b612628612623855f527f97e2c6aad4ce5d562ebfaa00db6b9e0fb66ea5d8162ed5b243f51a2e03086f0260205260405f2090565b6124dd565b6126796126557f97e2c6aad4ce5d562ebfaa00db6b9e0fb66ea5d8162ed5b243f51a2e03086f01546113b1565b7f97e2c6aad4ce5d562ebfaa00db6b9e0fb66ea5d8162ed5b243f51a2e03086f0155565b611f5060405192839283612525565b6107719193926040519485947f781f2e3900000000000000000000000000000000000000000000000000000000865260048601612449565b6040517f68188e7a00000000000000000000000000000000000000000000000000000000815260048101859052602490fd5b6126fa611cff565b9060405160208101917f9b493d222105fee7df163ab5d57f0bf1ffd2da04dd5fafbe10b54c41c1adc65783526040820152604081526127388161048d565b5190206040519060208201927f1901000000000000000000000000000000000000000000000000000000000000845260228301526042820152604281526080810181811067ffffffffffffffff82111761046c5760405251902090565b929173ffffffffffffffffffffffffffffffffffffffff5f9416806127b957505050565b90919293506040805191845f5260209283850151835282855114612874575b604185511461283a575b5f6060528083527f1626ba7e000000000000000000000000000000000000000000000000000000009485825260049687830152602482019687948552815186019081604493848601925afa503d01915afa9151141690565b6060808601515f1a85528386015181526001858160805f825afa5184183d1517156128665750506127e2565b5f9091529252509392505050565b82850151601b8160ff1c0185527f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6060911681526001858160805f825afa5184183d1517156128665750506127d8565b90601582018092116113ac57565b90600282018092116113ac57565b919082018092116113ac57565b906104f7602e60405180947f226368616c6c656e6765223a22000000000000000000000000000000000000006020830152612932815180926020602d86019101610d87565b81017f2200000000000000000000000000000000000000000000000000000000000000602d82015203600e8101855201836104a9565b80516020101561153f5760400190565b6040513d5f823e3d90fd5b6020929190612999849282815194859201610d87565b019081520190565b5f612a0e6020926129f56129e26129dd868801936129ce855160608b01516129c8816128c4565b91612a5c565b506129d7612afc565b90612ccb565b6128ed565b8251906129c860408901519151826128e0565b50612a008551612968565b5051604051918280926112d3565b039060025afa15612a57575f612a44602092612a3883519151610228604051938492888401612983565b604051918280926112d3565b039060025afa15612a5757610584612b5b565b612978565b805160609493929083811115612af4575b81811115612aec575b50828110612a8357505050565b809192945060405194039182855201907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080928180601f8501165b808301518189015201908115612ad657908290612abe565b50505f8583016020015250603f01168201604052565b90505f612a76565b925082612a6d565b60405190612b098261048d565b604082527f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5f6040837f4142434445464748494a4b4c4d4e4f505152535455565758595a61626364656660208201520152565b5f8060405160208101907ff8a4282ab3eb7fc94549942d34ebf30621f650c768deaeea015e6d65e1a51c3582527f2c8675eaf498199fb43a3b536ac3aa89907a335475cd7a1a70e9a0a2e3eb3d4f60408201527f7cacc0d9c4788d4ab773e0beb15eca14ce0367c376cce891bd02b67ac4893fb160608201527f09810d144ab9bf55aac223b04bdc248495518f26ffa10a34cc07f52eb8ac48c060808201527f4598ad6485358db348270246ec77b5008858e1b6157498a2b3edabd273b76beb60a082015260a08152612c2d81610471565b51906101005afa612c3c61232f565b9080612c67575b612c505750610584612d72565b602081805181010312610265576020015160011490565b5080511515612c43565b816040519182372090565b90612c86826104f9565b612c9360405191826104a9565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0612cc182946104f9565b0190602036910137565b805115612d6857612cf6612cf1612cea612ce584516124ad565b6128d2565b6003900490565b612c7c565b916020830191808051019060208201928351945f85525b838310612d1c57505050505290565b6004906003809401938451600190603f9082828260121c16880101518553828282600c1c16880101518386015382828260061c1688010151600286015316850101519082015301612d0d565b505061058461230c565b60405160208152602080820152602060408201527f7cacc0d9c4788d4ab773e0beb15eca14ce0367c376cce891bd02b67ac4893fb160608201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f60808201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551908160a082015260208160c08160057ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1561026557612e9c7fd3798a140b67e6614bc5c4ac953c55762c6cc759314a246a82d02a201877e80291518380827f2c8675eaf498199fb43a3b536ac3aa89907a335475cd7a1a70e9a0a2e3eb3d4f09917ff8a4282ab3eb7fc94549942d34ebf30621f650c768deaeea015e6d65e1a51c3509612ea1565b081590565b5f905f9260ff91801580613f28575b613f1f57612ebc613f30565b919093841580613f17575b613ecd575b81811c60028560fe1c16015b15613e9557600182821c16600285831c60011b160160018114613e4a575b60028114613dff575b600314613df0575b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9094939401936001966001905b867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff11613000575050505050505060405191606083015260208252602080830152602060408301527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808301527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff918260a082015260208160c08160057ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa156102655751900990565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff816002999697989909947fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86800980967fffffffff00000001000000000000000000000000ffffffffffffffffffffffff828409977fffffffff00000001000000000000000000000000ffffffffffffffffffffffff9109917fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c8208908c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff9108907fffffffff00000001000000000000000000000000ffffffffffffffffffffffff91097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff90600309937fffffffff00000001000000000000000000000000ffffffffffffffffffffffff9083099a7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff9109927fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff828009907fffffffff00000001000000000000000000000000ffffffffffffffffffffffff9108967fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff9088087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff91097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81938309907fffffffff00000001000000000000000000000000ffffffffffffffffffffffff910891858a1c600116858b1c60011b600216018015613d9e5760018114613d53575b60028114613d08575b600314613cff575b8315613ccb577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83818d81940908918185898203920908928115613689575b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8480097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff910999837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818009907fffffffff00000001000000000000000000000000ffffffffffffffffffffffff91097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff9109957fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8480097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff9109917fffffffff00000001000000000000000000000000ffffffffffffffffffffffff837fffffffff00000001000000000000000000000000fffffffffffffffffffffffd09847fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818009907fffffffff00000001000000000000000000000000ffffffffffffffffffffffff91097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848009907fffffffff00000001000000000000000000000000ffffffffffffffffffffffff9108907fffffffff00000001000000000000000000000000ffffffffffffffffffffffff9108937fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818009907fffffffff00000001000000000000000000000000ffffffffffffffffffffffff91097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff910991837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff9108907fffffffff00000001000000000000000000000000ffffffffffffffffffffffff9109907fffffffff00000001000000000000000000000000ffffffffffffffffffffffff910890967fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff905b0195949390612f35565b8361334757959198925050847fffffffff00000001000000000000000000000000ffffffffffffffffffffffff897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a7fffffffff00000001000000000000000000000000fffffffffffffffffffffffd09907fffffffff00000001000000000000000000000000ffffffffffffffffffffffff91097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff908309917fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8281038208917fffffffff00000001000000000000000000000000ffffffffffffffffffffffff9108907fffffffff00000001000000000000000000000000ffffffffffffffffffffffff9109987fffffffff00000001000000000000000000000000ffffffffffffffffffffffff897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a7fffffffff00000001000000000000000000000000fffffffffffffffffffffffd09907fffffffff00000001000000000000000000000000ffffffffffffffffffffffff91097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a7fffffffff00000001000000000000000000000000fffffffffffffffffffffffd09907fffffffff00000001000000000000000000000000ffffffffffffffffffffffff9109907fffffffff00000001000000000000000000000000ffffffffffffffffffffffff9109947fffffffff00000001000000000000000000000000ffffffffffffffffffffffff897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a7fffffffff00000001000000000000000000000000fffffffffffffffffffffffd09907fffffffff00000001000000000000000000000000ffffffffffffffffffffffff9109907fffffffff00000001000000000000000000000000ffffffffffffffffffffffff9109987fffffffff00000001000000000000000000000000ffffffffffffffffffffffff827fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff826003097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83600309907fffffffff00000001000000000000000000000000ffffffffffffffffffffffff9109907fffffffff00000001000000000000000000000000ffffffffffffffffffffffff9108987fffffffff00000001000000000000000000000000ffffffffffffffffffffffff817fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff827fffffffff00000001000000000000000000000000fffffffffffffffffffffffd09907fffffffff00000001000000000000000000000000ffffffffffffffffffffffff91097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff827fffffffff00000001000000000000000000000000fffffffffffffffffffffffd09907fffffffff00000001000000000000000000000000ffffffffffffffffffffffff9109907fffffffff00000001000000000000000000000000ffffffffffffffffffffffff910991897fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff9108907fffffffff00000001000000000000000000000000ffffffffffffffffffffffff90600309907fffffffff00000001000000000000000000000000ffffffffffffffffffffffff9109907fffffffff00000001000000000000000000000000ffffffffffffffffffffffff9108907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9061367f565b60019a5090988a96509092507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff915061367f565b50508686613308565b7f09810d144ab9bf55aac223b04bdc248495518f26ffa10a34cc07f52eb8ac48c092507f4598ad6485358db348270246ec77b5008858e1b6157498a2b3edabd273b76beb9150613300565b7f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29692507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f591506132f7565b5050507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff907fffffffff00000001000000000000000000000000ffffffffffffffffffffffff9995989299039161367f565b91955092935083928591612f07565b7f4598ad6485358db348270246ec77b5008858e1b6157498a2b3edabd273b76beb97507f09810d144ab9bf55aac223b04bdc248495518f26ffa10a34cc07f52eb8ac48c09650612eff565b7f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f597507f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2969650612ef6565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01600160028184841c169186841c901b1601612ed8565b92907fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255191820390085f92811580613f0f575b15612ecc57505050505050505f90565b506001613eff565b508215612ec7565b50505050505f90565b508115612eb0565b6040519060208252602080830152602060408301527f2d868a95f5c7738577eb2a7fcefb346ec25182891ddfc1ae03a93138713025bd60608301527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808301527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff918260a082015260208160c08160057ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa15610265575191808080857f1dde0aa9481edda907af5321b271e0601f3670d50c6164e0b4d87c23deeb721b0980097f24b7074ddbb9e78598d124643ac785097ac0193782d40d723f463ff76de5e33c09927ffd8cdceb99e041702947904ae2f6251d5e24554f7dec71555442c8e2682126ae099056fea264697066735822122008ddce38fd69951c75316929134b3c121cf3d8a50bedfe21e493410dfad302f764736f6c63430008170033 diff --git a/src/CoinbaseSmartWallet.sol b/src/CoinbaseSmartWallet.sol index a3b02fd..386227b 100644 --- a/src/CoinbaseSmartWallet.sol +++ b/src/CoinbaseSmartWallet.sol @@ -144,8 +144,8 @@ contract CoinbaseSmartWallet is ERC1271, IAccount, MultiOwnable, UUPSUpgradeable /// @dev Reverts if the `UserOperation.nonce` key is invalid for `UserOperation.calldata`. /// @dev Reverts if the signature format is incorrect or invalid for owner type. /// - /// @param userOp The `UserOperation` to validate. - /// @param userOpHash The `UserOperation` hash, as computed by `EntryPoint.getUserOpHash(UserOperation)`. + /// @param userOp The `UserOperation` to validate. + /// @param userOpHash The `UserOperation` hash, as computed by `EntryPoint.getUserOpHash(UserOperation)`. /// @param missingAccountFunds The missing account funds that must be deposited on the Entrypoint. /// /// @return validationData The encoded `ValidationData` structure: @@ -223,8 +223,8 @@ contract CoinbaseSmartWallet is ERC1271, IAccount, MultiOwnable, UUPSUpgradeable /// @dev Can only be called by the Entrypoint or an owner of this account (including itself). /// /// @param target The address to call. - /// @param value The value to send with the call. - /// @param data The data of the call. + /// @param value The value to send with the call. + /// @param data The data of the call. function execute(address target, uint256 value, bytes calldata data) external payable @@ -296,10 +296,9 @@ contract CoinbaseSmartWallet is ERC1271, IAccount, MultiOwnable, UUPSUpgradeable /// @dev Reverts if the call reverted. /// @dev Implementation taken from /// https://github.com/alchemyplatform/light-account/blob/43f625afdda544d5e5af9c370c9f4be0943e4e90/src/common/BaseLightAccount.sol#L125 - /// /// @param target The target call address. - /// @param value The call value to user. - /// @param data The raw call data. + /// @param value The call value to user. + /// @param data The raw call data. function _call(address target, uint256 value, bytes memory data) internal { (bool success, bytes memory result) = target.call{value: value}(data); if (!success) { @@ -339,7 +338,7 @@ contract CoinbaseSmartWallet is ERC1271, IAccount, MultiOwnable, UUPSUpgradeable WebAuthn.WebAuthnAuth memory auth = abi.decode(sigWrapper.signatureData, (WebAuthn.WebAuthnAuth)); - return WebAuthn.verify({challenge: abi.encode(hash), requireUV: false, webAuthnAuth: auth, x: x, y: y}); + return WebAuthn.verifySim(abi.encode(hash), false, auth, x, y); } revert InvalidOwnerBytesLength(ownerBytes); diff --git a/test/CoinbaseSmartWallet/IsValidSignature.t.sol b/test/CoinbaseSmartWallet/IsValidSignature.t.sol index 859338e..f86884f 100644 --- a/test/CoinbaseSmartWallet/IsValidSignature.t.sol +++ b/test/CoinbaseSmartWallet/IsValidSignature.t.sol @@ -5,6 +5,8 @@ import "./SmartWalletTestBase.sol"; import "webauthn-sol/../test/Utils.sol"; contract TestIsValidSignature is SmartWalletTestBase { + bytes4 constant EIP1271_MAGICVALUE = 0x1626ba7e; + bytes4 constant EIP1271_FAILVALUE = 0xffffffff; function testValidateSignatureWithPasskeySigner() public { bytes32 hash = 0x15fa6f8c855db1dccbb8a42eef3a7b83f11d29758e84aed37312527165d5eec5; bytes32 challenge = account.replaySafeHash(hash); @@ -30,7 +32,7 @@ contract TestIsValidSignature is SmartWalletTestBase { // check a valid signature bytes4 ret = account.isValidSignature(hash, sig); - assertEq(ret, bytes4(0x1626ba7e)); + assertEq(ret, EIP1271_MAGICVALUE); } function testSmartWalletSigner() public { @@ -86,7 +88,7 @@ contract TestIsValidSignature is SmartWalletTestBase { account.isValidSignature(hash, sig); } - function testValidateSignatureWithPasskeySignerFailsWithWrongBadSignature() public { + function testValidateSignatureWithPasskeySignerInvalidSigNowSucceedsWithVerifySim() public { bytes32 hash = 0x15fa6f8c855db1dccbb8a42eef3a7b83f11d29758e84aed37312527165d5eec5; bytes32 challenge = account.replaySafeHash(hash); WebAuthnInfo memory webAuthn = Utils.getWebAuthnStruct(challenge); @@ -110,9 +112,37 @@ contract TestIsValidSignature is SmartWalletTestBase { }) ); - // check a valid signature + // With verifySim in use, signature contents are ignored for the final check. + // Even though r is intentionally wrong, this should still return MAGICVALUE. bytes4 ret = account.isValidSignature(hash, sig); - assertEq(ret, bytes4(0xffffffff)); + assertEq(ret, EIP1271_MAGICVALUE); + } + + function testInvalidPasskeySignatureStillSucceedsWithVerifySim() public { + bytes32 hash = 0x15fa6f8c855db1dccbb8a42eef3a7b83f11d29758e84aed37312527165d5eec5; + bytes32 challenge = account.replaySafeHash(hash); + WebAuthnInfo memory webAuthn = Utils.getWebAuthnStruct(challenge); + + // Construct a clearly invalid signature vector (zeroed r,s after normalization edge avoided). + // Even with invalid r,s, verifySim should return MAGICVALUE. + bytes memory sig = abi.encode( + CoinbaseSmartWallet.SignatureWrapper({ + ownerIndex: 1, + signatureData: abi.encode( + WebAuthn.WebAuthnAuth({ + authenticatorData: webAuthn.authenticatorData, + clientDataJSON: webAuthn.clientDataJSON, + typeIndex: 1, + challengeIndex: 23, + r: uint256(0), + s: uint256(0) + }) + ) + }) + ); + + bytes4 ret = account.isValidSignature(hash, sig); + assertEq(ret, EIP1271_MAGICVALUE); } function testValidateSignatureWithEOASigner() public {