diff --git a/contracts/foundry.toml b/contracts/foundry.toml index c90bf23..d08b6d4 100644 --- a/contracts/foundry.toml +++ b/contracts/foundry.toml @@ -3,8 +3,8 @@ src = "src" out = "out" libs = ["lib"] -bytecode_hash="none" -solc_version="0.8.21" +bytecode_hash = "none" +solc_version = "0.8.21" [rpc_endpoints] base_goerli = "https://goerli.base.org" diff --git a/contracts/src/SimpleAccount.sol b/contracts/src/SimpleAccount.sol index 12c0753..6319442 100644 --- a/contracts/src/SimpleAccount.sol +++ b/contracts/src/SimpleAccount.sol @@ -19,13 +19,13 @@ struct Signature { uint256 s; } -contract SimpleAccount is IAccount, UUPSUpgradeable, Initializable, IERC1271 { - struct Call { - address dest; - uint256 value; - bytes data; - } +struct Call { + address dest; + uint256 value; + bytes data; +} +contract SimpleAccount is IAccount, UUPSUpgradeable, Initializable, IERC1271 { struct PublicKey { bytes32 X; bytes32 Y; diff --git a/contracts/test/SendUserOp.t.sol b/contracts/test/SendUserOp.t.sol index 539529c..d84ac9a 100644 --- a/contracts/test/SendUserOp.t.sol +++ b/contracts/test/SendUserOp.t.sol @@ -7,20 +7,25 @@ import {Utils} from "test/Utils.sol"; // use Openzeppelin v4.8.1 to avoid `Failed to resolve file` error import "account-abstraction/core/EntryPoint.sol"; import {SimpleAccountFactory} from "src/SimpleAccountFactory.sol"; -import {SimpleAccount} from "src/SimpleAccount.sol"; +import {SimpleAccount, Call} from "src/SimpleAccount.sol"; contract SendUserOpTest is Test { using UserOperationLib for UserOperation; EntryPoint public entryPoint; SimpleAccountFactory public factory; + address bigqDevAddress = 0x061060a65146b3265C62fC8f3AE977c9B27260fF; function setUp() public { // setup fork vm.createSelectFork("base_goerli"); - entryPoint = new EntryPoint(); - factory = new SimpleAccountFactory(entryPoint); + entryPoint = EntryPoint( + payable(0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789) + ); + factory = SimpleAccountFactory( + 0xCD7DA03e26Fa4b7BcB43B4e5Ed65bE5cC9d844B0 + ); } /*** @@ -44,18 +49,19 @@ contract SendUserOpTest is Test { ); function testSimpleUserOp() public { + // vm.etch(address(0x1234), type(P256Verifier).runtimeCode); bytes32[2] memory publicKey = [ bytes32( - 0x2a14910d2f67abb47fbaaaabbb73585e9cd25a0cfab7cb77901a5f189070c797 + 0xe7f630b0eb3594e991cfadbd4047cd5fecddf379b4a4458e3ea2b9566e09882a ), bytes32( - 0xad7ae3e847f90cb64392f3945f067ab3e0171831b07be8147c1e098621feff9c + 0x3e9775709101f2b294ddec0536f0f260570b6f009bff2096995d3e1d986239dd ) ]; uint8 version = 1; uint48 validUntil = 0; - bytes32 expectedUserOpHash = hex"7b3ae99bbc71fbac65fa6e95aeb48fc586d2a46d0381ff9b1110b2a0fa1ca0a4"; + bytes32 expectedUserOpHash = hex"5c4665f4794a8f0edf8dd366539911aca9defe9aa54d06303cfe47cca393bd7b"; bytes memory challengeToSign = abi.encodePacked( version, validUntil, @@ -68,8 +74,8 @@ contract SendUserOpTest is Test { abi.encode( // signature Utils.rawSignatureToSignature({ challenge: challengeToSign, - r: 0xb1c9a080371f3824da69b249fc27cbc6c152e05f0c7ba699879dc58e9808662b, - s: 0x63e3d5ad24f282481769f6537eb376a57b2e59da2f068751ba3c54bab23dd547 + r: 0xf91f09739d7fe162dc7ad35f3117b6ed18181fa9ea817bf8ffdc8c03e004527e, + s: 0xd3b053205ced70fc403953092db25b64ac43d48ee2f30147a2134de7ead0c446 }) ) ); @@ -131,4 +137,121 @@ contract SendUserOpTest is Test { uint256 validationData = account2.validateUserOp(op, hash, 0); assertEq(validationData, 0); } + + function testUserOpWithInitCode() public { + // fake verifier + // P256Verifier verifier = new P256Verifier(); + // vm.etch(address(0x1234), type(P256Verifier).runtimeCode); + + bytes32[2] memory publicKey = [ + bytes32( + 0xe7f630b0eb3594e991cfadbd4047cd5fecddf379b4a4458e3ea2b9566e09882a + ), + bytes32( + 0x3e9775709101f2b294ddec0536f0f260570b6f009bff2096995d3e1d986239dd + ) + ]; + + uint8 version = 1; + uint48 validUntil = 0; + bytes32 expectedUserOpHash = hex"ed8154bc00355192a1f1f3a21ec5442bd05e3bb1c0c6ab089d6e138f88125d6a"; + bytes memory challengeToSign = abi.encodePacked( + version, + validUntil, + expectedUserOpHash + ); + + bytes memory ownerSig = abi.encodePacked( + version, + validUntil, + abi.encode( // signature + Utils.rawSignatureToSignature({ + challenge: challengeToSign, + r: 0xa82d88cd9b64be0e6014041c263e7c3dfe879432cf50366fd027018bf9a6f2e6, + s: 0x3457a4b5cdd4b0806d0bb609b2274e268e30b43f772473363aa7b2799119b0d1 + }) + ) + ); + + uint256 salt = 123; + + // account not deployed yet + // we want to test the initCode feature of UserOperation + SimpleAccount account = SimpleAccount( + payable(0x60587a33099742fb5D3e97174804e7Ab11A30118) + ); + vm.deal(address(account), 1 ether); + + // get init code + bytes memory initCode = abi.encodePacked( + address(factory), + abi.encodeCall(factory.createAccount, (publicKey, salt)) + ); + + // send 42 wei to bigq dev + Call[] memory calls = new Call[](1); + calls[0] = Call({dest: bigqDevAddress, value: 42, data: hex""}); + + bytes memory callData = abi.encodeCall( + SimpleAccount.executeBatch, + (calls) + ); + + // dummy op + UserOperation memory op = UserOperation({ + sender: address(0), + nonce: 0, + initCode: hex"", + callData: callData, + callGasLimit: 200_000, + verificationGasLimit: 2_342_060, // 2_000_000 + 150_000 + initCode gas + preVerificationGas: 65_000, + maxFeePerGas: 3e9, + maxPriorityFeePerGas: 1e9, + paymasterAndData: hex"", + // signature must be empty when calculating hash + signature: hex"" + }); + + // fill data + op.sender = address(account); + op.initCode = initCode; + + bytes32 hash = entryPoint.getUserOpHash(op); + assertEq(expectedUserOpHash, hash); + + // add signature to op after calculating hash + op.signature = ownerSig; + + // compute balance before userOp validation and execution + uint256 balanceBefore = bigqDevAddress.balance; + + UserOperation[] memory ops = new UserOperation[](1); + ops[0] = op; + + vm.expectEmit(true, true, true, false); + emit UserOperationEvent( + hash, + address(account), + address(0), + 0, // These and following are not checked. + false, + 0 gwei, + 0 + ); + entryPoint.handleOps(ops, payable(address(account))); + + // compute balance after userOp validation and execution + uint256 balanceAfter = bigqDevAddress.balance; + assertEq(balanceAfter - balanceBefore, 42); + + // // code coverage can't handle indirect calls + // // call validateUserOp directly + // SimpleAccount account2 = new SimpleAccount(account.entryPoint()); + // vm.store(address(account2), 0, 0); // set _initialized = 0 + // account2.initialize(publicKey); + // vm.prank(address(entryPoint)); + // uint256 validationData = account2.validateUserOp(op, hash, 0); + // assertEq(validationData, 0); + } } diff --git a/contracts/test/Utils.sol b/contracts/test/Utils.sol index f33d6a7..1d77897 100644 --- a/contracts/test/Utils.sol +++ b/contracts/test/Utils.sol @@ -20,6 +20,7 @@ library Utils { '","origin":"http://localhost:3000","crossOrigin":false}' ) ); + uint256 challengeLocation = 23; uint256 responseTypeLocation = 1; diff --git a/front/.env.example b/front/.env.example index b4bbf9d..6027a93 100644 --- a/front/.env.example +++ b/front/.env.example @@ -1 +1 @@ -NEXT_PUBLIC_ALCHEMY_API_KEY= +STACKUP_BUNDLER_API_KEY="" diff --git a/front/next.config.js b/front/next.config.js index 93dfcb2..086f928 100644 --- a/front/next.config.js +++ b/front/next.config.js @@ -1,6 +1,9 @@ /** @type {import('next').NextConfig} */ module.exports = { reactStrictMode: false, + env: { + STACKUP_BUNDLER_API_KEY: process.env.STACKUP_BUNDLER_API_KEY, + }, webpack: (config) => { config.resolve.fallback = { fs: false, net: false, tls: false }; return config; diff --git a/front/src/abis/factory.json b/front/src/abis/factory.json new file mode 100644 index 0000000..2cb0da5 --- /dev/null +++ b/front/src/abis/factory.json @@ -0,0 +1,2607 @@ +{ + "abi": [ + { + "inputs": [ + { + "internalType": "contract IEntryPoint", + "name": "_entryPoint", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "accountImplem", + "outputs": [ + { + "internalType": "contract SimpleAccount", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32[2]", + "name": "publicKey", + "type": "bytes32[2]" + }, + { + "internalType": "uint256", + "name": "salt", + "type": "uint256" + } + ], + "name": "createAccount", + "outputs": [ + { + "internalType": "contract SimpleAccount", + "name": "", + "type": "address" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "entryPoint", + "outputs": [ + { + "internalType": "contract IEntryPoint", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32[2]", + "name": "publicKey", + "type": "bytes32[2]" + }, + { + "internalType": "uint256", + "name": "salt", + "type": "uint256" + } + ], + "name": "getAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": { + "object": "0x60c060405234801561001057600080fd5b506040516129ed3803806129ed83398101604081905261002f91610096565b6001600160a01b03811660a052604051819061004a90610089565b6001600160a01b039091168152602001604051809103906000f080158015610076573d6000803e3d6000fd5b506001600160a01b0316608052506100c6565b611f6a80610a8383390190565b6000602082840312156100a857600080fd5b81516001600160a01b03811681146100bf57600080fd5b9392505050565b60805160a0516109856100fe6000396000818160a5015261020901526000818160d90152818161012a015261028701526109856000f3fe60806040526004361061003f5760003560e01c80630b824849146100445780638375702b14610080578063b0d691fe14610093578063c1e4ba2d146100c7575b600080fd5b34801561005057600080fd5b5061006461005f366004610375565b6100fb565b6040516001600160a01b03909116815260200160405180910390f35b61006461008e366004610375565b6101d5565b34801561009f57600080fd5b506100647f000000000000000000000000000000000000000000000000000000000000000081565b3480156100d357600080fd5b506100647f000000000000000000000000000000000000000000000000000000000000000081565b60006101cc8260001b6040518060200161011490610352565b6020820181038252601f19601f820116604052507f00000000000000000000000000000000000000000000000000000000000000008660405160240161015a91906103fa565b60408051601f19818403018152918152602080830180516001600160e01b0316632d16032160e01b17905290516101939392910161044f565b60408051601f19818403018152908290526101b19291602001610491565b60405160208183030381529060405280519060200120610320565b90505b92915050565b6000806101e284846100fb565b905034156102685760405163b760faf960e01b81526001600160a01b0382811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063b760faf99034906024016000604051808303818588803b15801561024e57600080fd5b505af1158015610262573d6000803e3d6000fd5b50505050505b6001600160a01b0381163b8015610281575090506101cf565b8360001b7f0000000000000000000000000000000000000000000000000000000000000000866040516024016102b791906103fa565b60408051601f198184030181529181526020820180516001600160e01b0316632d16032160e01b179052516102eb90610352565b6102f692919061044f565b8190604051809103906000f5905080158015610316573d6000803e3d6000fd5b5095945050505050565b60006101cc8383306000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b6104b8806104c183390190565b634e487b7160e01b600052604160045260246000fd5b6000806060838503121561038857600080fd5b83601f84011261039757600080fd5b6040516040810181811067ffffffffffffffff821117156103ba576103ba61035f565b80604052508060408501868111156103d157600080fd5b855b818110156103eb5780358352602092830192016103d3565b50919691359550909350505050565b60408101818360005b6002811015610422578151835260209283019290910190600101610403565b50505092915050565b60005b8381101561044657818101518382015260200161042e565b50506000910152565b60018060a01b0383168152604060208201526000825180604084015261047c81606085016020870161042b565b601f01601f1916919091016060019392505050565b600083516104a381846020880161042b565b8351908301906104b781836020880161042b565b0194935050505056fe60806040526040516104b83803806104b8833981016040819052610022916102de565b61002e82826000610035565b50506103fb565b61003e83610061565b60008251118061004b5750805b1561005c5761005a83836100a1565b505b505050565b61006a816100cd565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606100c6838360405180606001604052806027815260200161049160279139610180565b9392505050565b6001600160a01b0381163b61013f5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080856001600160a01b03168560405161019d91906103ac565b600060405180830381855af49150503d80600081146101d8576040519150601f19603f3d011682016040523d82523d6000602084013e6101dd565b606091505b5090925090506101ef868383876101f9565b9695505050505050565b60608315610268578251600003610261576001600160a01b0385163b6102615760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610136565b5081610272565b610272838361027a565b949350505050565b81511561028a5781518083602001fd5b8060405162461bcd60e51b815260040161013691906103c8565b634e487b7160e01b600052604160045260246000fd5b60005b838110156102d55781810151838201526020016102bd565b50506000910152565b600080604083850312156102f157600080fd5b82516001600160a01b038116811461030857600080fd5b60208401519092506001600160401b038082111561032557600080fd5b818501915085601f83011261033957600080fd5b81518181111561034b5761034b6102a4565b604051601f8201601f19908116603f01168101908382118183101715610373576103736102a4565b8160405282815288602084870101111561038c57600080fd5b61039d8360208301602088016102ba565b80955050505050509250929050565b600082516103be8184602087016102ba565b9190910192915050565b60208152600082518060208401526103e78160408501602087016102ba565b601f01601f19169190910160400192915050565b6088806104096000396000f3fe608060405236601057600e6013565b005b600e5b601f601b6021565b6058565b565b600060537f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b3660008037600080366000845af43d6000803e8080156076573d6000f35b3d6000fdfea164736f6c6343000815000a416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a164736f6c6343000815000a60c0604052306080523480156200001557600080fd5b5060405162001f6a38038062001f6a833981016040819052620000389162000118565b6001600160a01b03811660a0526200004f62000056565b506200014a565b600054610100900460ff1615620000c35760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000116576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6000602082840312156200012b57600080fd5b81516001600160a01b03811681146200014357600080fd5b9392505050565b60805160a051611dc9620001a1600039600081816101ce0152818161037e015281816105b501526108350152600081816104d301528181610513015281816106340152818161067401526107030152611dc96000f3fe60806040526004361061008a5760003560e01c80633a871cdd116100595780633a871cdd146101365780634f1ef2861461016457806352d1902d1461017757806363ffab311461018c578063b0d691fe146101bc57600080fd5b80631626ba7e146100965780632d160321146100d457806334fcd5be146100f65780633659cfe61461011657600080fd5b3661009157005b600080fd5b3480156100a257600080fd5b506100b66100b136600461163e565b610208565b6040516001600160e01b031990911681526020015b60405180910390f35b3480156100e057600080fd5b506100f46100ef3660046116f9565b61025b565b005b34801561010257600080fd5b506100f461011136600461176e565b610373565b34801561012257600080fd5b506100f46101313660046117ff565b6104c9565b34801561014257600080fd5b5061015661015136600461181a565b6105a8565b6040519081526020016100cb565b6100f46101723660046118fb565b61062a565b34801561018357600080fd5b506101566106f6565b34801561019857600080fd5b506001546002546101a7919082565b604080519283526020830191909152016100cb565b3480156101c857600080fd5b506101f07f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016100cb565b60006102368460405160200161022091815260200190565b60405160208183030381529060405284846107a9565b156102495750630b135d3f60e11b610254565b506001600160e01b03195b9392505050565b600054610100900460ff161580801561027b5750600054600160ff909116105b806102955750303b158015610295575060005460ff166001145b6102fd5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff191660011790558015610320576000805461ff0019166101001790555b610329826107fd565b801561036f576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146103de5760405162461bcd60e51b815260206004820152601060248201526f1bdb9b1e48195b9d1c9e481c1bda5b9d60821b60448201526064016102f4565b60005b818110156104c4576104b28383838181106103fe576103fe611949565b9050602002810190610410919061195f565b61041e9060208101906117ff565b84848481811061043057610430611949565b9050602002810190610442919061195f565b6020013585858581811061045857610458611949565b905060200281019061046a919061195f565b61047890604081019061197f565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061089592505050565b806104bc816119e3565b9150506103e1565b505050565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036105115760405162461bcd60e51b81526004016102f4906119fc565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031661055a600080516020611d36833981519152546001600160a01b031690565b6001600160a01b0316146105805760405162461bcd60e51b81526004016102f490611a48565b6105898161090c565b604080516000808252602082019092526105a591839190610947565b50565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146106155760405162461bcd60e51b815260206004820152601060248201526f1bdb9b1e48195b9d1c9e481c1bda5b9d60821b60448201526064016102f4565b61061f8484610ab2565b905061025482610c72565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036106725760405162461bcd60e51b81526004016102f4906119fc565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166106bb600080516020611d36833981519152546001600160a01b031690565b6001600160a01b0316146106e15760405162461bcd60e51b81526004016102f490611a48565b6106ea8261090c565b61036f82826001610947565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146107965760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c000000000000000060648201526084016102f4565b50600080516020611d3683398151915290565b6000806107b883850185611a94565b90506107f4858260000151600084602001518560400151866060015187608001518860a0015160016000015460001c600180015460001c610cbf565b95945050505050565b6040805180820182528251808252602080850151928101839052600182905560028390558351808501855291825281019190915290517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316917f8a7fd7e24d60f649878f6c9c7e9114e6614218fd3dce2eb1d79549afaf161ab39161088a9190611b50565b60405180910390a250565b600080846001600160a01b031684846040516108b19190611ba5565b60006040518083038185875af1925050503d80600081146108ee576040519150601f19603f3d011682016040523d82523d6000602084013e6108f3565b606091505b50915091508161090557805160208201fd5b5050505050565b3330146105a55760405162461bcd60e51b815260206004820152600960248201526837b7363c9039b2b63360b91b60448201526064016102f4565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff161561097a576104c483610e81565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156109d4575060408051601f3d908101601f191682019092526109d191810190611bb7565b60015b610a375760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b60648201526084016102f4565b600080516020611d368339815191528114610aa65760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b60648201526084016102f4565b506104c4838383610f1d565b604080516060818101835260008083526020830181905292820183905290369083906000610ae461014089018961197f565b9050905080600003610afe57600195505050505050610c6c565b6000610b0e6101408a018a61197f565b6000818110610b1f57610b1f611949565b919091013560f81c9150506001819003610bf6576007821015610b4b5760019650505050505050610c6c565b6000610b5b6101408b018b61197f565b610b6a91600791600191611bd0565b610b7391611bfa565b60d01c9050610b866101408b018b61197f565b610b94916007908290611bd0565b6040516001600160f81b031960f886901b1660208201526001600160d01b031960d085901b166021820152602781018c9052919750955060470160408051601f1981840301815291815265ffffffffffff909216918501919091529550610c05565b60019650505050505050610c6c565b610c108686866107a9565b15610c6157610c5483600060d0826020015165ffffffffffff16901b60a0836040015165ffffffffffff16901b83600001516001600160a01b031617179050919050565b9650505050505050610c6c565b600196505050505050505b92915050565b80156105a557604051600090339060001990849084818181858888f193505050503d8060008114610905576040519150601f19603f3d011682016040523d82523d6000602084013e610905565b600060208a511080610cf95750610cf78a602081518110610ce257610ce2611949565b01602001516001600160f81b0319168a610f48565b155b15610d0657506000610e73565b604080518082019091526015815274113a3cb832911d113bb2b130baba34371733b2ba1160591b6020820152610d3d818a89610fae565b610d4b576000915050610e73565b6000610d568d611067565b9050600081604051602001610d6b9190611c2a565b6040516020818303038152906040529050610d87818c8c610fae565b610d975760009350505050610e73565b600060028c604051610da99190611ba5565b602060405180830381855afa158015610dc6573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610de99190611bb7565b9050600060028f83604051602001610e02929190611c6b565b60408051601f1981840301815290829052610e1c91611ba5565b602060405180830381855afa158015610e39573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610e5c9190611bb7565b9050610e6b818b8b8b8b61127f565b955050505050505b9a9950505050505050505050565b6001600160a01b0381163b610eee5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084016102f4565b600080516020611d3683398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b610f2683611363565b600082511180610f335750805b156104c457610f4283836113a3565b50505050565b6000600160f81b83811614610f5f57506000610c6c565b818015610f725750600160fa1b83811614155b15610f7f57506000610c6c565b600160fb1b83811614610fa557600f60fc1b600160fc1b841601610fa557506000610c6c565b50600192915050565b825182516000918591859190845b828110156110585781610fcf8289611c8d565b10610fe257600095505050505050610254565b83610fed8289611c8d565b81518110610ffd57610ffd611949565b602001015160f81c60f81b6001600160f81b03191685828151811061102457611024611949565b01602001516001600160f81b0319161461104657600095505050505050610254565b80611050816119e3565b915050610fbc565b50600198975050505050505050565b60606000611074836113c8565b905060008190506000600282511180156110bf575081600283516110989190611ca0565b815181106110a8576110a8611949565b6020910101516001600160f81b031916603d60f81b145b156110cc57506002611117565b6001825111801561110e575081600183516110e79190611ca0565b815181106110f7576110f7611949565b6020910101516001600160f81b031916603d60f81b145b15611117575060015b60008183516111269190611ca0565b905060008167ffffffffffffffff811115611143576111436116ba565b6040519080825280601f01601f19166020018201604052801561116d576020820181803683370190505b50905060005b828110156112745784818151811061118d5761118d611949565b01602001516001600160f81b031916602b60f81b036111d957602d60f81b8282815181106111bd576111bd611949565b60200101906001600160f81b031916908160001a905350611262565b8481815181106111eb576111eb611949565b01602001516001600160f81b031916602f60f81b0361121b57605f60f81b8282815181106111bd576111bd611949565b84818151811061122d5761122d611949565b602001015160f81c60f81b82828151811061124a5761124a611949565b60200101906001600160f81b031916908160001a9053505b8061126c816119e3565b915050611173565b509695505050505050565b6040805160208101879052908101859052606081018490526080810183905260a08101829052600090819060c001604051602081830303815290604052905060008073c2b78104907f722dabac4c69f826a522b2754de46001600160a01b0316836040516112ed9190611ba5565b600060405180830381855afa9150503d8060008114611328576040519150601f19603f3d011682016040523d82523d6000602084013e61132d565b606091505b50915091508161133f5761133f611cb3565b808060200190518101906113539190611bb7565b6001149998505050505050505050565b61136c81610e81565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606102548383604051806060016040528060278152602001611d966027913961151b565b606081516000036113e757505060408051602081019091526000815290565b6000604051806060016040528060408152602001611d5660409139905060006003845160026114169190611c8d565b6114209190611cc9565b61142b906004611ceb565b67ffffffffffffffff811115611443576114436116ba565b6040519080825280601f01601f19166020018201604052801561146d576020820181803683370190505b509050600182016020820185865187015b808210156114d9576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f811685015184535060018301925061147e565b50506003865106600181146114f5576002811461150857611510565b603d6001830353603d6002830353611510565b603d60018303535b509195945050505050565b6060600080856001600160a01b0316856040516115389190611ba5565b600060405180830381855af49150503d8060008114611573576040519150601f19603f3d011682016040523d82523d6000602084013e611578565b606091505b509150915061158986838387611593565b9695505050505050565b606083156116025782516000036115fb576001600160a01b0385163b6115fb5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016102f4565b508161160c565b61160c8383611614565b949350505050565b8151156116245781518083602001fd5b8060405162461bcd60e51b81526004016102f49190611d02565b60008060006040848603121561165357600080fd5b83359250602084013567ffffffffffffffff8082111561167257600080fd5b818601915086601f83011261168657600080fd5b81358181111561169557600080fd5b8760208285010111156116a757600080fd5b6020830194508093505050509250925092565b634e487b7160e01b600052604160045260246000fd5b60405160c0810167ffffffffffffffff811182821017156116f3576116f36116ba565b60405290565b60006040828403121561170b57600080fd5b82601f83011261171a57600080fd5b6040516040810181811067ffffffffffffffff8211171561173d5761173d6116ba565b806040525080604084018581111561175457600080fd5b845b81811015611510578035835260209283019201611756565b6000806020838503121561178157600080fd5b823567ffffffffffffffff8082111561179957600080fd5b818501915085601f8301126117ad57600080fd5b8135818111156117bc57600080fd5b8660208260051b85010111156117d157600080fd5b60209290920196919550909350505050565b80356001600160a01b03811681146117fa57600080fd5b919050565b60006020828403121561181157600080fd5b610254826117e3565b60008060006060848603121561182f57600080fd5b833567ffffffffffffffff81111561184657600080fd5b8401610160818703121561185957600080fd5b95602085013595506040909401359392505050565b600082601f83011261187f57600080fd5b813567ffffffffffffffff8082111561189a5761189a6116ba565b604051601f8301601f19908116603f011681019082821181831017156118c2576118c26116ba565b816040528381528660208588010111156118db57600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000806040838503121561190e57600080fd5b611917836117e3565b9150602083013567ffffffffffffffff81111561193357600080fd5b61193f8582860161186e565b9150509250929050565b634e487b7160e01b600052603260045260246000fd5b60008235605e1983360301811261197557600080fd5b9190910192915050565b6000808335601e1984360301811261199657600080fd5b83018035915067ffffffffffffffff8211156119b157600080fd5b6020019150368190038213156119c657600080fd5b9250929050565b634e487b7160e01b600052601160045260246000fd5b6000600182016119f5576119f56119cd565b5060010190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b600060208284031215611aa657600080fd5b813567ffffffffffffffff80821115611abe57600080fd5b9083019060c08286031215611ad257600080fd5b611ada6116d0565b823582811115611ae957600080fd5b611af58782860161186e565b825250602083013582811115611b0a57600080fd5b611b168782860161186e565b60208301525060408301356040820152606083013560608201526080830135608082015260a083013560a082015280935050505092915050565b60408101818360005b6002811015611b78578151835260209283019290910190600101611b59565b50505092915050565b60005b83811015611b9c578181015183820152602001611b84565b50506000910152565b60008251611975818460208701611b81565b600060208284031215611bc957600080fd5b5051919050565b60008085851115611be057600080fd5b83861115611bed57600080fd5b5050820193919092039150565b6001600160d01b03198135818116916006851015611c225780818660060360031b1b83161692505b505092915050565b6c1131b430b63632b733b2911d1160991b81528151600090611c5381600d850160208701611b81565b601160f91b600d939091019283015250600e01919050565b60008351611c7d818460208801611b81565b9190910191825250602001919050565b80820180821115610c6c57610c6c6119cd565b81810381811115610c6c57610c6c6119cd565b634e487b7160e01b600052600160045260246000fd5b600082611ce657634e487b7160e01b600052601260045260246000fd5b500490565b8082028115828204841417610c6c57610c6c6119cd565b6020815260008251806020840152611d21816040850160208701611b81565b601f01601f1916919091016040019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a164736f6c6343000815000a", + "sourceMap": "616:2276:50:-:0;;;748:134;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;795:24:50;;;;845:30;;808:11;;845:30;;;:::i;:::-;-1:-1:-1;;;;;513:32:55;;;495:51;;483:2;468:18;845:30:50;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;829:46:50;;;-1:-1:-1;616:2276:50;;;;;;;;;;:::o;14:310:55:-;104:6;157:2;145:9;136:7;132:23;128:32;125:52;;;173:1;170;163:12;125:52;199:16;;-1:-1:-1;;;;;244:31:55;;234:42;;224:70;;290:1;287;280:12;224:70;313:5;14:310;-1:-1:-1;;;14:310:55:o;329:223::-;616:2276:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;", + "linkReferences": {} + }, + "deployedBytecode": { + "object": "0x60806040526004361061003f5760003560e01c80630b824849146100445780638375702b14610080578063b0d691fe14610093578063c1e4ba2d146100c7575b600080fd5b34801561005057600080fd5b5061006461005f366004610375565b6100fb565b6040516001600160a01b03909116815260200160405180910390f35b61006461008e366004610375565b6101d5565b34801561009f57600080fd5b506100647f000000000000000000000000000000000000000000000000000000000000000081565b3480156100d357600080fd5b506100647f000000000000000000000000000000000000000000000000000000000000000081565b60006101cc8260001b6040518060200161011490610352565b6020820181038252601f19601f820116604052507f00000000000000000000000000000000000000000000000000000000000000008660405160240161015a91906103fa565b60408051601f19818403018152918152602080830180516001600160e01b0316632d16032160e01b17905290516101939392910161044f565b60408051601f19818403018152908290526101b19291602001610491565b60405160208183030381529060405280519060200120610320565b90505b92915050565b6000806101e284846100fb565b905034156102685760405163b760faf960e01b81526001600160a01b0382811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063b760faf99034906024016000604051808303818588803b15801561024e57600080fd5b505af1158015610262573d6000803e3d6000fd5b50505050505b6001600160a01b0381163b8015610281575090506101cf565b8360001b7f0000000000000000000000000000000000000000000000000000000000000000866040516024016102b791906103fa565b60408051601f198184030181529181526020820180516001600160e01b0316632d16032160e01b179052516102eb90610352565b6102f692919061044f565b8190604051809103906000f5905080158015610316573d6000803e3d6000fd5b5095945050505050565b60006101cc8383306000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b6104b8806104c183390190565b634e487b7160e01b600052604160045260246000fd5b6000806060838503121561038857600080fd5b83601f84011261039757600080fd5b6040516040810181811067ffffffffffffffff821117156103ba576103ba61035f565b80604052508060408501868111156103d157600080fd5b855b818110156103eb5780358352602092830192016103d3565b50919691359550909350505050565b60408101818360005b6002811015610422578151835260209283019290910190600101610403565b50505092915050565b60005b8381101561044657818101518382015260200161042e565b50506000910152565b60018060a01b0383168152604060208201526000825180604084015261047c81606085016020870161042b565b601f01601f1916919091016060019392505050565b600083516104a381846020880161042b565b8351908301906104b781836020880161042b565b0194935050505056fe60806040526040516104b83803806104b8833981016040819052610022916102de565b61002e82826000610035565b50506103fb565b61003e83610061565b60008251118061004b5750805b1561005c5761005a83836100a1565b505b505050565b61006a816100cd565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606100c6838360405180606001604052806027815260200161049160279139610180565b9392505050565b6001600160a01b0381163b61013f5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080856001600160a01b03168560405161019d91906103ac565b600060405180830381855af49150503d80600081146101d8576040519150601f19603f3d011682016040523d82523d6000602084013e6101dd565b606091505b5090925090506101ef868383876101f9565b9695505050505050565b60608315610268578251600003610261576001600160a01b0385163b6102615760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610136565b5081610272565b610272838361027a565b949350505050565b81511561028a5781518083602001fd5b8060405162461bcd60e51b815260040161013691906103c8565b634e487b7160e01b600052604160045260246000fd5b60005b838110156102d55781810151838201526020016102bd565b50506000910152565b600080604083850312156102f157600080fd5b82516001600160a01b038116811461030857600080fd5b60208401519092506001600160401b038082111561032557600080fd5b818501915085601f83011261033957600080fd5b81518181111561034b5761034b6102a4565b604051601f8201601f19908116603f01168101908382118183101715610373576103736102a4565b8160405282815288602084870101111561038c57600080fd5b61039d8360208301602088016102ba565b80955050505050509250929050565b600082516103be8184602087016102ba565b9190910192915050565b60208152600082518060208401526103e78160408501602087016102ba565b601f01601f19169190910160400192915050565b6088806104096000396000f3fe608060405236601057600e6013565b005b600e5b601f601b6021565b6058565b565b600060537f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b3660008037600080366000845af43d6000803e8080156076573d6000f35b3d6000fdfea164736f6c6343000815000a416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a164736f6c6343000815000a", + "sourceMap": "616:2276:50:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2219:671;;;;;;;;;;-1:-1:-1;2219:671:50;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1129:32:55;;;1111:51;;1099:2;1084:18;2219:671:50;;;;;;;1263:831;;;;;;:::i;:::-;;:::i;702:39::-;;;;;;;;;;;;;;;652:44;;;;;;;;;;;;;;;2219:671;2325:7;2363:520;2411:4;2403:13;;2507:31;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;2612:13;2763:9;2656:147;;;;;;;;:::i;:::-;;;;-1:-1:-1;;2656:147:50;;;;;;;;;;;;;;;-1:-1:-1;;;;;2656:147:50;-1:-1:-1;;;2656:147:50;;;2564:265;;;;;2656:147;2564:265;;:::i;:::-;;;;-1:-1:-1;;2564:265:50;;;;;;;;;;2465:386;;;2564:265;2465:386;;:::i;:::-;;;;;;;;;;;;;2434:435;;;;;;2363:22;:520::i;:::-;2344:539;;2219:671;;;;;:::o;1263:831::-;1375:13;1400:12;1415:27;1426:9;1437:4;1415:10;:27::i;:::-;1400:42;-1:-1:-1;1503:9:50;:13;1499:88;;1532:44;;-1:-1:-1;;;1532:44:50;;-1:-1:-1;;;;;1129:32:55;;;1532:44:50;;;1111:51:55;1532:10:50;:20;;;;1560:9;;1084:18:55;;1532:44:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1499:88;-1:-1:-1;;;;;1676:16:50;;;1706:12;;1702:78;;-1:-1:-1;1763:4:50;-1:-1:-1;1734:35:50;;1702:78;1900:4;1892:13;;1940;2022:9;1980:53;;;;;;;;:::i;:::-;;;;-1:-1:-1;;1980:53:50;;;;;;;;;;;;;;-1:-1:-1;;;;;1980:53:50;-1:-1:-1;;;1980:53:50;;;1869:186;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1790:297:50;1263:831;-1:-1:-1;;;;;1263:831:50:o;1799:165:43:-;1882:7;1908:49;1923:4;1929:12;1951:4;2338:12;2445:4;2439:11;3664:12;3657:4;3652:3;3648:14;3641:36;3713:4;3706;3701:3;3697:14;3690:28;3743:8;3738:3;3731:21;3836:4;3831:3;3827:14;3814:27;;3947:4;3940:5;3932:20;3990:2;3973:20;;;2207:1802;-1:-1:-1;;;;2207:1802:43:o;-1:-1:-1:-;;;;;;;;:::o;14:127:55:-;75:10;70:3;66:20;63:1;56:31;106:4;103:1;96:15;130:4;127:1;120:15;146:814;237:6;245;298:2;286:9;277:7;273:23;269:32;266:52;;;314:1;311;304:12;266:52;363:7;356:4;345:9;341:20;337:34;327:62;;385:1;382;375:12;327:62;418:2;412:9;460:2;452:6;448:15;529:6;517:10;514:22;493:18;481:10;478:34;475:62;472:88;;;540:18;;:::i;:::-;580:10;576:2;569:22;;611:6;655:2;644:9;640:18;681:7;673:6;670:19;667:39;;;702:1;699;692:12;667:39;726:9;744:146;760:6;755:3;752:15;744:146;;;828:17;;816:30;;875:4;866:14;;;;777;744:146;;;-1:-1:-1;909:6:55;;934:20;;;-1:-1:-1;146:814:55;;-1:-1:-1;;;;146:814:55:o;1640:494::-;1820:2;1805:18;;1809:9;1900:6;1778:4;1934:194;1948:4;1945:1;1942:11;1934:194;;;2007:13;;1995:26;;2044:4;2068:12;;;;2103:15;;;;1968:1;1961:9;1934:194;;;1938:3;;;1640:494;;;;:::o;2139:250::-;2224:1;2234:113;2248:6;2245:1;2242:13;2234:113;;;2324:11;;;2318:18;2305:11;;;2298:39;2270:2;2263:10;2234:113;;;-1:-1:-1;;2381:1:55;2363:16;;2356:27;2139:250::o;2394:491::-;2598:1;2594;2589:3;2585:11;2581:19;2573:6;2569:32;2558:9;2551:51;2638:2;2633;2622:9;2618:18;2611:30;2532:4;2670:6;2664:13;2713:6;2708:2;2697:9;2693:18;2686:34;2729:79;2801:6;2796:2;2785:9;2781:18;2776:2;2768:6;2764:15;2729:79;:::i;:::-;2869:2;2848:15;-1:-1:-1;;2844:29:55;2829:45;;;;2876:2;2825:54;;2394:491;-1:-1:-1;;;2394:491:55:o;2890:492::-;3065:3;3103:6;3097:13;3119:66;3178:6;3173:3;3166:4;3158:6;3154:17;3119:66;:::i;:::-;3248:13;;3207:16;;;;3270:70;3248:13;3207:16;3317:4;3305:17;;3270:70;:::i;:::-;3356:20;;2890:492;-1:-1:-1;;;;2890:492:55:o", + "linkReferences": {}, + "immutableReferences": { + "48750": [ + { + "start": 217, + "length": 32 + }, + { + "start": 298, + "length": 32 + }, + { + "start": 647, + "length": 32 + } + ], + "48753": [ + { + "start": 165, + "length": 32 + }, + { + "start": 521, + "length": 32 + } + ] + } + }, + "methodIdentifiers": { + "accountImplem()": "c1e4ba2d", + "createAccount(bytes32[2],uint256)": "8375702b", + "entryPoint()": "b0d691fe", + "getAddress(bytes32[2],uint256)": "0b824849" + }, + "rawMetadata": "{\"compiler\":{\"version\":\"0.8.21+commit.d9974bed\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IEntryPoint\",\"name\":\"_entryPoint\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"accountImplem\",\"outputs\":[{\"internalType\":\"contract SimpleAccount\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[2]\",\"name\":\"publicKey\",\"type\":\"bytes32[2]\"},{\"internalType\":\"uint256\",\"name\":\"salt\",\"type\":\"uint256\"}],\"name\":\"createAccount\",\"outputs\":[{\"internalType\":\"contract SimpleAccount\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"entryPoint\",\"outputs\":[{\"internalType\":\"contract IEntryPoint\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[2]\",\"name\":\"publicKey\",\"type\":\"bytes32[2]\"},{\"internalType\":\"uint256\",\"name\":\"salt\",\"type\":\"uint256\"}],\"name\":\"getAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"createAccount(bytes32[2],uint256)\":{\"notice\":\"Create an account, and return its address. Returns the address even if the account is already deployed. Note that during UserOperation execution, this method is called only if the account is not deployed. This method returns an existing account address so that entryPoint.getSenderAddress() would work even after account creation.\"},\"getAddress(bytes32[2],uint256)\":{\"notice\":\"Calculate the counterfactual address of this account as it would be returned by createAccount()\"}},\"notice\":\"A sample factory contract for SimpleAccount A UserOperations \\\"initCode\\\" holds the address of the factory, and a method call (to createAccount, in this sample factory). The factory's createAccount returns the target account address even if it is already installed. This way, the entryPoint.getSenderAddress() can be called either before or after the account is created.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/SimpleAccountFactory.sol\":\"SimpleAccountFactory\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/\",\":account-abstraction/=lib/account-abstraction/contracts/\",\":ds-test/=lib/forge-std/lib/ds-test/src/\",\":erc4626-tests/=lib/p256-verifier/lib/openzeppelin-contracts/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":p256-verifier/=lib/p256-verifier/src/\"]},\"sources\":{\"lib/account-abstraction/contracts/core/Helpers.sol\":{\"keccak256\":\"0x81b70ea6183fd28e6c00dc3cf357c8453abdd4cc46ec628e7589e4b6a188d626\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://f4a99aced25a842721a2495760af84b874c1f730c94f8b3e76c71c8b757c90f5\",\"dweb:/ipfs/QmacEJqVFbwQxE4HTzqvWWAFT7uSbH2Yd7EMqdCx1DxzBz\"]},\"lib/account-abstraction/contracts/interfaces/IAccount.sol\":{\"keccak256\":\"0x1a11613e6921d1a55ba72169156842ba7d30e966d40a23b34b29c88d1f82345e\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://2bdd695221a8d884d4603d46b5389cc2cdda5cba70f49b57a98e9fba1b9fd2c5\",\"dweb:/ipfs/QmZyHFwzpRgfa4YgzY4MUbNdj8WSGCjMHw2AxW4LVnMLWE\"]},\"lib/account-abstraction/contracts/interfaces/IAggregator.sol\":{\"keccak256\":\"0xfc37d01c654f967c0f33b0edcb074231d30841f6fe1b23a070564f13c497b111\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://490630958f3a1861ad16db742e891b8c9f6f229a11f942d25ff58e9bab983c37\",\"dweb:/ipfs/QmYcvJxvXrXWvDUp6XZZirzjMqk5BaWdmsWWsEtamiuDu9\"]},\"lib/account-abstraction/contracts/interfaces/IEntryPoint.sol\":{\"keccak256\":\"0x9cdadcebb6491f50a7c136e560f1eb51e785a79ebfa29605a0c5eee3c60adb19\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://236356329adad328f489629e53a141f8842fa00ad42c16cf9ea031cfe77bfa82\",\"dweb:/ipfs/QmRgjTghLaTcA3xbx6vcfVu6aCUK6W1iN8JS8ric2DPy1x\"]},\"lib/account-abstraction/contracts/interfaces/INonceManager.sol\":{\"keccak256\":\"0x509871e6c63663cdcc3eba19920fe84e991f38b289b1377ac3c3a6d9f22d7e12\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://00fe21b4349b24c50df60e1a705179293982bd9e7a32b78d4bac9620f89e7fe2\",\"dweb:/ipfs/QmSFFYGfUwQbVa6hASjU7YxTvgi2HkfrPr4X5oPHscHg8b\"]},\"lib/account-abstraction/contracts/interfaces/IStakeManager.sol\":{\"keccak256\":\"0x10cdaa14cd2b08279e02c2d4863cea18cfb7e11d7a33cf740755f9a025e7bda1\",\"license\":\"GPL-3.0-only\",\"urls\":[\"bzz-raw://3d214ceee25812bb2a8176dd245a399d84d222cf7f9cf0bc3937afad372f0b7a\",\"dweb:/ipfs/QmZxqSic8cGeis7R7ufUjf95CgTpyAFY9nCHuiLPbESbYr\"]},\"lib/account-abstraction/contracts/interfaces/UserOperation.sol\":{\"keccak256\":\"0x093777cb7097dccaffd631d07dfdbd0f731371efe3770fbe22a0c992af4eb4f6\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://6da218e65b43a3f99247b2c66c5946eaa48f2719a0f58469d3a80b4d24b28f00\",\"dweb:/ipfs/QmQ3np8AwPkWw9Ey4DMMQNJgPSVw3fdrX8wnLaVgYyiaQn\"]},\"lib/forge-std/src/console2.sol\":{\"keccak256\":\"0x954646445d1014c3cd85c7918f5e7adeeca5ee44b68c00bafa237e597a4e35ea\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://516fa3be52da4763147175bfba4be0aa011fadbb0c1afb01f97265bd4cee7973\",\"dweb:/ipfs/QmdixAyMJefx7qePChgdxcBH5MxhmN7vsqPuPLx3CgrVmF\"]},\"lib/openzeppelin-contracts/contracts/interfaces/IERC1271.sol\":{\"keccak256\":\"0x0705a4b1b86d7b0bd8432118f226ba139c44b9dcaba0a6eafba2dd7d0639c544\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c45b821ef9e882e57c256697a152e108f0f2ad6997609af8904cae99c9bd422e\",\"dweb:/ipfs/QmRKCJW6jjzR5UYZcLpGnhEJ75UVbH6EHkEa49sWx2SKng\"]},\"lib/openzeppelin-contracts/contracts/interfaces/draft-IERC1822.sol\":{\"keccak256\":\"0x1d4afe6cb24200cc4545eed814ecf5847277dfe5d613a1707aad5fceecebcfff\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://383fb7b8181016ac5ccf07bc9cdb7c1b5045ea36e2cc4df52bcbf20396fc7688\",\"dweb:/ipfs/QmYJ7Cg4WmE3rR8KGQxjUCXFfTH6TcwZ2Z1f6tPrq7jHFr\"]},\"lib/openzeppelin-contracts/contracts/proxy/ERC1967/ERC1967Proxy.sol\":{\"keccak256\":\"0xa2b22da3032e50b55f95ec1d13336102d675f341167aa76db571ef7f8bb7975d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://96b6d77a20bebd4eb06b801d3d020c7e82be13bd535cb0d0a6b7181c51dab5d5\",\"dweb:/ipfs/QmPUR9Cv9jNFdQX6PtBfaBW1ZCnKwiu65R2VD5kbdanDyn\"]},\"lib/openzeppelin-contracts/contracts/proxy/ERC1967/ERC1967Upgrade.sol\":{\"keccak256\":\"0xabf3f59bc0e5423eae45e459dbe92e7052c6983628d39008590edc852a62f94a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://89c2a0f70157c13845be5cb49b078a6374fee3a78fa950052a3af26190255da8\",\"dweb:/ipfs/QmUcvMEQH1oMM2pUyMuDiBUKdvvnTz1NRB8bmPHrVq8725\"]},\"lib/openzeppelin-contracts/contracts/proxy/Proxy.sol\":{\"keccak256\":\"0xc130fe33f1b2132158531a87734153293f6d07bc263ff4ac90e85da9c82c0e27\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8831721b6f4cc26534d190f9f1631c3f59c9ff38efdd911f85e0882b8e360472\",\"dweb:/ipfs/QmQZnLErZNStirSQ13ZNWQgvEYUtGE5tXYwn4QUPaVUfPN\"]},\"lib/openzeppelin-contracts/contracts/proxy/beacon/IBeacon.sol\":{\"keccak256\":\"0xd50a3421ac379ccb1be435fa646d66a65c986b4924f0849839f08692f39dde61\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ada1e030c0231db8d143b44ce92b4d1158eedb087880cad6d8cc7bd7ebe7b354\",\"dweb:/ipfs/QmWZ2NHZweRpz1U9GF6R1h65ri76dnX7fNxLBeM2t5N5Ce\"]},\"lib/openzeppelin-contracts/contracts/proxy/utils/Initializable.sol\":{\"keccak256\":\"0x3798da9e212cd00a7cda94ddb5a9721171a718e89c500d8901f810e0e37fa74e\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://a93f9c584e4b29dce1c7520b63d19f34c684f5ea972b5d04323a132059851004\",\"dweb:/ipfs/QmajmiA7BsarS63FMoP5PcBS4mqVGoiJ7xZ3wJVonYNTHC\"]},\"lib/openzeppelin-contracts/contracts/proxy/utils/UUPSUpgradeable.sol\":{\"keccak256\":\"0x85cc5aca68692044586dc5ca19a9868d3288f6b35d1085c620dd0278ed0abdaa\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://47e5b84668f9b898617da72e91a32559c6975357e267559b3e4ace0d0ca4a6a8\",\"dweb:/ipfs/QmUCVFEpcNdHfNpotEDnMRUeAGPShTcxrtzo3xpNJHZ67e\"]},\"lib/openzeppelin-contracts/contracts/utils/Address.sol\":{\"keccak256\":\"0xf96f969e24029d43d0df89e59d365f277021dac62b48e1c1e3ebe0acdd7f1ca1\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ec772b45a624be516f1c81970caa8a2e144301e9d0921cbc1a2789fef39a1269\",\"dweb:/ipfs/QmNyjwxCrGhQMyzLD93oUobJXVe9ceJvRvfXwbEtuxPiEj\"]},\"lib/openzeppelin-contracts/contracts/utils/Base64.sol\":{\"keccak256\":\"0x5f3461639fe20794cfb4db4a6d8477388a15b2e70a018043084b7c4bedfa8136\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://77e5309e2cc4cdc3395214edb0ff43ff5a5f7373f5a425383e540f6fab530f96\",\"dweb:/ipfs/QmTV8DZ9knJDa3b5NPBFQqjvTzodyZVjRUg5mx5A99JPLJ\"]},\"lib/openzeppelin-contracts/contracts/utils/Create2.sol\":{\"keccak256\":\"0xafc07f37809f74d9c66d6461cc0f85fb5147ab855acd0acc30af4b2272130c61\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8e63fa9a8bc793ccbdc82e93f85a4d2d5b66fd3f42303a6f5fe54c5ff230eb81\",\"dweb:/ipfs/QmVMxEw74WgFPqTZjXbYBLbo6gbbjtTocnfBW54Ft6W6Tb\"]},\"lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol\":{\"keccak256\":\"0xd5c50c54bf02740ebd122ff06832546cb5fa84486d52695a9ccfd11666e0c81d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://39e096c60a6eb1c6a257122d515496bd92d0c6a693a8f07acb6aa4b1263e95d4\",\"dweb:/ipfs/QmPs5trJBacCiSkezP6tpevapuRYWNY6mqSFzsMCJj7e6B\"]},\"lib/p256-verifier/src/P256.sol\":{\"keccak256\":\"0x4468a0e0038afa2e1cd62511a9ca80756dd9c359dd2747bf253a81cfff31ddbd\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://7477936aedd075763d5ffc0b87b88591ccb18d68001c883df2e0fad34e19ffce\",\"dweb:/ipfs/Qmb8QWQKJLLAmj7b4qQUcb17kpRfiLvyv2NMUm3y5zj9rc\"]},\"lib/p256-verifier/src/utils/Base64URL.sol\":{\"keccak256\":\"0x36416bdd7102f5a6feb22da9a5f648165cdf10c40c5cd119db076b7908758b03\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1bba99952002c232533c81a58850e2959fb3f55b4a16747532597ce432fd5c72\",\"dweb:/ipfs/QmYzfzNWUwqzcrqSHvppVM7xWDbaKuse3bmqwLac7QoKEq\"]},\"src/SimpleAccount.sol\":{\"keccak256\":\"0x6da78eac4ac3795750f5837194f6b6f78a3d79478f09b0b9efe9583f08595ee0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://234613012015441698451e5af98226a503feadaa7b4ab4a9d18d3c8a0be60d84\",\"dweb:/ipfs/QmVrosqua1ZCCGbPGSM8ksdw8SX3Cjp6zuQLqxP1PyU14Y\"]},\"src/SimpleAccountFactory.sol\":{\"keccak256\":\"0x9a5a306a026849c2e5b6c0a485cf0c27f457231e2ba1399da55d0c0ac2ad45d5\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://2d10ef4e51943fce477d5b2a362d8a1d4638668afc688984edd68023eff8feab\",\"dweb:/ipfs/QmdHiyCbao3Cv2dgXxSm4bqPouQ9RmyHCi6TDBqhXRzckS\"]},\"src/WebAuthn.sol\":{\"keccak256\":\"0xf0d93f00b415d520a554751713ccf1a1a6626ab7281d7a5494ed5494484eac93\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://adab00059653a4449b5c7f6a3846b4729f404cfd0b8e013fe953caf4da7e995c\",\"dweb:/ipfs/QmSsTV4Ukf5PaN5fXMt8c8G9CHxqiRqEbdeFbhLKx6ruDm\"]}},\"version\":1}", + "metadata": { + "compiler": { + "version": "0.8.21+commit.d9974bed" + }, + "language": "Solidity", + "output": { + "abi": [ + { + "inputs": [ + { + "internalType": "contract IEntryPoint", + "name": "_entryPoint", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "accountImplem", + "outputs": [ + { + "internalType": "contract SimpleAccount", + "name": "", + "type": "address" + } + ] + }, + { + "inputs": [ + { + "internalType": "bytes32[2]", + "name": "publicKey", + "type": "bytes32[2]" + }, + { + "internalType": "uint256", + "name": "salt", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function", + "name": "createAccount", + "outputs": [ + { + "internalType": "contract SimpleAccount", + "name": "", + "type": "address" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "entryPoint", + "outputs": [ + { + "internalType": "contract IEntryPoint", + "name": "", + "type": "address" + } + ] + }, + { + "inputs": [ + { + "internalType": "bytes32[2]", + "name": "publicKey", + "type": "bytes32[2]" + }, + { + "internalType": "uint256", + "name": "salt", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function", + "name": "getAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ] + } + ], + "devdoc": { + "kind": "dev", + "methods": {}, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "createAccount(bytes32[2],uint256)": { + "notice": "Create an account, and return its address. Returns the address even if the account is already deployed. Note that during UserOperation execution, this method is called only if the account is not deployed. This method returns an existing account address so that entryPoint.getSenderAddress() would work even after account creation." + }, + "getAddress(bytes32[2],uint256)": { + "notice": "Calculate the counterfactual address of this account as it would be returned by createAccount()" + } + }, + "version": 1 + } + }, + "settings": { + "remappings": [ + "@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/", + "account-abstraction/=lib/account-abstraction/contracts/", + "ds-test/=lib/forge-std/lib/ds-test/src/", + "erc4626-tests/=lib/p256-verifier/lib/openzeppelin-contracts/lib/erc4626-tests/", + "forge-std/=lib/forge-std/src/", + "openzeppelin-contracts/=lib/openzeppelin-contracts/", + "p256-verifier/=lib/p256-verifier/src/" + ], + "optimizer": { + "enabled": true, + "runs": 200 + }, + "metadata": { + "bytecodeHash": "none" + }, + "compilationTarget": { + "src/SimpleAccountFactory.sol": "SimpleAccountFactory" + }, + "libraries": {} + }, + "sources": { + "lib/account-abstraction/contracts/core/Helpers.sol": { + "keccak256": "0x81b70ea6183fd28e6c00dc3cf357c8453abdd4cc46ec628e7589e4b6a188d626", + "urls": [ + "bzz-raw://f4a99aced25a842721a2495760af84b874c1f730c94f8b3e76c71c8b757c90f5", + "dweb:/ipfs/QmacEJqVFbwQxE4HTzqvWWAFT7uSbH2Yd7EMqdCx1DxzBz" + ], + "license": "GPL-3.0" + }, + "lib/account-abstraction/contracts/interfaces/IAccount.sol": { + "keccak256": "0x1a11613e6921d1a55ba72169156842ba7d30e966d40a23b34b29c88d1f82345e", + "urls": [ + "bzz-raw://2bdd695221a8d884d4603d46b5389cc2cdda5cba70f49b57a98e9fba1b9fd2c5", + "dweb:/ipfs/QmZyHFwzpRgfa4YgzY4MUbNdj8WSGCjMHw2AxW4LVnMLWE" + ], + "license": "GPL-3.0" + }, + "lib/account-abstraction/contracts/interfaces/IAggregator.sol": { + "keccak256": "0xfc37d01c654f967c0f33b0edcb074231d30841f6fe1b23a070564f13c497b111", + "urls": [ + "bzz-raw://490630958f3a1861ad16db742e891b8c9f6f229a11f942d25ff58e9bab983c37", + "dweb:/ipfs/QmYcvJxvXrXWvDUp6XZZirzjMqk5BaWdmsWWsEtamiuDu9" + ], + "license": "GPL-3.0" + }, + "lib/account-abstraction/contracts/interfaces/IEntryPoint.sol": { + "keccak256": "0x9cdadcebb6491f50a7c136e560f1eb51e785a79ebfa29605a0c5eee3c60adb19", + "urls": [ + "bzz-raw://236356329adad328f489629e53a141f8842fa00ad42c16cf9ea031cfe77bfa82", + "dweb:/ipfs/QmRgjTghLaTcA3xbx6vcfVu6aCUK6W1iN8JS8ric2DPy1x" + ], + "license": "GPL-3.0" + }, + "lib/account-abstraction/contracts/interfaces/INonceManager.sol": { + "keccak256": "0x509871e6c63663cdcc3eba19920fe84e991f38b289b1377ac3c3a6d9f22d7e12", + "urls": [ + "bzz-raw://00fe21b4349b24c50df60e1a705179293982bd9e7a32b78d4bac9620f89e7fe2", + "dweb:/ipfs/QmSFFYGfUwQbVa6hASjU7YxTvgi2HkfrPr4X5oPHscHg8b" + ], + "license": "GPL-3.0" + }, + "lib/account-abstraction/contracts/interfaces/IStakeManager.sol": { + "keccak256": "0x10cdaa14cd2b08279e02c2d4863cea18cfb7e11d7a33cf740755f9a025e7bda1", + "urls": [ + "bzz-raw://3d214ceee25812bb2a8176dd245a399d84d222cf7f9cf0bc3937afad372f0b7a", + "dweb:/ipfs/QmZxqSic8cGeis7R7ufUjf95CgTpyAFY9nCHuiLPbESbYr" + ], + "license": "GPL-3.0-only" + }, + "lib/account-abstraction/contracts/interfaces/UserOperation.sol": { + "keccak256": "0x093777cb7097dccaffd631d07dfdbd0f731371efe3770fbe22a0c992af4eb4f6", + "urls": [ + "bzz-raw://6da218e65b43a3f99247b2c66c5946eaa48f2719a0f58469d3a80b4d24b28f00", + "dweb:/ipfs/QmQ3np8AwPkWw9Ey4DMMQNJgPSVw3fdrX8wnLaVgYyiaQn" + ], + "license": "GPL-3.0" + }, + "lib/forge-std/src/console2.sol": { + "keccak256": "0x954646445d1014c3cd85c7918f5e7adeeca5ee44b68c00bafa237e597a4e35ea", + "urls": [ + "bzz-raw://516fa3be52da4763147175bfba4be0aa011fadbb0c1afb01f97265bd4cee7973", + "dweb:/ipfs/QmdixAyMJefx7qePChgdxcBH5MxhmN7vsqPuPLx3CgrVmF" + ], + "license": "MIT" + }, + "lib/openzeppelin-contracts/contracts/interfaces/IERC1271.sol": { + "keccak256": "0x0705a4b1b86d7b0bd8432118f226ba139c44b9dcaba0a6eafba2dd7d0639c544", + "urls": [ + "bzz-raw://c45b821ef9e882e57c256697a152e108f0f2ad6997609af8904cae99c9bd422e", + "dweb:/ipfs/QmRKCJW6jjzR5UYZcLpGnhEJ75UVbH6EHkEa49sWx2SKng" + ], + "license": "MIT" + }, + "lib/openzeppelin-contracts/contracts/interfaces/draft-IERC1822.sol": { + "keccak256": "0x1d4afe6cb24200cc4545eed814ecf5847277dfe5d613a1707aad5fceecebcfff", + "urls": [ + "bzz-raw://383fb7b8181016ac5ccf07bc9cdb7c1b5045ea36e2cc4df52bcbf20396fc7688", + "dweb:/ipfs/QmYJ7Cg4WmE3rR8KGQxjUCXFfTH6TcwZ2Z1f6tPrq7jHFr" + ], + "license": "MIT" + }, + "lib/openzeppelin-contracts/contracts/proxy/ERC1967/ERC1967Proxy.sol": { + "keccak256": "0xa2b22da3032e50b55f95ec1d13336102d675f341167aa76db571ef7f8bb7975d", + "urls": [ + "bzz-raw://96b6d77a20bebd4eb06b801d3d020c7e82be13bd535cb0d0a6b7181c51dab5d5", + "dweb:/ipfs/QmPUR9Cv9jNFdQX6PtBfaBW1ZCnKwiu65R2VD5kbdanDyn" + ], + "license": "MIT" + }, + "lib/openzeppelin-contracts/contracts/proxy/ERC1967/ERC1967Upgrade.sol": { + "keccak256": "0xabf3f59bc0e5423eae45e459dbe92e7052c6983628d39008590edc852a62f94a", + "urls": [ + "bzz-raw://89c2a0f70157c13845be5cb49b078a6374fee3a78fa950052a3af26190255da8", + "dweb:/ipfs/QmUcvMEQH1oMM2pUyMuDiBUKdvvnTz1NRB8bmPHrVq8725" + ], + "license": "MIT" + }, + "lib/openzeppelin-contracts/contracts/proxy/Proxy.sol": { + "keccak256": "0xc130fe33f1b2132158531a87734153293f6d07bc263ff4ac90e85da9c82c0e27", + "urls": [ + "bzz-raw://8831721b6f4cc26534d190f9f1631c3f59c9ff38efdd911f85e0882b8e360472", + "dweb:/ipfs/QmQZnLErZNStirSQ13ZNWQgvEYUtGE5tXYwn4QUPaVUfPN" + ], + "license": "MIT" + }, + "lib/openzeppelin-contracts/contracts/proxy/beacon/IBeacon.sol": { + "keccak256": "0xd50a3421ac379ccb1be435fa646d66a65c986b4924f0849839f08692f39dde61", + "urls": [ + "bzz-raw://ada1e030c0231db8d143b44ce92b4d1158eedb087880cad6d8cc7bd7ebe7b354", + "dweb:/ipfs/QmWZ2NHZweRpz1U9GF6R1h65ri76dnX7fNxLBeM2t5N5Ce" + ], + "license": "MIT" + }, + "lib/openzeppelin-contracts/contracts/proxy/utils/Initializable.sol": { + "keccak256": "0x3798da9e212cd00a7cda94ddb5a9721171a718e89c500d8901f810e0e37fa74e", + "urls": [ + "bzz-raw://a93f9c584e4b29dce1c7520b63d19f34c684f5ea972b5d04323a132059851004", + "dweb:/ipfs/QmajmiA7BsarS63FMoP5PcBS4mqVGoiJ7xZ3wJVonYNTHC" + ], + "license": "MIT" + }, + "lib/openzeppelin-contracts/contracts/proxy/utils/UUPSUpgradeable.sol": { + "keccak256": "0x85cc5aca68692044586dc5ca19a9868d3288f6b35d1085c620dd0278ed0abdaa", + "urls": [ + "bzz-raw://47e5b84668f9b898617da72e91a32559c6975357e267559b3e4ace0d0ca4a6a8", + "dweb:/ipfs/QmUCVFEpcNdHfNpotEDnMRUeAGPShTcxrtzo3xpNJHZ67e" + ], + "license": "MIT" + }, + "lib/openzeppelin-contracts/contracts/utils/Address.sol": { + "keccak256": "0xf96f969e24029d43d0df89e59d365f277021dac62b48e1c1e3ebe0acdd7f1ca1", + "urls": [ + "bzz-raw://ec772b45a624be516f1c81970caa8a2e144301e9d0921cbc1a2789fef39a1269", + "dweb:/ipfs/QmNyjwxCrGhQMyzLD93oUobJXVe9ceJvRvfXwbEtuxPiEj" + ], + "license": "MIT" + }, + "lib/openzeppelin-contracts/contracts/utils/Base64.sol": { + "keccak256": "0x5f3461639fe20794cfb4db4a6d8477388a15b2e70a018043084b7c4bedfa8136", + "urls": [ + "bzz-raw://77e5309e2cc4cdc3395214edb0ff43ff5a5f7373f5a425383e540f6fab530f96", + "dweb:/ipfs/QmTV8DZ9knJDa3b5NPBFQqjvTzodyZVjRUg5mx5A99JPLJ" + ], + "license": "MIT" + }, + "lib/openzeppelin-contracts/contracts/utils/Create2.sol": { + "keccak256": "0xafc07f37809f74d9c66d6461cc0f85fb5147ab855acd0acc30af4b2272130c61", + "urls": [ + "bzz-raw://8e63fa9a8bc793ccbdc82e93f85a4d2d5b66fd3f42303a6f5fe54c5ff230eb81", + "dweb:/ipfs/QmVMxEw74WgFPqTZjXbYBLbo6gbbjtTocnfBW54Ft6W6Tb" + ], + "license": "MIT" + }, + "lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol": { + "keccak256": "0xd5c50c54bf02740ebd122ff06832546cb5fa84486d52695a9ccfd11666e0c81d", + "urls": [ + "bzz-raw://39e096c60a6eb1c6a257122d515496bd92d0c6a693a8f07acb6aa4b1263e95d4", + "dweb:/ipfs/QmPs5trJBacCiSkezP6tpevapuRYWNY6mqSFzsMCJj7e6B" + ], + "license": "MIT" + }, + "lib/p256-verifier/src/P256.sol": { + "keccak256": "0x4468a0e0038afa2e1cd62511a9ca80756dd9c359dd2747bf253a81cfff31ddbd", + "urls": [ + "bzz-raw://7477936aedd075763d5ffc0b87b88591ccb18d68001c883df2e0fad34e19ffce", + "dweb:/ipfs/Qmb8QWQKJLLAmj7b4qQUcb17kpRfiLvyv2NMUm3y5zj9rc" + ], + "license": "MIT" + }, + "lib/p256-verifier/src/utils/Base64URL.sol": { + "keccak256": "0x36416bdd7102f5a6feb22da9a5f648165cdf10c40c5cd119db076b7908758b03", + "urls": [ + "bzz-raw://1bba99952002c232533c81a58850e2959fb3f55b4a16747532597ce432fd5c72", + "dweb:/ipfs/QmYzfzNWUwqzcrqSHvppVM7xWDbaKuse3bmqwLac7QoKEq" + ], + "license": "MIT" + }, + "src/SimpleAccount.sol": { + "keccak256": "0x6da78eac4ac3795750f5837194f6b6f78a3d79478f09b0b9efe9583f08595ee0", + "urls": [ + "bzz-raw://234613012015441698451e5af98226a503feadaa7b4ab4a9d18d3c8a0be60d84", + "dweb:/ipfs/QmVrosqua1ZCCGbPGSM8ksdw8SX3Cjp6zuQLqxP1PyU14Y" + ], + "license": "MIT" + }, + "src/SimpleAccountFactory.sol": { + "keccak256": "0x9a5a306a026849c2e5b6c0a485cf0c27f457231e2ba1399da55d0c0ac2ad45d5", + "urls": [ + "bzz-raw://2d10ef4e51943fce477d5b2a362d8a1d4638668afc688984edd68023eff8feab", + "dweb:/ipfs/QmdHiyCbao3Cv2dgXxSm4bqPouQ9RmyHCi6TDBqhXRzckS" + ], + "license": "MIT" + }, + "src/WebAuthn.sol": { + "keccak256": "0xf0d93f00b415d520a554751713ccf1a1a6626ab7281d7a5494ed5494484eac93", + "urls": [ + "bzz-raw://adab00059653a4449b5c7f6a3846b4729f404cfd0b8e013fe953caf4da7e995c", + "dweb:/ipfs/QmSsTV4Ukf5PaN5fXMt8c8G9CHxqiRqEbdeFbhLKx6ruDm" + ], + "license": "MIT" + } + }, + "version": 1 + }, + "ast": { + "absolutePath": "src/SimpleAccountFactory.sol", + "id": 48898, + "exportedSymbols": { + "Address": [47806], + "Create2": [47934], + "ERC1967Proxy": [46757], + "ERC1967Upgrade": [47075], + "IAccount": [2899], + "IAggregator": [2933], + "IBeacon": [47137], + "IERC1271": [46710], + "IERC1822Proxiable": [46720], + "IEntryPoint": [3072], + "INonceManager": [3091], + "IStakeManager": [3230], + "Initializable": [47306], + "Proxy": [47127], + "Signature": [48278], + "SimpleAccount": [48741], + "SimpleAccountFactory": [48897], + "StorageSlot": [47994], + "UUPSUpgradeable": [47422], + "UserOperation": [3256], + "ValidationData": [1907], + "WebAuthn": [49150], + "_intersectTimeRange": [2053], + "_packValidationData": [2090, 2128], + "_parseValidationData": [1967], + "calldataKeccak": [2138], + "console2": [33458] + }, + "nodeType": "SourceUnit", + "src": "32:2861:50", + "nodes": [ + { + "id": 48743, + "nodeType": "PragmaDirective", + "src": "32:24:50", + "nodes": [], + "literals": ["solidity", "^", "0.8", ".12"] + }, + { + "id": 48744, + "nodeType": "ImportDirective", + "src": "58:60:50", + "nodes": [], + "absolutePath": "lib/openzeppelin-contracts/contracts/utils/Create2.sol", + "file": "openzeppelin-contracts/contracts/utils/Create2.sol", + "nameLocation": "-1:-1:-1", + "scope": 48898, + "sourceUnit": 47935, + "symbolAliases": [], + "unitAlias": "" + }, + { + "id": 48745, + "nodeType": "ImportDirective", + "src": "119:73:50", + "nodes": [], + "absolutePath": "lib/openzeppelin-contracts/contracts/proxy/ERC1967/ERC1967Proxy.sol", + "file": "openzeppelin-contracts/contracts/proxy/ERC1967/ERC1967Proxy.sol", + "nameLocation": "-1:-1:-1", + "scope": 48898, + "sourceUnit": 46758, + "symbolAliases": [], + "unitAlias": "" + }, + { + "id": 48746, + "nodeType": "ImportDirective", + "src": "194:31:50", + "nodes": [], + "absolutePath": "src/SimpleAccount.sol", + "file": "src/SimpleAccount.sol", + "nameLocation": "-1:-1:-1", + "scope": 48898, + "sourceUnit": 48742, + "symbolAliases": [], + "unitAlias": "" + }, + { + "id": 48897, + "nodeType": "ContractDefinition", + "src": "616:2276:50", + "nodes": [ + { + "id": 48750, + "nodeType": "VariableDeclaration", + "src": "652:44:50", + "nodes": [], + "constant": false, + "functionSelector": "c1e4ba2d", + "mutability": "immutable", + "name": "accountImplem", + "nameLocation": "683:13:50", + "scope": 48897, + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_contract$_SimpleAccount_$48741", + "typeString": "contract SimpleAccount" + }, + "typeName": { + "id": 48749, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 48748, + "name": "SimpleAccount", + "nameLocations": ["652:13:50"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 48741, + "src": "652:13:50" + }, + "referencedDeclaration": 48741, + "src": "652:13:50", + "typeDescriptions": { + "typeIdentifier": "t_contract$_SimpleAccount_$48741", + "typeString": "contract SimpleAccount" + } + }, + "visibility": "public" + }, + { + "id": 48753, + "nodeType": "VariableDeclaration", + "src": "702:39:50", + "nodes": [], + "constant": false, + "functionSelector": "b0d691fe", + "mutability": "immutable", + "name": "entryPoint", + "nameLocation": "731:10:50", + "scope": 48897, + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IEntryPoint_$3072", + "typeString": "contract IEntryPoint" + }, + "typeName": { + "id": 48752, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 48751, + "name": "IEntryPoint", + "nameLocations": ["702:11:50"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 3072, + "src": "702:11:50" + }, + "referencedDeclaration": 3072, + "src": "702:11:50", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IEntryPoint_$3072", + "typeString": "contract IEntryPoint" + } + }, + "visibility": "public" + }, + { + "id": 48772, + "nodeType": "FunctionDefinition", + "src": "748:134:50", + "nodes": [], + "body": { + "id": 48771, + "nodeType": "Block", + "src": "785:97:50", + "nodes": [], + "statements": [ + { + "expression": { + "id": 48761, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 48759, + "name": "entryPoint", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 48753, + "src": "795:10:50", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IEntryPoint_$3072", + "typeString": "contract IEntryPoint" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "id": 48760, + "name": "_entryPoint", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 48756, + "src": "808:11:50", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IEntryPoint_$3072", + "typeString": "contract IEntryPoint" + } + }, + "src": "795:24:50", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IEntryPoint_$3072", + "typeString": "contract IEntryPoint" + } + }, + "id": 48762, + "nodeType": "ExpressionStatement", + "src": "795:24:50" + }, + { + "expression": { + "id": 48769, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 48763, + "name": "accountImplem", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 48750, + "src": "829:13:50", + "typeDescriptions": { + "typeIdentifier": "t_contract$_SimpleAccount_$48741", + "typeString": "contract SimpleAccount" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "id": 48767, + "name": "_entryPoint", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 48756, + "src": "863:11:50", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IEntryPoint_$3072", + "typeString": "contract IEntryPoint" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_contract$_IEntryPoint_$3072", + "typeString": "contract IEntryPoint" + } + ], + "id": 48766, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "NewExpression", + "src": "845:17:50", + "typeDescriptions": { + "typeIdentifier": "t_function_creation_nonpayable$_t_contract$_IEntryPoint_$3072_$returns$_t_contract$_SimpleAccount_$48741_$", + "typeString": "function (contract IEntryPoint) returns (contract SimpleAccount)" + }, + "typeName": { + "id": 48765, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 48764, + "name": "SimpleAccount", + "nameLocations": ["849:13:50"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 48741, + "src": "849:13:50" + }, + "referencedDeclaration": 48741, + "src": "849:13:50", + "typeDescriptions": { + "typeIdentifier": "t_contract$_SimpleAccount_$48741", + "typeString": "contract SimpleAccount" + } + } + }, + "id": 48768, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "845:30:50", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_contract$_SimpleAccount_$48741", + "typeString": "contract SimpleAccount" + } + }, + "src": "829:46:50", + "typeDescriptions": { + "typeIdentifier": "t_contract$_SimpleAccount_$48741", + "typeString": "contract SimpleAccount" + } + }, + "id": 48770, + "nodeType": "ExpressionStatement", + "src": "829:46:50" + } + ] + }, + "implemented": true, + "kind": "constructor", + "modifiers": [], + "name": "", + "nameLocation": "-1:-1:-1", + "parameters": { + "id": 48757, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 48756, + "mutability": "mutable", + "name": "_entryPoint", + "nameLocation": "772:11:50", + "nodeType": "VariableDeclaration", + "scope": 48772, + "src": "760:23:50", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IEntryPoint_$3072", + "typeString": "contract IEntryPoint" + }, + "typeName": { + "id": 48755, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 48754, + "name": "IEntryPoint", + "nameLocations": ["760:11:50"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 3072, + "src": "760:11:50" + }, + "referencedDeclaration": 3072, + "src": "760:11:50", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IEntryPoint_$3072", + "typeString": "contract IEntryPoint" + } + }, + "visibility": "internal" + } + ], + "src": "759:25:50" + }, + "returnParameters": { + "id": 48758, + "nodeType": "ParameterList", + "parameters": [], + "src": "785:0:50" + }, + "scope": 48897, + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "public" + }, + { + "id": 48852, + "nodeType": "FunctionDefinition", + "src": "1263:831:50", + "nodes": [], + "body": { + "id": 48851, + "nodeType": "Block", + "src": "1390:704:50", + "nodes": [], + "statements": [ + { + "assignments": [48786], + "declarations": [ + { + "constant": false, + "id": 48786, + "mutability": "mutable", + "name": "addr", + "nameLocation": "1408:4:50", + "nodeType": "VariableDeclaration", + "scope": 48851, + "src": "1400:12:50", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 48785, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1400:7:50", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "id": 48791, + "initialValue": { + "arguments": [ + { + "id": 48788, + "name": "publicKey", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 48777, + "src": "1426:9:50", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_bytes32_$2_memory_ptr", + "typeString": "bytes32[2] memory" + } + }, + { + "id": 48789, + "name": "salt", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 48779, + "src": "1437:4:50", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_array$_t_bytes32_$2_memory_ptr", + "typeString": "bytes32[2] memory" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 48787, + "name": "getAddress", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 48896, + "src": "1415:10:50", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_array$_t_bytes32_$2_memory_ptr_$_t_uint256_$returns$_t_address_$", + "typeString": "function (bytes32[2] memory,uint256) view returns (address)" + } + }, + "id": 48790, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1415:27:50", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "1400:42:50" + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 48795, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "expression": { + "id": 48792, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -15, + "src": "1503:3:50", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 48793, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "1507:5:50", + "memberName": "value", + "nodeType": "MemberAccess", + "src": "1503:9:50", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "hexValue": "30", + "id": 48794, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1515:1:50", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "1503:13:50", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 48806, + "nodeType": "IfStatement", + "src": "1499:88:50", + "trueBody": { + "id": 48805, + "nodeType": "Block", + "src": "1518:69:50", + "statements": [ + { + "expression": { + "arguments": [ + { + "id": 48802, + "name": "addr", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 48786, + "src": "1571:4:50", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "expression": { + "id": 48796, + "name": "entryPoint", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 48753, + "src": "1532:10:50", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IEntryPoint_$3072", + "typeString": "contract IEntryPoint" + } + }, + "id": 48798, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "1543:9:50", + "memberName": "depositTo", + "nodeType": "MemberAccess", + "referencedDeclaration": 3205, + "src": "1532:20:50", + "typeDescriptions": { + "typeIdentifier": "t_function_external_payable$_t_address_$returns$__$", + "typeString": "function (address) payable external" + } + }, + "id": 48801, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "names": ["value"], + "nodeType": "FunctionCallOptions", + "options": [ + { + "expression": { + "id": 48799, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -15, + "src": "1560:3:50", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 48800, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "1564:5:50", + "memberName": "value", + "nodeType": "MemberAccess", + "src": "1560:9:50", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "src": "1532:38:50", + "typeDescriptions": { + "typeIdentifier": "t_function_external_payable$_t_address_$returns$__$value", + "typeString": "function (address) payable external" + } + }, + "id": 48803, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1532:44:50", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 48804, + "nodeType": "ExpressionStatement", + "src": "1532:44:50" + } + ] + } + }, + { + "assignments": [48808], + "declarations": [ + { + "constant": false, + "id": 48808, + "mutability": "mutable", + "name": "codeSize", + "nameLocation": "1665:8:50", + "nodeType": "VariableDeclaration", + "scope": 48851, + "src": "1660:13:50", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 48807, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "1660:4:50", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 48812, + "initialValue": { + "expression": { + "expression": { + "id": 48809, + "name": "addr", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 48786, + "src": "1676:4:50", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "id": 48810, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "1681:4:50", + "memberName": "code", + "nodeType": "MemberAccess", + "src": "1676:9:50", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + "id": 48811, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "1686:6:50", + "memberName": "length", + "nodeType": "MemberAccess", + "src": "1676:16:50", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "1660:32:50" + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 48815, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 48813, + "name": "codeSize", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 48808, + "src": "1706:8:50", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "hexValue": "30", + "id": 48814, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1717:1:50", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "1706:12:50", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 48824, + "nodeType": "IfStatement", + "src": "1702:78:50", + "trueBody": { + "id": 48823, + "nodeType": "Block", + "src": "1720:60:50", + "statements": [ + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "id": 48819, + "name": "addr", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 48786, + "src": "1763:4:50", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 48818, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "1755:8:50", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_payable_$", + "typeString": "type(address payable)" + }, + "typeName": { + "id": 48817, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1755:8:50", + "stateMutability": "payable", + "typeDescriptions": {} + } + }, + "id": 48820, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1755:13:50", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + ], + "id": 48816, + "name": "SimpleAccount", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 48741, + "src": "1741:13:50", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_SimpleAccount_$48741_$", + "typeString": "type(contract SimpleAccount)" + } + }, + "id": 48821, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1741:28:50", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_contract$_SimpleAccount_$48741", + "typeString": "contract SimpleAccount" + } + }, + "functionReturnParameters": 48784, + "id": 48822, + "nodeType": "Return", + "src": "1734:35:50" + } + ] + } + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "arguments": [ + { + "arguments": [ + { + "id": 48838, + "name": "accountImplem", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 48750, + "src": "1940:13:50", + "typeDescriptions": { + "typeIdentifier": "t_contract$_SimpleAccount_$48741", + "typeString": "contract SimpleAccount" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_contract$_SimpleAccount_$48741", + "typeString": "contract SimpleAccount" + } + ], + "id": 48837, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "1932:7:50", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 48836, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1932:7:50", + "typeDescriptions": {} + } + }, + "id": 48839, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1932:22:50", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "arguments": [ + { + "expression": { + "id": 48842, + "name": "SimpleAccount", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 48741, + "src": "1995:13:50", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_SimpleAccount_$48741_$", + "typeString": "type(contract SimpleAccount)" + } + }, + "id": 48843, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "2009:10:50", + "memberName": "initialize", + "nodeType": "MemberAccess", + "referencedDeclaration": 48345, + "src": "1995:24:50", + "typeDescriptions": { + "typeIdentifier": "t_function_declaration_nonpayable$_t_array$_t_bytes32_$2_memory_ptr_$returns$__$", + "typeString": "function SimpleAccount.initialize(bytes32[2] memory)" + } + }, + { + "components": [ + { + "id": 48844, + "name": "publicKey", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 48777, + "src": "2022:9:50", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_bytes32_$2_memory_ptr", + "typeString": "bytes32[2] memory" + } + } + ], + "id": 48845, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "2021:11:50", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_bytes32_$2_memory_ptr", + "typeString": "bytes32[2] memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_function_declaration_nonpayable$_t_array$_t_bytes32_$2_memory_ptr_$returns$__$", + "typeString": "function SimpleAccount.initialize(bytes32[2] memory)" + }, + { + "typeIdentifier": "t_array$_t_bytes32_$2_memory_ptr", + "typeString": "bytes32[2] memory" + } + ], + "expression": { + "id": 48840, + "name": "abi", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -1, + "src": "1980:3:50", + "typeDescriptions": { + "typeIdentifier": "t_magic_abi", + "typeString": "abi" + } + }, + "id": 48841, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "1984:10:50", + "memberName": "encodeCall", + "nodeType": "MemberAccess", + "src": "1980:14:50", + "typeDescriptions": { + "typeIdentifier": "t_function_abiencodecall_pure$__$returns$_t_bytes_memory_ptr_$", + "typeString": "function () pure returns (bytes memory)" + } + }, + "id": 48846, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1980:53:50", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + ], + "id": 48830, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "NewExpression", + "src": "1869:16:50", + "typeDescriptions": { + "typeIdentifier": "t_function_creation_payable$_t_address_$_t_bytes_memory_ptr_$returns$_t_contract$_ERC1967Proxy_$46757_$", + "typeString": "function (address,bytes memory) payable returns (contract ERC1967Proxy)" + }, + "typeName": { + "id": 48829, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 48828, + "name": "ERC1967Proxy", + "nameLocations": ["1873:12:50"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 46757, + "src": "1873:12:50" + }, + "referencedDeclaration": 46757, + "src": "1873:12:50", + "typeDescriptions": { + "typeIdentifier": "t_contract$_ERC1967Proxy_$46757", + "typeString": "contract ERC1967Proxy" + } + } + }, + "id": 48835, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "names": ["salt"], + "nodeType": "FunctionCallOptions", + "options": [ + { + "arguments": [ + { + "id": 48833, + "name": "salt", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 48779, + "src": "1900:4:50", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 48832, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "1892:7:50", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_bytes32_$", + "typeString": "type(bytes32)" + }, + "typeName": { + "id": 48831, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "1892:7:50", + "typeDescriptions": {} + } + }, + "id": 48834, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1892:13:50", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "src": "1869:37:50", + "typeDescriptions": { + "typeIdentifier": "t_function_creation_payable$_t_address_$_t_bytes_memory_ptr_$returns$_t_contract$_ERC1967Proxy_$46757_$salt", + "typeString": "function (address,bytes memory) payable returns (contract ERC1967Proxy)" + } + }, + "id": 48847, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1869:186:50", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_contract$_ERC1967Proxy_$46757", + "typeString": "contract ERC1967Proxy" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_contract$_ERC1967Proxy_$46757", + "typeString": "contract ERC1967Proxy" + } + ], + "id": 48827, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "1840:8:50", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_payable_$", + "typeString": "type(address payable)" + }, + "typeName": { + "id": 48826, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1840:8:50", + "stateMutability": "payable", + "typeDescriptions": {} + } + }, + "id": 48848, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1840:233:50", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + ], + "id": 48825, + "name": "SimpleAccount", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 48741, + "src": "1809:13:50", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_SimpleAccount_$48741_$", + "typeString": "type(contract SimpleAccount)" + } + }, + "id": 48849, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1809:278:50", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_contract$_SimpleAccount_$48741", + "typeString": "contract SimpleAccount" + } + }, + "functionReturnParameters": 48784, + "id": 48850, + "nodeType": "Return", + "src": "1790:297:50" + } + ] + }, + "documentation": { + "id": 48773, + "nodeType": "StructuredDocumentation", + "src": "888:370:50", + "text": " Create an account, and return its address.\n Returns the address even if the account is already deployed.\n Note that during UserOperation execution, this method is called only if the account is not deployed.\n This method returns an existing account address so that entryPoint.getSenderAddress() would work even after account creation." + }, + "functionSelector": "8375702b", + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "createAccount", + "nameLocation": "1272:13:50", + "parameters": { + "id": 48780, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 48777, + "mutability": "mutable", + "name": "publicKey", + "nameLocation": "1313:9:50", + "nodeType": "VariableDeclaration", + "scope": 48852, + "src": "1295:27:50", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_bytes32_$2_memory_ptr", + "typeString": "bytes32[2]" + }, + "typeName": { + "baseType": { + "id": 48774, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "1295:7:50", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "id": 48776, + "length": { + "hexValue": "32", + "id": 48775, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1303:1:50", + "typeDescriptions": { + "typeIdentifier": "t_rational_2_by_1", + "typeString": "int_const 2" + }, + "value": "2" + }, + "nodeType": "ArrayTypeName", + "src": "1295:10:50", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_bytes32_$2_storage_ptr", + "typeString": "bytes32[2]" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 48779, + "mutability": "mutable", + "name": "salt", + "nameLocation": "1340:4:50", + "nodeType": "VariableDeclaration", + "scope": 48852, + "src": "1332:12:50", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 48778, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1332:7:50", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "1285:65:50" + }, + "returnParameters": { + "id": 48784, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 48783, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 48852, + "src": "1375:13:50", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_contract$_SimpleAccount_$48741", + "typeString": "contract SimpleAccount" + }, + "typeName": { + "id": 48782, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 48781, + "name": "SimpleAccount", + "nameLocations": ["1375:13:50"], + "nodeType": "IdentifierPath", + "referencedDeclaration": 48741, + "src": "1375:13:50" + }, + "referencedDeclaration": 48741, + "src": "1375:13:50", + "typeDescriptions": { + "typeIdentifier": "t_contract$_SimpleAccount_$48741", + "typeString": "contract SimpleAccount" + } + }, + "visibility": "internal" + } + ], + "src": "1374:15:50" + }, + "scope": 48897, + "stateMutability": "payable", + "virtual": false, + "visibility": "public" + }, + { + "id": 48896, + "nodeType": "FunctionDefinition", + "src": "2219:671:50", + "nodes": [], + "body": { + "id": 48895, + "nodeType": "Block", + "src": "2334:556:50", + "nodes": [], + "statements": [ + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "id": 48868, + "name": "salt", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 48859, + "src": "2411:4:50", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 48867, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "2403:7:50", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_bytes32_$", + "typeString": "type(bytes32)" + }, + "typeName": { + "id": 48866, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "2403:7:50", + "typeDescriptions": {} + } + }, + "id": 48869, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2403:13:50", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "arguments": [ + { + "arguments": [ + { + "expression": { + "arguments": [ + { + "id": 48874, + "name": "ERC1967Proxy", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 46757, + "src": "2512:12:50", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_ERC1967Proxy_$46757_$", + "typeString": "type(contract ERC1967Proxy)" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_type$_t_contract$_ERC1967Proxy_$46757_$", + "typeString": "type(contract ERC1967Proxy)" + } + ], + "id": 48873, + "name": "type", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -27, + "src": "2507:4:50", + "typeDescriptions": { + "typeIdentifier": "t_function_metatype_pure$__$returns$__$", + "typeString": "function () pure" + } + }, + "id": 48875, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2507:18:50", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_magic_meta_type_t_contract$_ERC1967Proxy_$46757", + "typeString": "type(contract ERC1967Proxy)" + } + }, + "id": 48876, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "2526:12:50", + "memberName": "creationCode", + "nodeType": "MemberAccess", + "src": "2507:31:50", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + { + "arguments": [ + { + "arguments": [ + { + "id": 48881, + "name": "accountImplem", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 48750, + "src": "2612:13:50", + "typeDescriptions": { + "typeIdentifier": "t_contract$_SimpleAccount_$48741", + "typeString": "contract SimpleAccount" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_contract$_SimpleAccount_$48741", + "typeString": "contract SimpleAccount" + } + ], + "id": 48880, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "2604:7:50", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 48879, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2604:7:50", + "typeDescriptions": {} + } + }, + "id": 48882, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2604:22:50", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "arguments": [ + { + "expression": { + "id": 48885, + "name": "SimpleAccount", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 48741, + "src": "2704:13:50", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_SimpleAccount_$48741_$", + "typeString": "type(contract SimpleAccount)" + } + }, + "id": 48886, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "2718:10:50", + "memberName": "initialize", + "nodeType": "MemberAccess", + "referencedDeclaration": 48345, + "src": "2704:24:50", + "typeDescriptions": { + "typeIdentifier": "t_function_declaration_nonpayable$_t_array$_t_bytes32_$2_memory_ptr_$returns$__$", + "typeString": "function SimpleAccount.initialize(bytes32[2] memory)" + } + }, + { + "components": [ + { + "id": 48887, + "name": "publicKey", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 48857, + "src": "2763:9:50", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_bytes32_$2_memory_ptr", + "typeString": "bytes32[2] memory" + } + } + ], + "id": 48888, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "2762:11:50", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_bytes32_$2_memory_ptr", + "typeString": "bytes32[2] memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_function_declaration_nonpayable$_t_array$_t_bytes32_$2_memory_ptr_$returns$__$", + "typeString": "function SimpleAccount.initialize(bytes32[2] memory)" + }, + { + "typeIdentifier": "t_array$_t_bytes32_$2_memory_ptr", + "typeString": "bytes32[2] memory" + } + ], + "expression": { + "id": 48883, + "name": "abi", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -1, + "src": "2656:3:50", + "typeDescriptions": { + "typeIdentifier": "t_magic_abi", + "typeString": "abi" + } + }, + "id": 48884, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "2660:10:50", + "memberName": "encodeCall", + "nodeType": "MemberAccess", + "src": "2656:14:50", + "typeDescriptions": { + "typeIdentifier": "t_function_abiencodecall_pure$__$returns$_t_bytes_memory_ptr_$", + "typeString": "function () pure returns (bytes memory)" + } + }, + "id": 48889, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2656:147:50", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + ], + "expression": { + "id": 48877, + "name": "abi", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -1, + "src": "2564:3:50", + "typeDescriptions": { + "typeIdentifier": "t_magic_abi", + "typeString": "abi" + } + }, + "id": 48878, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "2568:6:50", + "memberName": "encode", + "nodeType": "MemberAccess", + "src": "2564:10:50", + "typeDescriptions": { + "typeIdentifier": "t_function_abiencode_pure$__$returns$_t_bytes_memory_ptr_$", + "typeString": "function () pure returns (bytes memory)" + } + }, + "id": 48890, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2564:265:50", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + }, + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + ], + "expression": { + "id": 48871, + "name": "abi", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -1, + "src": "2465:3:50", + "typeDescriptions": { + "typeIdentifier": "t_magic_abi", + "typeString": "abi" + } + }, + "id": 48872, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "2469:12:50", + "memberName": "encodePacked", + "nodeType": "MemberAccess", + "src": "2465:16:50", + "typeDescriptions": { + "typeIdentifier": "t_function_abiencodepacked_pure$__$returns$_t_bytes_memory_ptr_$", + "typeString": "function () pure returns (bytes memory)" + } + }, + "id": 48891, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2465:386:50", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + ], + "id": 48870, + "name": "keccak256", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -8, + "src": "2434:9:50", + "typeDescriptions": { + "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$", + "typeString": "function (bytes memory) pure returns (bytes32)" + } + }, + "id": 48892, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2434:435:50", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + ], + "expression": { + "id": 48864, + "name": "Create2", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 47934, + "src": "2363:7:50", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_Create2_$47934_$", + "typeString": "type(library Create2)" + } + }, + "id": 48865, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "2371:14:50", + "memberName": "computeAddress", + "nodeType": "MemberAccess", + "referencedDeclaration": 47919, + "src": "2363:22:50", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_bytes32_$_t_bytes32_$returns$_t_address_$", + "typeString": "function (bytes32,bytes32) view returns (address)" + } + }, + "id": 48893, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2363:520:50", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "functionReturnParameters": 48863, + "id": 48894, + "nodeType": "Return", + "src": "2344:539:50" + } + ] + }, + "documentation": { + "id": 48853, + "nodeType": "StructuredDocumentation", + "src": "2100:114:50", + "text": " Calculate the counterfactual address of this account as it would be returned by createAccount()" + }, + "functionSelector": "0b824849", + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "getAddress", + "nameLocation": "2228:10:50", + "parameters": { + "id": 48860, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 48857, + "mutability": "mutable", + "name": "publicKey", + "nameLocation": "2266:9:50", + "nodeType": "VariableDeclaration", + "scope": 48896, + "src": "2248:27:50", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_bytes32_$2_memory_ptr", + "typeString": "bytes32[2]" + }, + "typeName": { + "baseType": { + "id": 48854, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "2248:7:50", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "id": 48856, + "length": { + "hexValue": "32", + "id": 48855, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "2256:1:50", + "typeDescriptions": { + "typeIdentifier": "t_rational_2_by_1", + "typeString": "int_const 2" + }, + "value": "2" + }, + "nodeType": "ArrayTypeName", + "src": "2248:10:50", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_bytes32_$2_storage_ptr", + "typeString": "bytes32[2]" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 48859, + "mutability": "mutable", + "name": "salt", + "nameLocation": "2293:4:50", + "nodeType": "VariableDeclaration", + "scope": 48896, + "src": "2285:12:50", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 48858, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2285:7:50", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "2238:65:50" + }, + "returnParameters": { + "id": 48863, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 48862, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 48896, + "src": "2325:7:50", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 48861, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2325:7:50", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "2324:9:50" + }, + "scope": 48897, + "stateMutability": "view", + "virtual": false, + "visibility": "public" + } + ], + "abstract": false, + "baseContracts": [], + "canonicalName": "SimpleAccountFactory", + "contractDependencies": [46757, 48741], + "contractKind": "contract", + "documentation": { + "id": 48747, + "nodeType": "StructuredDocumentation", + "src": "227:388:50", + "text": " A sample factory contract for SimpleAccount\n A UserOperations \"initCode\" holds the address of the factory, and a method call (to createAccount, in this sample factory).\n The factory's createAccount returns the target account address even if it is already installed.\n This way, the entryPoint.getSenderAddress() can be called either before or after the account is created." + }, + "fullyImplemented": true, + "linearizedBaseContracts": [48897], + "name": "SimpleAccountFactory", + "nameLocation": "625:20:50", + "scope": 48898, + "usedErrors": [], + "usedEvents": [] + } + ], + "license": "MIT" + }, + "id": 50 +} diff --git a/front/src/app/(home)/page.tsx b/front/src/app/(home)/page.tsx index 05f1a6c..0b1e2c1 100644 --- a/front/src/app/(home)/page.tsx +++ b/front/src/app/(home)/page.tsx @@ -1,6 +1,8 @@ import { Box, Flex } from "@radix-ui/themes"; import SessionList from "@/components/SessionList"; import WCInput from "@/components/WCInput"; +import PassKey from "@/components/PassKey"; +import { SendTransaction } from "@/components/SendTransaction"; export default async function Home() { return ( @@ -10,6 +12,8 @@ export default async function Home() {
+ + ); diff --git a/front/src/components/PassKey.tsx b/front/src/components/PassKey.tsx index 7abf364..8515dc4 100644 --- a/front/src/components/PassKey.tsx +++ b/front/src/components/PassKey.tsx @@ -32,7 +32,11 @@ export default function PassKey() { } async function onGet() { - setCredential(await webauthn.get()); + setCredential( + await webauthn.get( + `0x01000000000000${"ed8154bc00355192a1f1f3a21ec5442bd05e3bb1c0c6ab089d6e138f88125d6a"}`, + ), + ); } return ( diff --git a/front/src/components/SendTransaction.tsx b/front/src/components/SendTransaction.tsx index 8fd8f02..740e465 100644 --- a/front/src/components/SendTransaction.tsx +++ b/front/src/components/SendTransaction.tsx @@ -1,13 +1,18 @@ "use client"; -import { parseEther } from "viem"; +import { Hex, PublicClient, createPublicClient, http, parseEther } from "viem"; import { useSendTransaction, useWaitForTransaction } from "wagmi"; import { stringify } from "../utils/stringify"; +import { UserOpBuilder } from "@/libs/smart-wallet/service/userOps"; +import { baseGoerli } from "viem/chains"; +import { SmartWalletProvider } from "@/libs/smart-wallet/SmartWalletProvider"; +import { smartWallet } from "@/libs/smart-wallet"; + +const builder = new UserOpBuilder(baseGoerli); export function SendTransaction() { - const { data, error, isLoading, isError, sendTransaction } = - useSendTransaction(); + const { data, error, isLoading, isError, sendTransaction } = useSendTransaction(); const { data: receipt, isLoading: isPending, @@ -17,15 +22,18 @@ export function SendTransaction() { return ( <>
{ + onSubmit={async (e) => { e.preventDefault(); const formData = new FormData(e.target as HTMLFormElement); - const address = formData.get("address") as string; + const address = formData.get("address") as Hex; const value = formData.get("value") as `${number}`; - sendTransaction({ - to: address, - value: parseEther(value), + + const res = await smartWallet.client.sendUserOperation({ + to: address ?? "0x1878EA9134D500A3cEF3E89589ECA3656EECf48f", + value: value ?? BigInt(11), }); + + console.log("res", res); }} > diff --git a/front/src/libs/smart-wallet/config/index.tsx b/front/src/libs/smart-wallet/config/index.tsx index f4a1521..7da928d 100644 --- a/front/src/libs/smart-wallet/config/index.tsx +++ b/front/src/libs/smart-wallet/config/index.tsx @@ -1,6 +1,9 @@ import { fallback, http } from "viem"; -const alchemy = http("https://eth-mainnet.g.alchemy.com/v2/..."); -const infura = http("https://mainnet.infura.io/v3/..."); +const publicRpc = http("https://goerli.base.org"); +const localhost = http("http://localhost:8545"); +const stackUpBundlerRpcUrl = http( + `https://api.stackup.sh/v1/node/${process.env.STACKUP_BUNDLER_API_KEY}`, +); -export const transport = fallback([alchemy, infura]); +export const transport = stackUpBundlerRpcUrl; diff --git a/front/src/libs/smart-wallet/hook/useSmartWalletHook.tsx b/front/src/libs/smart-wallet/hook/useSmartWalletHook.tsx index 25b0631..9679c54 100644 --- a/front/src/libs/smart-wallet/hook/useSmartWalletHook.tsx +++ b/front/src/libs/smart-wallet/hook/useSmartWalletHook.tsx @@ -15,7 +15,7 @@ export function useSmartWalletHook() { smartWallet.client.watchEvent({ address: address, - onLogs: (logs) => { + onLogs: (logs: any) => { console.log("logs", logs); }, }); diff --git a/front/src/libs/smart-wallet/service/actions/index.ts b/front/src/libs/smart-wallet/service/actions/index.ts index a50feaf..49793fa 100644 --- a/front/src/libs/smart-wallet/service/actions/index.ts +++ b/front/src/libs/smart-wallet/service/actions/index.ts @@ -1,15 +1,88 @@ -import { Client, Hash } from "viem"; +import { UserOpBuilder } from "@/libs/smart-wallet/service/userOps"; +import { P256Credential, WebAuthn } from "@/libs/webauthn"; +import { + Chain, + Client, + Hash, + Hex, + RpcTransactionRequest, + encodeAbiParameters, + encodePacked, +} from "viem"; /* */ export type SendUserOperationReturnType = Hash; export async function sendUserOperation( client: Client, - args: any + args: { to: Hex; value: bigint }, ): Promise { + const builder = new UserOpBuilder(client.chain as Chain); + + const { userOp, msgToSign } = await builder.buildUserOp({ + to: args.to, + value: args.value, + }); + + const credentials: P256Credential = (await new WebAuthn().get(msgToSign)) as P256Credential; + + const signatureUserOp = encodePacked( + ["uint8", "uint48", "bytes"], + [ + 1, + 0, + encodeAbiParameters( + [ + { + type: "tuple", + name: "credentials", + components: [ + { + name: "authenticatorData", + type: "bytes", + }, + { + name: "clientDataJSON", + type: "string", + }, + { + name: "challengeLocation", + type: "uint256", + }, + { + name: "responseTypeLocation", + type: "uint256", + }, + { + name: "r", + type: "bytes32", + }, + { + name: "s", + type: "bytes32", + }, + ], + }, + ], + [ + { + authenticatorData: credentials.authenticatorData, + clientDataJSON: JSON.stringify(credentials.clientData), + challengeLocation: BigInt(23), + responseTypeLocation: BigInt(1), + r: credentials.signature.r, + s: credentials.signature.s, + }, + ], + ), + ], + ); + + const userOpAsParams = builder.toParams({ ...userOp, signature: signatureUserOp }); + return await client.request({ method: "eth_sendUserOperation" as any, - params: args, + params: [userOpAsParams, builder.entryPoint], }); } @@ -18,7 +91,7 @@ export type EstimateUserOperationGasReturnType = bigint; export async function estimateUserOperationGas( client: Client, - args: any + args: any, ): Promise { return await client.request({ method: "eth_estimateUserOperationGas" as any, @@ -29,10 +102,7 @@ export async function estimateUserOperationGas( /* */ export type GetUserOperationReceiptReturnType = Hash; -export async function getUserOperationReceipt( - client: Client, - args: any -): Promise { +export async function getUserOperationReceipt(client: Client, args: any): Promise { return await client.request({ method: "eth_getUserOperationReceipt" as any, params: args, @@ -44,7 +114,7 @@ export type GetIsValidSignatureReturnType = boolean; export async function getIsValidSignature( client: Client, - args: any + args: any, ): Promise { return await client.request({ method: "eth_call" as any, diff --git a/front/src/libs/smart-wallet/service/smart-wallet.ts b/front/src/libs/smart-wallet/service/smart-wallet.ts index dec38fc..a34f4bd 100644 --- a/front/src/libs/smart-wallet/service/smart-wallet.ts +++ b/front/src/libs/smart-wallet/service/smart-wallet.ts @@ -1,12 +1,5 @@ -import { - createClient, - Client, - fallback, - Chain, - Transport, - createPublicClient, -} from "viem"; -import { mainnet } from "viem/chains"; +import { createClient, Client, fallback, Chain, Transport, createPublicClient } from "viem"; +import { baseGoerli } from "viem/chains"; import { SmartWalletActions, smartWalletActions } from "./decorators"; import { Prettify } from "viem/_types/types/utils"; import { transport } from "../config"; @@ -14,7 +7,7 @@ import { PublicClient } from "wagmi"; type SmartWalletClient< transport extends Transport = Transport, - chain extends Chain | undefined = Chain | undefined + chain extends Chain | undefined = Chain | undefined, > = Client & PublicClient; class SmartWallet { @@ -24,7 +17,7 @@ class SmartWallet { constructor() { this._client = createPublicClient({ - chain: mainnet, + chain: baseGoerli, transport, }).extend(smartWalletActions); } @@ -47,12 +40,12 @@ class SmartWallet { public get client() { console.warn( - "smartWallet: isInit() is not called. Only use this getter if you want to access wagmi publicClient method." + "smartWallet: isInit() is not called. Only use this getter if you want to access wagmi publicClient method.", ); return this._client; } - public async sendUserOperation(args: any) { + public async sendUserOperation(args: any): Promise<`0x${string}`> { this._isInit(); return await this._client.sendUserOperation({ from: this._address, @@ -60,7 +53,7 @@ class SmartWallet { }); } - public async estimateUserOperationGas(args: any) { + public async estimateUserOperationGas(args: any): Promise { this._isInit(); return await this._client.estimateUserOperationGas({ from: this._address, @@ -68,7 +61,7 @@ class SmartWallet { }); } - public async getUserOperationReceipt(args: any) { + public async getUserOperationReceipt(args: any): Promise<`0x${string}`> { this._isInit(); return await this._client.getUserOperationReceipt({ from: this._address, @@ -76,7 +69,7 @@ class SmartWallet { }); } - public async getIsValidSignature(args: any) { + public async getIsValidSignature(args: any): Promise { this._isInit(); return await this._client.getIsValidSignature({ from: this._address, diff --git a/front/src/libs/smart-wallet/service/userOps/builder.ts b/front/src/libs/smart-wallet/service/userOps/builder.ts new file mode 100644 index 0000000..af9887a --- /dev/null +++ b/front/src/libs/smart-wallet/service/userOps/builder.ts @@ -0,0 +1,294 @@ +import { SendUserOperationParams, UserOperation } from "@/libs/smart-wallet/service/userOps/types"; +import { + Chain, + GetContractReturnType, + Hex, + PublicClient, + WalletClient, + createPublicClient, + createWalletClient, + encodeAbiParameters, + encodeFunctionData, + encodePacked, + getContract, + http, + keccak256, + parseAbi, + toHex, +} from "viem"; +import factoryJSON from "@/abis/factory.json"; +import { + DEFAULT_USER_OP, + DEFAULT_VERIFICATION_GAS_LIMIT, + ZERO_ADDRESS, +} from "@/libs/smart-wallet/service/userOps/constants"; +import { Utils } from "userop"; + +const factoryAbi = [...factoryJSON.abi] as const; + +export class UserOpBuilder { + public account: Hex = "0x061060a65146b3265C62fC8f3AE977c9B27260fF"; + public entryPoint: Hex = "0x5ff137d4b0fdcd49dca30c7cf57e578a026d2789"; + public chain: Chain; + public publicClient: PublicClient; + public factoryContract: GetContractReturnType; + + constructor(chain: Chain) { + this.chain = chain; + this.publicClient = createPublicClient({ + chain, + transport: http(), + }); + + const walletClient = createWalletClient({ + account: this.account, + chain, + transport: http(), + }); + + this.factoryContract = getContract({ + address: "0xCD7DA03e26Fa4b7BcB43B4e5Ed65bE5cC9d844B0", // only on Base Goerli + abi: factoryAbi, + walletClient, + publicClient: this.publicClient, + }); + } + + // reference: https://ethereum.stackexchange.com/questions/150796/how-to-create-a-raw-erc-4337-useroperation-from-scratch-and-then-send-it-to-bund + async buildUserOp({ + to, + value, + }: { + to: Hex; + value: bigint; + }): Promise<{ userOp: UserOperation; msgToSign: Hex }> { + // calculate smart wallet address via Factory contract + const sender = await this._calculateSmartWalletAddress(); + + // get bytecode + const bytecode = await this.publicClient.getBytecode({ + address: sender, + }); + + let initCode = toHex(new Uint8Array(0)); + let initCodeGas = BigInt(0); + if (bytecode === undefined) { + // smart wallet does NOT already exists + // calculate initCode and initCodeGas + ({ initCode, initCodeGas } = await this._createInitCode()); + } + + // calculate nonce + const nonce = await this._getNonce(sender); + + // create user operation + const userOp: UserOperation = { + ...DEFAULT_USER_OP, + sender, + nonce, + initCode, + callData: encodeFunctionData({ + abi: [ + { + inputs: [ + { + components: [ + { + internalType: "address", + name: "dest", + type: "address", + }, + { + internalType: "uint256", + name: "value", + type: "uint256", + }, + { + internalType: "bytes", + name: "data", + type: "bytes", + }, + ], + internalType: "struct Call[]", + name: "calls", + type: "tuple[]", + }, + ], + name: "executeBatch", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + ], + functionName: "executeBatch", + args: [[{ dest: to, value, data: toHex(new Uint8Array(0)) }]], + }), + // hardcoded logic for now + // TODO: calculate gas limits dynamically + verificationGasLimit: DEFAULT_VERIFICATION_GAS_LIMIT + BigInt(150_000) + BigInt(initCodeGas), + }; + + // get userOp hash (with signature == 0x) by calling the entry point contract + const userOpHash = await this._getUserOpHash(userOp); + + // version = 1 and validUntil = 0 in msgToSign are hardcoded + const msgToSign = encodePacked(["uint8", "uint48", "bytes32"], [1, 0, userOpHash]); + return { userOp, msgToSign }; + } + + public toParams(op: UserOperation): SendUserOperationParams { + return { + sender: op.sender, + nonce: toHex(op.nonce), + initCode: op.initCode, + callData: op.callData, + callGasLimit: toHex(op.callGasLimit), + verificationGasLimit: toHex(op.verificationGasLimit), + preVerificationGas: toHex(op.preVerificationGas), + maxFeePerGas: toHex(op.maxFeePerGas), + maxPriorityFeePerGas: toHex(op.maxPriorityFeePerGas), + paymasterAndData: op.paymasterAndData === ZERO_ADDRESS ? "0x" : op.paymasterAndData, + signature: op.signature, + }; + } + + private async _createInitCode(): Promise<{ initCode: Hex; initCodeGas: bigint }> { + let createAccountTx = encodeFunctionData({ + abi: factoryAbi, + functionName: "createAccount", + args: [ + [ + "0x764e45a20b5b8b5c2e4043dfd5f21751c0f6c22c5547fdee58196792f3862379", + "0xeec85d606a0959f94db54d39eccf796624ada04cb5ecb0f2bda8c5cc0aaaf241", + ], + 123, + ], + }); + + let initCode = encodePacked( + ["address", "bytes"], // types + [this.factoryContract.address, createAccountTx], // values + ); + + let initCodeGas = await this.publicClient.estimateGas({ + account: this.account, + to: this.factoryContract.address, + data: createAccountTx, + }); + + return { + initCode, + initCodeGas, + }; + } + + private async _calculateSmartWalletAddress(): Promise { + const result: Hex = (await this.factoryContract.read.getAddress([ + [ + "0x764e45a20b5b8b5c2e4043dfd5f21751c0f6c22c5547fdee58196792f3862379", + "0xeec85d606a0959f94db54d39eccf796624ada04cb5ecb0f2bda8c5cc0aaaf241", + ], + 123, + ])) as Hex; + + return result; + } + + private async _getNonce(smartWalletAddress: Hex): Promise { + const nonce: bigint = await this.publicClient.readContract({ + address: this.entryPoint, + abi: parseAbi(["function getNonce(address, uint192) view returns (uint256)"]), + functionName: "getNonce", + args: [smartWalletAddress, BigInt(0)], + }); + return nonce; + } + + private async _getUserOpHash(userOp: UserOperation): Promise { + const entryPointContract = getContract({ + address: this.entryPoint, + abi: [ + { + inputs: [ + { + components: [ + { + internalType: "address", + name: "sender", + type: "address", + }, + { + internalType: "uint256", + name: "nonce", + type: "uint256", + }, + { + internalType: "bytes", + name: "initCode", + type: "bytes", + }, + { + internalType: "bytes", + name: "callData", + type: "bytes", + }, + { + internalType: "uint256", + name: "callGasLimit", + type: "uint256", + }, + { + internalType: "uint256", + name: "verificationGasLimit", + type: "uint256", + }, + { + internalType: "uint256", + name: "preVerificationGas", + type: "uint256", + }, + { + internalType: "uint256", + name: "maxFeePerGas", + type: "uint256", + }, + { + internalType: "uint256", + name: "maxPriorityFeePerGas", + type: "uint256", + }, + { + internalType: "bytes", + name: "paymasterAndData", + type: "bytes", + }, + { + internalType: "bytes", + name: "signature", + type: "bytes", + }, + ], + internalType: "struct UserOperation", + name: "userOp", + type: "tuple", + }, + ], + name: "getUserOpHash", + outputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + stateMutability: "view", + type: "function", + }, + ], + publicClient: this.publicClient, + }); + + const userOpHash = entryPointContract.read.getUserOpHash([userOp]); + return userOpHash; + } +} diff --git a/front/src/libs/smart-wallet/service/userOps/constants.ts b/front/src/libs/smart-wallet/service/userOps/constants.ts new file mode 100644 index 0000000..78de758 --- /dev/null +++ b/front/src/libs/smart-wallet/service/userOps/constants.ts @@ -0,0 +1,22 @@ +import { UserOperation } from "@/libs/smart-wallet/service/userOps/types"; +import { toHex } from "viem"; + +export const DEFAULT_CALL_GAS_LIMIT = BigInt(200_000); +export const DEFAULT_VERIFICATION_GAS_LIMIT = BigInt(2_000_000); +export const DEFAULT_PRE_VERIFICATION_GAS = BigInt(65_000); + +export const ZERO_ADDRESS = toHex(new Uint8Array(20)); // 0x00 * 20 + +export const DEFAULT_USER_OP: UserOperation = { + sender: ZERO_ADDRESS, + nonce: BigInt(0), + initCode: toHex(new Uint8Array(0)), + callData: toHex(new Uint8Array(0)), + callGasLimit: DEFAULT_CALL_GAS_LIMIT, + verificationGasLimit: DEFAULT_VERIFICATION_GAS_LIMIT, + preVerificationGas: DEFAULT_PRE_VERIFICATION_GAS, + maxFeePerGas: BigInt(3_000_000_000), + maxPriorityFeePerGas: BigInt(1_000_000_000), + paymasterAndData: toHex(new Uint8Array(0)), + signature: toHex(new Uint8Array(0)), +}; diff --git a/front/src/libs/smart-wallet/service/userOps/index.ts b/front/src/libs/smart-wallet/service/userOps/index.ts new file mode 100644 index 0000000..04f86d0 --- /dev/null +++ b/front/src/libs/smart-wallet/service/userOps/index.ts @@ -0,0 +1,3 @@ +export * from "./builder"; +export * from "./types"; +export * from "./constants"; diff --git a/front/src/libs/smart-wallet/service/userOps/types.ts b/front/src/libs/smart-wallet/service/userOps/types.ts new file mode 100644 index 0000000..ab2e33a --- /dev/null +++ b/front/src/libs/smart-wallet/service/userOps/types.ts @@ -0,0 +1,29 @@ +import { Hex } from "viem"; + +export type UserOperation = { + sender: Hex; + nonce: bigint; + initCode: Hex; + callData: Hex; + callGasLimit: bigint; + verificationGasLimit: bigint; + preVerificationGas: bigint; + maxFeePerGas: bigint; + maxPriorityFeePerGas: bigint; + paymasterAndData: Hex; + signature: Hex; +}; + +export type SendUserOperationParams = { + sender: Hex; + nonce: Hex; + initCode: Hex; + callData: Hex; + callGasLimit: Hex; + verificationGasLimit: Hex; + preVerificationGas: Hex; + maxFeePerGas: Hex; + maxPriorityFeePerGas: Hex; + paymasterAndData: Hex; + signature: Hex; +}; diff --git a/front/src/libs/webauthn/index.ts b/front/src/libs/webauthn/index.ts index b86bf52..8e19d14 100644 --- a/front/src/libs/webauthn/index.ts +++ b/front/src/libs/webauthn/index.ts @@ -70,13 +70,10 @@ export class WebAuthn { }; } - async get(): Promise { + async get(challenge: Hex): Promise { const options: PublicKeyCredentialRequestOptions = { timeout: 60000, - challenge: Buffer.from( - "010000000000007b3ae99bbc71fbac65fa6e95aeb48fc586d2a46d0381ff9b1110b2a0fa1ca0a4", - "hex", - ), + challenge: Buffer.from(challenge.slice(2), "hex"), rpId: "localhost", userVerification: "required", mediation: "conditional", @@ -108,7 +105,12 @@ export class WebAuthn { return { rawId: toHex(new Uint8Array(cred.rawId)), - clientData: clientDataObj, + clientData: { + type: clientDataObj.type, + challenge: clientDataObj.challenge, + origin: clientDataObj.origin, + crossOrigin: clientDataObj.crossOrigin, + }, authenticatorData, signature, };