diff --git a/Deploy.toml b/Deploy.toml index 3299399..4352cb3 100644 --- a/Deploy.toml +++ b/Deploy.toml @@ -6,11 +6,13 @@ rpcs = [ # "https://opt-mainnet.g.alchemy.com/v2/${ALCHEMY_API_KEY}", # "https://opt-sepolia.g.alchemy.com/v2/${ALCHEMY_API_KEY}", # "https://base-mainnet.g.alchemy.com/v2/${ALCHEMY_API_KEY}", -"https://base-sepolia.g.alchemy.com/v2/${ALCHEMY_API_KEY}", -# "https://arb-mainnet.g.alchemy.com/v2/${ALCHEMY_API_KEY}", +# "https://base-sepolia.g.alchemy.com/v2/${ALCHEMY_API_KEY}", +"https://arb-mainnet.g.alchemy.com/v2/${ALCHEMY_API_KEY}", # "https://arb-sepolia.g.alchemy.com/v2/${ALCHEMY_API_KEY}", # "https://polygon-mainnet.g.alchemy.com/v2/${ALCHEMY_API_KEY}", # "https://polygon-amoy.g.alchemy.com/v2/${ALCHEMY_API_KEY}", +# "https://zksync-mainnet.g.alchemy.com/v2/${ALCHEMY_API_KEY}", +# "https://zksync-sepolia.g.alchemy.com/v2/${ALCHEMY_API_KEY}", # "https://gnosis-mainnet.g.alchemy.com/v2/${ALCHEMY_API_KEY}", # "https://bnb-mainnet.g.alchemy.com/v2/${ALCHEMY_API_KEY}", # "https://bnb-testnet.g.alchemy.com/v2/${ALCHEMY_API_KEY}", @@ -20,6 +22,8 @@ rpcs = [ # "https://scroll-sepolia.g.alchemy.com/v2/${ALCHEMY_API_KEY}", # "https://sonic-mainnet.g.alchemy.com/v2/${ALCHEMY_API_KEY}", # "https://sonic-blaze.g.alchemy.com/v2/${ALCHEMY_API_KEY}", +# "https://soneium-mainnet.g.alchemy.com/v2/${ALCHEMY_API_KEY}", +# "https://soneium-minato.g.alchemy.com/v2/${ALCHEMY_API_KEY}", # "https://rpc.fuse.io", # "https://rpc.fusespark.io", # "https://odyssey.ithaca.xyz", @@ -41,8 +45,6 @@ rpcs = [ # "https://network.ambrosus-test.io", # "https://json-rpc.evm.iotaledger.net", # "https://json-rpc.evm.testnet.iotaledger.net", -# "https://rpc.soneium.org", -# "https://rpc.minato.soneium.org", # "https://carrot.megaeth.com/rpc", # "https://rpc.mantle.xyz", # "https://rpc.testnet.mantle.xyz", @@ -55,9 +57,9 @@ rpcs = [ # "https://zora-sepolia.g.alchemy.com/v2/${ALCHEMY_API_KEY}" ] -[deployments.verifier] +# [deployments.verifier] # required to enable verification -api_key = "${ETHERSCAN_API_KEY}" # Etherscan API key for verification +# api_key = "${ETHERSCAN_API_KEY}" # Etherscan API key for verification [deployments.dependencies] @@ -69,7 +71,7 @@ salt = "0x00000000000000000000000000000000000000005ceb75763e25a20124b7c69e" [deployments.singleton.OwnableValidator] file = "./artifacts/OwnableValidator/OwnableValidator.json" source_file="./artifacts/OwnableValidator/verify.json" -salt = "0x00000000000000000000000000000000000000009a4cc33019d42602e5f482c4" +salt = "0x00000000000000000000000000000000000000005cff70848341170223ea60eb" # [deployments.singleton.SocialRecovery] # file = "./artifacts/SocialRecovery/SocialRecovery.json" diff --git a/artifacts/OwnableValidator/OwnableValidator.json b/artifacts/OwnableValidator/OwnableValidator.json index afaef6c..b6e1a24 100644 --- a/artifacts/OwnableValidator/OwnableValidator.json +++ b/artifacts/OwnableValidator/OwnableValidator.json @@ -1 +1 @@ -{"abi":[{"type":"function","name":"addOwner","inputs":[{"name":"owner","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"getOwners","inputs":[{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"ownersArray","type":"address[]","internalType":"address[]"}],"stateMutability":"view"},{"type":"function","name":"isInitialized","inputs":[{"name":"smartAccount","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"isModuleType","inputs":[{"name":"typeID","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"pure"},{"type":"function","name":"isValidSignatureWithSender","inputs":[{"name":"","type":"address","internalType":"address"},{"name":"hash","type":"bytes32","internalType":"bytes32"},{"name":"data","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"bytes4","internalType":"bytes4"}],"stateMutability":"view"},{"type":"function","name":"name","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"pure"},{"type":"function","name":"onInstall","inputs":[{"name":"data","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"onUninstall","inputs":[{"name":"","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"ownerCount","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"removeOwner","inputs":[{"name":"prevOwner","type":"address","internalType":"address"},{"name":"owner","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setThreshold","inputs":[{"name":"_threshold","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"threshold","inputs":[{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"validateSignatureWithData","inputs":[{"name":"hash","type":"bytes32","internalType":"bytes32"},{"name":"signature","type":"bytes","internalType":"bytes"},{"name":"data","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"validateUserOp","inputs":[{"name":"userOp","type":"tuple","internalType":"struct PackedUserOperation","components":[{"name":"sender","type":"address","internalType":"address"},{"name":"nonce","type":"uint256","internalType":"uint256"},{"name":"initCode","type":"bytes","internalType":"bytes"},{"name":"callData","type":"bytes","internalType":"bytes"},{"name":"accountGasLimits","type":"bytes32","internalType":"bytes32"},{"name":"preVerificationGas","type":"uint256","internalType":"uint256"},{"name":"gasFees","type":"bytes32","internalType":"bytes32"},{"name":"paymasterAndData","type":"bytes","internalType":"bytes"},{"name":"signature","type":"bytes","internalType":"bytes"}]},{"name":"userOpHash","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"uint256","internalType":"ERC7579ValidatorBase.ValidationData"}],"stateMutability":"view"},{"type":"function","name":"version","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"pure"},{"type":"event","name":"ModuleInitialized","inputs":[{"name":"account","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"ModuleUninitialized","inputs":[{"name":"account","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"OwnerAdded","inputs":[{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"owner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"OwnerRemoved","inputs":[{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"owner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"ThresholdSet","inputs":[{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"threshold","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"error","name":"CannotRemoveOwner","inputs":[]},{"type":"error","name":"InvalidOwner","inputs":[{"name":"owner","type":"address","internalType":"address"}]},{"type":"error","name":"InvalidSignature","inputs":[]},{"type":"error","name":"InvalidThreshold","inputs":[]},{"type":"error","name":"LinkedList_AlreadyInitialized","inputs":[]},{"type":"error","name":"LinkedList_EntryAlreadyInList","inputs":[{"name":"entry","type":"address","internalType":"address"}]},{"type":"error","name":"LinkedList_InvalidEntry","inputs":[{"name":"entry","type":"address","internalType":"address"}]},{"type":"error","name":"LinkedList_InvalidPage","inputs":[]},{"type":"error","name":"MaxOwnersReached","inputs":[]},{"type":"error","name":"ModuleAlreadyInitialized","inputs":[{"name":"smartAccount","type":"address","internalType":"address"}]},{"type":"error","name":"NotInitialized","inputs":[{"name":"smartAccount","type":"address","internalType":"address"}]},{"type":"error","name":"NotSortedAndUnique","inputs":[]},{"type":"error","name":"ThresholdNotSet","inputs":[]}],"bytecode":{"object":"0x6080604052348015600e575f5ffd5b506131a68061001c5f395ff3fe608060405234801561000f575f5ffd5b50600436106100f3575f3560e01c80639700320311610095578063ecd0596111610064578063ecd0596114610293578063f551e2ee146102c3578063fbe5ce0a146102f3578063fd8b84b11461030f576100f3565b806397003203146101d3578063c86ec2bf14610203578063ccfdec8c14610233578063d60b347f14610263576100f3565b80637065cb48116100d15780637065cb481461014f5780638a91b0e31461016b578063940d384014610187578063960bfe04146101b7576100f3565b806306fdde03146100f757806354fd4d50146101155780636d61fe7014610133575b5f5ffd5b6100ff61033f565b60405161010c9190612712565b60405180910390f35b61011d61037c565b60405161012a9190612712565b60405180910390f35b61014d600480360381019061014891906127a4565b6103b9565b005b61016960048036038101906101649190612849565b6106bf565b005b610185600480360381019061018091906127a4565b6108b9565b005b6101a1600480360381019061019c91906128a7565b610a57565b6040516101ae9190612952565b60405180910390f35b6101d160048036038101906101cc919061299e565b610b8f565b005b6101ed60048036038101906101e891906129ec565b610d21565b6040516101fa9190612a7f565b60405180910390f35b61021d60048036038101906102189190612849565b610d6c565b60405161022a9190612aa7565b60405180910390f35b61024d60048036038101906102489190612849565b610d81565b60405161025a9190612aa7565b60405180910390f35b61027d60048036038101906102789190612849565b610d96565b60405161028a9190612952565b60405180910390f35b6102ad60048036038101906102a8919061299e565b610ddf565b6040516102ba9190612952565b60405180910390f35b6102dd60048036038101906102d89190612ac0565b610df6565b6040516102ea9190612b6b565b60405180910390f35b61030d60048036038101906103089190612b84565b610e30565b005b61032960048036038101906103249190612849565b610faf565b6040516103369190612c79565b60405180910390f35b60606040518060400160405280601081526020017f4f776e61626c6556616c696461746f7200000000000000000000000000000000815250905090565b60606040518060400160405280600581526020017f312e302e30000000000000000000000000000000000000000000000000000000815250905090565b5f5f83838101906103ca9190612dd1565b915091506103d781610fd4565b61040d576040517fe719027300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8203610446576040517f34b46f4800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8151905082811015610485576040517faabd5a0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f3390508360015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055506020821115610506576040517f2414149d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160025f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555061055b815f610fed90919063ffffffff16565b5f5f90505b82811015610673575f84828151811061057c5761057b612e2b565b5b602002602001015190505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036105f657806040517fb20f76e30000000000000000000000000000000000000000000000000000000081526004016105ed9190612e67565b60405180910390fd5b61060b83825f6110eb9092919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc82bdbbf677a2462f2a7e22e4ba9abd209496b69cd7b868b3b1d28f76e09a40a60405160405180910390a3508080600101915050610560565b508073ffffffffffffffffffffffffffffffffffffffff167f27b541a16df0902e262f34789782092ab25125513b8ed73608e802951771b92860405160405180910390a2505050505050565b5f3390506106cc81610d96565b61070d57806040517ff91bd6f10000000000000000000000000000000000000000000000000000000081526004016107049190612e67565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361077d57816040517fb20f76e30000000000000000000000000000000000000000000000000000000081526004016107749190612e67565b60405180910390fd5b602060025f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054106107f4576040517f2414149d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f81548092919061084190612ead565b919050555061085b81835f6110eb9092919063ffffffff16565b8173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167fc82bdbbf677a2462f2a7e22e4ba9abd209496b69cd7b868b3b1d28f76e09a40a60405160405180910390a35050565b5f33905060606108d882600160205f6114a8909392919063ffffffff16565b50809150505f5f90505b8151811015610989575f8282815181106108ff576108fe612e2b565b5b60200260200101519050610921846001835f611843909392919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fe594d081b4382713733fe631966432c9cea5199afb2db5c3c1931f9f9300367960405160405180910390a35080806001019150506108e2565b505f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505f60025f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff167f9d00629762554452d03c3b45626436df6ca1c3795d05d04df882f6db481b1be060405160405180910390a250505050565b5f5f5f8484810190610a699190612dd1565b91509150610a7681610fd4565b610a84575f92505050610b86565b5f8203610a95575f92505050610b86565b5f610aec610aa28a611bff565b89898080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f8201169050808301925050505050505085611c2f565b9050610af781611e31565b610b0081611e45565b5f5f825190505f5f90505b81811015610b67575f610b41858381518110610b2a57610b29612e2b565b5b602002602001015187611e5990919063ffffffff16565b5090508015610b59578380610b5590612ead565b9450505b508080600101915050610b0b565b50848210610b7d57600195505050505050610b86565b5f955050505050505b95945050505050565b5f339050610b9c81610d96565b610bdd57806040517ff91bd6f1000000000000000000000000000000000000000000000000000000008152600401610bd49190612e67565b60405180910390fd5b5f8203610c16576040517faabd5a0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160025f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541015610c8d576040517faabd5a0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508073ffffffffffffffffffffffffffffffffffffffff167ff7e18aa0532694077d6fc7df02e85d86b91ba964f958d1949d45c5776d36eb6e83604051610d159190612aa7565b60405180910390a25050565b5f5f610d4f845f016020810190610d389190612849565b8486806101000190610d4a9190612f00565b611e93565b90508015610d60575f915050610d66565b60019150505b92915050565b6001602052805f5260405f205f915090505481565b6002602052805f5260405f205f915090505481565b5f5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205414159050919050565b5f6001821480610def5750600782145b9050919050565b5f5f610e0433868686611e93565b90508015610e1c57631626ba7e60e01b915050610e28565b63ffffffff60e01b9150505b949350505050565b5f33905060015f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205460025f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205403610ee7576040517f1e6d14ea00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610efe8184845f611843909392919063ffffffff16565b60025f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f815480929190610f4b90612f62565b91905055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167fe594d081b4382713733fe631966432c9cea5199afb2db5c3c1931f9f9300367960405160405180910390a3505050565b6060610fca82600160205f6114a8909392919063ffffffff16565b5080915050919050565b5f610fe6610fe183611fd8565b611fe2565b9050919050565b610ff7828261202f565b1561102e576040517f53c85e6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001825f015f600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614806111515750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b1561119357806040517f7c84ecfb00000000000000000000000000000000000000000000000000000000815260040161118a9190612e67565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff16835f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461129b57806040517f40d3d1a40000000000000000000000000000000000000000000000000000000081526004016112929190612e67565b60405180910390fd5b825f015f600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16835f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080835f015f600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050565b60605f600173ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141580156114f057506114ee868686612101565b155b1561153257836040517f7c84ecfb0000000000000000000000000000000000000000000000000000000081526004016115299190612e67565b60405180910390fd5b5f830361156b576040517ff725081700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8267ffffffffffffffff81111561158557611584612c99565b5b6040519080825280602002602001820160405280156115b35781602001602082028036833780820191505090505b5091505f5f9050865f015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156116bf5750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b80156116ca57508381105b156117cb57818382815181106116e3576116e2612e2b565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050865f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915080806117c390612ead565b915050611656565b600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415801561180757505f81115b15611836578260018261181a9190612f89565b8151811061182b5761182a612e2b565b5b602002602001015191505b8083525094509492505050565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614806118a95750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b156118eb57816040517f7c84ecfb0000000000000000000000000000000000000000000000000000000081526004016118e29190612e67565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16845f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146119f357806040517f7c84ecfb0000000000000000000000000000000000000000000000000000000081526004016119ea9190612e67565b60405180910390fd5b835f015f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16845f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f845f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050565b5f816020527b19457468657265756d205369676e6564204d6573736167653a0a33325f52603c6004209050919050565b60605f835190505f604182611c449190612fe9565b90508067ffffffffffffffff811115611c6057611c5f612c99565b5b604051908082528060200260200182016040528015611c8e5781602001602082028036833780820191505090505b50925083811015611ccb576040517f8baa579f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f5b82811015611dec575f5f5f5f611ce48b8661220c565b9250925092505f8360ff1603611d0857611d018c8c84848c612238565b9350611d4b565b601e8360ff161115611d3b57611d34611d208d611bff565b600485611d2d9190613025565b8484612357565b9350611d4a565b611d478c848484612357565b93505b5b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614611d8d578580611d8990612ead565b9650505b83898681518110611da157611da0612e2b565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050505050508080600101915050611cce565b5084811015611e27576040517f8baa579f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050509392505050565b611e42611e3d82611fd8565b612391565b50565b611e56611e5182611fd8565b6125db565b50565b5f5f611e84611e6785611fd8565b8473ffffffffffffffffffffffffffffffffffffffff165f61262f565b80925081935050509250929050565b5f5f60015f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490505f8103611ee5575f915050611fd0565b5f611f3c611ef287611bff565b86868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f8201169050808301925050505050505084611c2f565b9050611f4781611e31565b611f5081611e45565b5f5f825190505f5f90505b81811015611fb357611f928a858381518110611f7a57611f79612e2b565b5b60200260200101515f6121019092919063ffffffff16565b15611fa6578280611fa290612ead565b9350505b8080600101915050611f5b565b50838210611fc8576001945050505050611fd0565b5f9450505050505b949350505050565b6060819050919050565b5f60019050600282511061202a57815160051b82016020830192505b60011561202857825160208401935083518110925081841883026120225750612028565b50611ffe565b505b919050565b5f5f73ffffffffffffffffffffffffffffffffffffffff16835f015f600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415905092915050565b5f8173ffffffffffffffffffffffffffffffffffffffff16600173ffffffffffffffffffffffffffffffffffffffff161415801561220357505f73ffffffffffffffffffffffffffffffffffffffff16845f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b90509392505050565b5f5f5f83604102602081018601519250604081018601519150606081018601515f1a9350509250925092565b5f835f1c90505f602084870101519050826020855f1c836122599190613059565b6122639190613059565b1115612272575f91505061234e565b60606020858801019050631626ba7e60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168373ffffffffffffffffffffffffffffffffffffffff16631626ba7e8a846040518363ffffffff1660e01b81526004016122de9291906130ed565b602060405180830381865afa1580156122f9573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061231d9190613145565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161461234b575f9250505061234e565b50505b95945050505050565b5f604051855f5260ff851660205283604052826060526020604060805f60015afa505f6060523d6060185191508060405250949350505050565b61252b565b5f5f8290508391509250929050565b805182518252808352505050565b61018082840311612438576020820180518351106123d6576123d583826123a5565b5b5b60011561242f5760208101905083811161242f57805182820180518281116124015750505061242a565b5b60011561242057806020830152848201915081519050828111612402575b8260208301525050505b6123d7565b50505050612529565b81601f1683830160061c60051b01825181518082106124605761245b8183612396565b915091505b855180821061248e576124738183612396565b9150915081831061248d576124888284612396565b925092505b5b8087528184528286525050508051849150835b6001156124f6575b6001156124bf57806020019050805182116124a9575b825b6001156124d6578085019050805183106124c1575b8093508382106124e657506124f6565b6124f084836123a5565b506124a1565b5050836020820114612511576125108460208301846123b3565b5b828114612524576125238184846123b3565b5b505050505b565b8051600281106125d757601f19602083018260051b8401805b80518185015111612559578084019050612544565b82811161256957505050506125d7565b8190505b8051818501511061258257808401905061256d565b8281116125c1575b6001156125b85782518251845280835282850192506020840193508284106125b257506125b8565b5061258a565b505050506125d7565b5f86526125cf8284866123b3565b848652505050505b5050565b600281511061262c576020810160408201600183510160051b83015b60011561262057815183511461261257602083019250815183525b6020820191508082036125f7575b83830360051c84525050505b50565b5f5f5f19600186515f87870197505b6001156126805781830160011c94508460051b89015187019050878114828411176126805780881161267457838501915061267b565b6001850192505b61263e565b8781149550841515905080848601029450808616955050505050935093915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f6126e4826126a2565b6126ee81856126ac565b93506126fe8185602086016126bc565b612707816126ca565b840191505092915050565b5f6020820190508181035f83015261272a81846126da565b905092915050565b5f604051905090565b5f5ffd5b5f5ffd5b5f5ffd5b5f5ffd5b5f5ffd5b5f5f83601f84011261276457612763612743565b5b8235905067ffffffffffffffff81111561278157612780612747565b5b60208301915083600182028301111561279d5761279c61274b565b5b9250929050565b5f5f602083850312156127ba576127b961273b565b5b5f83013567ffffffffffffffff8111156127d7576127d661273f565b5b6127e38582860161274f565b92509250509250929050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f612818826127ef565b9050919050565b6128288161280e565b8114612832575f5ffd5b50565b5f813590506128438161281f565b92915050565b5f6020828403121561285e5761285d61273b565b5b5f61286b84828501612835565b91505092915050565b5f819050919050565b61288681612874565b8114612890575f5ffd5b50565b5f813590506128a18161287d565b92915050565b5f5f5f5f5f606086880312156128c0576128bf61273b565b5b5f6128cd88828901612893565b955050602086013567ffffffffffffffff8111156128ee576128ed61273f565b5b6128fa8882890161274f565b9450945050604086013567ffffffffffffffff81111561291d5761291c61273f565b5b6129298882890161274f565b92509250509295509295909350565b5f8115159050919050565b61294c81612938565b82525050565b5f6020820190506129655f830184612943565b92915050565b5f819050919050565b61297d8161296b565b8114612987575f5ffd5b50565b5f8135905061299881612974565b92915050565b5f602082840312156129b3576129b261273b565b5b5f6129c08482850161298a565b91505092915050565b5f5ffd5b5f61012082840312156129e3576129e26129c9565b5b81905092915050565b5f5f60408385031215612a0257612a0161273b565b5b5f83013567ffffffffffffffff811115612a1f57612a1e61273f565b5b612a2b858286016129cd565b9250506020612a3c85828601612893565b9150509250929050565b5f819050919050565b5f612a69612a64612a5f8461296b565b612a46565b61296b565b9050919050565b612a7981612a4f565b82525050565b5f602082019050612a925f830184612a70565b92915050565b612aa18161296b565b82525050565b5f602082019050612aba5f830184612a98565b92915050565b5f5f5f5f60608587031215612ad857612ad761273b565b5b5f612ae587828801612835565b9450506020612af687828801612893565b935050604085013567ffffffffffffffff811115612b1757612b1661273f565b5b612b238782880161274f565b925092505092959194509250565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612b6581612b31565b82525050565b5f602082019050612b7e5f830184612b5c565b92915050565b5f5f60408385031215612b9a57612b9961273b565b5b5f612ba785828601612835565b9250506020612bb885828601612835565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b612bf48161280e565b82525050565b5f612c058383612beb565b60208301905092915050565b5f602082019050919050565b5f612c2782612bc2565b612c318185612bcc565b9350612c3c83612bdc565b805f5b83811015612c6c578151612c538882612bfa565b9750612c5e83612c11565b925050600181019050612c3f565b5085935050505092915050565b5f6020820190508181035f830152612c918184612c1d565b905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b612ccf826126ca565b810181811067ffffffffffffffff82111715612cee57612ced612c99565b5b80604052505050565b5f612d00612732565b9050612d0c8282612cc6565b919050565b5f67ffffffffffffffff821115612d2b57612d2a612c99565b5b602082029050602081019050919050565b5f612d4e612d4984612d11565b612cf7565b90508083825260208201905060208402830185811115612d7157612d7061274b565b5b835b81811015612d9a5780612d868882612835565b845260208401935050602081019050612d73565b5050509392505050565b5f82601f830112612db857612db7612743565b5b8135612dc8848260208601612d3c565b91505092915050565b5f5f60408385031215612de757612de661273b565b5b5f612df48582860161298a565b925050602083013567ffffffffffffffff811115612e1557612e1461273f565b5b612e2185828601612da4565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b612e618161280e565b82525050565b5f602082019050612e7a5f830184612e58565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f612eb78261296b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612ee957612ee8612e80565b5b600182019050919050565b5f5ffd5b5f5ffd5b5f5ffd5b5f5f83356001602003843603038112612f1c57612f1b612ef4565b5b80840192508235915067ffffffffffffffff821115612f3e57612f3d612ef8565b5b602083019250600182023603831315612f5a57612f59612efc565b5b509250929050565b5f612f6c8261296b565b91505f8203612f7e57612f7d612e80565b5b600182039050919050565b5f612f938261296b565b9150612f9e8361296b565b9250828203905081811115612fb657612fb5612e80565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f612ff38261296b565b9150612ffe8361296b565b92508261300e5761300d612fbc565b5b828204905092915050565b5f60ff82169050919050565b5f61302f82613019565b915061303a83613019565b9250828203905060ff81111561305357613052612e80565b5b92915050565b5f6130638261296b565b915061306e8361296b565b925082820190508082111561308657613085612e80565b5b92915050565b61309581612874565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f6130bf8261309b565b6130c981856130a5565b93506130d98185602086016126bc565b6130e2816126ca565b840191505092915050565b5f6040820190506131005f83018561308c565b818103602083015261311281846130b5565b90509392505050565b61312481612b31565b811461312e575f5ffd5b50565b5f8151905061313f8161311b565b92915050565b5f6020828403121561315a5761315961273b565b5b5f61316784828501613131565b9150509291505056fea26469706673582212203255f56c1040bc40dc7b1af933e0f6e7ce88801abcd0a4c70abf3c052a6a754164736f6c634300081c0033","sourceMap":"747:13272:52:-:0;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x608060405234801561000f575f5ffd5b50600436106100f3575f3560e01c80639700320311610095578063ecd0596111610064578063ecd0596114610293578063f551e2ee146102c3578063fbe5ce0a146102f3578063fd8b84b11461030f576100f3565b806397003203146101d3578063c86ec2bf14610203578063ccfdec8c14610233578063d60b347f14610263576100f3565b80637065cb48116100d15780637065cb481461014f5780638a91b0e31461016b578063940d384014610187578063960bfe04146101b7576100f3565b806306fdde03146100f757806354fd4d50146101155780636d61fe7014610133575b5f5ffd5b6100ff61033f565b60405161010c9190612712565b60405180910390f35b61011d61037c565b60405161012a9190612712565b60405180910390f35b61014d600480360381019061014891906127a4565b6103b9565b005b61016960048036038101906101649190612849565b6106bf565b005b610185600480360381019061018091906127a4565b6108b9565b005b6101a1600480360381019061019c91906128a7565b610a57565b6040516101ae9190612952565b60405180910390f35b6101d160048036038101906101cc919061299e565b610b8f565b005b6101ed60048036038101906101e891906129ec565b610d21565b6040516101fa9190612a7f565b60405180910390f35b61021d60048036038101906102189190612849565b610d6c565b60405161022a9190612aa7565b60405180910390f35b61024d60048036038101906102489190612849565b610d81565b60405161025a9190612aa7565b60405180910390f35b61027d60048036038101906102789190612849565b610d96565b60405161028a9190612952565b60405180910390f35b6102ad60048036038101906102a8919061299e565b610ddf565b6040516102ba9190612952565b60405180910390f35b6102dd60048036038101906102d89190612ac0565b610df6565b6040516102ea9190612b6b565b60405180910390f35b61030d60048036038101906103089190612b84565b610e30565b005b61032960048036038101906103249190612849565b610faf565b6040516103369190612c79565b60405180910390f35b60606040518060400160405280601081526020017f4f776e61626c6556616c696461746f7200000000000000000000000000000000815250905090565b60606040518060400160405280600581526020017f312e302e30000000000000000000000000000000000000000000000000000000815250905090565b5f5f83838101906103ca9190612dd1565b915091506103d781610fd4565b61040d576040517fe719027300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8203610446576040517f34b46f4800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8151905082811015610485576040517faabd5a0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f3390508360015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055506020821115610506576040517f2414149d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160025f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555061055b815f610fed90919063ffffffff16565b5f5f90505b82811015610673575f84828151811061057c5761057b612e2b565b5b602002602001015190505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036105f657806040517fb20f76e30000000000000000000000000000000000000000000000000000000081526004016105ed9190612e67565b60405180910390fd5b61060b83825f6110eb9092919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc82bdbbf677a2462f2a7e22e4ba9abd209496b69cd7b868b3b1d28f76e09a40a60405160405180910390a3508080600101915050610560565b508073ffffffffffffffffffffffffffffffffffffffff167f27b541a16df0902e262f34789782092ab25125513b8ed73608e802951771b92860405160405180910390a2505050505050565b5f3390506106cc81610d96565b61070d57806040517ff91bd6f10000000000000000000000000000000000000000000000000000000081526004016107049190612e67565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361077d57816040517fb20f76e30000000000000000000000000000000000000000000000000000000081526004016107749190612e67565b60405180910390fd5b602060025f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054106107f4576040517f2414149d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f81548092919061084190612ead565b919050555061085b81835f6110eb9092919063ffffffff16565b8173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167fc82bdbbf677a2462f2a7e22e4ba9abd209496b69cd7b868b3b1d28f76e09a40a60405160405180910390a35050565b5f33905060606108d882600160205f6114a8909392919063ffffffff16565b50809150505f5f90505b8151811015610989575f8282815181106108ff576108fe612e2b565b5b60200260200101519050610921846001835f611843909392919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fe594d081b4382713733fe631966432c9cea5199afb2db5c3c1931f9f9300367960405160405180910390a35080806001019150506108e2565b505f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505f60025f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff167f9d00629762554452d03c3b45626436df6ca1c3795d05d04df882f6db481b1be060405160405180910390a250505050565b5f5f5f8484810190610a699190612dd1565b91509150610a7681610fd4565b610a84575f92505050610b86565b5f8203610a95575f92505050610b86565b5f610aec610aa28a611bff565b89898080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f8201169050808301925050505050505085611c2f565b9050610af781611e31565b610b0081611e45565b5f5f825190505f5f90505b81811015610b67575f610b41858381518110610b2a57610b29612e2b565b5b602002602001015187611e5990919063ffffffff16565b5090508015610b59578380610b5590612ead565b9450505b508080600101915050610b0b565b50848210610b7d57600195505050505050610b86565b5f955050505050505b95945050505050565b5f339050610b9c81610d96565b610bdd57806040517ff91bd6f1000000000000000000000000000000000000000000000000000000008152600401610bd49190612e67565b60405180910390fd5b5f8203610c16576040517faabd5a0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160025f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541015610c8d576040517faabd5a0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508073ffffffffffffffffffffffffffffffffffffffff167ff7e18aa0532694077d6fc7df02e85d86b91ba964f958d1949d45c5776d36eb6e83604051610d159190612aa7565b60405180910390a25050565b5f5f610d4f845f016020810190610d389190612849565b8486806101000190610d4a9190612f00565b611e93565b90508015610d60575f915050610d66565b60019150505b92915050565b6001602052805f5260405f205f915090505481565b6002602052805f5260405f205f915090505481565b5f5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205414159050919050565b5f6001821480610def5750600782145b9050919050565b5f5f610e0433868686611e93565b90508015610e1c57631626ba7e60e01b915050610e28565b63ffffffff60e01b9150505b949350505050565b5f33905060015f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205460025f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205403610ee7576040517f1e6d14ea00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610efe8184845f611843909392919063ffffffff16565b60025f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f815480929190610f4b90612f62565b91905055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167fe594d081b4382713733fe631966432c9cea5199afb2db5c3c1931f9f9300367960405160405180910390a3505050565b6060610fca82600160205f6114a8909392919063ffffffff16565b5080915050919050565b5f610fe6610fe183611fd8565b611fe2565b9050919050565b610ff7828261202f565b1561102e576040517f53c85e6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001825f015f600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614806111515750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b1561119357806040517f7c84ecfb00000000000000000000000000000000000000000000000000000000815260040161118a9190612e67565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff16835f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461129b57806040517f40d3d1a40000000000000000000000000000000000000000000000000000000081526004016112929190612e67565b60405180910390fd5b825f015f600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16835f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080835f015f600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050565b60605f600173ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141580156114f057506114ee868686612101565b155b1561153257836040517f7c84ecfb0000000000000000000000000000000000000000000000000000000081526004016115299190612e67565b60405180910390fd5b5f830361156b576040517ff725081700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8267ffffffffffffffff81111561158557611584612c99565b5b6040519080825280602002602001820160405280156115b35781602001602082028036833780820191505090505b5091505f5f9050865f015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156116bf5750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b80156116ca57508381105b156117cb57818382815181106116e3576116e2612e2b565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050865f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915080806117c390612ead565b915050611656565b600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415801561180757505f81115b15611836578260018261181a9190612f89565b8151811061182b5761182a612e2b565b5b602002602001015191505b8083525094509492505050565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614806118a95750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b156118eb57816040517f7c84ecfb0000000000000000000000000000000000000000000000000000000081526004016118e29190612e67565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16845f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146119f357806040517f7c84ecfb0000000000000000000000000000000000000000000000000000000081526004016119ea9190612e67565b60405180910390fd5b835f015f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16845f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f845f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050565b5f816020527b19457468657265756d205369676e6564204d6573736167653a0a33325f52603c6004209050919050565b60605f835190505f604182611c449190612fe9565b90508067ffffffffffffffff811115611c6057611c5f612c99565b5b604051908082528060200260200182016040528015611c8e5781602001602082028036833780820191505090505b50925083811015611ccb576040517f8baa579f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f5b82811015611dec575f5f5f5f611ce48b8661220c565b9250925092505f8360ff1603611d0857611d018c8c84848c612238565b9350611d4b565b601e8360ff161115611d3b57611d34611d208d611bff565b600485611d2d9190613025565b8484612357565b9350611d4a565b611d478c848484612357565b93505b5b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614611d8d578580611d8990612ead565b9650505b83898681518110611da157611da0612e2b565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050505050508080600101915050611cce565b5084811015611e27576040517f8baa579f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050509392505050565b611e42611e3d82611fd8565b612391565b50565b611e56611e5182611fd8565b6125db565b50565b5f5f611e84611e6785611fd8565b8473ffffffffffffffffffffffffffffffffffffffff165f61262f565b80925081935050509250929050565b5f5f60015f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490505f8103611ee5575f915050611fd0565b5f611f3c611ef287611bff565b86868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f8201169050808301925050505050505084611c2f565b9050611f4781611e31565b611f5081611e45565b5f5f825190505f5f90505b81811015611fb357611f928a858381518110611f7a57611f79612e2b565b5b60200260200101515f6121019092919063ffffffff16565b15611fa6578280611fa290612ead565b9350505b8080600101915050611f5b565b50838210611fc8576001945050505050611fd0565b5f9450505050505b949350505050565b6060819050919050565b5f60019050600282511061202a57815160051b82016020830192505b60011561202857825160208401935083518110925081841883026120225750612028565b50611ffe565b505b919050565b5f5f73ffffffffffffffffffffffffffffffffffffffff16835f015f600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415905092915050565b5f8173ffffffffffffffffffffffffffffffffffffffff16600173ffffffffffffffffffffffffffffffffffffffff161415801561220357505f73ffffffffffffffffffffffffffffffffffffffff16845f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b90509392505050565b5f5f5f83604102602081018601519250604081018601519150606081018601515f1a9350509250925092565b5f835f1c90505f602084870101519050826020855f1c836122599190613059565b6122639190613059565b1115612272575f91505061234e565b60606020858801019050631626ba7e60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168373ffffffffffffffffffffffffffffffffffffffff16631626ba7e8a846040518363ffffffff1660e01b81526004016122de9291906130ed565b602060405180830381865afa1580156122f9573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061231d9190613145565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161461234b575f9250505061234e565b50505b95945050505050565b5f604051855f5260ff851660205283604052826060526020604060805f60015afa505f6060523d6060185191508060405250949350505050565b61252b565b5f5f8290508391509250929050565b805182518252808352505050565b61018082840311612438576020820180518351106123d6576123d583826123a5565b5b5b60011561242f5760208101905083811161242f57805182820180518281116124015750505061242a565b5b60011561242057806020830152848201915081519050828111612402575b8260208301525050505b6123d7565b50505050612529565b81601f1683830160061c60051b01825181518082106124605761245b8183612396565b915091505b855180821061248e576124738183612396565b9150915081831061248d576124888284612396565b925092505b5b8087528184528286525050508051849150835b6001156124f6575b6001156124bf57806020019050805182116124a9575b825b6001156124d6578085019050805183106124c1575b8093508382106124e657506124f6565b6124f084836123a5565b506124a1565b5050836020820114612511576125108460208301846123b3565b5b828114612524576125238184846123b3565b5b505050505b565b8051600281106125d757601f19602083018260051b8401805b80518185015111612559578084019050612544565b82811161256957505050506125d7565b8190505b8051818501511061258257808401905061256d565b8281116125c1575b6001156125b85782518251845280835282850192506020840193508284106125b257506125b8565b5061258a565b505050506125d7565b5f86526125cf8284866123b3565b848652505050505b5050565b600281511061262c576020810160408201600183510160051b83015b60011561262057815183511461261257602083019250815183525b6020820191508082036125f7575b83830360051c84525050505b50565b5f5f5f19600186515f87870197505b6001156126805781830160011c94508460051b89015187019050878114828411176126805780881161267457838501915061267b565b6001850192505b61263e565b8781149550841515905080848601029450808616955050505050935093915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f6126e4826126a2565b6126ee81856126ac565b93506126fe8185602086016126bc565b612707816126ca565b840191505092915050565b5f6020820190508181035f83015261272a81846126da565b905092915050565b5f604051905090565b5f5ffd5b5f5ffd5b5f5ffd5b5f5ffd5b5f5ffd5b5f5f83601f84011261276457612763612743565b5b8235905067ffffffffffffffff81111561278157612780612747565b5b60208301915083600182028301111561279d5761279c61274b565b5b9250929050565b5f5f602083850312156127ba576127b961273b565b5b5f83013567ffffffffffffffff8111156127d7576127d661273f565b5b6127e38582860161274f565b92509250509250929050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f612818826127ef565b9050919050565b6128288161280e565b8114612832575f5ffd5b50565b5f813590506128438161281f565b92915050565b5f6020828403121561285e5761285d61273b565b5b5f61286b84828501612835565b91505092915050565b5f819050919050565b61288681612874565b8114612890575f5ffd5b50565b5f813590506128a18161287d565b92915050565b5f5f5f5f5f606086880312156128c0576128bf61273b565b5b5f6128cd88828901612893565b955050602086013567ffffffffffffffff8111156128ee576128ed61273f565b5b6128fa8882890161274f565b9450945050604086013567ffffffffffffffff81111561291d5761291c61273f565b5b6129298882890161274f565b92509250509295509295909350565b5f8115159050919050565b61294c81612938565b82525050565b5f6020820190506129655f830184612943565b92915050565b5f819050919050565b61297d8161296b565b8114612987575f5ffd5b50565b5f8135905061299881612974565b92915050565b5f602082840312156129b3576129b261273b565b5b5f6129c08482850161298a565b91505092915050565b5f5ffd5b5f61012082840312156129e3576129e26129c9565b5b81905092915050565b5f5f60408385031215612a0257612a0161273b565b5b5f83013567ffffffffffffffff811115612a1f57612a1e61273f565b5b612a2b858286016129cd565b9250506020612a3c85828601612893565b9150509250929050565b5f819050919050565b5f612a69612a64612a5f8461296b565b612a46565b61296b565b9050919050565b612a7981612a4f565b82525050565b5f602082019050612a925f830184612a70565b92915050565b612aa18161296b565b82525050565b5f602082019050612aba5f830184612a98565b92915050565b5f5f5f5f60608587031215612ad857612ad761273b565b5b5f612ae587828801612835565b9450506020612af687828801612893565b935050604085013567ffffffffffffffff811115612b1757612b1661273f565b5b612b238782880161274f565b925092505092959194509250565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612b6581612b31565b82525050565b5f602082019050612b7e5f830184612b5c565b92915050565b5f5f60408385031215612b9a57612b9961273b565b5b5f612ba785828601612835565b9250506020612bb885828601612835565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b612bf48161280e565b82525050565b5f612c058383612beb565b60208301905092915050565b5f602082019050919050565b5f612c2782612bc2565b612c318185612bcc565b9350612c3c83612bdc565b805f5b83811015612c6c578151612c538882612bfa565b9750612c5e83612c11565b925050600181019050612c3f565b5085935050505092915050565b5f6020820190508181035f830152612c918184612c1d565b905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b612ccf826126ca565b810181811067ffffffffffffffff82111715612cee57612ced612c99565b5b80604052505050565b5f612d00612732565b9050612d0c8282612cc6565b919050565b5f67ffffffffffffffff821115612d2b57612d2a612c99565b5b602082029050602081019050919050565b5f612d4e612d4984612d11565b612cf7565b90508083825260208201905060208402830185811115612d7157612d7061274b565b5b835b81811015612d9a5780612d868882612835565b845260208401935050602081019050612d73565b5050509392505050565b5f82601f830112612db857612db7612743565b5b8135612dc8848260208601612d3c565b91505092915050565b5f5f60408385031215612de757612de661273b565b5b5f612df48582860161298a565b925050602083013567ffffffffffffffff811115612e1557612e1461273f565b5b612e2185828601612da4565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b612e618161280e565b82525050565b5f602082019050612e7a5f830184612e58565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f612eb78261296b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612ee957612ee8612e80565b5b600182019050919050565b5f5ffd5b5f5ffd5b5f5ffd5b5f5f83356001602003843603038112612f1c57612f1b612ef4565b5b80840192508235915067ffffffffffffffff821115612f3e57612f3d612ef8565b5b602083019250600182023603831315612f5a57612f59612efc565b5b509250929050565b5f612f6c8261296b565b91505f8203612f7e57612f7d612e80565b5b600182039050919050565b5f612f938261296b565b9150612f9e8361296b565b9250828203905081811115612fb657612fb5612e80565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f612ff38261296b565b9150612ffe8361296b565b92508261300e5761300d612fbc565b5b828204905092915050565b5f60ff82169050919050565b5f61302f82613019565b915061303a83613019565b9250828203905060ff81111561305357613052612e80565b5b92915050565b5f6130638261296b565b915061306e8361296b565b925082820190508082111561308657613085612e80565b5b92915050565b61309581612874565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f6130bf8261309b565b6130c981856130a5565b93506130d98185602086016126bc565b6130e2816126ca565b840191505092915050565b5f6040820190506131005f83018561308c565b818103602083015261311281846130b5565b90509392505050565b61312481612b31565b811461312e575f5ffd5b50565b5f8151905061313f8161311b565b92915050565b5f6020828403121561315a5761315961273b565b5b5f61316784828501613131565b9150509291505056fea26469706673582212203255f56c1040bc40dc7b1af933e0f6e7ce88801abcd0a4c70abf3c052a6a754164736f6c634300081c0033","sourceMap":"747:13272:52:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13710:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13921:96;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2369:1473;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6075:728;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3991:721;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10113:1497;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5221:687;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8579:478;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1802:52;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1889:45;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4906:124;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13447:162;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9338:450;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7061:641;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7867:227;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13710:104;13757:13;13782:25;;;;;;;;;;;;;;;;;;;13710:104;:::o;13921:96::-;13971:13;13996:14;;;;;;;;;;;;;;;;;;;13921:96;:::o;2369:1473::-;2481:18;2501:24;2540:4;;2529:38;;;;;;;:::i;:::-;2480:87;;;;2638:31;:7;:29;:31::i;:::-;2633:90;;2692:20;;;;;;;;;;;;;;2633:90;2793:1;2779:10;:15;2775:70;;2817:17;;;;;;;;;;;;;;2775:70;2924:20;2947:7;:14;2924:37;;2990:10;2975:12;:25;2971:81;;;3023:18;;;;;;;;;;;;;;2971:81;3099:15;3117:10;3099:28;;3184:10;3163:9;:18;3173:7;3163:18;;;;;;;;;;;;;;;:31;;;;1695:2;3251:12;:25;3247:81;;;3299:18;;;;;;;;;;;;;;3247:81;3387:12;3365:10;:19;3376:7;3365:19;;;;;;;;;;;;;;;:34;;;;3447:20;3459:7;3447:6;:11;;:20;;;;:::i;:::-;3517:9;3529:1;3517:13;;3512:282;3536:12;3532:1;:16;3512:282;;;3569:14;3586:7;3594:1;3586:10;;;;;;;;:::i;:::-;;;;;;;;3569:27;;3632:1;3614:20;;:6;:20;;;3610:86;;3674:6;3661:20;;;;;;;;;;;:::i;:::-;;;;;;;;3610:86;3709:28;3721:7;3730:6;3709;:11;;:28;;;;;:::i;:::-;3776:6;3756:27;;3767:7;3756:27;;;;;;;;;;;;3555:239;3550:3;;;;;;;3512:282;;;;3827:7;3809:26;;;;;;;;;;;;2427:1415;;;;2369:1473;;:::o;6075:728::-;6164:15;6182:10;6164:28;;6277:22;6291:7;6277:13;:22::i;:::-;6272:59;;6323:7;6308:23;;;;;;;;;;;:::i;:::-;;;;;;;;6272:59;6408:1;6391:19;;:5;:19;;;6387:76;;6446:5;6433:19;;;;;;;;;;;:::i;:::-;;;;;;;;6387:76;1695:2;6519:10;:19;6530:7;6519:19;;;;;;;;;;;;;;;;:33;6515:89;;6575:18;;;;;;;;;;;;;;6515:89;6651:10;:19;6662:7;6651:19;;;;;;;;;;;;;;;;:21;;;;;;;;;:::i;:::-;;;;;;6727:27;6739:7;6748:5;6727:6;:11;;:27;;;;;:::i;:::-;6790:5;6770:26;;6781:7;6770:26;;;;;;;;;;;;6117:686;6075:728;:::o;3991:721::-;4093:15;4111:10;4093:28;;4160;4215:57;4242:7;113:3:47;1695:2:52;4215:6;:26;;:57;;;;;;:::i;:::-;4198:74;;;;;4287:9;4299:1;4287:13;;4282:247;4306:11;:18;4302:1;:22;4282:247;;;4345:13;4361:11;4373:1;4361:14;;;;;;;;:::i;:::-;;;;;;;;4345:30;;4435:36;4446:7;113:3:47;4465:5:52;4435:6;:10;;:36;;;;;;:::i;:::-;4512:5;4490:28;;4503:7;4490:28;;;;;;;;;;;;4331:198;4326:3;;;;;;;4282:247;;;;4592:1;4571:9;:18;4581:7;4571:18;;;;;;;;;;;;;;;:22;;;;4660:1;4638:10;:19;4649:7;4638:19;;;;;;;;;;;;;;;:23;;;;4697:7;4677:28;;;;;;;;;;;;4046:666;;3991:721;;:::o;10113:1497::-;10286:4;10350:18;10370:24;10409:4;;10398:38;;;;;;;:::i;:::-;10349:87;;;;10507:31;:7;:29;:31::i;:::-;10502:75;;10561:5;10554:12;;;;;;10502:75;10644:1;10630:10;:15;10626:58;;10668:5;10661:12;;;;;;10626:58;10745:24;10772:115;10820:34;10849:4;10820:28;:34::i;:::-;10856:9;;10772:115;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10867:10;10772:34;:115::i;:::-;10745:142;;10975:14;:7;:12;:14::i;:::-;10999:24;:7;:22;:24::i;:::-;11077:20;11107:21;11131:7;:14;11107:38;;11160:9;11172:1;11160:13;;11155:188;11179:13;11175:1;:17;11155:188;;;11214:10;11229:32;11250:7;11258:1;11250:10;;;;;;;;:::i;:::-;;;;;;;;11229:7;:20;;:32;;;;:::i;:::-;11213:48;;;11279:5;11275:58;;;11304:14;;;;;:::i;:::-;;;;11275:58;11199:144;11194:3;;;;;;;11155:188;;;;11436:10;11420:12;:26;11416:120;;11521:4;11514:11;;;;;;;;;11416:120;11598:5;11591:12;;;;;;;10113:1497;;;;;;;;:::o;5221:687::-;5319:15;5337:10;5319:28;;5432:22;5446:7;5432:13;:22::i;:::-;5427:59;;5478:7;5463:23;;;;;;;;;;;:::i;:::-;;;;;;;;5427:59;5562:1;5548:10;:15;5544:71;;5586:18;;;;;;;;;;;;;;5544:71;5720:10;5698;:19;5709:7;5698:19;;;;;;;;;;;;;;;;:32;5694:88;;;5753:18;;;;;;;;;;;;;;5694:88;5842:10;5821:9;:18;5831:7;5821:18;;;;;;;;;;;;;;;:31;;;;5881:7;5868:33;;;5890:10;5868:33;;;;;;:::i;:::-;;;;;;;;5272:636;5221:687;:::o;8579:478::-;8746:14;8826:12;8841:73;8870:6;:13;;;;;;;;;;:::i;:::-;8885:10;8897:6;:16;;;;;;;;:::i;:::-;8841:28;:73::i;:::-;8826:88;;8958:7;8954:63;;;433:1:40;8981:25:52;;;;;8954:63;514:1:40;9026:24:52;;;8579:478;;;;;:::o;1802:52::-;;;;;;;;;;;;;;;;;:::o;1889:45::-;;;;;;;;;;;;;;;;;:::o;4906:124::-;4972:4;5022:1;4995:9;:23;5005:12;4995:23;;;;;;;;;;;;;;;;:28;;4988:35;;4906:124;;;:::o;13447:162::-;13517:4;116:1:45;13540:6:52;:24;:62;;;;377:1:45;13568:6:52;:34;13540:62;13533:69;;13447:162;;;:::o;9338:450::-;9512:6;9584:12;9599:52;9628:10;9640:4;9646;;9599:28;:52::i;:::-;9584:67;;9695:7;9691:60;;;565:10:40;9725:15:52;;9718:22;;;;;9691:60;623:10:40;9767:14:52;;9760:21;;;9338:450;;;;;;;:::o;7061:641::-;7172:15;7190:10;7172:28;;7282:9;:18;7292:7;7282:18;;;;;;;;;;;;;;;;7259:10;:19;7270:7;7259:19;;;;;;;;;;;;;;;;:41;7255:252;;7477:19;;;;;;;;;;;;;;7255:252;7545:37;7556:7;7565:9;7576:5;7545:6;:10;;:37;;;;;;:::i;:::-;7630:10;:19;7641:7;7630:19;;;;;;;;;;;;;;;;:21;;;;;;;;;:::i;:::-;;;;;;7689:5;7667:28;;7680:7;7667:28;;;;;;;;;;;;7125:577;7061:641;;:::o;7867:227::-;7926:28;8030:57;8057:7;113:3:47;1695:2:52;8030:6;:26;;:57;;;;;;:::i;:::-;8013:74;;;;;7867:227;;;:::o;17139:147:50:-;17213:11;17245:34;17267:11;17276:1;17267:8;:11::i;:::-;17245:21;:34::i;:::-;17236:43;;17139:147;;;:::o;977:213:47:-;1058:33;1077:4;1083:7;1058:18;:33::i;:::-;1054:77;;;1100:31;;;;;;;;;;;;;;1054:77;113:3;1141:4;:12;;:22;113:3;1141:22;;;;;;;;;;;;;;;:31;1164:7;1141:31;;;;;;;;;;;;;;;;:42;;;;;;;;;;;;;;;;;;977:213;;:::o;2458:480::-;175:3;2557:24;;:8;:24;;;:48;;;;113:3;2585:20;;:8;:20;;;2557:48;2553:119;;;2652:8;2628:33;;;;;;;;;;;:::i;:::-;;;;;;;;2553:119;175:3;2685:47;;:4;:12;;:22;2698:8;2685:22;;;;;;;;;;;;;;;:31;2708:7;2685:31;;;;;;;;;;;;;;;;;;;;;;;;;:47;;;2681:124;;2785:8;2755:39;;;;;;;;;;;:::i;:::-;;;;;;;;2681:124;2848:4;:12;;:22;113:3;2848:22;;;;;;;;;;;;;;;:31;2871:7;2848:31;;;;;;;;;;;;;;;;;;;;;;;;;2814:4;:12;;:22;2827:8;2814:22;;;;;;;;;;;;;;;:31;2837:7;2814:31;;;;;;;;;;;;;;;;:65;;;;;;;;;;;;;;;;;;2923:8;2889:4;:12;;:22;113:3;2889:22;;;;;;;;;;;;;;;:31;2912:7;2889:31;;;;;;;;;;;;;;;;:42;;;;;;;;;;;;;;;;;;2458:480;;;:::o;5700:1854::-;5891:22;5915:12;113:3;5947:17;;:5;:17;;;;:52;;;;;5969:30;5978:4;5984:7;5993:5;5969:8;:30::i;:::-;5968:31;5947:52;5943:120;;;6046:5;6022:30;;;;;;;;;;;:::i;:::-;;;;;;;;5943:120;6088:1;6076:8;:13;6072:50;;6098:24;;;;;;;;;;;;;;6072:50;6195:8;6181:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6173:31;;6248:18;6269:1;6248:22;;6287:4;:12;;:19;6300:5;6287:19;;;;;;;;;;;;;;;:28;6307:7;6287:28;;;;;;;;;;;;;;;;;;;;;;;;;6280:35;;6325:197;175:3;6332:20;;:4;:20;;;;:40;;;;;113:3;6356:16;;:4;:16;;;;6332:40;:65;;;;;6389:8;6376:10;:21;6332:65;6325:197;;;6433:4;6413:5;6419:10;6413:17;;;;;;;;:::i;:::-;;;;;;;:24;;;;;;;;;;;6458:4;:12;;:18;6471:4;6458:18;;;;;;;;;;;;;;;:27;6477:7;6458:27;;;;;;;;;;;;;;;;;;;;;;;;;6451:34;;6499:12;;;;;:::i;:::-;;;;6325:197;;;113:3;7247:16;;:4;:16;;;;:34;;;;;7280:1;7267:10;:14;7247:34;7243:93;;;7304:5;7323:1;7310:10;:14;;;;:::i;:::-;7304:21;;;;;;;;:::i;:::-;;;;;;;;7297:28;;7243:93;7527:10;7520:5;7513:25;7499:49;5700:1854;;;;;;;:::o;3774:545::-;175:3;3941:24;;:8;:24;;;:48;;;;113:3;3969:20;;:8;:20;;;3941:48;3937:120;;;4036:9;4012:34;;;;;;;;;;;:::i;:::-;;;;;;;;3937:120;4106:8;4070:44;;:4;:12;;:23;4083:9;4070:23;;;;;;;;;;;;;;;:32;4094:7;4070:32;;;;;;;;;;;;;;;;;;;;;;;;;:44;;;4066:115;;4161:8;4137:33;;;;;;;;;;;:::i;:::-;;;;;;;;4066:115;4225:4;:12;;:22;4238:8;4225:22;;;;;;;;;;;;;;;:31;4248:7;4225:31;;;;;;;;;;;;;;;;;;;;;;;;;4190:4;:12;;:23;4203:9;4190:23;;;;;;;;;;;;;;;:32;4214:7;4190:32;;;;;;;;;;;;;;;;:66;;;;;;;;;;;;;;;;;;175:3;4266:4;:12;;:22;4279:8;4266:22;;;;;;;;;;;;;;;:31;4289:7;4266:31;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;3774:545;;;;:::o;13276:409:49:-;13345:14;13450:4;13444;13437:18;13524:50;13518:4;13511:64;13627:4;13621;13611:21;13601:31;;13276:409;;;:::o;904:1741:21:-;1080:33;1129:24;1156:10;:17;1129:44;;1183:23;1228:2;1209:16;:21;;;;:::i;:::-;1183:47;;1273:15;1259:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1240:49;;1321:18;1303:15;:36;1299:67;;;1348:18;;;;;;;;;;;;;;1299:67;1376:21;1412:9;1407:1157;1427:15;1423:1;:19;1407:1157;;;1506:15;1536:7;1545:9;1556;1569:50;1598:10;1615:1;1569:14;:50::i;:::-;1535:84;;;;;;1643:1;1638;:6;;;1634:789;;1735:70;1760:8;1770:10;1782:1;1785;1788:16;1735:24;:70::i;:::-;1725:80;;1634:789;;;1834:2;1830:1;:6;;;1826:597;;;2121:184;2166:38;2195:8;2166:28;:38::i;:::-;2233:1;2229;:5;;;;:::i;:::-;2259:1;2285;2121:16;:184::i;:::-;2111:194;;1826:597;;;2354:54;2379:8;2392:1;2398;2404;2354:16;:54::i;:::-;2344:64;;1826:597;1634:789;2459:1;2440:21;;:7;:21;;;2436:75;;2481:15;;;;;:::i;:::-;;;;2436:75;2546:7;2524:16;2541:1;2524:19;;;;;;;;:::i;:::-;;;;;;;:29;;;;;;;;;;;1449:1115;;;;1444:3;;;;;;;1407:1157;;;;2593:18;2577:13;:34;2573:65;;;2620:18;;;;;;;;;;;;;;2573:65;1119:1526;;;904:1741;;;;;:::o;7665:82:50:-;7723:17;7728:11;7737:1;7728:8;:11::i;:::-;7723:4;:17::i;:::-;7665:82;:::o;9420:102::-;9488:27;9503:11;9512:1;9503:8;:11::i;:::-;9488:14;:27::i;:::-;9420:102;:::o;10596:216::-;10701:10;10713:13;10759:46;10773:11;10782:1;10773:8;:11::i;:::-;10794:6;10759:46;;10803:1;10759:13;:46::i;:::-;10742:63;;;;;;;;10596:216;;;;;:::o;11825:1233:52:-;11992:4;12064:18;12085:9;:18;12095:7;12085:18;;;;;;;;;;;;;;;;12064:39;;12131:1;12117:10;:15;12113:58;;12155:5;12148:12;;;;;12113:58;12232:24;12271:88;12306:34;12335:4;12306:28;:34::i;:::-;12342:4;;12271:88;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12348:10;12271:34;:88::i;:::-;12232:127;;12447:14;:7;:12;:14::i;:::-;12471:24;:7;:22;:24::i;:::-;12549:20;12579:21;12603:7;:14;12579:38;;12632:9;12644:1;12632:13;;12627:157;12651:13;12647:1;:17;12627:157;;;12689:36;12705:7;12714;12722:1;12714:10;;;;;;;;:::i;:::-;;;;;;;;12689:6;:15;;:36;;;;;:::i;:::-;12685:89;;;12745:14;;;;;:::i;:::-;;;;12685:89;12666:3;;;;;;;12627:157;;;;12877:10;12861:12;:26;12857:120;;12962:4;12955:11;;;;;;;;12857:120;13046:5;13039:12;;;;;;11825:1233;;;;;;;:::o;25451:415:50:-;25511:23;25849:1;25839:11;;25451:415;;;:::o;15851:552::-;15925:11;16024:1;16014:11;;16061:1;16057;16051:8;16048:15;16038:349;;16114:1;16108:8;16105:1;16101:16;16098:1;16094:24;16153:4;16150:1;16146:12;16141:17;;16135:238;16161:1;16135:238;;;16203:1;16197:8;16238:4;16235:1;16231:12;16226:17;;16286:1;16280:8;16277:1;16274:15;16264:25;;16339:3;16336:1;16332:11;16324:6;16320:24;16310:45;;16348:5;;;16310:45;16166:207;16135:238;;;16065:322;16038:349;15851:552;;;:::o;1464:222:47:-;1605:4;175:3;1632:47;;:4;:12;;:22;113:3;1632:22;;;;;;;;;;;;;;;:31;1655:7;1632:31;;;;;;;;;;;;;;;;;;;;;;;;;:47;;;;1625:54;;1464:222;;;;:::o;5117:253::-;5271:4;5310:5;5298:17;;113:3;5298:17;;;;:65;;;;;175:3;5319:44;;:4;:12;;:19;5332:5;5319:19;;;;;;;;;;;;;;;:28;5339:7;5319:28;;;;;;;;;;;;;;;;;;;;;;;;;:44;;;;5298:65;5291:72;;5117:253;;;;;:::o;5164:552:21:-;5295:7;5304:9;5315;5492:3;5486:4;5482:14;5554:4;5540:12;5536:23;5524:10;5520:40;5514:47;5509:52;;5619:4;5605:12;5601:23;5589:10;5585:40;5579:47;5574:52;;5692:4;5678:12;5674:23;5662:10;5658:40;5652:47;5649:1;5644:56;5639:61;;5448:262;5164:552;;;;;:::o;2987:1429::-;3205:15;3379:1;3371:10;;3345:38;;3522:28;3693:4;3689:1;3677:10;3673:18;3669:29;3663:36;3639:60;;3820:16;3815:2;3810:1;3802:10;;3779:20;:33;;;;:::i;:::-;:38;;;;:::i;:::-;:57;3775:105;;;3867:1;3852:17;;;;;3775:105;3917:30;4227:4;4223:1;4211:10;4207:18;4203:29;4182:50;;168:10;4362:19;;4268:113;;;4288:7;4268:45;;;4314:8;4324:17;4268:74;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:113;;;;4251:158;;4407:1;4392:17;;;;;;4251:158;3226:1190;;2987:1429;;;;;;;;:::o;11989:726:49:-;12101:14;12212:4;12206:11;12277:4;12271;12264:18;12315:4;12312:1;12308:12;12302:4;12295:26;12347:1;12341:4;12334:15;12375:1;12369:4;12362:15;12433:4;12427;12421;12415;12412:1;12405:5;12394:44;12390:49;12465:1;12459:4;12452:15;12617:16;12611:4;12607:27;12601:34;12591:44;;12661:1;12655:4;12648:15;12183:526;11989:726;;;;;;:::o;2861:4547:50:-;2985:97;;;3010:2;3014;3041;3035:8;;3066:2;3060:8;;2985:97;;;;;:::o;3095:143::-;3152:2;3146:9;3189:2;3183:9;3179:2;3172:21;3221:2;3217;3210:14;3118:120;3095:143;;:::o;3251:2828::-;3454:5;3449:2;3445;3441:11;3438:22;3428:982;;3561:4;3557:2;3553:13;3617:2;3611:9;3606:2;3600:9;3597:24;3587:53;;3625:13;3635:2;3631;3625:13;:::i;:::-;3587:53;3661:705;3668:1;3661:705;;;3713:4;3709:2;3705:13;3699:19;;3753:2;3749;3746:10;3759:5;3743:23;3807:2;3801:9;3861:2;3857;3853:11;3942:2;3936:9;4009:2;4005;4002:10;3992:34;;4016:8;;;;;3992:34;4051:243;4058:1;4051:243;;;4115:2;4108:4;4104:2;4100:13;4093:25;4161:2;4157;4153:11;4147:17;;4205:2;4199:9;4193:15;;4254:2;4250;4247:10;4051:243;4237:31;4051:243;4341:2;4334:4;4330:2;4326:13;4319:25;3673:693;;;3661:705;;;;4387:5;;;;;;3428:982;4541:2;4537;4533:11;4526:2;4522;4518:11;4515:1;4511:19;4508:1;4504:27;4500:45;4646:2;4640:9;4687:2;4681:9;4729:3;4724;4721:12;4711:54;;4749:14;4759:3;4754;4749:14;:::i;:::-;4737:26;;;;4711:54;4803:2;4797:9;4845:3;4840;4837:12;4827:177;;4889:14;4899:3;4894;4889:14;:::i;:::-;4877:26;;;;4946:3;4941;4938:12;4928:54;;4966:14;4976:3;4971;4966:14;:::i;:::-;4954:26;;;;4928:54;4827:177;5036:3;5032:2;5025:15;5072:3;5068:2;5061:15;5108:3;5104:2;5097:15;4607:523;;;5275:2;5269:9;5305:2;5299:8;;5344:2;5328:569;5349:1;5328:569;;;5380:154;5387:1;5380:154;;;5438:2;5432:4;5428:13;5422:19;;5493:2;5487:9;5483:2;5480:17;5380:154;5470:38;5380:154;5569:2;5596:152;5603:1;5596:152;;;5652:2;5648;5644:11;5638:17;;5707:2;5701:9;5697:2;5694:17;5596:152;5684:38;5596:152;5779:2;5773:8;;5823:2;5819;5816:10;5806:31;;5830:5;;;5806:31;5862:13;5872:2;5868;5862:13;:::i;:::-;5354:543;5328:569;;;5332:16;5185:730;5960:2;5953:4;5949:2;5945:13;5942:21;5932:69;;5967:32;5996:2;5989:4;5985:2;5981:13;5977:2;5967:32;:::i;:::-;5932:69;6035:2;6031;6028:10;6018:47;;6042:21;6060:2;6056;6052;6042:21;:::i;:::-;6018:47;3282:2797;3251:2828;;;;:::o;:::-;6114:1;6108:8;6132:1;6129;6126:8;6093:1299;;6170:4;6166:9;6220:4;6217:1;6213:12;6278:1;6275;6271:9;6268:1;6264:17;6321:1;6406:67;6447:1;6441:8;6436:1;6433;6429:9;6423:16;6420:30;6406:67;;6469:1;6466;6462:9;6457:14;;6406:67;;;6564:1;6561;6558:8;6548:29;;6570:5;;;;;;6548:29;6672:1;6667:6;;6661:75;6710:1;6704:8;6699:1;6696;6692:9;6686:16;6683:30;6661:75;;6732:1;6729;6725:9;6720:14;;6661:75;;;6821:1;6818;6815:8;6805:379;;6847:293;6854:1;6847:293;;;6900:1;6894:8;6943:1;6937:8;6934:1;6927:19;6981:1;6978;6971:12;7020:1;7017;7013:9;7008:14;;7059:4;7056:1;7052:12;7047:17;;7105:1;7102;7099:8;7089:29;;7111:5;;;7089:29;6859:281;6847:293;;;7161:5;;;;;;6805:379;7211:1;7208;7201:12;7279:18;7295:1;7292;7289;7279:18;:::i;:::-;7324:1;7321;7314:12;7373:5;;;;6093:1299;6097:21;2861:4547;:::o;8425:722::-;8637:1;8633;8627:8;8624:15;8614:517;;8675:4;8672:1;8668:12;8713:4;8710:1;8706:12;8774:1;8770;8764:8;8760:16;8757:1;8753:24;8750:1;8746:32;8795:277;8802:1;8795:277;;;8858:1;8852:8;8848:1;8842:8;8839:22;8829:143;;8901:4;8898:1;8894:12;8889:17;;8947:1;8941:8;8938:1;8931:19;8829:143;9005:4;9002:1;8998:12;8993:17;;9040:3;9037:1;9034:10;8795:277;9031:23;8795:277;9113:1;9110;9106:9;9103:1;9099:17;9096:1;9089:28;8641:490;;;8614:517;8425:722;:::o;27459:1099::-;27580:10;27592:13;27700:1;27696:6;27724:1;27753;27747:8;27777:1;27819:6;27811;27807:19;27797:29;;27791:453;27829:1;27791:453;;;27875:1;27872;27868:9;27865:1;27861:17;27852:26;;27932:5;27929:1;27925:13;27922:1;27918:21;27912:28;27904:6;27900:41;27895:46;;27980:6;27977:1;27974:13;27970:1;27967;27964:8;27961:27;27991:5;27958:40;28104:1;28096:6;28093:13;28083:112;;28146:1;28139:5;28135:13;28130:18;;28169:8;;28083:112;28228:1;28221:5;28217:13;28212:18;;27791:453;;;;28418:6;28415:1;28412:13;28403:22;;28457:5;28450:13;28443:21;28438:26;;28505:1;28501;28494:5;28490:13;28486:21;28477:30;;28540:1;28533:5;28529:13;28520:22;;27673:879;;;;27459:1099;;;;;;:::o;7:99:53:-;59:6;93:5;87:12;77:22;;7:99;;;:::o;112:169::-;196:11;230:6;225:3;218:19;270:4;265:3;261:14;246:29;;112:169;;;;:::o;287:139::-;376:6;371:3;366;360:23;417:1;408:6;403:3;399:16;392:27;287:139;;;:::o;432:102::-;473:6;524:2;520:7;515:2;508:5;504:14;500:28;490:38;;432:102;;;:::o;540:377::-;628:3;656:39;689:5;656:39;:::i;:::-;711:71;775:6;770:3;711:71;:::i;:::-;704:78;;791:65;849:6;844:3;837:4;830:5;826:16;791:65;:::i;:::-;881:29;903:6;881:29;:::i;:::-;876:3;872:39;865:46;;632:285;540:377;;;;:::o;923:313::-;1036:4;1074:2;1063:9;1059:18;1051:26;;1123:9;1117:4;1113:20;1109:1;1098:9;1094:17;1087:47;1151:78;1224:4;1215:6;1151:78;:::i;:::-;1143:86;;923:313;;;;:::o;1242:75::-;1275:6;1308:2;1302:9;1292:19;;1242:75;:::o;1323:117::-;1432:1;1429;1422:12;1446:117;1555:1;1552;1545:12;1569:117;1678:1;1675;1668:12;1692:117;1801:1;1798;1791:12;1815:117;1924:1;1921;1914:12;1951:552;2008:8;2018:6;2068:3;2061:4;2053:6;2049:17;2045:27;2035:122;;2076:79;;:::i;:::-;2035:122;2189:6;2176:20;2166:30;;2219:18;2211:6;2208:30;2205:117;;;2241:79;;:::i;:::-;2205:117;2355:4;2347:6;2343:17;2331:29;;2409:3;2401:4;2393:6;2389:17;2379:8;2375:32;2372:41;2369:128;;;2416:79;;:::i;:::-;2369:128;1951:552;;;;;:::o;2509:527::-;2579:6;2587;2636:2;2624:9;2615:7;2611:23;2607:32;2604:119;;;2642:79;;:::i;:::-;2604:119;2790:1;2779:9;2775:17;2762:31;2820:18;2812:6;2809:30;2806:117;;;2842:79;;:::i;:::-;2806:117;2955:64;3011:7;3002:6;2991:9;2987:22;2955:64;:::i;:::-;2937:82;;;;2733:296;2509:527;;;;;:::o;3042:126::-;3079:7;3119:42;3112:5;3108:54;3097:65;;3042:126;;;:::o;3174:96::-;3211:7;3240:24;3258:5;3240:24;:::i;:::-;3229:35;;3174:96;;;:::o;3276:122::-;3349:24;3367:5;3349:24;:::i;:::-;3342:5;3339:35;3329:63;;3388:1;3385;3378:12;3329:63;3276:122;:::o;3404:139::-;3450:5;3488:6;3475:20;3466:29;;3504:33;3531:5;3504:33;:::i;:::-;3404:139;;;;:::o;3549:329::-;3608:6;3657:2;3645:9;3636:7;3632:23;3628:32;3625:119;;;3663:79;;:::i;:::-;3625:119;3783:1;3808:53;3853:7;3844:6;3833:9;3829:22;3808:53;:::i;:::-;3798:63;;3754:117;3549:329;;;;:::o;3884:77::-;3921:7;3950:5;3939:16;;3884:77;;;:::o;3967:122::-;4040:24;4058:5;4040:24;:::i;:::-;4033:5;4030:35;4020:63;;4079:1;4076;4069:12;4020:63;3967:122;:::o;4095:139::-;4141:5;4179:6;4166:20;4157:29;;4195:33;4222:5;4195:33;:::i;:::-;4095:139;;;;:::o;4240:1015::-;4339:6;4347;4355;4363;4371;4420:2;4408:9;4399:7;4395:23;4391:32;4388:119;;;4426:79;;:::i;:::-;4388:119;4546:1;4571:53;4616:7;4607:6;4596:9;4592:22;4571:53;:::i;:::-;4561:63;;4517:117;4701:2;4690:9;4686:18;4673:32;4732:18;4724:6;4721:30;4718:117;;;4754:79;;:::i;:::-;4718:117;4867:64;4923:7;4914:6;4903:9;4899:22;4867:64;:::i;:::-;4849:82;;;;4644:297;5008:2;4997:9;4993:18;4980:32;5039:18;5031:6;5028:30;5025:117;;;5061:79;;:::i;:::-;5025:117;5174:64;5230:7;5221:6;5210:9;5206:22;5174:64;:::i;:::-;5156:82;;;;4951:297;4240:1015;;;;;;;;:::o;5261:90::-;5295:7;5338:5;5331:13;5324:21;5313:32;;5261:90;;;:::o;5357:109::-;5438:21;5453:5;5438:21;:::i;:::-;5433:3;5426:34;5357:109;;:::o;5472:210::-;5559:4;5597:2;5586:9;5582:18;5574:26;;5610:65;5672:1;5661:9;5657:17;5648:6;5610:65;:::i;:::-;5472:210;;;;:::o;5688:77::-;5725:7;5754:5;5743:16;;5688:77;;;:::o;5771:122::-;5844:24;5862:5;5844:24;:::i;:::-;5837:5;5834:35;5824:63;;5883:1;5880;5873:12;5824:63;5771:122;:::o;5899:139::-;5945:5;5983:6;5970:20;5961:29;;5999:33;6026:5;5999:33;:::i;:::-;5899:139;;;;:::o;6044:329::-;6103:6;6152:2;6140:9;6131:7;6127:23;6123:32;6120:119;;;6158:79;;:::i;:::-;6120:119;6278:1;6303:53;6348:7;6339:6;6328:9;6324:22;6303:53;:::i;:::-;6293:63;;6249:117;6044:329;;;;:::o;6379:117::-;6488:1;6485;6478:12;6536:244;6621:5;6662:3;6653:6;6648:3;6644:16;6640:26;6637:113;;;6669:79;;:::i;:::-;6637:113;6768:6;6759:15;;6536:244;;;;:::o;6786:712::-;6893:6;6901;6950:2;6938:9;6929:7;6925:23;6921:32;6918:119;;;6956:79;;:::i;:::-;6918:119;7104:1;7093:9;7089:17;7076:31;7134:18;7126:6;7123:30;7120:117;;;7156:79;;:::i;:::-;7120:117;7261:92;7345:7;7336:6;7325:9;7321:22;7261:92;:::i;:::-;7251:102;;7047:316;7402:2;7428:53;7473:7;7464:6;7453:9;7449:22;7428:53;:::i;:::-;7418:63;;7373:118;6786:712;;;;;:::o;7504:60::-;7532:3;7553:5;7546:12;;7504:60;;;:::o;7570:142::-;7620:9;7653:53;7671:34;7680:24;7698:5;7680:24;:::i;:::-;7671:34;:::i;:::-;7653:53;:::i;:::-;7640:66;;7570:142;;;:::o;7718:166::-;7840:37;7871:5;7840:37;:::i;:::-;7835:3;7828:50;7718:166;;:::o;7890:292::-;8018:4;8056:2;8045:9;8041:18;8033:26;;8069:106;8172:1;8161:9;8157:17;8148:6;8069:106;:::i;:::-;7890:292;;;;:::o;8188:118::-;8275:24;8293:5;8275:24;:::i;:::-;8270:3;8263:37;8188:118;;:::o;8312:222::-;8405:4;8443:2;8432:9;8428:18;8420:26;;8456:71;8524:1;8513:9;8509:17;8500:6;8456:71;:::i;:::-;8312:222;;;;:::o;8540:817::-;8628:6;8636;8644;8652;8701:2;8689:9;8680:7;8676:23;8672:32;8669:119;;;8707:79;;:::i;:::-;8669:119;8827:1;8852:53;8897:7;8888:6;8877:9;8873:22;8852:53;:::i;:::-;8842:63;;8798:117;8954:2;8980:53;9025:7;9016:6;9005:9;9001:22;8980:53;:::i;:::-;8970:63;;8925:118;9110:2;9099:9;9095:18;9082:32;9141:18;9133:6;9130:30;9127:117;;;9163:79;;:::i;:::-;9127:117;9276:64;9332:7;9323:6;9312:9;9308:22;9276:64;:::i;:::-;9258:82;;;;9053:297;8540:817;;;;;;;:::o;9363:149::-;9399:7;9439:66;9432:5;9428:78;9417:89;;9363:149;;;:::o;9518:115::-;9603:23;9620:5;9603:23;:::i;:::-;9598:3;9591:36;9518:115;;:::o;9639:218::-;9730:4;9768:2;9757:9;9753:18;9745:26;;9781:69;9847:1;9836:9;9832:17;9823:6;9781:69;:::i;:::-;9639:218;;;;:::o;9863:474::-;9931:6;9939;9988:2;9976:9;9967:7;9963:23;9959:32;9956:119;;;9994:79;;:::i;:::-;9956:119;10114:1;10139:53;10184:7;10175:6;10164:9;10160:22;10139:53;:::i;:::-;10129:63;;10085:117;10241:2;10267:53;10312:7;10303:6;10292:9;10288:22;10267:53;:::i;:::-;10257:63;;10212:118;9863:474;;;;;:::o;10343:114::-;10410:6;10444:5;10438:12;10428:22;;10343:114;;;:::o;10463:184::-;10562:11;10596:6;10591:3;10584:19;10636:4;10631:3;10627:14;10612:29;;10463:184;;;;:::o;10653:132::-;10720:4;10743:3;10735:11;;10773:4;10768:3;10764:14;10756:22;;10653:132;;;:::o;10791:108::-;10868:24;10886:5;10868:24;:::i;:::-;10863:3;10856:37;10791:108;;:::o;10905:179::-;10974:10;10995:46;11037:3;11029:6;10995:46;:::i;:::-;11073:4;11068:3;11064:14;11050:28;;10905:179;;;;:::o;11090:113::-;11160:4;11192;11187:3;11183:14;11175:22;;11090:113;;;:::o;11239:732::-;11358:3;11387:54;11435:5;11387:54;:::i;:::-;11457:86;11536:6;11531:3;11457:86;:::i;:::-;11450:93;;11567:56;11617:5;11567:56;:::i;:::-;11646:7;11677:1;11662:284;11687:6;11684:1;11681:13;11662:284;;;11763:6;11757:13;11790:63;11849:3;11834:13;11790:63;:::i;:::-;11783:70;;11876:60;11929:6;11876:60;:::i;:::-;11866:70;;11722:224;11709:1;11706;11702:9;11697:14;;11662:284;;;11666:14;11962:3;11955:10;;11363:608;;;11239:732;;;;:::o;11977:373::-;12120:4;12158:2;12147:9;12143:18;12135:26;;12207:9;12201:4;12197:20;12193:1;12182:9;12178:17;12171:47;12235:108;12338:4;12329:6;12235:108;:::i;:::-;12227:116;;11977:373;;;;:::o;12356:180::-;12404:77;12401:1;12394:88;12501:4;12498:1;12491:15;12525:4;12522:1;12515:15;12542:281;12625:27;12647:4;12625:27;:::i;:::-;12617:6;12613:40;12755:6;12743:10;12740:22;12719:18;12707:10;12704:34;12701:62;12698:88;;;12766:18;;:::i;:::-;12698:88;12806:10;12802:2;12795:22;12585:238;12542:281;;:::o;12829:129::-;12863:6;12890:20;;:::i;:::-;12880:30;;12919:33;12947:4;12939:6;12919:33;:::i;:::-;12829:129;;;:::o;12964:311::-;13041:4;13131:18;13123:6;13120:30;13117:56;;;13153:18;;:::i;:::-;13117:56;13203:4;13195:6;13191:17;13183:25;;13263:4;13257;13253:15;13245:23;;12964:311;;;:::o;13298:710::-;13394:5;13419:81;13435:64;13492:6;13435:64;:::i;:::-;13419:81;:::i;:::-;13410:90;;13520:5;13549:6;13542:5;13535:21;13583:4;13576:5;13572:16;13565:23;;13636:4;13628:6;13624:17;13616:6;13612:30;13665:3;13657:6;13654:15;13651:122;;;13684:79;;:::i;:::-;13651:122;13799:6;13782:220;13816:6;13811:3;13808:15;13782:220;;;13891:3;13920:37;13953:3;13941:10;13920:37;:::i;:::-;13915:3;13908:50;13987:4;13982:3;13978:14;13971:21;;13858:144;13842:4;13837:3;13833:14;13826:21;;13782:220;;;13786:21;13400:608;;13298:710;;;;;:::o;14031:370::-;14102:5;14151:3;14144:4;14136:6;14132:17;14128:27;14118:122;;14159:79;;:::i;:::-;14118:122;14276:6;14263:20;14301:94;14391:3;14383:6;14376:4;14368:6;14364:17;14301:94;:::i;:::-;14292:103;;14108:293;14031:370;;;;:::o;14407:684::-;14500:6;14508;14557:2;14545:9;14536:7;14532:23;14528:32;14525:119;;;14563:79;;:::i;:::-;14525:119;14683:1;14708:53;14753:7;14744:6;14733:9;14729:22;14708:53;:::i;:::-;14698:63;;14654:117;14838:2;14827:9;14823:18;14810:32;14869:18;14861:6;14858:30;14855:117;;;14891:79;;:::i;:::-;14855:117;14996:78;15066:7;15057:6;15046:9;15042:22;14996:78;:::i;:::-;14986:88;;14781:303;14407:684;;;;;:::o;15097:180::-;15145:77;15142:1;15135:88;15242:4;15239:1;15232:15;15266:4;15263:1;15256:15;15283:118;15370:24;15388:5;15370:24;:::i;:::-;15365:3;15358:37;15283:118;;:::o;15407:222::-;15500:4;15538:2;15527:9;15523:18;15515:26;;15551:71;15619:1;15608:9;15604:17;15595:6;15551:71;:::i;:::-;15407:222;;;;:::o;15635:180::-;15683:77;15680:1;15673:88;15780:4;15777:1;15770:15;15804:4;15801:1;15794:15;15821:233;15860:3;15883:24;15901:5;15883:24;:::i;:::-;15874:33;;15929:66;15922:5;15919:77;15916:103;;15999:18;;:::i;:::-;15916:103;16046:1;16039:5;16035:13;16028:20;;15821:233;;;:::o;16060:117::-;16169:1;16166;16159:12;16183:117;16292:1;16289;16282:12;16306:117;16415:1;16412;16405:12;16429:724;16506:4;16512:6;16568:11;16555:25;16668:1;16662:4;16658:12;16647:8;16631:14;16627:29;16623:48;16603:18;16599:73;16589:168;;16676:79;;:::i;:::-;16589:168;16788:18;16778:8;16774:33;16766:41;;16840:4;16827:18;16817:28;;16868:18;16860:6;16857:30;16854:117;;;16890:79;;:::i;:::-;16854:117;16998:2;16992:4;16988:13;16980:21;;17055:4;17047:6;17043:17;17027:14;17023:38;17017:4;17013:49;17010:136;;;17065:79;;:::i;:::-;17010:136;16519:634;16429:724;;;;;:::o;17159:171::-;17198:3;17221:24;17239:5;17221:24;:::i;:::-;17212:33;;17267:4;17260:5;17257:15;17254:41;;17275:18;;:::i;:::-;17254:41;17322:1;17315:5;17311:13;17304:20;;17159:171;;;:::o;17336:194::-;17376:4;17396:20;17414:1;17396:20;:::i;:::-;17391:25;;17430:20;17448:1;17430:20;:::i;:::-;17425:25;;17474:1;17471;17467:9;17459:17;;17498:1;17492:4;17489:11;17486:37;;;17503:18;;:::i;:::-;17486:37;17336:194;;;;:::o;17536:180::-;17584:77;17581:1;17574:88;17681:4;17678:1;17671:15;17705:4;17702:1;17695:15;17722:185;17762:1;17779:20;17797:1;17779:20;:::i;:::-;17774:25;;17813:20;17831:1;17813:20;:::i;:::-;17808:25;;17852:1;17842:35;;17857:18;;:::i;:::-;17842:35;17899:1;17896;17892:9;17887:14;;17722:185;;;;:::o;17913:86::-;17948:7;17988:4;17981:5;17977:16;17966:27;;17913:86;;;:::o;18005:191::-;18043:4;18063:18;18079:1;18063:18;:::i;:::-;18058:23;;18095:18;18111:1;18095:18;:::i;:::-;18090:23;;18137:1;18134;18130:9;18122:17;;18161:4;18155;18152:14;18149:40;;;18169:18;;:::i;:::-;18149:40;18005:191;;;;:::o;18202:::-;18242:3;18261:20;18279:1;18261:20;:::i;:::-;18256:25;;18295:20;18313:1;18295:20;:::i;:::-;18290:25;;18338:1;18335;18331:9;18324:16;;18359:3;18356:1;18353:10;18350:36;;;18366:18;;:::i;:::-;18350:36;18202:191;;;;:::o;18399:118::-;18486:24;18504:5;18486:24;:::i;:::-;18481:3;18474:37;18399:118;;:::o;18523:98::-;18574:6;18608:5;18602:12;18592:22;;18523:98;;;:::o;18627:168::-;18710:11;18744:6;18739:3;18732:19;18784:4;18779:3;18775:14;18760:29;;18627:168;;;;:::o;18801:373::-;18887:3;18915:38;18947:5;18915:38;:::i;:::-;18969:70;19032:6;19027:3;18969:70;:::i;:::-;18962:77;;19048:65;19106:6;19101:3;19094:4;19087:5;19083:16;19048:65;:::i;:::-;19138:29;19160:6;19138:29;:::i;:::-;19133:3;19129:39;19122:46;;18891:283;18801:373;;;;:::o;19180:419::-;19319:4;19357:2;19346:9;19342:18;19334:26;;19370:71;19438:1;19427:9;19423:17;19414:6;19370:71;:::i;:::-;19488:9;19482:4;19478:20;19473:2;19462:9;19458:18;19451:48;19516:76;19587:4;19578:6;19516:76;:::i;:::-;19508:84;;19180:419;;;;;:::o;19605:120::-;19677:23;19694:5;19677:23;:::i;:::-;19670:5;19667:34;19657:62;;19715:1;19712;19705:12;19657:62;19605:120;:::o;19731:141::-;19787:5;19818:6;19812:13;19803:22;;19834:32;19860:5;19834:32;:::i;:::-;19731:141;;;;:::o;19878:349::-;19947:6;19996:2;19984:9;19975:7;19971:23;19967:32;19964:119;;;20002:79;;:::i;:::-;19964:119;20122:1;20147:63;20202:7;20193:6;20182:9;20178:22;20147:63;:::i;:::-;20137:73;;20093:127;19878:349;;;;:::o","linkReferences":{}},"methodIdentifiers":{"addOwner(address)":"7065cb48","getOwners(address)":"fd8b84b1","isInitialized(address)":"d60b347f","isModuleType(uint256)":"ecd05961","isValidSignatureWithSender(address,bytes32,bytes)":"f551e2ee","name()":"06fdde03","onInstall(bytes)":"6d61fe70","onUninstall(bytes)":"8a91b0e3","ownerCount(address)":"ccfdec8c","removeOwner(address,address)":"fbe5ce0a","setThreshold(uint256)":"960bfe04","threshold(address)":"c86ec2bf","validateSignatureWithData(bytes32,bytes,bytes)":"940d3840","validateUserOp((address,uint256,bytes,bytes,bytes32,uint256,bytes32,bytes,bytes),bytes32)":"97003203","version()":"54fd4d50"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.28+commit.7893614a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"CannotRemoveOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"InvalidOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidSignature\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidThreshold\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"LinkedList_AlreadyInitialized\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"entry\",\"type\":\"address\"}],\"name\":\"LinkedList_EntryAlreadyInList\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"entry\",\"type\":\"address\"}],\"name\":\"LinkedList_InvalidEntry\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"LinkedList_InvalidPage\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MaxOwnersReached\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"smartAccount\",\"type\":\"address\"}],\"name\":\"ModuleAlreadyInitialized\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"smartAccount\",\"type\":\"address\"}],\"name\":\"NotInitialized\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotSortedAndUnique\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ThresholdNotSet\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"ModuleInitialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"ModuleUninitialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"OwnerAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"OwnerRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"threshold\",\"type\":\"uint256\"}],\"name\":\"ThresholdSet\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"addOwner\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"getOwners\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"ownersArray\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"smartAccount\",\"type\":\"address\"}],\"name\":\"isInitialized\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"typeID\",\"type\":\"uint256\"}],\"name\":\"isModuleType\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"hash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"isValidSignatureWithSender\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"onInstall\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onUninstall\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"ownerCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"prevOwner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"removeOwner\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_threshold\",\"type\":\"uint256\"}],\"name\":\"setThreshold\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"threshold\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"hash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"validateSignatureWithData\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"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\":\"bytes32\",\"name\":\"accountGasLimits\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"gasFees\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct PackedUserOperation\",\"name\":\"userOp\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"userOpHash\",\"type\":\"bytes32\"}],\"name\":\"validateUserOp\",\"outputs\":[{\"internalType\":\"ERC7579ValidatorBase.ValidationData\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"version\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}],\"devdoc\":{\"author\":\"Rhinestone\",\"details\":\"Module that allows users to designate EOA owners that can validate transactions using a threshold\",\"kind\":\"dev\",\"methods\":{\"addOwner(address)\":{\"details\":\"will revert if the owner is already added\",\"params\":{\"owner\":\"address of the owner to add\"}},\"getOwners(address)\":{\"params\":{\"account\":\"address of the account\"},\"returns\":{\"ownersArray\":\"array of owners\"}},\"isInitialized(address)\":{\"params\":{\"smartAccount\":\"address of the smart account\"},\"returns\":{\"_0\":\"true if the module is initialized, false otherwise\"}},\"isModuleType(uint256)\":{\"params\":{\"typeID\":\"type of the module\"},\"returns\":{\"_0\":\"true if the type is a module type, false otherwise\"}},\"isValidSignatureWithSender(address,bytes32,bytes)\":{\"params\":{\"data\":\"bytes data containing the signatures\",\"hash\":\"bytes32 hash of the data\"},\"returns\":{\"_0\":\"bytes4 EIP1271_SUCCESS if the signature is valid, EIP1271_FAILED otherwise\"}},\"name()\":{\"returns\":{\"_0\":\"name of the module\"}},\"onInstall(bytes)\":{\"details\":\"data is encoded as follows: abi.encode(threshold, owners)\",\"params\":{\"data\":\"encoded data containing the threshold and owners\"}},\"onUninstall(bytes)\":{\"details\":\"the data parameter is not used\"},\"removeOwner(address,address)\":{\"details\":\"will revert if the owner is not added or the previous owner is invalid\",\"params\":{\"owner\":\"address of the owner to remove\",\"prevOwner\":\"address of the previous owner\"}},\"setThreshold(uint256)\":{\"details\":\"the function will revert if the module is not initialized\",\"params\":{\"_threshold\":\"uint256 threshold to set\"}},\"validateSignatureWithData(bytes32,bytes,bytes)\":{\"params\":{\"data\":\"bytes data containing the data\",\"hash\":\"bytes32 hash of the data\",\"signature\":\"bytes data containing the signatures\"},\"returns\":{\"_0\":\"bool true if the signature is valid, false otherwise\"}},\"validateUserOp((address,uint256,bytes,bytes,bytes32,uint256,bytes32,bytes,bytes),bytes32)\":{\"params\":{\"userOp\":\"PackedUserOperation struct containing the UserOperation\",\"userOpHash\":\"bytes32 hash of the UserOperation\"},\"returns\":{\"_0\":\"ValidationData the UserOperation validation result\"}},\"version()\":{\"returns\":{\"_0\":\"version of the module\"}}},\"title\":\"OwnableValidator\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"addOwner(address)\":{\"notice\":\"Adds an owner to the account\"},\"getOwners(address)\":{\"notice\":\"Returns the owners of the account\"},\"isInitialized(address)\":{\"notice\":\"Checks if the module is initialized\"},\"isModuleType(uint256)\":{\"notice\":\"Returns the type of the module\"},\"isValidSignatureWithSender(address,bytes32,bytes)\":{\"notice\":\"Validates an ERC-1271 signature with the sender\"},\"name()\":{\"notice\":\"Returns the name of the module\"},\"onInstall(bytes)\":{\"notice\":\"Initializes the module with the threshold and owners\"},\"onUninstall(bytes)\":{\"notice\":\"Handles the uninstallation of the module and clears the threshold and owners\"},\"removeOwner(address,address)\":{\"notice\":\"Removes an owner from the account\"},\"setThreshold(uint256)\":{\"notice\":\"Sets the threshold for the account\"},\"validateSignatureWithData(bytes32,bytes,bytes)\":{\"notice\":\"Validates a signature with the data (stateless validation)\"},\"validateUserOp((address,uint256,bytes,bytes,bytes32,uint256,bytes32,bytes,bytes),bytes32)\":{\"notice\":\"Validates a user operation\"},\"version()\":{\"notice\":\"Returns the version of the module\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/OwnableValidator/OwnableValidator.sol\":\"OwnableValidator\"},\"evmVersion\":\"cancun\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@ERC4337/=node_modules/@ERC4337/\",\":@erc7579/enumerablemap4337/=node_modules/@erc7579/enumerablemap4337/src/\",\":@gnosis.pm/=node_modules/@gnosis.pm/\",\":@openzeppelin/=node_modules/@openzeppelin/\",\":@prb/math/=node_modules/@prb/math/src/\",\":@rhinestone/=node_modules/@rhinestone/\",\":@safe-global/=node_modules/@safe-global/\",\":@webauthn/=node_modules/webauthn-sol/src/\",\":ExcessivelySafeCall/=node_modules/excessively-safe-call/src/\",\":FreshCryptoLib/=node_modules/FreshCryptoLib/solidity/src/\",\":account-abstraction-v0.6/=node_modules/@ERC4337/account-abstraction-v0.6/contracts/\",\":account-abstraction/=node_modules/@ERC4337/account-abstraction/contracts/\",\":checknsignatures/=node_modules/@rhinestone/checknsignatures/src/\",\":ds-test/=node_modules/ds-test/src/\",\":erc4337-validation/=node_modules/@rhinestone/erc4337-validation/src/\",\":excessively-safe-call/=node_modules/excessively-safe-call/\",\":flatbytes/=node_modules/@rhinestone/flatbytes/src/\",\":forge-std/=node_modules/forge-std/src/\",\":hardhat-deploy/=node_modules/hardhat-deploy/\",\":hardhat/=node_modules/hardhat/\",\":modulekit/=node_modules/@rhinestone/modulekit/src/\",\":sentinellist/=node_modules/@rhinestone/sentinellist/src/\",\":solady/=node_modules/solady/src/\",\":solarray/=node_modules/solarray/src/\",\":solmate/=node_modules/solmate/src/\",\":webauthn-sol/=node_modules/webauthn-sol/\",\"node_modules/webauthn-sol/src/:openzeppelin-contracts/=node_modules/@openzeppelin/\"]},\"sources\":{\"node_modules/@ERC4337/account-abstraction/contracts/core/EntryPoint.sol\":{\"keccak256\":\"0x87549d2e99e1dee6d6eab5b53bcb612014f22fa39818a443c90b7c577505cb44\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://e40dc804f53fe6cf45ac86d65df8a18ccb613ec966da56188b2509b8745ff98b\",\"dweb:/ipfs/QmXmpjRbJemM3jcKSHLLH8wMNrq3hCQtDEv4B9Wx6HjdCh\"]},\"node_modules/@ERC4337/account-abstraction/contracts/core/EntryPointSimulations.sol\":{\"keccak256\":\"0x22173c730ae4f6aa1fd0ab43ea9212debd1070e4c5835b6d3e50f96bf07771b3\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://ca711a75a06f2d641d1dc3491a0680ce091c5a50cb451b775e46db9e7190a441\",\"dweb:/ipfs/QmZUhDH7G9Sd7KbHswNKF81VYV8kJRr893Ur7z33aryj5V\"]},\"node_modules/@ERC4337/account-abstraction/contracts/core/GasDebug.sol\":{\"keccak256\":\"0x8c516bd5a7fe0a26523708518322045447c5275ace64f19800691eb980f69faf\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://1d4f4ed9fd4ea3b835205ea56f1572c73f32f26f815328b7eafc8630929abcac\",\"dweb:/ipfs/QmT9AMMdvv3vzxFRdRJrEcfus65dVPq512BiVx4E4qkggG\"]},\"node_modules/@ERC4337/account-abstraction/contracts/core/Helpers.sol\":{\"keccak256\":\"0x6247e011a6cb0b263b3aa098822977181674d91b62e5bdfe04c6e66f72da25d6\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://ca829a69b3fbc74fec8e140d42a2bf93bc3512609272f031c846470f61f0ab7e\",\"dweb:/ipfs/QmP3r3MBgAN39KeVB1rCGJWwcBcotNt26ALtAR54poQ1Jc\"]},\"node_modules/@ERC4337/account-abstraction/contracts/core/NonceManager.sol\":{\"keccak256\":\"0x1f951786ce6f171e7ed0242fee73ee4a205c7523404ee6cffca48b8c64ea5fe9\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://a602bf2274d478dae7a532cca31f8179131808c324cc26ece5c7e87c5a1015a6\",\"dweb:/ipfs/QmaaSyw5GGbAWzUhAPCtsb38P3MmaVr1ngp61PYHCU2a5a\"]},\"node_modules/@ERC4337/account-abstraction/contracts/core/SenderCreator.sol\":{\"keccak256\":\"0xeb95afb6e4cf921c1ed105ecb9f549ca46bee57f68acd1d2f4f84607ac0db5c5\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://d2ac91562f1fcabe4809a1b4256895efebcf46f89e08336a6c09ee2d29733238\",\"dweb:/ipfs/QmPsQnPcCzioPwVtUhxkbnwKPC1bnhHSbAwK9GXVpjN3mH\"]},\"node_modules/@ERC4337/account-abstraction/contracts/core/StakeManager.sol\":{\"keccak256\":\"0x673eb19600058d8642605ca409c9e1d4cab13735564b856270b92c330ffb1b8d\",\"license\":\"GPL-3.0-only\",\"urls\":[\"bzz-raw://06599c57c7075ee8eb5f1710fccca3eb322876b968ec271e1fb34af41510ab2c\",\"dweb:/ipfs/QmVsDEjmZYtzgXa4AYKxbQEYQVh6NBq8GmFJCariBUqK4G\"]},\"node_modules/@ERC4337/account-abstraction/contracts/core/UserOperationLib.sol\":{\"keccak256\":\"0x9d50ece985d35f82e33e5da417595c86fac10449e3d10895d08363d33aad454b\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://b1d11cc364c8bf7ed5388268c895b5ffed16e87dfbcb320ddeeba5e7974315dc\",\"dweb:/ipfs/QmYSpvjxEjweietQrYZagwQ52ipy7eXx4rwvnTzXKeGeMS\"]},\"node_modules/@ERC4337/account-abstraction/contracts/interfaces/IAccount.sol\":{\"keccak256\":\"0x38710bec0cb20ff4ceef46a80475b5bdabc27b7efd2687fd473db68332f61b78\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://dea7a723e1ef852e8764e69914a345d2e8bc5e13facfc9d5c29d791cb4ab0020\",\"dweb:/ipfs/QmU8dYgyF4DBJXFqjwLAtnE3q8q259ChfoEk9a6wyhHzEP\"]},\"node_modules/@ERC4337/account-abstraction/contracts/interfaces/IAccountExecute.sol\":{\"keccak256\":\"0xd3dc32dde1add1fb6377f939ceff6be31c2e21343522311f7b88db666be9ee6c\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://5b8f065171bd32e23b306868189c730f849ce6147f753c59e396e7afcf384577\",\"dweb:/ipfs/QmZpDRNEZ9YNgGgyLQo5yM4bB1FNbtnfDABsChbgSQKXUh\"]},\"node_modules/@ERC4337/account-abstraction/contracts/interfaces/IAggregator.sol\":{\"keccak256\":\"0xf100d6fcc0c3b450b13e979b6a42c628c292a1bc340eccc2e7796b80e3975588\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://192938b5b27234d35c8098a319e879363c79f750eea4d0e409dc889a8ce5b155\",\"dweb:/ipfs/QmURpaJFPqEtkKP2ngBsgZhAGN8wAWh5XQpYmCkiz4Urz5\"]},\"node_modules/@ERC4337/account-abstraction/contracts/interfaces/IEntryPoint.sol\":{\"keccak256\":\"0x1972a5fcb3a808b58c85af5741949ef6af11ab0debd3ae8c708171ae1ae0d0c4\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://baa9837ae73b9e2362a47d42d081d7c0f3d8e878e5edb381117d94a6968949c9\",\"dweb:/ipfs/QmUmo6FUE7fv5z1WzW1YFjxp8PqaeN2JrEee9au59w3Xhe\"]},\"node_modules/@ERC4337/account-abstraction/contracts/interfaces/IEntryPointSimulations.sol\":{\"keccak256\":\"0x454c515668b9088d000535fa162e1478b39d38a5c615baba2a6efe6ddb88509c\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://492fd691024b4424b2d47f43bc9fcdcf702868c5913eb741a472b496280355f3\",\"dweb:/ipfs/QmZZgGgzBtXbPWpVoBentShqYNfZ6FsRA9oNQcVHiXxCPh\"]},\"node_modules/@ERC4337/account-abstraction/contracts/interfaces/INonceManager.sol\":{\"keccak256\":\"0xd575af0f6ebbd5f0b2933307d44cd7b4e03a69f4b817a67db5409bd3c89aeecb\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://3b1e2dea9b05cfba9d13339ed16d96457dc861013cc4f3f35b71a80f82448db3\",\"dweb:/ipfs/QmVaGy5uGDMSiU2SzyokTjoHFyb39VVG5wtaM9KTnHyZSk\"]},\"node_modules/@ERC4337/account-abstraction/contracts/interfaces/IPaymaster.sol\":{\"keccak256\":\"0x49d8dbf8a85b006bcd89bbc40e4e9e113997cc016007de85263bdae70572d07f\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://bc0d83804c1b795d5c216b3518cd176c48f90db28550f267cbd89746d6b476c8\",\"dweb:/ipfs/QmNdCm4c6hnt7f6Q8q21QjtCNZWWRUaMVEYnQHEv68VnKt\"]},\"node_modules/@ERC4337/account-abstraction/contracts/interfaces/IStakeManager.sol\":{\"keccak256\":\"0xbe5ca9e7f254d031687419e7b96ef48c9c63e9398bbe992dc72ffc6dc14e0a04\",\"license\":\"GPL-3.0-only\",\"urls\":[\"bzz-raw://1fffec71c38627a26fabb423350148009579f092623fb02b471a12d973763a00\",\"dweb:/ipfs/QmRBi31QEYXHj3x1AnQ2jKa2eziZH1b9av396P3b4dw6bj\"]},\"node_modules/@ERC4337/account-abstraction/contracts/interfaces/PackedUserOperation.sol\":{\"keccak256\":\"0x1129b46381db68eddbc5cb49e50664667b66b03c480453858e7b25eabe444359\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://499a948aba60480dba6e25c763b8d918f1c246eb7a3302e04f493e080f3295be\",\"dweb:/ipfs/QmeRhhswf4NACcBKam2PyjpTP2ddSm648kah5kkQJsvwz3\"]},\"node_modules/@ERC4337/account-abstraction/contracts/utils/Exec.sol\":{\"keccak256\":\"0x86b1b1cd11158dddb9d381040c57fdc643c74b5e4eed3e7e036f32452672ad74\",\"license\":\"LGPL-3.0-only\",\"urls\":[\"bzz-raw://ad88663b6c76df73cf09a272cf333d038df7bb4c51281284b572bf9b46e1cd77\",\"dweb:/ipfs/QmVKxYF8avyPBtqejVhFCM2CuHsfpsCh7TsPqkBLtrgwJQ\"]},\"node_modules/@openzeppelin/contracts/utils/ReentrancyGuard.sol\":{\"keccak256\":\"0x11a5a79827df29e915a12740caf62fe21ebe27c08c9ae3e09abe9ee3ba3866d3\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://3cf0c69ab827e3251db9ee6a50647d62c90ba580a4d7bbff21f2bea39e7b2f4a\",\"dweb:/ipfs/QmZiKwtKU1SBX4RGfQtY7PZfiapbbu6SZ9vizGQD9UHjRA\"]},\"node_modules/@openzeppelin/contracts/utils/introspection/ERC165.sol\":{\"keccak256\":\"0xddce8e17e3d3f9ed818b4f4c4478a8262aab8b11ed322f1bf5ed705bb4bd97fa\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8084aa71a4cc7d2980972412a88fe4f114869faea3fefa5436431644eb5c0287\",\"dweb:/ipfs/Qmbqfs5dRdPvHVKY8kTaeyc65NdqXRQwRK7h9s5UJEhD1p\"]},\"node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x79796192ec90263f21b464d5bc90b777a525971d3de8232be80d9c4f9fb353b8\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://f6fda447a62815e8064f47eff0dd1cf58d9207ad69b5d32280f8d7ed1d1e4621\",\"dweb:/ipfs/QmfDRc7pxfaXB2Dh9np5Uf29Na3pQ7tafRS684wd3GLjVL\"]},\"node_modules/@rhinestone/checknsignatures/src/CheckNSignatures.sol\":{\"keccak256\":\"0xa7ebba59118cb54c70cf7654be78586889cee323b7659af4b66e7c7c808f18e0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6a668830d1a982e0497ff4aac55c30a128c2a29162e3cad8cc0144c39bafb85e\",\"dweb:/ipfs/QmeLRXa4tFzba8s6sawCAPdrbgsJFQyQzor8iU1vMPHgHJ\"]},\"node_modules/@rhinestone/modulekit/src/Modules.sol\":{\"keccak256\":\"0xf645c15937e85eb04e162798b9443467a363d4adfcfcf18a2c4d6b2b7f1afb84\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ed469757561cfad9da9aa361fd9c0a4697cf4fa37494143b38f6983fb662241c\",\"dweb:/ipfs/QmPYSVcdYk1NXLojCMKj14k3pvqBUfdPdn6Mt59YWiwZgT\"]},\"node_modules/@rhinestone/modulekit/src/accounts/common/interfaces/IERC7579Account.sol\":{\"keccak256\":\"0xdfa4eea2e7d608e6b3681d8caebb92c29fbcc9a09e1cec0ac45db52a77d7bea9\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://82cf46f8346867884d531139cffbbc62929e56e7a5e38bc7377dbe1566300417\",\"dweb:/ipfs/QmZSr9gaDe3sns3ai6ikr58ZYaBuhcdpzUZ2DWvDWhXYaJ\"]},\"node_modules/@rhinestone/modulekit/src/accounts/common/interfaces/IERC7579Module.sol\":{\"keccak256\":\"0xfee8bc6130ac2cbbdb3c5d28c2d9bc4611959039e7b63b4d089478446e07c70e\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://7656b57b1e9ab7c4ccde15ce2ffcf8d556cde092a12895a5ecb96b7108342bb2\",\"dweb:/ipfs/QmVx5pMfXULEgHb7iHgodwWLKEbEbQrPYLV6zE75rpsy5M\"]},\"node_modules/@rhinestone/modulekit/src/accounts/common/lib/ModeLib.sol\":{\"keccak256\":\"0x11b48cd992efe381edabe7fd70b8e9dc61e4eae683c696c44f37b625582d712a\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://5ba56d9bdba0f616da1728ceb19e4f34a3c085f46bfae413e297ab664d9a46e9\",\"dweb:/ipfs/QmbSXxis2vsCHupcBHv6hj5YHcqdQcrcmT73fNSqxrmGmN\"]},\"node_modules/@rhinestone/modulekit/src/accounts/erc7579/lib/ExecutionLib.sol\":{\"keccak256\":\"0x7f44dd6d3b30632196d6ce5195c9774db8ed6093b4b9492d2d93b0188a39d03e\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://80363d69d6fae4515be36f0656aad3b604f0adecb9739716173e89d965738d5b\",\"dweb:/ipfs/QmY2wndmRcSVjtkBR1s1Ynd3qsUzqnhbD3Yia4HxESxWo7\"]},\"node_modules/@rhinestone/modulekit/src/external/ERC4337.sol\":{\"keccak256\":\"0x3b618977f0270c023672951ec6851631b77f909149ff24aeadf9632a0f3e951f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://0fc0f8554c4cc57f8684523bef40f4fab20261f4ea417c3904011d4e23cf4709\",\"dweb:/ipfs/QmeR4ydYCGBG7tZ4dMA9GWoqNkBkqbGrbsmz7oZm7EnxCW\"]},\"node_modules/@rhinestone/modulekit/src/module-bases/ERC1271Policy.sol\":{\"keccak256\":\"0x57f200dfcbf437eeec106a5ecb22913cb8c56bb8c97df810aa95d5a9f40be555\",\"license\":\"AGPL-3.0-only\",\"urls\":[\"bzz-raw://4eec64a5618c4d756b409f0ba6d18c0513809d7343fa6f7197f723e7f5863530\",\"dweb:/ipfs/QmTUrwdifuKuiqQxbqtaNq6hijvUaDCz2fNSzauikuCcxk\"]},\"node_modules/@rhinestone/modulekit/src/module-bases/ERC7484RegistryAdapter.sol\":{\"keccak256\":\"0xd04ec510f52292bf4f4d28022107ccad6676c6633d9af9c98657be241a8a0b00\",\"license\":\"AGPL-3.0-only\",\"urls\":[\"bzz-raw://743d4945bb5575f80e07a943c183c85973b45804a27037205034e0051b821157\",\"dweb:/ipfs/QmZC7LEZUKMpsoADovf2ZmMypQNxfzGC7NXxg6Nt83m1Vu\"]},\"node_modules/@rhinestone/modulekit/src/module-bases/ERC7579ActionPolicy.sol\":{\"keccak256\":\"0x53e32f3a2a942012bbdb107fa998b08330af922190872334be6fdfe161b9953a\",\"license\":\"AGPL-3.0-only\",\"urls\":[\"bzz-raw://b280d3723ac6a854c28f07892686167fab227c2df95005bc4e26dd944ed47fa6\",\"dweb:/ipfs/QmQSeUTPyVEUV6nxGsk6TTMVNhX29tcDwvN4cZo69rwYod\"]},\"node_modules/@rhinestone/modulekit/src/module-bases/ERC7579ExecutorBase.sol\":{\"keccak256\":\"0x3bc15dbe5c06aef0eef2fd1bab501acd09eea55564d5a72c44dc87b2cd402452\",\"license\":\"AGPL-3.0-only\",\"urls\":[\"bzz-raw://25eee3dd1e6f6de598ddc18ac1592f9370bea153f407cfd9da9676a26abcdcf5\",\"dweb:/ipfs/QmQoHBTYW4E7UsfxN5ezSPhzooxGXxSQCQCYhMAf23Gyhk\"]},\"node_modules/@rhinestone/modulekit/src/module-bases/ERC7579FallbackBase.sol\":{\"keccak256\":\"0x51512f893cfd2f86e912e71ace40ff6c76f1bc1899067989a6e8dcfef974c2aa\",\"license\":\"AGPL-3.0-only\",\"urls\":[\"bzz-raw://38cc0f491095168dae886ca6c4a651a305e733160ed736a5115b6ae056913af5\",\"dweb:/ipfs/QmUZVCFY33GrEeuVmwLexEFQLMz9UYMCUWj4NoEBxHWTQL\"]},\"node_modules/@rhinestone/modulekit/src/module-bases/ERC7579HookBase.sol\":{\"keccak256\":\"0xaa3b73e5331af99e5ae5f2a1cd7638e39d23cf952cf27b21bc029afbf988d9a1\",\"license\":\"AGPL-3.0-only\",\"urls\":[\"bzz-raw://a3263e270433ec4b9680f2383e840d788e542555b80c7b86ac408b06964939f7\",\"dweb:/ipfs/QmQk7XmrtDTtkKhBMeomRWznPegJTM7ht12QdetwfjWUer\"]},\"node_modules/@rhinestone/modulekit/src/module-bases/ERC7579HookDestruct.sol\":{\"keccak256\":\"0xb7d1a8a4eee87b446ef2288da1913448e047f213ad347a1a6f5e5642a99f6453\",\"license\":\"AGPL-3.0-only\",\"urls\":[\"bzz-raw://a948a926cbd412bbb0806ef2105ddb72b2606f6b1fe05894e1925aa87e8147be\",\"dweb:/ipfs/QmPECjFWt73BfZD1wVRB4KcdDZwLJUGxpNNcgDtmpZpnLq\"]},\"node_modules/@rhinestone/modulekit/src/module-bases/ERC7579HybridValidatorBase.sol\":{\"keccak256\":\"0x0cd6cceced1db0ce9675e40f2fa3ef4117292b217105f94d879b3cdfa42b9ad5\",\"license\":\"AGPL-3.0-only\",\"urls\":[\"bzz-raw://9959eef2047910a56bd1240f717607060ae2633a065307f6ace7a60f73ea68c8\",\"dweb:/ipfs/QmT1YYdR2CuDAT7nVZLnCnZvxhiP2fqPTa9CgMDftLdPNy\"]},\"node_modules/@rhinestone/modulekit/src/module-bases/ERC7579ModuleBase.sol\":{\"keccak256\":\"0xb7c53d0c4d0f89e66f2515cbf0301b53eae618d31b1eeb265618ca5455b90635\",\"license\":\"AGPL-3.0-only\",\"urls\":[\"bzz-raw://a83a1289dad42538b822c0db93603088ca9a466cd264058003054d4e4c51bb22\",\"dweb:/ipfs/QmTt5sjJddkprDKaYJ3agCMFnY2dCKLBBCoCfHBBrm7Zvd\"]},\"node_modules/@rhinestone/modulekit/src/module-bases/ERC7579PolicyBase.sol\":{\"keccak256\":\"0xcb718e2571d570c41c8743df9cb5024b59070c2c7d53bcd5f12fc074872a5ac9\",\"license\":\"AGPL-3.0-only\",\"urls\":[\"bzz-raw://bf145b5430ff9119c34e67a3dc7bf7c7f3cb790b1c23370bb11a8325f74a5e5c\",\"dweb:/ipfs/QmddY22ziXCicJPWzLPDnoUxKyGdBH18jPdqU96XVjEtMU\"]},\"node_modules/@rhinestone/modulekit/src/module-bases/ERC7579StatelessValidatorBase.sol\":{\"keccak256\":\"0xa48e6c5c489141edf3512b7c323f1287d4a62d7f8599c8c50fb5ed39086be608\",\"license\":\"AGPL-3.0-only\",\"urls\":[\"bzz-raw://f7c3cd5ce3d02ce5bb4733df1ef599fd36d1ca01dee27981701e8fe5b725fcf2\",\"dweb:/ipfs/QmU9U1RHsHCGDnMVCkwXoBbtqGmBP6grh5ovV9YsXw6svx\"]},\"node_modules/@rhinestone/modulekit/src/module-bases/ERC7579UserOpPolicy.sol\":{\"keccak256\":\"0xc8b26e65beb6964a536c03b4eb6d075df76a80c774ed2ae40e66c7b36a10fe41\",\"license\":\"AGPL-3.0-only\",\"urls\":[\"bzz-raw://b719036038aa616a25f5551a9c52d385bb1c168874e94535170364d21e02476a\",\"dweb:/ipfs/QmUrZNVjbADJQGyhPh6akNAsRBixYgyjgyX2DrBdZm5KNh\"]},\"node_modules/@rhinestone/modulekit/src/module-bases/ERC7579ValidatorBase.sol\":{\"keccak256\":\"0x5a85c53cea028a03a6c6aa005f475d7241a9b120c21e4e773a9e9b5084c18428\",\"license\":\"AGPL-3.0-only\",\"urls\":[\"bzz-raw://79ef9f1b63888e7792ddf70335f086c06676ad6e13a750648fa7f69773764916\",\"dweb:/ipfs/QmTjVVefugMU5BdXgdEccmS352Ah9nn1KCPNiCyyhugcfP\"]},\"node_modules/@rhinestone/modulekit/src/module-bases/SchedulingBase.sol\":{\"keccak256\":\"0xed8224ace5d41ef74ff399440d45313e95dc1930d6ee559833c07e8a66a11b16\",\"license\":\"AGPL-3.0-only\",\"urls\":[\"bzz-raw://a61855e4743b1f4869c5738ac9314ab06d109b346f6986c740b8af8c99aed5b0\",\"dweb:/ipfs/QmWVDTC71MpUWwUV6fj9mehB2u3wZ2zwRrGkmYjtmf1bV2\"]},\"node_modules/@rhinestone/modulekit/src/module-bases/interfaces/IERC7484.sol\":{\"keccak256\":\"0xb4c149815fe8a943201d145d5ba6bd494560785db764b180559c8cd11a8048fc\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c1687a18731256611519cef74491665a4ec374c3185a56b0fa5f250ce70bb850\",\"dweb:/ipfs/QmRvSU1drCoC94jUZZh5eG3gaRLR29zAAvyGxHRRAnbWme\"]},\"node_modules/@rhinestone/modulekit/src/module-bases/interfaces/IPolicy.sol\":{\"keccak256\":\"0x096e3f9850d1b05ffc9c057fd3380006e1fbabaa11148d3790a12dd924b543d0\",\"license\":\"LGPL-3.0-only\",\"urls\":[\"bzz-raw://5b97d9829d02661726d351783e3093d2cd5b2a518fdbaf9d7eee5787b183cf0a\",\"dweb:/ipfs/QmWPS64aZjRxNYizTMMFJGQgjygdaKfAnUEzyuMHJFrRTB\"]},\"node_modules/@rhinestone/modulekit/src/module-bases/interfaces/IStatelessValidator.sol\":{\"keccak256\":\"0x7a217ecb0c1a99eda30bded8adf5bb0dcc0e89e078c847fd9f1eeab0b928dc1e\",\"license\":\"AGPL-3.0-only\",\"urls\":[\"bzz-raw://29c4d6b519b608c0ad0f4a0115ab71d1b5d056702db05bc1c9571944d2770ce6\",\"dweb:/ipfs/QmbJTThHy3ympkLUUdAuxYwy8j4XGy7f3HHGcE6HzW73gc\"]},\"node_modules/@rhinestone/modulekit/src/module-bases/utils/ERC7579Constants.sol\":{\"keccak256\":\"0xcc1e1cad832005b57588f1fb216ed0424f2c20cb2e55001d96a198f9a5c4d4ad\",\"license\":\"AGPL-3.0-only\",\"urls\":[\"bzz-raw://12c88dc886effaafa389a72299f98b64f7b8ae87c430eb65d3780b821ea54178\",\"dweb:/ipfs/QmQaNc2NQGz2MPcYBLaZdAHLngEWiYwffQ64bxEetZH3mb\"]},\"node_modules/@rhinestone/modulekit/src/module-bases/utils/TrustedForwarder.sol\":{\"keccak256\":\"0x9b61fc17327922e85ac6ae0eb00836b09315dad2b297f1fed8f193b13bcee7c3\",\"license\":\"AGPL-3.0-only\",\"urls\":[\"bzz-raw://60d43af97695deba72f172ac4dd6402c7818ad52c5dd503fd8aac70ff566de7d\",\"dweb:/ipfs/QmdnbFF7bzBcowpotmPawFBrsVZqCw4tnFb5qc366vJMYo\"]},\"node_modules/@rhinestone/sentinellist/src/SentinelList4337.sol\":{\"keccak256\":\"0x21cbe60aac0ddd77dd8430d96b6b59c6e31eeee5918c4097aecf594e9fc0fa64\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://e2e6bffd163bf1f406ba14388f5cc94e419d976087fc008a7028e9d6e2396643\",\"dweb:/ipfs/QmQ2ipNcRMpyE4kaHqio4TEoDMNTVkSTuFbzFScfPhoFVk\"]},\"node_modules/forge-std/src/interfaces/IERC165.sol\":{\"keccak256\":\"0x414b2861b1acbf816ccb7346d3f16cf6c1e002e9e5e40d2f1f26fa5ddc2ea600\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://698352fb240868ea8f1d1fe389993035eeab930f10d06934f80ccfb2b6ccbfbc\",\"dweb:/ipfs/QmT6WLHAgXxFhh12kWym895oTzXid1326iZiwT3pyfggoT\"]},\"node_modules/solady/src/utils/ECDSA.sol\":{\"keccak256\":\"0xb0754260daabfe6f20dd16f2213823f27c8df1089b43c8eda9b3c2a6eca07478\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ffef4ca363ec0e2437b5e195fbb3d58bdc6750921fce32f351ca1c092ad36a75\",\"dweb:/ipfs/QmTcnAyxwvQg3h357PdB8S8oz5bBt85J4SvEgmMqwAfPKF\"]},\"node_modules/solady/src/utils/LibSort.sol\":{\"keccak256\":\"0x3fc758c5e83f389058e156537c060ff0d952b82c767ecebf8047b698cfc7ffb1\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://e09190e7b4e67a6fdb7da01448229fd69207e0249ff1b910ef6b10ce4aa21f76\",\"dweb:/ipfs/QmW7uGJq7vE94sC4VGFuHfxTmDGZdqWLBjR43FuTwgin9R\"]},\"node_modules/solady/src/utils/SignatureCheckerLib.sol\":{\"keccak256\":\"0x098c7eb88b3048f227b240e0e5bf1da4a8f7622b30f6d7c06416bfcab3225e77\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://50c2766f652916c5d6433665fb1c3b2f04c3d9292a35c12e0f8d7c71dd6438cb\",\"dweb:/ipfs/QmWTMwN2RDZUUPg7KkH1qFBjTSh84Zw8bbYwRBCQUtLN2h\"]},\"src/OwnableValidator/OwnableValidator.sol\":{\"keccak256\":\"0x0d7e238e2f206730c1a438ba3db3d50e134f0bb8fe95fde0f15cd9832ae3698c\",\"license\":\"AGPL-3.0-only\",\"urls\":[\"bzz-raw://88b8c7c643c6d82583cfd8a50a029e1836390d48d3097a268d64c695e648dc82\",\"dweb:/ipfs/QmcKu6EdEYQUez8ke6y4kXMAh7XbVoWVeXnBp1HQsPawio\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.28+commit.7893614a"},"language":"Solidity","output":{"abi":[{"inputs":[],"type":"error","name":"CannotRemoveOwner"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"type":"error","name":"InvalidOwner"},{"inputs":[],"type":"error","name":"InvalidSignature"},{"inputs":[],"type":"error","name":"InvalidThreshold"},{"inputs":[],"type":"error","name":"LinkedList_AlreadyInitialized"},{"inputs":[{"internalType":"address","name":"entry","type":"address"}],"type":"error","name":"LinkedList_EntryAlreadyInList"},{"inputs":[{"internalType":"address","name":"entry","type":"address"}],"type":"error","name":"LinkedList_InvalidEntry"},{"inputs":[],"type":"error","name":"LinkedList_InvalidPage"},{"inputs":[],"type":"error","name":"MaxOwnersReached"},{"inputs":[{"internalType":"address","name":"smartAccount","type":"address"}],"type":"error","name":"ModuleAlreadyInitialized"},{"inputs":[{"internalType":"address","name":"smartAccount","type":"address"}],"type":"error","name":"NotInitialized"},{"inputs":[],"type":"error","name":"NotSortedAndUnique"},{"inputs":[],"type":"error","name":"ThresholdNotSet"},{"inputs":[{"internalType":"address","name":"account","type":"address","indexed":true}],"type":"event","name":"ModuleInitialized","anonymous":false},{"inputs":[{"internalType":"address","name":"account","type":"address","indexed":true}],"type":"event","name":"ModuleUninitialized","anonymous":false},{"inputs":[{"internalType":"address","name":"account","type":"address","indexed":true},{"internalType":"address","name":"owner","type":"address","indexed":true}],"type":"event","name":"OwnerAdded","anonymous":false},{"inputs":[{"internalType":"address","name":"account","type":"address","indexed":true},{"internalType":"address","name":"owner","type":"address","indexed":true}],"type":"event","name":"OwnerRemoved","anonymous":false},{"inputs":[{"internalType":"address","name":"account","type":"address","indexed":true},{"internalType":"uint256","name":"threshold","type":"uint256","indexed":false}],"type":"event","name":"ThresholdSet","anonymous":false},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"addOwner"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"stateMutability":"view","type":"function","name":"getOwners","outputs":[{"internalType":"address[]","name":"ownersArray","type":"address[]"}]},{"inputs":[{"internalType":"address","name":"smartAccount","type":"address"}],"stateMutability":"view","type":"function","name":"isInitialized","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"uint256","name":"typeID","type":"uint256"}],"stateMutability":"pure","type":"function","name":"isModuleType","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"bytes32","name":"hash","type":"bytes32"},{"internalType":"bytes","name":"data","type":"bytes"}],"stateMutability":"view","type":"function","name":"isValidSignatureWithSender","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}]},{"inputs":[],"stateMutability":"pure","type":"function","name":"name","outputs":[{"internalType":"string","name":"","type":"string"}]},{"inputs":[{"internalType":"bytes","name":"data","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"onInstall"},{"inputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"onUninstall"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function","name":"ownerCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"address","name":"prevOwner","type":"address"},{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"removeOwner"},{"inputs":[{"internalType":"uint256","name":"_threshold","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"setThreshold"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"stateMutability":"view","type":"function","name":"threshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"bytes32","name":"hash","type":"bytes32"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"bytes","name":"data","type":"bytes"}],"stateMutability":"view","type":"function","name":"validateSignatureWithData","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"struct PackedUserOperation","name":"userOp","type":"tuple","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":"bytes32","name":"accountGasLimits","type":"bytes32"},{"internalType":"uint256","name":"preVerificationGas","type":"uint256"},{"internalType":"bytes32","name":"gasFees","type":"bytes32"},{"internalType":"bytes","name":"paymasterAndData","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}]},{"internalType":"bytes32","name":"userOpHash","type":"bytes32"}],"stateMutability":"view","type":"function","name":"validateUserOp","outputs":[{"internalType":"ERC7579ValidatorBase.ValidationData","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"pure","type":"function","name":"version","outputs":[{"internalType":"string","name":"","type":"string"}]}],"devdoc":{"kind":"dev","methods":{"addOwner(address)":{"details":"will revert if the owner is already added","params":{"owner":"address of the owner to add"}},"getOwners(address)":{"params":{"account":"address of the account"},"returns":{"ownersArray":"array of owners"}},"isInitialized(address)":{"params":{"smartAccount":"address of the smart account"},"returns":{"_0":"true if the module is initialized, false otherwise"}},"isModuleType(uint256)":{"params":{"typeID":"type of the module"},"returns":{"_0":"true if the type is a module type, false otherwise"}},"isValidSignatureWithSender(address,bytes32,bytes)":{"params":{"data":"bytes data containing the signatures","hash":"bytes32 hash of the data"},"returns":{"_0":"bytes4 EIP1271_SUCCESS if the signature is valid, EIP1271_FAILED otherwise"}},"name()":{"returns":{"_0":"name of the module"}},"onInstall(bytes)":{"details":"data is encoded as follows: abi.encode(threshold, owners)","params":{"data":"encoded data containing the threshold and owners"}},"onUninstall(bytes)":{"details":"the data parameter is not used"},"removeOwner(address,address)":{"details":"will revert if the owner is not added or the previous owner is invalid","params":{"owner":"address of the owner to remove","prevOwner":"address of the previous owner"}},"setThreshold(uint256)":{"details":"the function will revert if the module is not initialized","params":{"_threshold":"uint256 threshold to set"}},"validateSignatureWithData(bytes32,bytes,bytes)":{"params":{"data":"bytes data containing the data","hash":"bytes32 hash of the data","signature":"bytes data containing the signatures"},"returns":{"_0":"bool true if the signature is valid, false otherwise"}},"validateUserOp((address,uint256,bytes,bytes,bytes32,uint256,bytes32,bytes,bytes),bytes32)":{"params":{"userOp":"PackedUserOperation struct containing the UserOperation","userOpHash":"bytes32 hash of the UserOperation"},"returns":{"_0":"ValidationData the UserOperation validation result"}},"version()":{"returns":{"_0":"version of the module"}}},"version":1},"userdoc":{"kind":"user","methods":{"addOwner(address)":{"notice":"Adds an owner to the account"},"getOwners(address)":{"notice":"Returns the owners of the account"},"isInitialized(address)":{"notice":"Checks if the module is initialized"},"isModuleType(uint256)":{"notice":"Returns the type of the module"},"isValidSignatureWithSender(address,bytes32,bytes)":{"notice":"Validates an ERC-1271 signature with the sender"},"name()":{"notice":"Returns the name of the module"},"onInstall(bytes)":{"notice":"Initializes the module with the threshold and owners"},"onUninstall(bytes)":{"notice":"Handles the uninstallation of the module and clears the threshold and owners"},"removeOwner(address,address)":{"notice":"Removes an owner from the account"},"setThreshold(uint256)":{"notice":"Sets the threshold for the account"},"validateSignatureWithData(bytes32,bytes,bytes)":{"notice":"Validates a signature with the data (stateless validation)"},"validateUserOp((address,uint256,bytes,bytes,bytes32,uint256,bytes32,bytes,bytes),bytes32)":{"notice":"Validates a user operation"},"version()":{"notice":"Returns the version of the module"}},"version":1}},"settings":{"remappings":["@ERC4337/=node_modules/@ERC4337/","@erc7579/enumerablemap4337/=node_modules/@erc7579/enumerablemap4337/src/","@gnosis.pm/=node_modules/@gnosis.pm/","@openzeppelin/=node_modules/@openzeppelin/","@prb/math/=node_modules/@prb/math/src/","@rhinestone/=node_modules/@rhinestone/","@safe-global/=node_modules/@safe-global/","@webauthn/=node_modules/webauthn-sol/src/","ExcessivelySafeCall/=node_modules/excessively-safe-call/src/","FreshCryptoLib/=node_modules/FreshCryptoLib/solidity/src/","account-abstraction-v0.6/=node_modules/@ERC4337/account-abstraction-v0.6/contracts/","account-abstraction/=node_modules/@ERC4337/account-abstraction/contracts/","checknsignatures/=node_modules/@rhinestone/checknsignatures/src/","ds-test/=node_modules/ds-test/src/","erc4337-validation/=node_modules/@rhinestone/erc4337-validation/src/","excessively-safe-call/=node_modules/excessively-safe-call/","flatbytes/=node_modules/@rhinestone/flatbytes/src/","forge-std/=node_modules/forge-std/src/","hardhat-deploy/=node_modules/hardhat-deploy/","hardhat/=node_modules/hardhat/","modulekit/=node_modules/@rhinestone/modulekit/src/","sentinellist/=node_modules/@rhinestone/sentinellist/src/","solady/=node_modules/solady/src/","solarray/=node_modules/solarray/src/","solmate/=node_modules/solmate/src/","webauthn-sol/=node_modules/webauthn-sol/","node_modules/webauthn-sol/src/:openzeppelin-contracts/=node_modules/@openzeppelin/"],"optimizer":{"enabled":false,"runs":200},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"src/OwnableValidator/OwnableValidator.sol":"OwnableValidator"},"evmVersion":"cancun","libraries":{}},"sources":{"node_modules/@ERC4337/account-abstraction/contracts/core/EntryPoint.sol":{"keccak256":"0x87549d2e99e1dee6d6eab5b53bcb612014f22fa39818a443c90b7c577505cb44","urls":["bzz-raw://e40dc804f53fe6cf45ac86d65df8a18ccb613ec966da56188b2509b8745ff98b","dweb:/ipfs/QmXmpjRbJemM3jcKSHLLH8wMNrq3hCQtDEv4B9Wx6HjdCh"],"license":"GPL-3.0"},"node_modules/@ERC4337/account-abstraction/contracts/core/EntryPointSimulations.sol":{"keccak256":"0x22173c730ae4f6aa1fd0ab43ea9212debd1070e4c5835b6d3e50f96bf07771b3","urls":["bzz-raw://ca711a75a06f2d641d1dc3491a0680ce091c5a50cb451b775e46db9e7190a441","dweb:/ipfs/QmZUhDH7G9Sd7KbHswNKF81VYV8kJRr893Ur7z33aryj5V"],"license":"GPL-3.0"},"node_modules/@ERC4337/account-abstraction/contracts/core/GasDebug.sol":{"keccak256":"0x8c516bd5a7fe0a26523708518322045447c5275ace64f19800691eb980f69faf","urls":["bzz-raw://1d4f4ed9fd4ea3b835205ea56f1572c73f32f26f815328b7eafc8630929abcac","dweb:/ipfs/QmT9AMMdvv3vzxFRdRJrEcfus65dVPq512BiVx4E4qkggG"],"license":"GPL-3.0"},"node_modules/@ERC4337/account-abstraction/contracts/core/Helpers.sol":{"keccak256":"0x6247e011a6cb0b263b3aa098822977181674d91b62e5bdfe04c6e66f72da25d6","urls":["bzz-raw://ca829a69b3fbc74fec8e140d42a2bf93bc3512609272f031c846470f61f0ab7e","dweb:/ipfs/QmP3r3MBgAN39KeVB1rCGJWwcBcotNt26ALtAR54poQ1Jc"],"license":"GPL-3.0"},"node_modules/@ERC4337/account-abstraction/contracts/core/NonceManager.sol":{"keccak256":"0x1f951786ce6f171e7ed0242fee73ee4a205c7523404ee6cffca48b8c64ea5fe9","urls":["bzz-raw://a602bf2274d478dae7a532cca31f8179131808c324cc26ece5c7e87c5a1015a6","dweb:/ipfs/QmaaSyw5GGbAWzUhAPCtsb38P3MmaVr1ngp61PYHCU2a5a"],"license":"GPL-3.0"},"node_modules/@ERC4337/account-abstraction/contracts/core/SenderCreator.sol":{"keccak256":"0xeb95afb6e4cf921c1ed105ecb9f549ca46bee57f68acd1d2f4f84607ac0db5c5","urls":["bzz-raw://d2ac91562f1fcabe4809a1b4256895efebcf46f89e08336a6c09ee2d29733238","dweb:/ipfs/QmPsQnPcCzioPwVtUhxkbnwKPC1bnhHSbAwK9GXVpjN3mH"],"license":"GPL-3.0"},"node_modules/@ERC4337/account-abstraction/contracts/core/StakeManager.sol":{"keccak256":"0x673eb19600058d8642605ca409c9e1d4cab13735564b856270b92c330ffb1b8d","urls":["bzz-raw://06599c57c7075ee8eb5f1710fccca3eb322876b968ec271e1fb34af41510ab2c","dweb:/ipfs/QmVsDEjmZYtzgXa4AYKxbQEYQVh6NBq8GmFJCariBUqK4G"],"license":"GPL-3.0-only"},"node_modules/@ERC4337/account-abstraction/contracts/core/UserOperationLib.sol":{"keccak256":"0x9d50ece985d35f82e33e5da417595c86fac10449e3d10895d08363d33aad454b","urls":["bzz-raw://b1d11cc364c8bf7ed5388268c895b5ffed16e87dfbcb320ddeeba5e7974315dc","dweb:/ipfs/QmYSpvjxEjweietQrYZagwQ52ipy7eXx4rwvnTzXKeGeMS"],"license":"GPL-3.0"},"node_modules/@ERC4337/account-abstraction/contracts/interfaces/IAccount.sol":{"keccak256":"0x38710bec0cb20ff4ceef46a80475b5bdabc27b7efd2687fd473db68332f61b78","urls":["bzz-raw://dea7a723e1ef852e8764e69914a345d2e8bc5e13facfc9d5c29d791cb4ab0020","dweb:/ipfs/QmU8dYgyF4DBJXFqjwLAtnE3q8q259ChfoEk9a6wyhHzEP"],"license":"GPL-3.0"},"node_modules/@ERC4337/account-abstraction/contracts/interfaces/IAccountExecute.sol":{"keccak256":"0xd3dc32dde1add1fb6377f939ceff6be31c2e21343522311f7b88db666be9ee6c","urls":["bzz-raw://5b8f065171bd32e23b306868189c730f849ce6147f753c59e396e7afcf384577","dweb:/ipfs/QmZpDRNEZ9YNgGgyLQo5yM4bB1FNbtnfDABsChbgSQKXUh"],"license":"GPL-3.0"},"node_modules/@ERC4337/account-abstraction/contracts/interfaces/IAggregator.sol":{"keccak256":"0xf100d6fcc0c3b450b13e979b6a42c628c292a1bc340eccc2e7796b80e3975588","urls":["bzz-raw://192938b5b27234d35c8098a319e879363c79f750eea4d0e409dc889a8ce5b155","dweb:/ipfs/QmURpaJFPqEtkKP2ngBsgZhAGN8wAWh5XQpYmCkiz4Urz5"],"license":"GPL-3.0"},"node_modules/@ERC4337/account-abstraction/contracts/interfaces/IEntryPoint.sol":{"keccak256":"0x1972a5fcb3a808b58c85af5741949ef6af11ab0debd3ae8c708171ae1ae0d0c4","urls":["bzz-raw://baa9837ae73b9e2362a47d42d081d7c0f3d8e878e5edb381117d94a6968949c9","dweb:/ipfs/QmUmo6FUE7fv5z1WzW1YFjxp8PqaeN2JrEee9au59w3Xhe"],"license":"GPL-3.0"},"node_modules/@ERC4337/account-abstraction/contracts/interfaces/IEntryPointSimulations.sol":{"keccak256":"0x454c515668b9088d000535fa162e1478b39d38a5c615baba2a6efe6ddb88509c","urls":["bzz-raw://492fd691024b4424b2d47f43bc9fcdcf702868c5913eb741a472b496280355f3","dweb:/ipfs/QmZZgGgzBtXbPWpVoBentShqYNfZ6FsRA9oNQcVHiXxCPh"],"license":"GPL-3.0"},"node_modules/@ERC4337/account-abstraction/contracts/interfaces/INonceManager.sol":{"keccak256":"0xd575af0f6ebbd5f0b2933307d44cd7b4e03a69f4b817a67db5409bd3c89aeecb","urls":["bzz-raw://3b1e2dea9b05cfba9d13339ed16d96457dc861013cc4f3f35b71a80f82448db3","dweb:/ipfs/QmVaGy5uGDMSiU2SzyokTjoHFyb39VVG5wtaM9KTnHyZSk"],"license":"GPL-3.0"},"node_modules/@ERC4337/account-abstraction/contracts/interfaces/IPaymaster.sol":{"keccak256":"0x49d8dbf8a85b006bcd89bbc40e4e9e113997cc016007de85263bdae70572d07f","urls":["bzz-raw://bc0d83804c1b795d5c216b3518cd176c48f90db28550f267cbd89746d6b476c8","dweb:/ipfs/QmNdCm4c6hnt7f6Q8q21QjtCNZWWRUaMVEYnQHEv68VnKt"],"license":"GPL-3.0"},"node_modules/@ERC4337/account-abstraction/contracts/interfaces/IStakeManager.sol":{"keccak256":"0xbe5ca9e7f254d031687419e7b96ef48c9c63e9398bbe992dc72ffc6dc14e0a04","urls":["bzz-raw://1fffec71c38627a26fabb423350148009579f092623fb02b471a12d973763a00","dweb:/ipfs/QmRBi31QEYXHj3x1AnQ2jKa2eziZH1b9av396P3b4dw6bj"],"license":"GPL-3.0-only"},"node_modules/@ERC4337/account-abstraction/contracts/interfaces/PackedUserOperation.sol":{"keccak256":"0x1129b46381db68eddbc5cb49e50664667b66b03c480453858e7b25eabe444359","urls":["bzz-raw://499a948aba60480dba6e25c763b8d918f1c246eb7a3302e04f493e080f3295be","dweb:/ipfs/QmeRhhswf4NACcBKam2PyjpTP2ddSm648kah5kkQJsvwz3"],"license":"GPL-3.0"},"node_modules/@ERC4337/account-abstraction/contracts/utils/Exec.sol":{"keccak256":"0x86b1b1cd11158dddb9d381040c57fdc643c74b5e4eed3e7e036f32452672ad74","urls":["bzz-raw://ad88663b6c76df73cf09a272cf333d038df7bb4c51281284b572bf9b46e1cd77","dweb:/ipfs/QmVKxYF8avyPBtqejVhFCM2CuHsfpsCh7TsPqkBLtrgwJQ"],"license":"LGPL-3.0-only"},"node_modules/@openzeppelin/contracts/utils/ReentrancyGuard.sol":{"keccak256":"0x11a5a79827df29e915a12740caf62fe21ebe27c08c9ae3e09abe9ee3ba3866d3","urls":["bzz-raw://3cf0c69ab827e3251db9ee6a50647d62c90ba580a4d7bbff21f2bea39e7b2f4a","dweb:/ipfs/QmZiKwtKU1SBX4RGfQtY7PZfiapbbu6SZ9vizGQD9UHjRA"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0xddce8e17e3d3f9ed818b4f4c4478a8262aab8b11ed322f1bf5ed705bb4bd97fa","urls":["bzz-raw://8084aa71a4cc7d2980972412a88fe4f114869faea3fefa5436431644eb5c0287","dweb:/ipfs/Qmbqfs5dRdPvHVKY8kTaeyc65NdqXRQwRK7h9s5UJEhD1p"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x79796192ec90263f21b464d5bc90b777a525971d3de8232be80d9c4f9fb353b8","urls":["bzz-raw://f6fda447a62815e8064f47eff0dd1cf58d9207ad69b5d32280f8d7ed1d1e4621","dweb:/ipfs/QmfDRc7pxfaXB2Dh9np5Uf29Na3pQ7tafRS684wd3GLjVL"],"license":"MIT"},"node_modules/@rhinestone/checknsignatures/src/CheckNSignatures.sol":{"keccak256":"0xa7ebba59118cb54c70cf7654be78586889cee323b7659af4b66e7c7c808f18e0","urls":["bzz-raw://6a668830d1a982e0497ff4aac55c30a128c2a29162e3cad8cc0144c39bafb85e","dweb:/ipfs/QmeLRXa4tFzba8s6sawCAPdrbgsJFQyQzor8iU1vMPHgHJ"],"license":"MIT"},"node_modules/@rhinestone/modulekit/src/Modules.sol":{"keccak256":"0xf645c15937e85eb04e162798b9443467a363d4adfcfcf18a2c4d6b2b7f1afb84","urls":["bzz-raw://ed469757561cfad9da9aa361fd9c0a4697cf4fa37494143b38f6983fb662241c","dweb:/ipfs/QmPYSVcdYk1NXLojCMKj14k3pvqBUfdPdn6Mt59YWiwZgT"],"license":"MIT"},"node_modules/@rhinestone/modulekit/src/accounts/common/interfaces/IERC7579Account.sol":{"keccak256":"0xdfa4eea2e7d608e6b3681d8caebb92c29fbcc9a09e1cec0ac45db52a77d7bea9","urls":["bzz-raw://82cf46f8346867884d531139cffbbc62929e56e7a5e38bc7377dbe1566300417","dweb:/ipfs/QmZSr9gaDe3sns3ai6ikr58ZYaBuhcdpzUZ2DWvDWhXYaJ"],"license":"MIT"},"node_modules/@rhinestone/modulekit/src/accounts/common/interfaces/IERC7579Module.sol":{"keccak256":"0xfee8bc6130ac2cbbdb3c5d28c2d9bc4611959039e7b63b4d089478446e07c70e","urls":["bzz-raw://7656b57b1e9ab7c4ccde15ce2ffcf8d556cde092a12895a5ecb96b7108342bb2","dweb:/ipfs/QmVx5pMfXULEgHb7iHgodwWLKEbEbQrPYLV6zE75rpsy5M"],"license":"MIT"},"node_modules/@rhinestone/modulekit/src/accounts/common/lib/ModeLib.sol":{"keccak256":"0x11b48cd992efe381edabe7fd70b8e9dc61e4eae683c696c44f37b625582d712a","urls":["bzz-raw://5ba56d9bdba0f616da1728ceb19e4f34a3c085f46bfae413e297ab664d9a46e9","dweb:/ipfs/QmbSXxis2vsCHupcBHv6hj5YHcqdQcrcmT73fNSqxrmGmN"],"license":"GPL-3.0"},"node_modules/@rhinestone/modulekit/src/accounts/erc7579/lib/ExecutionLib.sol":{"keccak256":"0x7f44dd6d3b30632196d6ce5195c9774db8ed6093b4b9492d2d93b0188a39d03e","urls":["bzz-raw://80363d69d6fae4515be36f0656aad3b604f0adecb9739716173e89d965738d5b","dweb:/ipfs/QmY2wndmRcSVjtkBR1s1Ynd3qsUzqnhbD3Yia4HxESxWo7"],"license":"MIT"},"node_modules/@rhinestone/modulekit/src/external/ERC4337.sol":{"keccak256":"0x3b618977f0270c023672951ec6851631b77f909149ff24aeadf9632a0f3e951f","urls":["bzz-raw://0fc0f8554c4cc57f8684523bef40f4fab20261f4ea417c3904011d4e23cf4709","dweb:/ipfs/QmeR4ydYCGBG7tZ4dMA9GWoqNkBkqbGrbsmz7oZm7EnxCW"],"license":"MIT"},"node_modules/@rhinestone/modulekit/src/module-bases/ERC1271Policy.sol":{"keccak256":"0x57f200dfcbf437eeec106a5ecb22913cb8c56bb8c97df810aa95d5a9f40be555","urls":["bzz-raw://4eec64a5618c4d756b409f0ba6d18c0513809d7343fa6f7197f723e7f5863530","dweb:/ipfs/QmTUrwdifuKuiqQxbqtaNq6hijvUaDCz2fNSzauikuCcxk"],"license":"AGPL-3.0-only"},"node_modules/@rhinestone/modulekit/src/module-bases/ERC7484RegistryAdapter.sol":{"keccak256":"0xd04ec510f52292bf4f4d28022107ccad6676c6633d9af9c98657be241a8a0b00","urls":["bzz-raw://743d4945bb5575f80e07a943c183c85973b45804a27037205034e0051b821157","dweb:/ipfs/QmZC7LEZUKMpsoADovf2ZmMypQNxfzGC7NXxg6Nt83m1Vu"],"license":"AGPL-3.0-only"},"node_modules/@rhinestone/modulekit/src/module-bases/ERC7579ActionPolicy.sol":{"keccak256":"0x53e32f3a2a942012bbdb107fa998b08330af922190872334be6fdfe161b9953a","urls":["bzz-raw://b280d3723ac6a854c28f07892686167fab227c2df95005bc4e26dd944ed47fa6","dweb:/ipfs/QmQSeUTPyVEUV6nxGsk6TTMVNhX29tcDwvN4cZo69rwYod"],"license":"AGPL-3.0-only"},"node_modules/@rhinestone/modulekit/src/module-bases/ERC7579ExecutorBase.sol":{"keccak256":"0x3bc15dbe5c06aef0eef2fd1bab501acd09eea55564d5a72c44dc87b2cd402452","urls":["bzz-raw://25eee3dd1e6f6de598ddc18ac1592f9370bea153f407cfd9da9676a26abcdcf5","dweb:/ipfs/QmQoHBTYW4E7UsfxN5ezSPhzooxGXxSQCQCYhMAf23Gyhk"],"license":"AGPL-3.0-only"},"node_modules/@rhinestone/modulekit/src/module-bases/ERC7579FallbackBase.sol":{"keccak256":"0x51512f893cfd2f86e912e71ace40ff6c76f1bc1899067989a6e8dcfef974c2aa","urls":["bzz-raw://38cc0f491095168dae886ca6c4a651a305e733160ed736a5115b6ae056913af5","dweb:/ipfs/QmUZVCFY33GrEeuVmwLexEFQLMz9UYMCUWj4NoEBxHWTQL"],"license":"AGPL-3.0-only"},"node_modules/@rhinestone/modulekit/src/module-bases/ERC7579HookBase.sol":{"keccak256":"0xaa3b73e5331af99e5ae5f2a1cd7638e39d23cf952cf27b21bc029afbf988d9a1","urls":["bzz-raw://a3263e270433ec4b9680f2383e840d788e542555b80c7b86ac408b06964939f7","dweb:/ipfs/QmQk7XmrtDTtkKhBMeomRWznPegJTM7ht12QdetwfjWUer"],"license":"AGPL-3.0-only"},"node_modules/@rhinestone/modulekit/src/module-bases/ERC7579HookDestruct.sol":{"keccak256":"0xb7d1a8a4eee87b446ef2288da1913448e047f213ad347a1a6f5e5642a99f6453","urls":["bzz-raw://a948a926cbd412bbb0806ef2105ddb72b2606f6b1fe05894e1925aa87e8147be","dweb:/ipfs/QmPECjFWt73BfZD1wVRB4KcdDZwLJUGxpNNcgDtmpZpnLq"],"license":"AGPL-3.0-only"},"node_modules/@rhinestone/modulekit/src/module-bases/ERC7579HybridValidatorBase.sol":{"keccak256":"0x0cd6cceced1db0ce9675e40f2fa3ef4117292b217105f94d879b3cdfa42b9ad5","urls":["bzz-raw://9959eef2047910a56bd1240f717607060ae2633a065307f6ace7a60f73ea68c8","dweb:/ipfs/QmT1YYdR2CuDAT7nVZLnCnZvxhiP2fqPTa9CgMDftLdPNy"],"license":"AGPL-3.0-only"},"node_modules/@rhinestone/modulekit/src/module-bases/ERC7579ModuleBase.sol":{"keccak256":"0xb7c53d0c4d0f89e66f2515cbf0301b53eae618d31b1eeb265618ca5455b90635","urls":["bzz-raw://a83a1289dad42538b822c0db93603088ca9a466cd264058003054d4e4c51bb22","dweb:/ipfs/QmTt5sjJddkprDKaYJ3agCMFnY2dCKLBBCoCfHBBrm7Zvd"],"license":"AGPL-3.0-only"},"node_modules/@rhinestone/modulekit/src/module-bases/ERC7579PolicyBase.sol":{"keccak256":"0xcb718e2571d570c41c8743df9cb5024b59070c2c7d53bcd5f12fc074872a5ac9","urls":["bzz-raw://bf145b5430ff9119c34e67a3dc7bf7c7f3cb790b1c23370bb11a8325f74a5e5c","dweb:/ipfs/QmddY22ziXCicJPWzLPDnoUxKyGdBH18jPdqU96XVjEtMU"],"license":"AGPL-3.0-only"},"node_modules/@rhinestone/modulekit/src/module-bases/ERC7579StatelessValidatorBase.sol":{"keccak256":"0xa48e6c5c489141edf3512b7c323f1287d4a62d7f8599c8c50fb5ed39086be608","urls":["bzz-raw://f7c3cd5ce3d02ce5bb4733df1ef599fd36d1ca01dee27981701e8fe5b725fcf2","dweb:/ipfs/QmU9U1RHsHCGDnMVCkwXoBbtqGmBP6grh5ovV9YsXw6svx"],"license":"AGPL-3.0-only"},"node_modules/@rhinestone/modulekit/src/module-bases/ERC7579UserOpPolicy.sol":{"keccak256":"0xc8b26e65beb6964a536c03b4eb6d075df76a80c774ed2ae40e66c7b36a10fe41","urls":["bzz-raw://b719036038aa616a25f5551a9c52d385bb1c168874e94535170364d21e02476a","dweb:/ipfs/QmUrZNVjbADJQGyhPh6akNAsRBixYgyjgyX2DrBdZm5KNh"],"license":"AGPL-3.0-only"},"node_modules/@rhinestone/modulekit/src/module-bases/ERC7579ValidatorBase.sol":{"keccak256":"0x5a85c53cea028a03a6c6aa005f475d7241a9b120c21e4e773a9e9b5084c18428","urls":["bzz-raw://79ef9f1b63888e7792ddf70335f086c06676ad6e13a750648fa7f69773764916","dweb:/ipfs/QmTjVVefugMU5BdXgdEccmS352Ah9nn1KCPNiCyyhugcfP"],"license":"AGPL-3.0-only"},"node_modules/@rhinestone/modulekit/src/module-bases/SchedulingBase.sol":{"keccak256":"0xed8224ace5d41ef74ff399440d45313e95dc1930d6ee559833c07e8a66a11b16","urls":["bzz-raw://a61855e4743b1f4869c5738ac9314ab06d109b346f6986c740b8af8c99aed5b0","dweb:/ipfs/QmWVDTC71MpUWwUV6fj9mehB2u3wZ2zwRrGkmYjtmf1bV2"],"license":"AGPL-3.0-only"},"node_modules/@rhinestone/modulekit/src/module-bases/interfaces/IERC7484.sol":{"keccak256":"0xb4c149815fe8a943201d145d5ba6bd494560785db764b180559c8cd11a8048fc","urls":["bzz-raw://c1687a18731256611519cef74491665a4ec374c3185a56b0fa5f250ce70bb850","dweb:/ipfs/QmRvSU1drCoC94jUZZh5eG3gaRLR29zAAvyGxHRRAnbWme"],"license":"MIT"},"node_modules/@rhinestone/modulekit/src/module-bases/interfaces/IPolicy.sol":{"keccak256":"0x096e3f9850d1b05ffc9c057fd3380006e1fbabaa11148d3790a12dd924b543d0","urls":["bzz-raw://5b97d9829d02661726d351783e3093d2cd5b2a518fdbaf9d7eee5787b183cf0a","dweb:/ipfs/QmWPS64aZjRxNYizTMMFJGQgjygdaKfAnUEzyuMHJFrRTB"],"license":"LGPL-3.0-only"},"node_modules/@rhinestone/modulekit/src/module-bases/interfaces/IStatelessValidator.sol":{"keccak256":"0x7a217ecb0c1a99eda30bded8adf5bb0dcc0e89e078c847fd9f1eeab0b928dc1e","urls":["bzz-raw://29c4d6b519b608c0ad0f4a0115ab71d1b5d056702db05bc1c9571944d2770ce6","dweb:/ipfs/QmbJTThHy3ympkLUUdAuxYwy8j4XGy7f3HHGcE6HzW73gc"],"license":"AGPL-3.0-only"},"node_modules/@rhinestone/modulekit/src/module-bases/utils/ERC7579Constants.sol":{"keccak256":"0xcc1e1cad832005b57588f1fb216ed0424f2c20cb2e55001d96a198f9a5c4d4ad","urls":["bzz-raw://12c88dc886effaafa389a72299f98b64f7b8ae87c430eb65d3780b821ea54178","dweb:/ipfs/QmQaNc2NQGz2MPcYBLaZdAHLngEWiYwffQ64bxEetZH3mb"],"license":"AGPL-3.0-only"},"node_modules/@rhinestone/modulekit/src/module-bases/utils/TrustedForwarder.sol":{"keccak256":"0x9b61fc17327922e85ac6ae0eb00836b09315dad2b297f1fed8f193b13bcee7c3","urls":["bzz-raw://60d43af97695deba72f172ac4dd6402c7818ad52c5dd503fd8aac70ff566de7d","dweb:/ipfs/QmdnbFF7bzBcowpotmPawFBrsVZqCw4tnFb5qc366vJMYo"],"license":"AGPL-3.0-only"},"node_modules/@rhinestone/sentinellist/src/SentinelList4337.sol":{"keccak256":"0x21cbe60aac0ddd77dd8430d96b6b59c6e31eeee5918c4097aecf594e9fc0fa64","urls":["bzz-raw://e2e6bffd163bf1f406ba14388f5cc94e419d976087fc008a7028e9d6e2396643","dweb:/ipfs/QmQ2ipNcRMpyE4kaHqio4TEoDMNTVkSTuFbzFScfPhoFVk"],"license":"MIT"},"node_modules/forge-std/src/interfaces/IERC165.sol":{"keccak256":"0x414b2861b1acbf816ccb7346d3f16cf6c1e002e9e5e40d2f1f26fa5ddc2ea600","urls":["bzz-raw://698352fb240868ea8f1d1fe389993035eeab930f10d06934f80ccfb2b6ccbfbc","dweb:/ipfs/QmT6WLHAgXxFhh12kWym895oTzXid1326iZiwT3pyfggoT"],"license":"MIT"},"node_modules/solady/src/utils/ECDSA.sol":{"keccak256":"0xb0754260daabfe6f20dd16f2213823f27c8df1089b43c8eda9b3c2a6eca07478","urls":["bzz-raw://ffef4ca363ec0e2437b5e195fbb3d58bdc6750921fce32f351ca1c092ad36a75","dweb:/ipfs/QmTcnAyxwvQg3h357PdB8S8oz5bBt85J4SvEgmMqwAfPKF"],"license":"MIT"},"node_modules/solady/src/utils/LibSort.sol":{"keccak256":"0x3fc758c5e83f389058e156537c060ff0d952b82c767ecebf8047b698cfc7ffb1","urls":["bzz-raw://e09190e7b4e67a6fdb7da01448229fd69207e0249ff1b910ef6b10ce4aa21f76","dweb:/ipfs/QmW7uGJq7vE94sC4VGFuHfxTmDGZdqWLBjR43FuTwgin9R"],"license":"MIT"},"node_modules/solady/src/utils/SignatureCheckerLib.sol":{"keccak256":"0x098c7eb88b3048f227b240e0e5bf1da4a8f7622b30f6d7c06416bfcab3225e77","urls":["bzz-raw://50c2766f652916c5d6433665fb1c3b2f04c3d9292a35c12e0f8d7c71dd6438cb","dweb:/ipfs/QmWTMwN2RDZUUPg7KkH1qFBjTSh84Zw8bbYwRBCQUtLN2h"],"license":"MIT"},"src/OwnableValidator/OwnableValidator.sol":{"keccak256":"0x0d7e238e2f206730c1a438ba3db3d50e134f0bb8fe95fde0f15cd9832ae3698c","urls":["bzz-raw://88b8c7c643c6d82583cfd8a50a029e1836390d48d3097a268d64c695e648dc82","dweb:/ipfs/QmcKu6EdEYQUez8ke6y4kXMAh7XbVoWVeXnBp1HQsPawio"],"license":"AGPL-3.0-only"}},"version":1},"id":52} \ No newline at end of file +{"abi":[{"type":"function","name":"addOwner","inputs":[{"name":"owner","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"getOwners","inputs":[{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"ownersArray","type":"address[]","internalType":"address[]"}],"stateMutability":"view"},{"type":"function","name":"isInitialized","inputs":[{"name":"smartAccount","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"isModuleType","inputs":[{"name":"typeID","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"pure"},{"type":"function","name":"isValidSignatureWithSender","inputs":[{"name":"","type":"address","internalType":"address"},{"name":"hash","type":"bytes32","internalType":"bytes32"},{"name":"data","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"bytes4","internalType":"bytes4"}],"stateMutability":"view"},{"type":"function","name":"name","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"pure"},{"type":"function","name":"onInstall","inputs":[{"name":"data","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"onUninstall","inputs":[{"name":"","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"ownerCount","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"removeOwner","inputs":[{"name":"prevOwner","type":"address","internalType":"address"},{"name":"owner","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setThreshold","inputs":[{"name":"_threshold","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"threshold","inputs":[{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"validateSignatureWithData","inputs":[{"name":"hash","type":"bytes32","internalType":"bytes32"},{"name":"signature","type":"bytes","internalType":"bytes"},{"name":"data","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"validateUserOp","inputs":[{"name":"userOp","type":"tuple","internalType":"struct PackedUserOperation","components":[{"name":"sender","type":"address","internalType":"address"},{"name":"nonce","type":"uint256","internalType":"uint256"},{"name":"initCode","type":"bytes","internalType":"bytes"},{"name":"callData","type":"bytes","internalType":"bytes"},{"name":"accountGasLimits","type":"bytes32","internalType":"bytes32"},{"name":"preVerificationGas","type":"uint256","internalType":"uint256"},{"name":"gasFees","type":"bytes32","internalType":"bytes32"},{"name":"paymasterAndData","type":"bytes","internalType":"bytes"},{"name":"signature","type":"bytes","internalType":"bytes"}]},{"name":"userOpHash","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"uint256","internalType":"ERC7579ValidatorBase.ValidationData"}],"stateMutability":"view"},{"type":"function","name":"version","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"pure"},{"type":"event","name":"ModuleInitialized","inputs":[{"name":"account","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"ModuleUninitialized","inputs":[{"name":"account","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"OwnerAdded","inputs":[{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"owner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"OwnerRemoved","inputs":[{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"owner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"ThresholdSet","inputs":[{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"threshold","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"error","name":"CannotRemoveOwner","inputs":[]},{"type":"error","name":"InvalidOwner","inputs":[{"name":"owner","type":"address","internalType":"address"}]},{"type":"error","name":"InvalidSignature","inputs":[]},{"type":"error","name":"InvalidThreshold","inputs":[]},{"type":"error","name":"LinkedList_AlreadyInitialized","inputs":[]},{"type":"error","name":"LinkedList_EntryAlreadyInList","inputs":[{"name":"entry","type":"address","internalType":"address"}]},{"type":"error","name":"LinkedList_InvalidEntry","inputs":[{"name":"entry","type":"address","internalType":"address"}]},{"type":"error","name":"LinkedList_InvalidPage","inputs":[]},{"type":"error","name":"MaxOwnersReached","inputs":[]},{"type":"error","name":"ModuleAlreadyInitialized","inputs":[{"name":"smartAccount","type":"address","internalType":"address"}]},{"type":"error","name":"NotInitialized","inputs":[{"name":"smartAccount","type":"address","internalType":"address"}]},{"type":"error","name":"NotSortedAndUnique","inputs":[]},{"type":"error","name":"ThresholdNotSet","inputs":[]}],"bytecode":{"object":"0x6080604052348015600e575f5ffd5b5061319e8061001c5f395ff3fe608060405234801561000f575f5ffd5b50600436106100f3575f3560e01c80639700320311610095578063ecd0596111610064578063ecd0596114610293578063f551e2ee146102c3578063fbe5ce0a146102f3578063fd8b84b11461030f576100f3565b806397003203146101d3578063c86ec2bf14610203578063ccfdec8c14610233578063d60b347f14610263576100f3565b80637065cb48116100d15780637065cb481461014f5780638a91b0e31461016b578063940d384014610187578063960bfe04146101b7576100f3565b806306fdde03146100f757806354fd4d50146101155780636d61fe7014610133575b5f5ffd5b6100ff61033f565b60405161010c919061270a565b60405180910390f35b61011d61037c565b60405161012a919061270a565b60405180910390f35b61014d6004803603810190610148919061279c565b6103b9565b005b61016960048036038101906101649190612841565b6106bf565b005b6101856004803603810190610180919061279c565b6108b9565b005b6101a1600480360381019061019c919061289f565b610a57565b6040516101ae919061294a565b60405180910390f35b6101d160048036038101906101cc9190612996565b610b87565b005b6101ed60048036038101906101e891906129e4565b610d19565b6040516101fa9190612a77565b60405180910390f35b61021d60048036038101906102189190612841565b610d6c565b60405161022a9190612a9f565b60405180910390f35b61024d60048036038101906102489190612841565b610d81565b60405161025a9190612a9f565b60405180910390f35b61027d60048036038101906102789190612841565b610d96565b60405161028a919061294a565b60405180910390f35b6102ad60048036038101906102a89190612996565b610ddf565b6040516102ba919061294a565b60405180910390f35b6102dd60048036038101906102d89190612ab8565b610df6565b6040516102ea9190612b63565b60405180910390f35b61030d60048036038101906103089190612b7c565b610e30565b005b61032960048036038101906103249190612841565b610faf565b6040516103369190612c71565b60405180910390f35b60606040518060400160405280601081526020017f4f776e61626c6556616c696461746f7200000000000000000000000000000000815250905090565b60606040518060400160405280600581526020017f312e302e30000000000000000000000000000000000000000000000000000000815250905090565b5f5f83838101906103ca9190612dc9565b915091506103d781610fd4565b61040d576040517fe719027300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8203610446576040517f34b46f4800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8151905082811015610485576040517faabd5a0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f3390508360015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055506020821115610506576040517f2414149d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160025f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555061055b815f610fed90919063ffffffff16565b5f5f90505b82811015610673575f84828151811061057c5761057b612e23565b5b602002602001015190505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036105f657806040517fb20f76e30000000000000000000000000000000000000000000000000000000081526004016105ed9190612e5f565b60405180910390fd5b61060b83825f6110eb9092919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc82bdbbf677a2462f2a7e22e4ba9abd209496b69cd7b868b3b1d28f76e09a40a60405160405180910390a3508080600101915050610560565b508073ffffffffffffffffffffffffffffffffffffffff167f27b541a16df0902e262f34789782092ab25125513b8ed73608e802951771b92860405160405180910390a2505050505050565b5f3390506106cc81610d96565b61070d57806040517ff91bd6f10000000000000000000000000000000000000000000000000000000081526004016107049190612e5f565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361077d57816040517fb20f76e30000000000000000000000000000000000000000000000000000000081526004016107749190612e5f565b60405180910390fd5b602060025f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054106107f4576040517f2414149d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f81548092919061084190612ea5565b919050555061085b81835f6110eb9092919063ffffffff16565b8173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167fc82bdbbf677a2462f2a7e22e4ba9abd209496b69cd7b868b3b1d28f76e09a40a60405160405180910390a35050565b5f33905060606108d882600160205f6114a8909392919063ffffffff16565b50809150505f5f90505b8151811015610989575f8282815181106108ff576108fe612e23565b5b60200260200101519050610921846001835f611843909392919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fe594d081b4382713733fe631966432c9cea5199afb2db5c3c1931f9f9300367960405160405180910390a35080806001019150506108e2565b505f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505f60025f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff167f9d00629762554452d03c3b45626436df6ca1c3795d05d04df882f6db481b1be060405160405180910390a250505050565b5f5f5f8484810190610a699190612dc9565b91509150610a7681610fd4565b610a84575f92505050610b7e565b5f8203610a95575f92505050610b7e565b5f610ae48989898080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f8201169050808301925050505050505085611bff565b9050610aef81611e01565b610af881611e15565b5f5f825190505f5f90505b81811015610b5f575f610b39858381518110610b2257610b21612e23565b5b602002602001015187611e2990919063ffffffff16565b5090508015610b51578380610b4d90612ea5565b9450505b508080600101915050610b03565b50848210610b7557600195505050505050610b7e565b5f955050505050505b95945050505050565b5f339050610b9481610d96565b610bd557806040517ff91bd6f1000000000000000000000000000000000000000000000000000000008152600401610bcc9190612e5f565b60405180910390fd5b5f8203610c0e576040517faabd5a0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160025f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541015610c85576040517faabd5a0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508073ffffffffffffffffffffffffffffffffffffffff167ff7e18aa0532694077d6fc7df02e85d86b91ba964f958d1949d45c5776d36eb6e83604051610d0d9190612a9f565b60405180910390a25050565b5f5f610d4f845f016020810190610d309190612841565b610d3985611e63565b86806101000190610d4a9190612ef8565b611e93565b90508015610d60575f915050610d66565b60019150505b92915050565b6001602052805f5260405f205f915090505481565b6002602052805f5260405f205f915090505481565b5f5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205414159050919050565b5f6001821480610def5750600782145b9050919050565b5f5f610e0433868686611e93565b90508015610e1c57631626ba7e60e01b915050610e28565b63ffffffff60e01b9150505b949350505050565b5f33905060015f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205460025f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205403610ee7576040517f1e6d14ea00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610efe8184845f611843909392919063ffffffff16565b60025f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f815480929190610f4b90612f5a565b91905055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167fe594d081b4382713733fe631966432c9cea5199afb2db5c3c1931f9f9300367960405160405180910390a3505050565b6060610fca82600160205f6114a8909392919063ffffffff16565b5080915050919050565b5f610fe6610fe183611fd0565b611fda565b9050919050565b610ff78282612027565b1561102e576040517f53c85e6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001825f015f600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614806111515750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b1561119357806040517f7c84ecfb00000000000000000000000000000000000000000000000000000000815260040161118a9190612e5f565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff16835f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461129b57806040517f40d3d1a40000000000000000000000000000000000000000000000000000000081526004016112929190612e5f565b60405180910390fd5b825f015f600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16835f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080835f015f600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050565b60605f600173ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141580156114f057506114ee8686866120f9565b155b1561153257836040517f7c84ecfb0000000000000000000000000000000000000000000000000000000081526004016115299190612e5f565b60405180910390fd5b5f830361156b576040517ff725081700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8267ffffffffffffffff81111561158557611584612c91565b5b6040519080825280602002602001820160405280156115b35781602001602082028036833780820191505090505b5091505f5f9050865f015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156116bf5750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b80156116ca57508381105b156117cb57818382815181106116e3576116e2612e23565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050865f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915080806117c390612ea5565b915050611656565b600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415801561180757505f81115b15611836578260018261181a9190612f81565b8151811061182b5761182a612e23565b5b602002602001015191505b8083525094509492505050565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614806118a95750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b156118eb57816040517f7c84ecfb0000000000000000000000000000000000000000000000000000000081526004016118e29190612e5f565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16845f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146119f357806040517f7c84ecfb0000000000000000000000000000000000000000000000000000000081526004016119ea9190612e5f565b60405180910390fd5b835f015f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16845f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f845f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050565b60605f835190505f604182611c149190612fe1565b90508067ffffffffffffffff811115611c3057611c2f612c91565b5b604051908082528060200260200182016040528015611c5e5781602001602082028036833780820191505090505b50925083811015611c9b576040517f8baa579f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f5b82811015611dbc575f5f5f5f611cb48b86612204565b9250925092505f8360ff1603611cd857611cd18c8c84848c612230565b9350611d1b565b601e8360ff161115611d0b57611d04611cf08d611e63565b600485611cfd919061301d565b848461234f565b9350611d1a565b611d178c84848461234f565b93505b5b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614611d5d578580611d5990612ea5565b9650505b83898681518110611d7157611d70612e23565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050505050508080600101915050611c9e565b5084811015611df7576040517f8baa579f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050509392505050565b611e12611e0d82611fd0565b612389565b50565b611e26611e2182611fd0565b6125d3565b50565b5f5f611e54611e3785611fd0565b8473ffffffffffffffffffffffffffffffffffffffff165f612627565b80925081935050509250929050565b5f816020527b19457468657265756d205369676e6564204d6573736167653a0a33325f52603c6004209050919050565b5f5f60015f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490505f8103611ee5575f915050611fc8565b5f611f348686868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f8201169050808301925050505050505084611bff565b9050611f3f81611e01565b611f4881611e15565b5f5f825190505f5f90505b81811015611fab57611f8a8a858381518110611f7257611f71612e23565b5b60200260200101515f6120f99092919063ffffffff16565b15611f9e578280611f9a90612ea5565b9350505b8080600101915050611f53565b50838210611fc0576001945050505050611fc8565b5f9450505050505b949350505050565b6060819050919050565b5f60019050600282511061202257815160051b82016020830192505b600115612020578251602084019350835181109250818418830261201a5750612020565b50611ff6565b505b919050565b5f5f73ffffffffffffffffffffffffffffffffffffffff16835f015f600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415905092915050565b5f8173ffffffffffffffffffffffffffffffffffffffff16600173ffffffffffffffffffffffffffffffffffffffff16141580156121fb57505f73ffffffffffffffffffffffffffffffffffffffff16845f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b90509392505050565b5f5f5f83604102602081018601519250604081018601519150606081018601515f1a9350509250925092565b5f835f1c90505f602084870101519050826020855f1c836122519190613051565b61225b9190613051565b111561226a575f915050612346565b60606020858801019050631626ba7e60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168373ffffffffffffffffffffffffffffffffffffffff16631626ba7e8a846040518363ffffffff1660e01b81526004016122d69291906130e5565b602060405180830381865afa1580156122f1573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612315919061313d565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612343575f92505050612346565b50505b95945050505050565b5f604051855f5260ff851660205283604052826060526020604060805f60015afa505f6060523d6060185191508060405250949350505050565b612523565b5f5f8290508391509250929050565b805182518252808352505050565b61018082840311612430576020820180518351106123ce576123cd838261239d565b5b5b6001156124275760208101905083811161242757805182820180518281116123f957505050612422565b5b600115612418578060208301528482019150815190508281116123fa575b8260208301525050505b6123cf565b50505050612521565b81601f1683830160061c60051b018251815180821061245857612453818361238e565b915091505b85518082106124865761246b818361238e565b9150915081831061248557612480828461238e565b925092505b5b8087528184528286525050508051849150835b6001156124ee575b6001156124b757806020019050805182116124a1575b825b6001156124ce578085019050805183106124b9575b8093508382106124de57506124ee565b6124e8848361239d565b50612499565b5050836020820114612509576125088460208301846123ab565b5b82811461251c5761251b8184846123ab565b5b505050505b565b8051600281106125cf57601f19602083018260051b8401805b8051818501511161255157808401905061253c565b82811161256157505050506125cf565b8190505b8051818501511061257a578084019050612565565b8281116125b9575b6001156125b05782518251845280835282850192506020840193508284106125aa57506125b0565b50612582565b505050506125cf565b5f86526125c78284866123ab565b848652505050505b5050565b6002815110612624576020810160408201600183510160051b83015b60011561261857815183511461260a57602083019250815183525b6020820191508082036125ef575b83830360051c84525050505b50565b5f5f5f19600186515f87870197505b6001156126785781830160011c94508460051b89015187019050878114828411176126785780881161266c578385019150612673565b6001850192505b612636565b8781149550841515905080848601029450808616955050505050935093915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f6126dc8261269a565b6126e681856126a4565b93506126f68185602086016126b4565b6126ff816126c2565b840191505092915050565b5f6020820190508181035f83015261272281846126d2565b905092915050565b5f604051905090565b5f5ffd5b5f5ffd5b5f5ffd5b5f5ffd5b5f5ffd5b5f5f83601f84011261275c5761275b61273b565b5b8235905067ffffffffffffffff8111156127795761277861273f565b5b60208301915083600182028301111561279557612794612743565b5b9250929050565b5f5f602083850312156127b2576127b1612733565b5b5f83013567ffffffffffffffff8111156127cf576127ce612737565b5b6127db85828601612747565b92509250509250929050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f612810826127e7565b9050919050565b61282081612806565b811461282a575f5ffd5b50565b5f8135905061283b81612817565b92915050565b5f6020828403121561285657612855612733565b5b5f6128638482850161282d565b91505092915050565b5f819050919050565b61287e8161286c565b8114612888575f5ffd5b50565b5f8135905061289981612875565b92915050565b5f5f5f5f5f606086880312156128b8576128b7612733565b5b5f6128c58882890161288b565b955050602086013567ffffffffffffffff8111156128e6576128e5612737565b5b6128f288828901612747565b9450945050604086013567ffffffffffffffff81111561291557612914612737565b5b61292188828901612747565b92509250509295509295909350565b5f8115159050919050565b61294481612930565b82525050565b5f60208201905061295d5f83018461293b565b92915050565b5f819050919050565b61297581612963565b811461297f575f5ffd5b50565b5f813590506129908161296c565b92915050565b5f602082840312156129ab576129aa612733565b5b5f6129b884828501612982565b91505092915050565b5f5ffd5b5f61012082840312156129db576129da6129c1565b5b81905092915050565b5f5f604083850312156129fa576129f9612733565b5b5f83013567ffffffffffffffff811115612a1757612a16612737565b5b612a23858286016129c5565b9250506020612a348582860161288b565b9150509250929050565b5f819050919050565b5f612a61612a5c612a5784612963565b612a3e565b612963565b9050919050565b612a7181612a47565b82525050565b5f602082019050612a8a5f830184612a68565b92915050565b612a9981612963565b82525050565b5f602082019050612ab25f830184612a90565b92915050565b5f5f5f5f60608587031215612ad057612acf612733565b5b5f612add8782880161282d565b9450506020612aee8782880161288b565b935050604085013567ffffffffffffffff811115612b0f57612b0e612737565b5b612b1b87828801612747565b925092505092959194509250565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612b5d81612b29565b82525050565b5f602082019050612b765f830184612b54565b92915050565b5f5f60408385031215612b9257612b91612733565b5b5f612b9f8582860161282d565b9250506020612bb08582860161282d565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b612bec81612806565b82525050565b5f612bfd8383612be3565b60208301905092915050565b5f602082019050919050565b5f612c1f82612bba565b612c298185612bc4565b9350612c3483612bd4565b805f5b83811015612c64578151612c4b8882612bf2565b9750612c5683612c09565b925050600181019050612c37565b5085935050505092915050565b5f6020820190508181035f830152612c898184612c15565b905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b612cc7826126c2565b810181811067ffffffffffffffff82111715612ce657612ce5612c91565b5b80604052505050565b5f612cf861272a565b9050612d048282612cbe565b919050565b5f67ffffffffffffffff821115612d2357612d22612c91565b5b602082029050602081019050919050565b5f612d46612d4184612d09565b612cef565b90508083825260208201905060208402830185811115612d6957612d68612743565b5b835b81811015612d925780612d7e888261282d565b845260208401935050602081019050612d6b565b5050509392505050565b5f82601f830112612db057612daf61273b565b5b8135612dc0848260208601612d34565b91505092915050565b5f5f60408385031215612ddf57612dde612733565b5b5f612dec85828601612982565b925050602083013567ffffffffffffffff811115612e0d57612e0c612737565b5b612e1985828601612d9c565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b612e5981612806565b82525050565b5f602082019050612e725f830184612e50565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f612eaf82612963565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612ee157612ee0612e78565b5b600182019050919050565b5f5ffd5b5f5ffd5b5f5ffd5b5f5f83356001602003843603038112612f1457612f13612eec565b5b80840192508235915067ffffffffffffffff821115612f3657612f35612ef0565b5b602083019250600182023603831315612f5257612f51612ef4565b5b509250929050565b5f612f6482612963565b91505f8203612f7657612f75612e78565b5b600182039050919050565b5f612f8b82612963565b9150612f9683612963565b9250828203905081811115612fae57612fad612e78565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f612feb82612963565b9150612ff683612963565b92508261300657613005612fb4565b5b828204905092915050565b5f60ff82169050919050565b5f61302782613011565b915061303283613011565b9250828203905060ff81111561304b5761304a612e78565b5b92915050565b5f61305b82612963565b915061306683612963565b925082820190508082111561307e5761307d612e78565b5b92915050565b61308d8161286c565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f6130b782613093565b6130c1818561309d565b93506130d18185602086016126b4565b6130da816126c2565b840191505092915050565b5f6040820190506130f85f830185613084565b818103602083015261310a81846130ad565b90509392505050565b61311c81612b29565b8114613126575f5ffd5b50565b5f8151905061313781613113565b92915050565b5f6020828403121561315257613151612733565b5b5f61315f84828501613129565b9150509291505056fea2646970667358221220d9ea9e472c5573feaf08b0a9f784404346badd56f435409c13a236330790f69264736f6c634300081c0033","sourceMap":"747:13230:52:-:0;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x608060405234801561000f575f5ffd5b50600436106100f3575f3560e01c80639700320311610095578063ecd0596111610064578063ecd0596114610293578063f551e2ee146102c3578063fbe5ce0a146102f3578063fd8b84b11461030f576100f3565b806397003203146101d3578063c86ec2bf14610203578063ccfdec8c14610233578063d60b347f14610263576100f3565b80637065cb48116100d15780637065cb481461014f5780638a91b0e31461016b578063940d384014610187578063960bfe04146101b7576100f3565b806306fdde03146100f757806354fd4d50146101155780636d61fe7014610133575b5f5ffd5b6100ff61033f565b60405161010c919061270a565b60405180910390f35b61011d61037c565b60405161012a919061270a565b60405180910390f35b61014d6004803603810190610148919061279c565b6103b9565b005b61016960048036038101906101649190612841565b6106bf565b005b6101856004803603810190610180919061279c565b6108b9565b005b6101a1600480360381019061019c919061289f565b610a57565b6040516101ae919061294a565b60405180910390f35b6101d160048036038101906101cc9190612996565b610b87565b005b6101ed60048036038101906101e891906129e4565b610d19565b6040516101fa9190612a77565b60405180910390f35b61021d60048036038101906102189190612841565b610d6c565b60405161022a9190612a9f565b60405180910390f35b61024d60048036038101906102489190612841565b610d81565b60405161025a9190612a9f565b60405180910390f35b61027d60048036038101906102789190612841565b610d96565b60405161028a919061294a565b60405180910390f35b6102ad60048036038101906102a89190612996565b610ddf565b6040516102ba919061294a565b60405180910390f35b6102dd60048036038101906102d89190612ab8565b610df6565b6040516102ea9190612b63565b60405180910390f35b61030d60048036038101906103089190612b7c565b610e30565b005b61032960048036038101906103249190612841565b610faf565b6040516103369190612c71565b60405180910390f35b60606040518060400160405280601081526020017f4f776e61626c6556616c696461746f7200000000000000000000000000000000815250905090565b60606040518060400160405280600581526020017f312e302e30000000000000000000000000000000000000000000000000000000815250905090565b5f5f83838101906103ca9190612dc9565b915091506103d781610fd4565b61040d576040517fe719027300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8203610446576040517f34b46f4800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8151905082811015610485576040517faabd5a0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f3390508360015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055506020821115610506576040517f2414149d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160025f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555061055b815f610fed90919063ffffffff16565b5f5f90505b82811015610673575f84828151811061057c5761057b612e23565b5b602002602001015190505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036105f657806040517fb20f76e30000000000000000000000000000000000000000000000000000000081526004016105ed9190612e5f565b60405180910390fd5b61060b83825f6110eb9092919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc82bdbbf677a2462f2a7e22e4ba9abd209496b69cd7b868b3b1d28f76e09a40a60405160405180910390a3508080600101915050610560565b508073ffffffffffffffffffffffffffffffffffffffff167f27b541a16df0902e262f34789782092ab25125513b8ed73608e802951771b92860405160405180910390a2505050505050565b5f3390506106cc81610d96565b61070d57806040517ff91bd6f10000000000000000000000000000000000000000000000000000000081526004016107049190612e5f565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361077d57816040517fb20f76e30000000000000000000000000000000000000000000000000000000081526004016107749190612e5f565b60405180910390fd5b602060025f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054106107f4576040517f2414149d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f81548092919061084190612ea5565b919050555061085b81835f6110eb9092919063ffffffff16565b8173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167fc82bdbbf677a2462f2a7e22e4ba9abd209496b69cd7b868b3b1d28f76e09a40a60405160405180910390a35050565b5f33905060606108d882600160205f6114a8909392919063ffffffff16565b50809150505f5f90505b8151811015610989575f8282815181106108ff576108fe612e23565b5b60200260200101519050610921846001835f611843909392919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fe594d081b4382713733fe631966432c9cea5199afb2db5c3c1931f9f9300367960405160405180910390a35080806001019150506108e2565b505f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505f60025f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff167f9d00629762554452d03c3b45626436df6ca1c3795d05d04df882f6db481b1be060405160405180910390a250505050565b5f5f5f8484810190610a699190612dc9565b91509150610a7681610fd4565b610a84575f92505050610b7e565b5f8203610a95575f92505050610b7e565b5f610ae48989898080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f8201169050808301925050505050505085611bff565b9050610aef81611e01565b610af881611e15565b5f5f825190505f5f90505b81811015610b5f575f610b39858381518110610b2257610b21612e23565b5b602002602001015187611e2990919063ffffffff16565b5090508015610b51578380610b4d90612ea5565b9450505b508080600101915050610b03565b50848210610b7557600195505050505050610b7e565b5f955050505050505b95945050505050565b5f339050610b9481610d96565b610bd557806040517ff91bd6f1000000000000000000000000000000000000000000000000000000008152600401610bcc9190612e5f565b60405180910390fd5b5f8203610c0e576040517faabd5a0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160025f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541015610c85576040517faabd5a0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508073ffffffffffffffffffffffffffffffffffffffff167ff7e18aa0532694077d6fc7df02e85d86b91ba964f958d1949d45c5776d36eb6e83604051610d0d9190612a9f565b60405180910390a25050565b5f5f610d4f845f016020810190610d309190612841565b610d3985611e63565b86806101000190610d4a9190612ef8565b611e93565b90508015610d60575f915050610d66565b60019150505b92915050565b6001602052805f5260405f205f915090505481565b6002602052805f5260405f205f915090505481565b5f5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205414159050919050565b5f6001821480610def5750600782145b9050919050565b5f5f610e0433868686611e93565b90508015610e1c57631626ba7e60e01b915050610e28565b63ffffffff60e01b9150505b949350505050565b5f33905060015f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205460025f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205403610ee7576040517f1e6d14ea00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610efe8184845f611843909392919063ffffffff16565b60025f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f815480929190610f4b90612f5a565b91905055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167fe594d081b4382713733fe631966432c9cea5199afb2db5c3c1931f9f9300367960405160405180910390a3505050565b6060610fca82600160205f6114a8909392919063ffffffff16565b5080915050919050565b5f610fe6610fe183611fd0565b611fda565b9050919050565b610ff78282612027565b1561102e576040517f53c85e6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001825f015f600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614806111515750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b1561119357806040517f7c84ecfb00000000000000000000000000000000000000000000000000000000815260040161118a9190612e5f565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff16835f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461129b57806040517f40d3d1a40000000000000000000000000000000000000000000000000000000081526004016112929190612e5f565b60405180910390fd5b825f015f600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16835f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080835f015f600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050565b60605f600173ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141580156114f057506114ee8686866120f9565b155b1561153257836040517f7c84ecfb0000000000000000000000000000000000000000000000000000000081526004016115299190612e5f565b60405180910390fd5b5f830361156b576040517ff725081700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8267ffffffffffffffff81111561158557611584612c91565b5b6040519080825280602002602001820160405280156115b35781602001602082028036833780820191505090505b5091505f5f9050865f015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156116bf5750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b80156116ca57508381105b156117cb57818382815181106116e3576116e2612e23565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050865f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915080806117c390612ea5565b915050611656565b600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415801561180757505f81115b15611836578260018261181a9190612f81565b8151811061182b5761182a612e23565b5b602002602001015191505b8083525094509492505050565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614806118a95750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b156118eb57816040517f7c84ecfb0000000000000000000000000000000000000000000000000000000081526004016118e29190612e5f565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16845f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146119f357806040517f7c84ecfb0000000000000000000000000000000000000000000000000000000081526004016119ea9190612e5f565b60405180910390fd5b835f015f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16845f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f845f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050565b60605f835190505f604182611c149190612fe1565b90508067ffffffffffffffff811115611c3057611c2f612c91565b5b604051908082528060200260200182016040528015611c5e5781602001602082028036833780820191505090505b50925083811015611c9b576040517f8baa579f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f5b82811015611dbc575f5f5f5f611cb48b86612204565b9250925092505f8360ff1603611cd857611cd18c8c84848c612230565b9350611d1b565b601e8360ff161115611d0b57611d04611cf08d611e63565b600485611cfd919061301d565b848461234f565b9350611d1a565b611d178c84848461234f565b93505b5b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614611d5d578580611d5990612ea5565b9650505b83898681518110611d7157611d70612e23565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050505050508080600101915050611c9e565b5084811015611df7576040517f8baa579f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050509392505050565b611e12611e0d82611fd0565b612389565b50565b611e26611e2182611fd0565b6125d3565b50565b5f5f611e54611e3785611fd0565b8473ffffffffffffffffffffffffffffffffffffffff165f612627565b80925081935050509250929050565b5f816020527b19457468657265756d205369676e6564204d6573736167653a0a33325f52603c6004209050919050565b5f5f60015f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490505f8103611ee5575f915050611fc8565b5f611f348686868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f8201169050808301925050505050505084611bff565b9050611f3f81611e01565b611f4881611e15565b5f5f825190505f5f90505b81811015611fab57611f8a8a858381518110611f7257611f71612e23565b5b60200260200101515f6120f99092919063ffffffff16565b15611f9e578280611f9a90612ea5565b9350505b8080600101915050611f53565b50838210611fc0576001945050505050611fc8565b5f9450505050505b949350505050565b6060819050919050565b5f60019050600282511061202257815160051b82016020830192505b600115612020578251602084019350835181109250818418830261201a5750612020565b50611ff6565b505b919050565b5f5f73ffffffffffffffffffffffffffffffffffffffff16835f015f600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415905092915050565b5f8173ffffffffffffffffffffffffffffffffffffffff16600173ffffffffffffffffffffffffffffffffffffffff16141580156121fb57505f73ffffffffffffffffffffffffffffffffffffffff16845f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b90509392505050565b5f5f5f83604102602081018601519250604081018601519150606081018601515f1a9350509250925092565b5f835f1c90505f602084870101519050826020855f1c836122519190613051565b61225b9190613051565b111561226a575f915050612346565b60606020858801019050631626ba7e60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168373ffffffffffffffffffffffffffffffffffffffff16631626ba7e8a846040518363ffffffff1660e01b81526004016122d69291906130e5565b602060405180830381865afa1580156122f1573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612315919061313d565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612343575f92505050612346565b50505b95945050505050565b5f604051855f5260ff851660205283604052826060526020604060805f60015afa505f6060523d6060185191508060405250949350505050565b612523565b5f5f8290508391509250929050565b805182518252808352505050565b61018082840311612430576020820180518351106123ce576123cd838261239d565b5b5b6001156124275760208101905083811161242757805182820180518281116123f957505050612422565b5b600115612418578060208301528482019150815190508281116123fa575b8260208301525050505b6123cf565b50505050612521565b81601f1683830160061c60051b018251815180821061245857612453818361238e565b915091505b85518082106124865761246b818361238e565b9150915081831061248557612480828461238e565b925092505b5b8087528184528286525050508051849150835b6001156124ee575b6001156124b757806020019050805182116124a1575b825b6001156124ce578085019050805183106124b9575b8093508382106124de57506124ee565b6124e8848361239d565b50612499565b5050836020820114612509576125088460208301846123ab565b5b82811461251c5761251b8184846123ab565b5b505050505b565b8051600281106125cf57601f19602083018260051b8401805b8051818501511161255157808401905061253c565b82811161256157505050506125cf565b8190505b8051818501511061257a578084019050612565565b8281116125b9575b6001156125b05782518251845280835282850192506020840193508284106125aa57506125b0565b50612582565b505050506125cf565b5f86526125c78284866123ab565b848652505050505b5050565b6002815110612624576020810160408201600183510160051b83015b60011561261857815183511461260a57602083019250815183525b6020820191508082036125ef575b83830360051c84525050505b50565b5f5f5f19600186515f87870197505b6001156126785781830160011c94508460051b89015187019050878114828411176126785780881161266c578385019150612673565b6001850192505b612636565b8781149550841515905080848601029450808616955050505050935093915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f6126dc8261269a565b6126e681856126a4565b93506126f68185602086016126b4565b6126ff816126c2565b840191505092915050565b5f6020820190508181035f83015261272281846126d2565b905092915050565b5f604051905090565b5f5ffd5b5f5ffd5b5f5ffd5b5f5ffd5b5f5ffd5b5f5f83601f84011261275c5761275b61273b565b5b8235905067ffffffffffffffff8111156127795761277861273f565b5b60208301915083600182028301111561279557612794612743565b5b9250929050565b5f5f602083850312156127b2576127b1612733565b5b5f83013567ffffffffffffffff8111156127cf576127ce612737565b5b6127db85828601612747565b92509250509250929050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f612810826127e7565b9050919050565b61282081612806565b811461282a575f5ffd5b50565b5f8135905061283b81612817565b92915050565b5f6020828403121561285657612855612733565b5b5f6128638482850161282d565b91505092915050565b5f819050919050565b61287e8161286c565b8114612888575f5ffd5b50565b5f8135905061289981612875565b92915050565b5f5f5f5f5f606086880312156128b8576128b7612733565b5b5f6128c58882890161288b565b955050602086013567ffffffffffffffff8111156128e6576128e5612737565b5b6128f288828901612747565b9450945050604086013567ffffffffffffffff81111561291557612914612737565b5b61292188828901612747565b92509250509295509295909350565b5f8115159050919050565b61294481612930565b82525050565b5f60208201905061295d5f83018461293b565b92915050565b5f819050919050565b61297581612963565b811461297f575f5ffd5b50565b5f813590506129908161296c565b92915050565b5f602082840312156129ab576129aa612733565b5b5f6129b884828501612982565b91505092915050565b5f5ffd5b5f61012082840312156129db576129da6129c1565b5b81905092915050565b5f5f604083850312156129fa576129f9612733565b5b5f83013567ffffffffffffffff811115612a1757612a16612737565b5b612a23858286016129c5565b9250506020612a348582860161288b565b9150509250929050565b5f819050919050565b5f612a61612a5c612a5784612963565b612a3e565b612963565b9050919050565b612a7181612a47565b82525050565b5f602082019050612a8a5f830184612a68565b92915050565b612a9981612963565b82525050565b5f602082019050612ab25f830184612a90565b92915050565b5f5f5f5f60608587031215612ad057612acf612733565b5b5f612add8782880161282d565b9450506020612aee8782880161288b565b935050604085013567ffffffffffffffff811115612b0f57612b0e612737565b5b612b1b87828801612747565b925092505092959194509250565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612b5d81612b29565b82525050565b5f602082019050612b765f830184612b54565b92915050565b5f5f60408385031215612b9257612b91612733565b5b5f612b9f8582860161282d565b9250506020612bb08582860161282d565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b612bec81612806565b82525050565b5f612bfd8383612be3565b60208301905092915050565b5f602082019050919050565b5f612c1f82612bba565b612c298185612bc4565b9350612c3483612bd4565b805f5b83811015612c64578151612c4b8882612bf2565b9750612c5683612c09565b925050600181019050612c37565b5085935050505092915050565b5f6020820190508181035f830152612c898184612c15565b905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b612cc7826126c2565b810181811067ffffffffffffffff82111715612ce657612ce5612c91565b5b80604052505050565b5f612cf861272a565b9050612d048282612cbe565b919050565b5f67ffffffffffffffff821115612d2357612d22612c91565b5b602082029050602081019050919050565b5f612d46612d4184612d09565b612cef565b90508083825260208201905060208402830185811115612d6957612d68612743565b5b835b81811015612d925780612d7e888261282d565b845260208401935050602081019050612d6b565b5050509392505050565b5f82601f830112612db057612daf61273b565b5b8135612dc0848260208601612d34565b91505092915050565b5f5f60408385031215612ddf57612dde612733565b5b5f612dec85828601612982565b925050602083013567ffffffffffffffff811115612e0d57612e0c612737565b5b612e1985828601612d9c565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b612e5981612806565b82525050565b5f602082019050612e725f830184612e50565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f612eaf82612963565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612ee157612ee0612e78565b5b600182019050919050565b5f5ffd5b5f5ffd5b5f5ffd5b5f5f83356001602003843603038112612f1457612f13612eec565b5b80840192508235915067ffffffffffffffff821115612f3657612f35612ef0565b5b602083019250600182023603831315612f5257612f51612ef4565b5b509250929050565b5f612f6482612963565b91505f8203612f7657612f75612e78565b5b600182039050919050565b5f612f8b82612963565b9150612f9683612963565b9250828203905081811115612fae57612fad612e78565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f612feb82612963565b9150612ff683612963565b92508261300657613005612fb4565b5b828204905092915050565b5f60ff82169050919050565b5f61302782613011565b915061303283613011565b9250828203905060ff81111561304b5761304a612e78565b5b92915050565b5f61305b82612963565b915061306683612963565b925082820190508082111561307e5761307d612e78565b5b92915050565b61308d8161286c565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f6130b782613093565b6130c1818561309d565b93506130d18185602086016126b4565b6130da816126c2565b840191505092915050565b5f6040820190506130f85f830185613084565b818103602083015261310a81846130ad565b90509392505050565b61311c81612b29565b8114613126575f5ffd5b50565b5f8151905061313781613113565b92915050565b5f6020828403121561315257613151612733565b5b5f61315f84828501613129565b9150509291505056fea2646970667358221220d9ea9e472c5573feaf08b0a9f784404346badd56f435409c13a236330790f69264736f6c634300081c0033","sourceMap":"747:13230:52:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13668:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13879:96;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2369:1473;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6075:728;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3991:721;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10165:1445;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5221:687;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8579:530;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1802:52;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1889:45;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4906:124;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13405:162;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9390:450;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7061:641;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7867:227;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13668:104;13715:13;13740:25;;;;;;;;;;;;;;;;;;;13668:104;:::o;13879:96::-;13929:13;13954:14;;;;;;;;;;;;;;;;;;;13879:96;:::o;2369:1473::-;2481:18;2501:24;2540:4;;2529:38;;;;;;;:::i;:::-;2480:87;;;;2638:31;:7;:29;:31::i;:::-;2633:90;;2692:20;;;;;;;;;;;;;;2633:90;2793:1;2779:10;:15;2775:70;;2817:17;;;;;;;;;;;;;;2775:70;2924:20;2947:7;:14;2924:37;;2990:10;2975:12;:25;2971:81;;;3023:18;;;;;;;;;;;;;;2971:81;3099:15;3117:10;3099:28;;3184:10;3163:9;:18;3173:7;3163:18;;;;;;;;;;;;;;;:31;;;;1695:2;3251:12;:25;3247:81;;;3299:18;;;;;;;;;;;;;;3247:81;3387:12;3365:10;:19;3376:7;3365:19;;;;;;;;;;;;;;;:34;;;;3447:20;3459:7;3447:6;:11;;:20;;;;:::i;:::-;3517:9;3529:1;3517:13;;3512:282;3536:12;3532:1;:16;3512:282;;;3569:14;3586:7;3594:1;3586:10;;;;;;;;:::i;:::-;;;;;;;;3569:27;;3632:1;3614:20;;:6;:20;;;3610:86;;3674:6;3661:20;;;;;;;;;;;:::i;:::-;;;;;;;;3610:86;3709:28;3721:7;3730:6;3709;:11;;:28;;;;;:::i;:::-;3776:6;3756:27;;3767:7;3756:27;;;;;;;;;;;;3555:239;3550:3;;;;;;;3512:282;;;;3827:7;3809:26;;;;;;;;;;;;2427:1415;;;;2369:1473;;:::o;6075:728::-;6164:15;6182:10;6164:28;;6277:22;6291:7;6277:13;:22::i;:::-;6272:59;;6323:7;6308:23;;;;;;;;;;;:::i;:::-;;;;;;;;6272:59;6408:1;6391:19;;:5;:19;;;6387:76;;6446:5;6433:19;;;;;;;;;;;:::i;:::-;;;;;;;;6387:76;1695:2;6519:10;:19;6530:7;6519:19;;;;;;;;;;;;;;;;:33;6515:89;;6575:18;;;;;;;;;;;;;;6515:89;6651:10;:19;6662:7;6651:19;;;;;;;;;;;;;;;;:21;;;;;;;;;:::i;:::-;;;;;;6727:27;6739:7;6748:5;6727:6;:11;;:27;;;;;:::i;:::-;6790:5;6770:26;;6781:7;6770:26;;;;;;;;;;;;6117:686;6075:728;:::o;3991:721::-;4093:15;4111:10;4093:28;;4160;4215:57;4242:7;113:3:47;1695:2:52;4215:6;:26;;:57;;;;;;:::i;:::-;4198:74;;;;;4287:9;4299:1;4287:13;;4282:247;4306:11;:18;4302:1;:22;4282:247;;;4345:13;4361:11;4373:1;4361:14;;;;;;;;:::i;:::-;;;;;;;;4345:30;;4435:36;4446:7;113:3:47;4465:5:52;4435:6;:10;;:36;;;;;;:::i;:::-;4512:5;4490:28;;4503:7;4490:28;;;;;;;;;;;;4331:198;4326:3;;;;;;;4282:247;;;;4592:1;4571:9;:18;4581:7;4571:18;;;;;;;;;;;;;;;:22;;;;4660:1;4638:10;:19;4649:7;4638:19;;;;;;;;;;;;;;;:23;;;;4697:7;4677:28;;;;;;;;;;;;4046:666;;3991:721;;:::o;10165:1445::-;10338:4;10402:18;10422:24;10461:4;;10450:38;;;;;;;:::i;:::-;10401:87;;;;10559:31;:7;:29;:31::i;:::-;10554:75;;10613:5;10606:12;;;;;;10554:75;10696:1;10682:10;:15;10678:58;;10720:5;10713:12;;;;;;10678:58;10797:24;10824:63;10859:4;10865:9;;10824:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10876:10;10824:34;:63::i;:::-;10797:90;;10975:14;:7;:12;:14::i;:::-;10999:24;:7;:22;:24::i;:::-;11077:20;11107:21;11131:7;:14;11107:38;;11160:9;11172:1;11160:13;;11155:188;11179:13;11175:1;:17;11155:188;;;11214:10;11229:32;11250:7;11258:1;11250:10;;;;;;;;:::i;:::-;;;;;;;;11229:7;:20;;:32;;;;:::i;:::-;11213:48;;;11279:5;11275:58;;;11304:14;;;;;:::i;:::-;;;;11275:58;11199:144;11194:3;;;;;;;11155:188;;;;11436:10;11420:12;:26;11416:120;;11521:4;11514:11;;;;;;;;;11416:120;11598:5;11591:12;;;;;;;10165:1445;;;;;;;;:::o;5221:687::-;5319:15;5337:10;5319:28;;5432:22;5446:7;5432:13;:22::i;:::-;5427:59;;5478:7;5463:23;;;;;;;;;;;:::i;:::-;;;;;;;;5427:59;5562:1;5548:10;:15;5544:71;;5586:18;;;;;;;;;;;;;;5544:71;5720:10;5698;:19;5709:7;5698:19;;;;;;;;;;;;;;;;:32;5694:88;;;5753:18;;;;;;;;;;;;;;5694:88;5842:10;5821:9;:18;5831:7;5821:18;;;;;;;;;;;;;;;:31;;;;5881:7;5868:33;;;5890:10;5868:33;;;;;;:::i;:::-;;;;;;;;5272:636;5221:687;:::o;8579:530::-;8746:14;8826:12;8841:125;8883:6;:13;;;;;;;;;;:::i;:::-;8898:40;8927:10;8898:28;:40::i;:::-;8940:6;:16;;;;;;;;:::i;:::-;8841:28;:125::i;:::-;8826:140;;9010:7;9006:63;;;433:1:40;9033:25:52;;;;;9006:63;514:1:40;9078:24:52;;;8579:530;;;;;:::o;1802:52::-;;;;;;;;;;;;;;;;;:::o;1889:45::-;;;;;;;;;;;;;;;;;:::o;4906:124::-;4972:4;5022:1;4995:9;:23;5005:12;4995:23;;;;;;;;;;;;;;;;:28;;4988:35;;4906:124;;;:::o;13405:162::-;13475:4;116:1:45;13498:6:52;:24;:62;;;;377:1:45;13526:6:52;:34;13498:62;13491:69;;13405:162;;;:::o;9390:450::-;9564:6;9636:12;9651:52;9680:10;9692:4;9698;;9651:28;:52::i;:::-;9636:67;;9747:7;9743:60;;;565:10:40;9777:15:52;;9770:22;;;;;9743:60;623:10:40;9819:14:52;;9812:21;;;9390:450;;;;;;;:::o;7061:641::-;7172:15;7190:10;7172:28;;7282:9;:18;7292:7;7282:18;;;;;;;;;;;;;;;;7259:10;:19;7270:7;7259:19;;;;;;;;;;;;;;;;:41;7255:252;;7477:19;;;;;;;;;;;;;;7255:252;7545:37;7556:7;7565:9;7576:5;7545:6;:10;;:37;;;;;;:::i;:::-;7630:10;:19;7641:7;7630:19;;;;;;;;;;;;;;;;:21;;;;;;;;;:::i;:::-;;;;;;7689:5;7667:28;;7680:7;7667:28;;;;;;;;;;;;7125:577;7061:641;;:::o;7867:227::-;7926:28;8030:57;8057:7;113:3:47;1695:2:52;8030:6;:26;;:57;;;;;;:::i;:::-;8013:74;;;;;7867:227;;;:::o;17139:147:50:-;17213:11;17245:34;17267:11;17276:1;17267:8;:11::i;:::-;17245:21;:34::i;:::-;17236:43;;17139:147;;;:::o;977:213:47:-;1058:33;1077:4;1083:7;1058:18;:33::i;:::-;1054:77;;;1100:31;;;;;;;;;;;;;;1054:77;113:3;1141:4;:12;;:22;113:3;1141:22;;;;;;;;;;;;;;;:31;1164:7;1141:31;;;;;;;;;;;;;;;;:42;;;;;;;;;;;;;;;;;;977:213;;:::o;2458:480::-;175:3;2557:24;;:8;:24;;;:48;;;;113:3;2585:20;;:8;:20;;;2557:48;2553:119;;;2652:8;2628:33;;;;;;;;;;;:::i;:::-;;;;;;;;2553:119;175:3;2685:47;;:4;:12;;:22;2698:8;2685:22;;;;;;;;;;;;;;;:31;2708:7;2685:31;;;;;;;;;;;;;;;;;;;;;;;;;:47;;;2681:124;;2785:8;2755:39;;;;;;;;;;;:::i;:::-;;;;;;;;2681:124;2848:4;:12;;:22;113:3;2848:22;;;;;;;;;;;;;;;:31;2871:7;2848:31;;;;;;;;;;;;;;;;;;;;;;;;;2814:4;:12;;:22;2827:8;2814:22;;;;;;;;;;;;;;;:31;2837:7;2814:31;;;;;;;;;;;;;;;;:65;;;;;;;;;;;;;;;;;;2923:8;2889:4;:12;;:22;113:3;2889:22;;;;;;;;;;;;;;;:31;2912:7;2889:31;;;;;;;;;;;;;;;;:42;;;;;;;;;;;;;;;;;;2458:480;;;:::o;5700:1854::-;5891:22;5915:12;113:3;5947:17;;:5;:17;;;;:52;;;;;5969:30;5978:4;5984:7;5993:5;5969:8;:30::i;:::-;5968:31;5947:52;5943:120;;;6046:5;6022:30;;;;;;;;;;;:::i;:::-;;;;;;;;5943:120;6088:1;6076:8;:13;6072:50;;6098:24;;;;;;;;;;;;;;6072:50;6195:8;6181:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6173:31;;6248:18;6269:1;6248:22;;6287:4;:12;;:19;6300:5;6287:19;;;;;;;;;;;;;;;:28;6307:7;6287:28;;;;;;;;;;;;;;;;;;;;;;;;;6280:35;;6325:197;175:3;6332:20;;:4;:20;;;;:40;;;;;113:3;6356:16;;:4;:16;;;;6332:40;:65;;;;;6389:8;6376:10;:21;6332:65;6325:197;;;6433:4;6413:5;6419:10;6413:17;;;;;;;;:::i;:::-;;;;;;;:24;;;;;;;;;;;6458:4;:12;;:18;6471:4;6458:18;;;;;;;;;;;;;;;:27;6477:7;6458:27;;;;;;;;;;;;;;;;;;;;;;;;;6451:34;;6499:12;;;;;:::i;:::-;;;;6325:197;;;113:3;7247:16;;:4;:16;;;;:34;;;;;7280:1;7267:10;:14;7247:34;7243:93;;;7304:5;7323:1;7310:10;:14;;;;:::i;:::-;7304:21;;;;;;;;:::i;:::-;;;;;;;;7297:28;;7243:93;7527:10;7520:5;7513:25;7499:49;5700:1854;;;;;;;:::o;3774:545::-;175:3;3941:24;;:8;:24;;;:48;;;;113:3;3969:20;;:8;:20;;;3941:48;3937:120;;;4036:9;4012:34;;;;;;;;;;;:::i;:::-;;;;;;;;3937:120;4106:8;4070:44;;:4;:12;;:23;4083:9;4070:23;;;;;;;;;;;;;;;:32;4094:7;4070:32;;;;;;;;;;;;;;;;;;;;;;;;;:44;;;4066:115;;4161:8;4137:33;;;;;;;;;;;:::i;:::-;;;;;;;;4066:115;4225:4;:12;;:22;4238:8;4225:22;;;;;;;;;;;;;;;:31;4248:7;4225:31;;;;;;;;;;;;;;;;;;;;;;;;;4190:4;:12;;:23;4203:9;4190:23;;;;;;;;;;;;;;;:32;4214:7;4190:32;;;;;;;;;;;;;;;;:66;;;;;;;;;;;;;;;;;;175:3;4266:4;:12;;:22;4279:8;4266:22;;;;;;;;;;;;;;;:31;4289:7;4266:31;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;3774:545;;;;:::o;904:1741:21:-;1080:33;1129:24;1156:10;:17;1129:44;;1183:23;1228:2;1209:16;:21;;;;:::i;:::-;1183:47;;1273:15;1259:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1240:49;;1321:18;1303:15;:36;1299:67;;;1348:18;;;;;;;;;;;;;;1299:67;1376:21;1412:9;1407:1157;1427:15;1423:1;:19;1407:1157;;;1506:15;1536:7;1545:9;1556;1569:50;1598:10;1615:1;1569:14;:50::i;:::-;1535:84;;;;;;1643:1;1638;:6;;;1634:789;;1735:70;1760:8;1770:10;1782:1;1785;1788:16;1735:24;:70::i;:::-;1725:80;;1634:789;;;1834:2;1830:1;:6;;;1826:597;;;2121:184;2166:38;2195:8;2166:28;:38::i;:::-;2233:1;2229;:5;;;;:::i;:::-;2259:1;2285;2121:16;:184::i;:::-;2111:194;;1826:597;;;2354:54;2379:8;2392:1;2398;2404;2354:16;:54::i;:::-;2344:64;;1826:597;1634:789;2459:1;2440:21;;:7;:21;;;2436:75;;2481:15;;;;;:::i;:::-;;;;2436:75;2546:7;2524:16;2541:1;2524:19;;;;;;;;:::i;:::-;;;;;;;:29;;;;;;;;;;;1449:1115;;;;1444:3;;;;;;;1407:1157;;;;2593:18;2577:13;:34;2573:65;;;2620:18;;;;;;;;;;;;;;2573:65;1119:1526;;;904:1741;;;;;:::o;7665:82:50:-;7723:17;7728:11;7737:1;7728:8;:11::i;:::-;7723:4;:17::i;:::-;7665:82;:::o;9420:102::-;9488:27;9503:11;9512:1;9503:8;:11::i;:::-;9488:14;:27::i;:::-;9420:102;:::o;10596:216::-;10701:10;10713:13;10759:46;10773:11;10782:1;10773:8;:11::i;:::-;10794:6;10759:46;;10803:1;10759:13;:46::i;:::-;10742:63;;;;;;;;10596:216;;;;;:::o;13276:409:49:-;13345:14;13450:4;13444;13437:18;13524:50;13518:4;13511:64;13627:4;13621;13611:21;13601:31;;13276:409;;;:::o;11825:1191:52:-;11992:4;12064:18;12085:9;:18;12095:7;12085:18;;;;;;;;;;;;;;;;12064:39;;12131:1;12117:10;:15;12113:58;;12155:5;12148:12;;;;;12113:58;12232:24;12259:58;12294:4;12300;;12259:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12306:10;12259:34;:58::i;:::-;12232:85;;12405:14;:7;:12;:14::i;:::-;12429:24;:7;:22;:24::i;:::-;12507:20;12537:21;12561:7;:14;12537:38;;12590:9;12602:1;12590:13;;12585:157;12609:13;12605:1;:17;12585:157;;;12647:36;12663:7;12672;12680:1;12672:10;;;;;;;;:::i;:::-;;;;;;;;12647:6;:15;;:36;;;;;:::i;:::-;12643:89;;;12703:14;;;;;:::i;:::-;;;;12643:89;12624:3;;;;;;;12585:157;;;;12835:10;12819:12;:26;12815:120;;12920:4;12913:11;;;;;;;;12815:120;13004:5;12997:12;;;;;;11825:1191;;;;;;;:::o;25451:415:50:-;25511:23;25849:1;25839:11;;25451:415;;;:::o;15851:552::-;15925:11;16024:1;16014:11;;16061:1;16057;16051:8;16048:15;16038:349;;16114:1;16108:8;16105:1;16101:16;16098:1;16094:24;16153:4;16150:1;16146:12;16141:17;;16135:238;16161:1;16135:238;;;16203:1;16197:8;16238:4;16235:1;16231:12;16226:17;;16286:1;16280:8;16277:1;16274:15;16264:25;;16339:3;16336:1;16332:11;16324:6;16320:24;16310:45;;16348:5;;;16310:45;16166:207;16135:238;;;16065:322;16038:349;15851:552;;;:::o;1464:222:47:-;1605:4;175:3;1632:47;;:4;:12;;:22;113:3;1632:22;;;;;;;;;;;;;;;:31;1655:7;1632:31;;;;;;;;;;;;;;;;;;;;;;;;;:47;;;;1625:54;;1464:222;;;;:::o;5117:253::-;5271:4;5310:5;5298:17;;113:3;5298:17;;;;:65;;;;;175:3;5319:44;;:4;:12;;:19;5332:5;5319:19;;;;;;;;;;;;;;;:28;5339:7;5319:28;;;;;;;;;;;;;;;;;;;;;;;;;:44;;;;5298:65;5291:72;;5117:253;;;;;:::o;5164:552:21:-;5295:7;5304:9;5315;5492:3;5486:4;5482:14;5554:4;5540:12;5536:23;5524:10;5520:40;5514:47;5509:52;;5619:4;5605:12;5601:23;5589:10;5585:40;5579:47;5574:52;;5692:4;5678:12;5674:23;5662:10;5658:40;5652:47;5649:1;5644:56;5639:61;;5448:262;5164:552;;;;;:::o;2987:1429::-;3205:15;3379:1;3371:10;;3345:38;;3522:28;3693:4;3689:1;3677:10;3673:18;3669:29;3663:36;3639:60;;3820:16;3815:2;3810:1;3802:10;;3779:20;:33;;;;:::i;:::-;:38;;;;:::i;:::-;:57;3775:105;;;3867:1;3852:17;;;;;3775:105;3917:30;4227:4;4223:1;4211:10;4207:18;4203:29;4182:50;;168:10;4362:19;;4268:113;;;4288:7;4268:45;;;4314:8;4324:17;4268:74;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:113;;;;4251:158;;4407:1;4392:17;;;;;;4251:158;3226:1190;;2987:1429;;;;;;;;:::o;11989:726:49:-;12101:14;12212:4;12206:11;12277:4;12271;12264:18;12315:4;12312:1;12308:12;12302:4;12295:26;12347:1;12341:4;12334:15;12375:1;12369:4;12362:15;12433:4;12427;12421;12415;12412:1;12405:5;12394:44;12390:49;12465:1;12459:4;12452:15;12617:16;12611:4;12607:27;12601:34;12591:44;;12661:1;12655:4;12648:15;12183:526;11989:726;;;;;;:::o;2861:4547:50:-;2985:97;;;3010:2;3014;3041;3035:8;;3066:2;3060:8;;2985:97;;;;;:::o;3095:143::-;3152:2;3146:9;3189:2;3183:9;3179:2;3172:21;3221:2;3217;3210:14;3118:120;3095:143;;:::o;3251:2828::-;3454:5;3449:2;3445;3441:11;3438:22;3428:982;;3561:4;3557:2;3553:13;3617:2;3611:9;3606:2;3600:9;3597:24;3587:53;;3625:13;3635:2;3631;3625:13;:::i;:::-;3587:53;3661:705;3668:1;3661:705;;;3713:4;3709:2;3705:13;3699:19;;3753:2;3749;3746:10;3759:5;3743:23;3807:2;3801:9;3861:2;3857;3853:11;3942:2;3936:9;4009:2;4005;4002:10;3992:34;;4016:8;;;;;3992:34;4051:243;4058:1;4051:243;;;4115:2;4108:4;4104:2;4100:13;4093:25;4161:2;4157;4153:11;4147:17;;4205:2;4199:9;4193:15;;4254:2;4250;4247:10;4051:243;4237:31;4051:243;4341:2;4334:4;4330:2;4326:13;4319:25;3673:693;;;3661:705;;;;4387:5;;;;;;3428:982;4541:2;4537;4533:11;4526:2;4522;4518:11;4515:1;4511:19;4508:1;4504:27;4500:45;4646:2;4640:9;4687:2;4681:9;4729:3;4724;4721:12;4711:54;;4749:14;4759:3;4754;4749:14;:::i;:::-;4737:26;;;;4711:54;4803:2;4797:9;4845:3;4840;4837:12;4827:177;;4889:14;4899:3;4894;4889:14;:::i;:::-;4877:26;;;;4946:3;4941;4938:12;4928:54;;4966:14;4976:3;4971;4966:14;:::i;:::-;4954:26;;;;4928:54;4827:177;5036:3;5032:2;5025:15;5072:3;5068:2;5061:15;5108:3;5104:2;5097:15;4607:523;;;5275:2;5269:9;5305:2;5299:8;;5344:2;5328:569;5349:1;5328:569;;;5380:154;5387:1;5380:154;;;5438:2;5432:4;5428:13;5422:19;;5493:2;5487:9;5483:2;5480:17;5380:154;5470:38;5380:154;5569:2;5596:152;5603:1;5596:152;;;5652:2;5648;5644:11;5638:17;;5707:2;5701:9;5697:2;5694:17;5596:152;5684:38;5596:152;5779:2;5773:8;;5823:2;5819;5816:10;5806:31;;5830:5;;;5806:31;5862:13;5872:2;5868;5862:13;:::i;:::-;5354:543;5328:569;;;5332:16;5185:730;5960:2;5953:4;5949:2;5945:13;5942:21;5932:69;;5967:32;5996:2;5989:4;5985:2;5981:13;5977:2;5967:32;:::i;:::-;5932:69;6035:2;6031;6028:10;6018:47;;6042:21;6060:2;6056;6052;6042:21;:::i;:::-;6018:47;3282:2797;3251:2828;;;;:::o;:::-;6114:1;6108:8;6132:1;6129;6126:8;6093:1299;;6170:4;6166:9;6220:4;6217:1;6213:12;6278:1;6275;6271:9;6268:1;6264:17;6321:1;6406:67;6447:1;6441:8;6436:1;6433;6429:9;6423:16;6420:30;6406:67;;6469:1;6466;6462:9;6457:14;;6406:67;;;6564:1;6561;6558:8;6548:29;;6570:5;;;;;;6548:29;6672:1;6667:6;;6661:75;6710:1;6704:8;6699:1;6696;6692:9;6686:16;6683:30;6661:75;;6732:1;6729;6725:9;6720:14;;6661:75;;;6821:1;6818;6815:8;6805:379;;6847:293;6854:1;6847:293;;;6900:1;6894:8;6943:1;6937:8;6934:1;6927:19;6981:1;6978;6971:12;7020:1;7017;7013:9;7008:14;;7059:4;7056:1;7052:12;7047:17;;7105:1;7102;7099:8;7089:29;;7111:5;;;7089:29;6859:281;6847:293;;;7161:5;;;;;;6805:379;7211:1;7208;7201:12;7279:18;7295:1;7292;7289;7279:18;:::i;:::-;7324:1;7321;7314:12;7373:5;;;;6093:1299;6097:21;2861:4547;:::o;8425:722::-;8637:1;8633;8627:8;8624:15;8614:517;;8675:4;8672:1;8668:12;8713:4;8710:1;8706:12;8774:1;8770;8764:8;8760:16;8757:1;8753:24;8750:1;8746:32;8795:277;8802:1;8795:277;;;8858:1;8852:8;8848:1;8842:8;8839:22;8829:143;;8901:4;8898:1;8894:12;8889:17;;8947:1;8941:8;8938:1;8931:19;8829:143;9005:4;9002:1;8998:12;8993:17;;9040:3;9037:1;9034:10;8795:277;9031:23;8795:277;9113:1;9110;9106:9;9103:1;9099:17;9096:1;9089:28;8641:490;;;8614:517;8425:722;:::o;27459:1099::-;27580:10;27592:13;27700:1;27696:6;27724:1;27753;27747:8;27777:1;27819:6;27811;27807:19;27797:29;;27791:453;27829:1;27791:453;;;27875:1;27872;27868:9;27865:1;27861:17;27852:26;;27932:5;27929:1;27925:13;27922:1;27918:21;27912:28;27904:6;27900:41;27895:46;;27980:6;27977:1;27974:13;27970:1;27967;27964:8;27961:27;27991:5;27958:40;28104:1;28096:6;28093:13;28083:112;;28146:1;28139:5;28135:13;28130:18;;28169:8;;28083:112;28228:1;28221:5;28217:13;28212:18;;27791:453;;;;28418:6;28415:1;28412:13;28403:22;;28457:5;28450:13;28443:21;28438:26;;28505:1;28501;28494:5;28490:13;28486:21;28477:30;;28540:1;28533:5;28529:13;28520:22;;27673:879;;;;27459:1099;;;;;;:::o;7:99:53:-;59:6;93:5;87:12;77:22;;7:99;;;:::o;112:169::-;196:11;230:6;225:3;218:19;270:4;265:3;261:14;246:29;;112:169;;;;:::o;287:139::-;376:6;371:3;366;360:23;417:1;408:6;403:3;399:16;392:27;287:139;;;:::o;432:102::-;473:6;524:2;520:7;515:2;508:5;504:14;500:28;490:38;;432:102;;;:::o;540:377::-;628:3;656:39;689:5;656:39;:::i;:::-;711:71;775:6;770:3;711:71;:::i;:::-;704:78;;791:65;849:6;844:3;837:4;830:5;826:16;791:65;:::i;:::-;881:29;903:6;881:29;:::i;:::-;876:3;872:39;865:46;;632:285;540:377;;;;:::o;923:313::-;1036:4;1074:2;1063:9;1059:18;1051:26;;1123:9;1117:4;1113:20;1109:1;1098:9;1094:17;1087:47;1151:78;1224:4;1215:6;1151:78;:::i;:::-;1143:86;;923:313;;;;:::o;1242:75::-;1275:6;1308:2;1302:9;1292:19;;1242:75;:::o;1323:117::-;1432:1;1429;1422:12;1446:117;1555:1;1552;1545:12;1569:117;1678:1;1675;1668:12;1692:117;1801:1;1798;1791:12;1815:117;1924:1;1921;1914:12;1951:552;2008:8;2018:6;2068:3;2061:4;2053:6;2049:17;2045:27;2035:122;;2076:79;;:::i;:::-;2035:122;2189:6;2176:20;2166:30;;2219:18;2211:6;2208:30;2205:117;;;2241:79;;:::i;:::-;2205:117;2355:4;2347:6;2343:17;2331:29;;2409:3;2401:4;2393:6;2389:17;2379:8;2375:32;2372:41;2369:128;;;2416:79;;:::i;:::-;2369:128;1951:552;;;;;:::o;2509:527::-;2579:6;2587;2636:2;2624:9;2615:7;2611:23;2607:32;2604:119;;;2642:79;;:::i;:::-;2604:119;2790:1;2779:9;2775:17;2762:31;2820:18;2812:6;2809:30;2806:117;;;2842:79;;:::i;:::-;2806:117;2955:64;3011:7;3002:6;2991:9;2987:22;2955:64;:::i;:::-;2937:82;;;;2733:296;2509:527;;;;;:::o;3042:126::-;3079:7;3119:42;3112:5;3108:54;3097:65;;3042:126;;;:::o;3174:96::-;3211:7;3240:24;3258:5;3240:24;:::i;:::-;3229:35;;3174:96;;;:::o;3276:122::-;3349:24;3367:5;3349:24;:::i;:::-;3342:5;3339:35;3329:63;;3388:1;3385;3378:12;3329:63;3276:122;:::o;3404:139::-;3450:5;3488:6;3475:20;3466:29;;3504:33;3531:5;3504:33;:::i;:::-;3404:139;;;;:::o;3549:329::-;3608:6;3657:2;3645:9;3636:7;3632:23;3628:32;3625:119;;;3663:79;;:::i;:::-;3625:119;3783:1;3808:53;3853:7;3844:6;3833:9;3829:22;3808:53;:::i;:::-;3798:63;;3754:117;3549:329;;;;:::o;3884:77::-;3921:7;3950:5;3939:16;;3884:77;;;:::o;3967:122::-;4040:24;4058:5;4040:24;:::i;:::-;4033:5;4030:35;4020:63;;4079:1;4076;4069:12;4020:63;3967:122;:::o;4095:139::-;4141:5;4179:6;4166:20;4157:29;;4195:33;4222:5;4195:33;:::i;:::-;4095:139;;;;:::o;4240:1015::-;4339:6;4347;4355;4363;4371;4420:2;4408:9;4399:7;4395:23;4391:32;4388:119;;;4426:79;;:::i;:::-;4388:119;4546:1;4571:53;4616:7;4607:6;4596:9;4592:22;4571:53;:::i;:::-;4561:63;;4517:117;4701:2;4690:9;4686:18;4673:32;4732:18;4724:6;4721:30;4718:117;;;4754:79;;:::i;:::-;4718:117;4867:64;4923:7;4914:6;4903:9;4899:22;4867:64;:::i;:::-;4849:82;;;;4644:297;5008:2;4997:9;4993:18;4980:32;5039:18;5031:6;5028:30;5025:117;;;5061:79;;:::i;:::-;5025:117;5174:64;5230:7;5221:6;5210:9;5206:22;5174:64;:::i;:::-;5156:82;;;;4951:297;4240:1015;;;;;;;;:::o;5261:90::-;5295:7;5338:5;5331:13;5324:21;5313:32;;5261:90;;;:::o;5357:109::-;5438:21;5453:5;5438:21;:::i;:::-;5433:3;5426:34;5357:109;;:::o;5472:210::-;5559:4;5597:2;5586:9;5582:18;5574:26;;5610:65;5672:1;5661:9;5657:17;5648:6;5610:65;:::i;:::-;5472:210;;;;:::o;5688:77::-;5725:7;5754:5;5743:16;;5688:77;;;:::o;5771:122::-;5844:24;5862:5;5844:24;:::i;:::-;5837:5;5834:35;5824:63;;5883:1;5880;5873:12;5824:63;5771:122;:::o;5899:139::-;5945:5;5983:6;5970:20;5961:29;;5999:33;6026:5;5999:33;:::i;:::-;5899:139;;;;:::o;6044:329::-;6103:6;6152:2;6140:9;6131:7;6127:23;6123:32;6120:119;;;6158:79;;:::i;:::-;6120:119;6278:1;6303:53;6348:7;6339:6;6328:9;6324:22;6303:53;:::i;:::-;6293:63;;6249:117;6044:329;;;;:::o;6379:117::-;6488:1;6485;6478:12;6536:244;6621:5;6662:3;6653:6;6648:3;6644:16;6640:26;6637:113;;;6669:79;;:::i;:::-;6637:113;6768:6;6759:15;;6536:244;;;;:::o;6786:712::-;6893:6;6901;6950:2;6938:9;6929:7;6925:23;6921:32;6918:119;;;6956:79;;:::i;:::-;6918:119;7104:1;7093:9;7089:17;7076:31;7134:18;7126:6;7123:30;7120:117;;;7156:79;;:::i;:::-;7120:117;7261:92;7345:7;7336:6;7325:9;7321:22;7261:92;:::i;:::-;7251:102;;7047:316;7402:2;7428:53;7473:7;7464:6;7453:9;7449:22;7428:53;:::i;:::-;7418:63;;7373:118;6786:712;;;;;:::o;7504:60::-;7532:3;7553:5;7546:12;;7504:60;;;:::o;7570:142::-;7620:9;7653:53;7671:34;7680:24;7698:5;7680:24;:::i;:::-;7671:34;:::i;:::-;7653:53;:::i;:::-;7640:66;;7570:142;;;:::o;7718:166::-;7840:37;7871:5;7840:37;:::i;:::-;7835:3;7828:50;7718:166;;:::o;7890:292::-;8018:4;8056:2;8045:9;8041:18;8033:26;;8069:106;8172:1;8161:9;8157:17;8148:6;8069:106;:::i;:::-;7890:292;;;;:::o;8188:118::-;8275:24;8293:5;8275:24;:::i;:::-;8270:3;8263:37;8188:118;;:::o;8312:222::-;8405:4;8443:2;8432:9;8428:18;8420:26;;8456:71;8524:1;8513:9;8509:17;8500:6;8456:71;:::i;:::-;8312:222;;;;:::o;8540:817::-;8628:6;8636;8644;8652;8701:2;8689:9;8680:7;8676:23;8672:32;8669:119;;;8707:79;;:::i;:::-;8669:119;8827:1;8852:53;8897:7;8888:6;8877:9;8873:22;8852:53;:::i;:::-;8842:63;;8798:117;8954:2;8980:53;9025:7;9016:6;9005:9;9001:22;8980:53;:::i;:::-;8970:63;;8925:118;9110:2;9099:9;9095:18;9082:32;9141:18;9133:6;9130:30;9127:117;;;9163:79;;:::i;:::-;9127:117;9276:64;9332:7;9323:6;9312:9;9308:22;9276:64;:::i;:::-;9258:82;;;;9053:297;8540:817;;;;;;;:::o;9363:149::-;9399:7;9439:66;9432:5;9428:78;9417:89;;9363:149;;;:::o;9518:115::-;9603:23;9620:5;9603:23;:::i;:::-;9598:3;9591:36;9518:115;;:::o;9639:218::-;9730:4;9768:2;9757:9;9753:18;9745:26;;9781:69;9847:1;9836:9;9832:17;9823:6;9781:69;:::i;:::-;9639:218;;;;:::o;9863:474::-;9931:6;9939;9988:2;9976:9;9967:7;9963:23;9959:32;9956:119;;;9994:79;;:::i;:::-;9956:119;10114:1;10139:53;10184:7;10175:6;10164:9;10160:22;10139:53;:::i;:::-;10129:63;;10085:117;10241:2;10267:53;10312:7;10303:6;10292:9;10288:22;10267:53;:::i;:::-;10257:63;;10212:118;9863:474;;;;;:::o;10343:114::-;10410:6;10444:5;10438:12;10428:22;;10343:114;;;:::o;10463:184::-;10562:11;10596:6;10591:3;10584:19;10636:4;10631:3;10627:14;10612:29;;10463:184;;;;:::o;10653:132::-;10720:4;10743:3;10735:11;;10773:4;10768:3;10764:14;10756:22;;10653:132;;;:::o;10791:108::-;10868:24;10886:5;10868:24;:::i;:::-;10863:3;10856:37;10791:108;;:::o;10905:179::-;10974:10;10995:46;11037:3;11029:6;10995:46;:::i;:::-;11073:4;11068:3;11064:14;11050:28;;10905:179;;;;:::o;11090:113::-;11160:4;11192;11187:3;11183:14;11175:22;;11090:113;;;:::o;11239:732::-;11358:3;11387:54;11435:5;11387:54;:::i;:::-;11457:86;11536:6;11531:3;11457:86;:::i;:::-;11450:93;;11567:56;11617:5;11567:56;:::i;:::-;11646:7;11677:1;11662:284;11687:6;11684:1;11681:13;11662:284;;;11763:6;11757:13;11790:63;11849:3;11834:13;11790:63;:::i;:::-;11783:70;;11876:60;11929:6;11876:60;:::i;:::-;11866:70;;11722:224;11709:1;11706;11702:9;11697:14;;11662:284;;;11666:14;11962:3;11955:10;;11363:608;;;11239:732;;;;:::o;11977:373::-;12120:4;12158:2;12147:9;12143:18;12135:26;;12207:9;12201:4;12197:20;12193:1;12182:9;12178:17;12171:47;12235:108;12338:4;12329:6;12235:108;:::i;:::-;12227:116;;11977:373;;;;:::o;12356:180::-;12404:77;12401:1;12394:88;12501:4;12498:1;12491:15;12525:4;12522:1;12515:15;12542:281;12625:27;12647:4;12625:27;:::i;:::-;12617:6;12613:40;12755:6;12743:10;12740:22;12719:18;12707:10;12704:34;12701:62;12698:88;;;12766:18;;:::i;:::-;12698:88;12806:10;12802:2;12795:22;12585:238;12542:281;;:::o;12829:129::-;12863:6;12890:20;;:::i;:::-;12880:30;;12919:33;12947:4;12939:6;12919:33;:::i;:::-;12829:129;;;:::o;12964:311::-;13041:4;13131:18;13123:6;13120:30;13117:56;;;13153:18;;:::i;:::-;13117:56;13203:4;13195:6;13191:17;13183:25;;13263:4;13257;13253:15;13245:23;;12964:311;;;:::o;13298:710::-;13394:5;13419:81;13435:64;13492:6;13435:64;:::i;:::-;13419:81;:::i;:::-;13410:90;;13520:5;13549:6;13542:5;13535:21;13583:4;13576:5;13572:16;13565:23;;13636:4;13628:6;13624:17;13616:6;13612:30;13665:3;13657:6;13654:15;13651:122;;;13684:79;;:::i;:::-;13651:122;13799:6;13782:220;13816:6;13811:3;13808:15;13782:220;;;13891:3;13920:37;13953:3;13941:10;13920:37;:::i;:::-;13915:3;13908:50;13987:4;13982:3;13978:14;13971:21;;13858:144;13842:4;13837:3;13833:14;13826:21;;13782:220;;;13786:21;13400:608;;13298:710;;;;;:::o;14031:370::-;14102:5;14151:3;14144:4;14136:6;14132:17;14128:27;14118:122;;14159:79;;:::i;:::-;14118:122;14276:6;14263:20;14301:94;14391:3;14383:6;14376:4;14368:6;14364:17;14301:94;:::i;:::-;14292:103;;14108:293;14031:370;;;;:::o;14407:684::-;14500:6;14508;14557:2;14545:9;14536:7;14532:23;14528:32;14525:119;;;14563:79;;:::i;:::-;14525:119;14683:1;14708:53;14753:7;14744:6;14733:9;14729:22;14708:53;:::i;:::-;14698:63;;14654:117;14838:2;14827:9;14823:18;14810:32;14869:18;14861:6;14858:30;14855:117;;;14891:79;;:::i;:::-;14855:117;14996:78;15066:7;15057:6;15046:9;15042:22;14996:78;:::i;:::-;14986:88;;14781:303;14407:684;;;;;:::o;15097:180::-;15145:77;15142:1;15135:88;15242:4;15239:1;15232:15;15266:4;15263:1;15256:15;15283:118;15370:24;15388:5;15370:24;:::i;:::-;15365:3;15358:37;15283:118;;:::o;15407:222::-;15500:4;15538:2;15527:9;15523:18;15515:26;;15551:71;15619:1;15608:9;15604:17;15595:6;15551:71;:::i;:::-;15407:222;;;;:::o;15635:180::-;15683:77;15680:1;15673:88;15780:4;15777:1;15770:15;15804:4;15801:1;15794:15;15821:233;15860:3;15883:24;15901:5;15883:24;:::i;:::-;15874:33;;15929:66;15922:5;15919:77;15916:103;;15999:18;;:::i;:::-;15916:103;16046:1;16039:5;16035:13;16028:20;;15821:233;;;:::o;16060:117::-;16169:1;16166;16159:12;16183:117;16292:1;16289;16282:12;16306:117;16415:1;16412;16405:12;16429:724;16506:4;16512:6;16568:11;16555:25;16668:1;16662:4;16658:12;16647:8;16631:14;16627:29;16623:48;16603:18;16599:73;16589:168;;16676:79;;:::i;:::-;16589:168;16788:18;16778:8;16774:33;16766:41;;16840:4;16827:18;16817:28;;16868:18;16860:6;16857:30;16854:117;;;16890:79;;:::i;:::-;16854:117;16998:2;16992:4;16988:13;16980:21;;17055:4;17047:6;17043:17;17027:14;17023:38;17017:4;17013:49;17010:136;;;17065:79;;:::i;:::-;17010:136;16519:634;16429:724;;;;;:::o;17159:171::-;17198:3;17221:24;17239:5;17221:24;:::i;:::-;17212:33;;17267:4;17260:5;17257:15;17254:41;;17275:18;;:::i;:::-;17254:41;17322:1;17315:5;17311:13;17304:20;;17159:171;;;:::o;17336:194::-;17376:4;17396:20;17414:1;17396:20;:::i;:::-;17391:25;;17430:20;17448:1;17430:20;:::i;:::-;17425:25;;17474:1;17471;17467:9;17459:17;;17498:1;17492:4;17489:11;17486:37;;;17503:18;;:::i;:::-;17486:37;17336:194;;;;:::o;17536:180::-;17584:77;17581:1;17574:88;17681:4;17678:1;17671:15;17705:4;17702:1;17695:15;17722:185;17762:1;17779:20;17797:1;17779:20;:::i;:::-;17774:25;;17813:20;17831:1;17813:20;:::i;:::-;17808:25;;17852:1;17842:35;;17857:18;;:::i;:::-;17842:35;17899:1;17896;17892:9;17887:14;;17722:185;;;;:::o;17913:86::-;17948:7;17988:4;17981:5;17977:16;17966:27;;17913:86;;;:::o;18005:191::-;18043:4;18063:18;18079:1;18063:18;:::i;:::-;18058:23;;18095:18;18111:1;18095:18;:::i;:::-;18090:23;;18137:1;18134;18130:9;18122:17;;18161:4;18155;18152:14;18149:40;;;18169:18;;:::i;:::-;18149:40;18005:191;;;;:::o;18202:::-;18242:3;18261:20;18279:1;18261:20;:::i;:::-;18256:25;;18295:20;18313:1;18295:20;:::i;:::-;18290:25;;18338:1;18335;18331:9;18324:16;;18359:3;18356:1;18353:10;18350:36;;;18366:18;;:::i;:::-;18350:36;18202:191;;;;:::o;18399:118::-;18486:24;18504:5;18486:24;:::i;:::-;18481:3;18474:37;18399:118;;:::o;18523:98::-;18574:6;18608:5;18602:12;18592:22;;18523:98;;;:::o;18627:168::-;18710:11;18744:6;18739:3;18732:19;18784:4;18779:3;18775:14;18760:29;;18627:168;;;;:::o;18801:373::-;18887:3;18915:38;18947:5;18915:38;:::i;:::-;18969:70;19032:6;19027:3;18969:70;:::i;:::-;18962:77;;19048:65;19106:6;19101:3;19094:4;19087:5;19083:16;19048:65;:::i;:::-;19138:29;19160:6;19138:29;:::i;:::-;19133:3;19129:39;19122:46;;18891:283;18801:373;;;;:::o;19180:419::-;19319:4;19357:2;19346:9;19342:18;19334:26;;19370:71;19438:1;19427:9;19423:17;19414:6;19370:71;:::i;:::-;19488:9;19482:4;19478:20;19473:2;19462:9;19458:18;19451:48;19516:76;19587:4;19578:6;19516:76;:::i;:::-;19508:84;;19180:419;;;;;:::o;19605:120::-;19677:23;19694:5;19677:23;:::i;:::-;19670:5;19667:34;19657:62;;19715:1;19712;19705:12;19657:62;19605:120;:::o;19731:141::-;19787:5;19818:6;19812:13;19803:22;;19834:32;19860:5;19834:32;:::i;:::-;19731:141;;;;:::o;19878:349::-;19947:6;19996:2;19984:9;19975:7;19971:23;19967:32;19964:119;;;20002:79;;:::i;:::-;19964:119;20122:1;20147:63;20202:7;20193:6;20182:9;20178:22;20147:63;:::i;:::-;20137:73;;20093:127;19878:349;;;;:::o","linkReferences":{}},"methodIdentifiers":{"addOwner(address)":"7065cb48","getOwners(address)":"fd8b84b1","isInitialized(address)":"d60b347f","isModuleType(uint256)":"ecd05961","isValidSignatureWithSender(address,bytes32,bytes)":"f551e2ee","name()":"06fdde03","onInstall(bytes)":"6d61fe70","onUninstall(bytes)":"8a91b0e3","ownerCount(address)":"ccfdec8c","removeOwner(address,address)":"fbe5ce0a","setThreshold(uint256)":"960bfe04","threshold(address)":"c86ec2bf","validateSignatureWithData(bytes32,bytes,bytes)":"940d3840","validateUserOp((address,uint256,bytes,bytes,bytes32,uint256,bytes32,bytes,bytes),bytes32)":"97003203","version()":"54fd4d50"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.28+commit.7893614a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"CannotRemoveOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"InvalidOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidSignature\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidThreshold\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"LinkedList_AlreadyInitialized\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"entry\",\"type\":\"address\"}],\"name\":\"LinkedList_EntryAlreadyInList\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"entry\",\"type\":\"address\"}],\"name\":\"LinkedList_InvalidEntry\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"LinkedList_InvalidPage\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MaxOwnersReached\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"smartAccount\",\"type\":\"address\"}],\"name\":\"ModuleAlreadyInitialized\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"smartAccount\",\"type\":\"address\"}],\"name\":\"NotInitialized\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotSortedAndUnique\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ThresholdNotSet\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"ModuleInitialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"ModuleUninitialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"OwnerAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"OwnerRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"threshold\",\"type\":\"uint256\"}],\"name\":\"ThresholdSet\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"addOwner\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"getOwners\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"ownersArray\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"smartAccount\",\"type\":\"address\"}],\"name\":\"isInitialized\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"typeID\",\"type\":\"uint256\"}],\"name\":\"isModuleType\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"hash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"isValidSignatureWithSender\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"onInstall\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onUninstall\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"ownerCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"prevOwner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"removeOwner\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_threshold\",\"type\":\"uint256\"}],\"name\":\"setThreshold\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"threshold\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"hash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"validateSignatureWithData\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"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\":\"bytes32\",\"name\":\"accountGasLimits\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"preVerificationGas\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"gasFees\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"paymasterAndData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct PackedUserOperation\",\"name\":\"userOp\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"userOpHash\",\"type\":\"bytes32\"}],\"name\":\"validateUserOp\",\"outputs\":[{\"internalType\":\"ERC7579ValidatorBase.ValidationData\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"version\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}],\"devdoc\":{\"author\":\"Rhinestone\",\"details\":\"Module that allows users to designate EOA owners that can validate transactions using a threshold\",\"kind\":\"dev\",\"methods\":{\"addOwner(address)\":{\"details\":\"will revert if the owner is already added\",\"params\":{\"owner\":\"address of the owner to add\"}},\"getOwners(address)\":{\"params\":{\"account\":\"address of the account\"},\"returns\":{\"ownersArray\":\"array of owners\"}},\"isInitialized(address)\":{\"params\":{\"smartAccount\":\"address of the smart account\"},\"returns\":{\"_0\":\"true if the module is initialized, false otherwise\"}},\"isModuleType(uint256)\":{\"params\":{\"typeID\":\"type of the module\"},\"returns\":{\"_0\":\"true if the type is a module type, false otherwise\"}},\"isValidSignatureWithSender(address,bytes32,bytes)\":{\"params\":{\"data\":\"bytes data containing the signatures\",\"hash\":\"bytes32 hash of the data\"},\"returns\":{\"_0\":\"bytes4 EIP1271_SUCCESS if the signature is valid, EIP1271_FAILED otherwise\"}},\"name()\":{\"returns\":{\"_0\":\"name of the module\"}},\"onInstall(bytes)\":{\"details\":\"data is encoded as follows: abi.encode(threshold, owners)\",\"params\":{\"data\":\"encoded data containing the threshold and owners\"}},\"onUninstall(bytes)\":{\"details\":\"the data parameter is not used\"},\"removeOwner(address,address)\":{\"details\":\"will revert if the owner is not added or the previous owner is invalid\",\"params\":{\"owner\":\"address of the owner to remove\",\"prevOwner\":\"address of the previous owner\"}},\"setThreshold(uint256)\":{\"details\":\"the function will revert if the module is not initialized\",\"params\":{\"_threshold\":\"uint256 threshold to set\"}},\"validateSignatureWithData(bytes32,bytes,bytes)\":{\"params\":{\"data\":\"bytes data containing the data\",\"hash\":\"bytes32 hash of the data\",\"signature\":\"bytes data containing the signatures\"},\"returns\":{\"_0\":\"bool true if the signature is valid, false otherwise\"}},\"validateUserOp((address,uint256,bytes,bytes,bytes32,uint256,bytes32,bytes,bytes),bytes32)\":{\"params\":{\"userOp\":\"PackedUserOperation struct containing the UserOperation\",\"userOpHash\":\"bytes32 hash of the UserOperation\"},\"returns\":{\"_0\":\"ValidationData the UserOperation validation result\"}},\"version()\":{\"returns\":{\"_0\":\"version of the module\"}}},\"title\":\"OwnableValidator\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"addOwner(address)\":{\"notice\":\"Adds an owner to the account\"},\"getOwners(address)\":{\"notice\":\"Returns the owners of the account\"},\"isInitialized(address)\":{\"notice\":\"Checks if the module is initialized\"},\"isModuleType(uint256)\":{\"notice\":\"Returns the type of the module\"},\"isValidSignatureWithSender(address,bytes32,bytes)\":{\"notice\":\"Validates an ERC-1271 signature with the sender\"},\"name()\":{\"notice\":\"Returns the name of the module\"},\"onInstall(bytes)\":{\"notice\":\"Initializes the module with the threshold and owners\"},\"onUninstall(bytes)\":{\"notice\":\"Handles the uninstallation of the module and clears the threshold and owners\"},\"removeOwner(address,address)\":{\"notice\":\"Removes an owner from the account\"},\"setThreshold(uint256)\":{\"notice\":\"Sets the threshold for the account\"},\"validateSignatureWithData(bytes32,bytes,bytes)\":{\"notice\":\"Validates a signature with the data (stateless validation)\"},\"validateUserOp((address,uint256,bytes,bytes,bytes32,uint256,bytes32,bytes,bytes),bytes32)\":{\"notice\":\"Validates a user operation\"},\"version()\":{\"notice\":\"Returns the version of the module\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/OwnableValidator/OwnableValidator.sol\":\"OwnableValidator\"},\"evmVersion\":\"cancun\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@ERC4337/=node_modules/@ERC4337/\",\":@erc7579/enumerablemap4337/=node_modules/@erc7579/enumerablemap4337/src/\",\":@gnosis.pm/=node_modules/@gnosis.pm/\",\":@openzeppelin/=node_modules/@openzeppelin/\",\":@prb/math/=node_modules/@prb/math/src/\",\":@rhinestone/=node_modules/@rhinestone/\",\":@safe-global/=node_modules/@safe-global/\",\":@webauthn/=node_modules/webauthn-sol/src/\",\":ExcessivelySafeCall/=node_modules/excessively-safe-call/src/\",\":FreshCryptoLib/=node_modules/FreshCryptoLib/solidity/src/\",\":account-abstraction-v0.6/=node_modules/@ERC4337/account-abstraction-v0.6/contracts/\",\":account-abstraction/=node_modules/@ERC4337/account-abstraction/contracts/\",\":checknsignatures/=node_modules/@rhinestone/checknsignatures/src/\",\":ds-test/=node_modules/ds-test/src/\",\":erc4337-validation/=node_modules/@rhinestone/erc4337-validation/src/\",\":excessively-safe-call/=node_modules/excessively-safe-call/\",\":flatbytes/=node_modules/@rhinestone/flatbytes/src/\",\":forge-std/=node_modules/forge-std/src/\",\":hardhat-deploy/=node_modules/hardhat-deploy/\",\":hardhat/=node_modules/hardhat/\",\":modulekit/=node_modules/@rhinestone/modulekit/src/\",\":sentinellist/=node_modules/@rhinestone/sentinellist/src/\",\":solady/=node_modules/solady/src/\",\":solarray/=node_modules/solarray/src/\",\":solmate/=node_modules/solmate/src/\",\":webauthn-sol/=node_modules/webauthn-sol/\",\"node_modules/webauthn-sol/src/:openzeppelin-contracts/=node_modules/@openzeppelin/\"]},\"sources\":{\"node_modules/@ERC4337/account-abstraction/contracts/core/EntryPoint.sol\":{\"keccak256\":\"0x87549d2e99e1dee6d6eab5b53bcb612014f22fa39818a443c90b7c577505cb44\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://e40dc804f53fe6cf45ac86d65df8a18ccb613ec966da56188b2509b8745ff98b\",\"dweb:/ipfs/QmXmpjRbJemM3jcKSHLLH8wMNrq3hCQtDEv4B9Wx6HjdCh\"]},\"node_modules/@ERC4337/account-abstraction/contracts/core/EntryPointSimulations.sol\":{\"keccak256\":\"0x22173c730ae4f6aa1fd0ab43ea9212debd1070e4c5835b6d3e50f96bf07771b3\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://ca711a75a06f2d641d1dc3491a0680ce091c5a50cb451b775e46db9e7190a441\",\"dweb:/ipfs/QmZUhDH7G9Sd7KbHswNKF81VYV8kJRr893Ur7z33aryj5V\"]},\"node_modules/@ERC4337/account-abstraction/contracts/core/GasDebug.sol\":{\"keccak256\":\"0x8c516bd5a7fe0a26523708518322045447c5275ace64f19800691eb980f69faf\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://1d4f4ed9fd4ea3b835205ea56f1572c73f32f26f815328b7eafc8630929abcac\",\"dweb:/ipfs/QmT9AMMdvv3vzxFRdRJrEcfus65dVPq512BiVx4E4qkggG\"]},\"node_modules/@ERC4337/account-abstraction/contracts/core/Helpers.sol\":{\"keccak256\":\"0x6247e011a6cb0b263b3aa098822977181674d91b62e5bdfe04c6e66f72da25d6\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://ca829a69b3fbc74fec8e140d42a2bf93bc3512609272f031c846470f61f0ab7e\",\"dweb:/ipfs/QmP3r3MBgAN39KeVB1rCGJWwcBcotNt26ALtAR54poQ1Jc\"]},\"node_modules/@ERC4337/account-abstraction/contracts/core/NonceManager.sol\":{\"keccak256\":\"0x1f951786ce6f171e7ed0242fee73ee4a205c7523404ee6cffca48b8c64ea5fe9\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://a602bf2274d478dae7a532cca31f8179131808c324cc26ece5c7e87c5a1015a6\",\"dweb:/ipfs/QmaaSyw5GGbAWzUhAPCtsb38P3MmaVr1ngp61PYHCU2a5a\"]},\"node_modules/@ERC4337/account-abstraction/contracts/core/SenderCreator.sol\":{\"keccak256\":\"0xeb95afb6e4cf921c1ed105ecb9f549ca46bee57f68acd1d2f4f84607ac0db5c5\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://d2ac91562f1fcabe4809a1b4256895efebcf46f89e08336a6c09ee2d29733238\",\"dweb:/ipfs/QmPsQnPcCzioPwVtUhxkbnwKPC1bnhHSbAwK9GXVpjN3mH\"]},\"node_modules/@ERC4337/account-abstraction/contracts/core/StakeManager.sol\":{\"keccak256\":\"0x673eb19600058d8642605ca409c9e1d4cab13735564b856270b92c330ffb1b8d\",\"license\":\"GPL-3.0-only\",\"urls\":[\"bzz-raw://06599c57c7075ee8eb5f1710fccca3eb322876b968ec271e1fb34af41510ab2c\",\"dweb:/ipfs/QmVsDEjmZYtzgXa4AYKxbQEYQVh6NBq8GmFJCariBUqK4G\"]},\"node_modules/@ERC4337/account-abstraction/contracts/core/UserOperationLib.sol\":{\"keccak256\":\"0x9d50ece985d35f82e33e5da417595c86fac10449e3d10895d08363d33aad454b\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://b1d11cc364c8bf7ed5388268c895b5ffed16e87dfbcb320ddeeba5e7974315dc\",\"dweb:/ipfs/QmYSpvjxEjweietQrYZagwQ52ipy7eXx4rwvnTzXKeGeMS\"]},\"node_modules/@ERC4337/account-abstraction/contracts/interfaces/IAccount.sol\":{\"keccak256\":\"0x38710bec0cb20ff4ceef46a80475b5bdabc27b7efd2687fd473db68332f61b78\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://dea7a723e1ef852e8764e69914a345d2e8bc5e13facfc9d5c29d791cb4ab0020\",\"dweb:/ipfs/QmU8dYgyF4DBJXFqjwLAtnE3q8q259ChfoEk9a6wyhHzEP\"]},\"node_modules/@ERC4337/account-abstraction/contracts/interfaces/IAccountExecute.sol\":{\"keccak256\":\"0xd3dc32dde1add1fb6377f939ceff6be31c2e21343522311f7b88db666be9ee6c\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://5b8f065171bd32e23b306868189c730f849ce6147f753c59e396e7afcf384577\",\"dweb:/ipfs/QmZpDRNEZ9YNgGgyLQo5yM4bB1FNbtnfDABsChbgSQKXUh\"]},\"node_modules/@ERC4337/account-abstraction/contracts/interfaces/IAggregator.sol\":{\"keccak256\":\"0xf100d6fcc0c3b450b13e979b6a42c628c292a1bc340eccc2e7796b80e3975588\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://192938b5b27234d35c8098a319e879363c79f750eea4d0e409dc889a8ce5b155\",\"dweb:/ipfs/QmURpaJFPqEtkKP2ngBsgZhAGN8wAWh5XQpYmCkiz4Urz5\"]},\"node_modules/@ERC4337/account-abstraction/contracts/interfaces/IEntryPoint.sol\":{\"keccak256\":\"0x1972a5fcb3a808b58c85af5741949ef6af11ab0debd3ae8c708171ae1ae0d0c4\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://baa9837ae73b9e2362a47d42d081d7c0f3d8e878e5edb381117d94a6968949c9\",\"dweb:/ipfs/QmUmo6FUE7fv5z1WzW1YFjxp8PqaeN2JrEee9au59w3Xhe\"]},\"node_modules/@ERC4337/account-abstraction/contracts/interfaces/IEntryPointSimulations.sol\":{\"keccak256\":\"0x454c515668b9088d000535fa162e1478b39d38a5c615baba2a6efe6ddb88509c\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://492fd691024b4424b2d47f43bc9fcdcf702868c5913eb741a472b496280355f3\",\"dweb:/ipfs/QmZZgGgzBtXbPWpVoBentShqYNfZ6FsRA9oNQcVHiXxCPh\"]},\"node_modules/@ERC4337/account-abstraction/contracts/interfaces/INonceManager.sol\":{\"keccak256\":\"0xd575af0f6ebbd5f0b2933307d44cd7b4e03a69f4b817a67db5409bd3c89aeecb\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://3b1e2dea9b05cfba9d13339ed16d96457dc861013cc4f3f35b71a80f82448db3\",\"dweb:/ipfs/QmVaGy5uGDMSiU2SzyokTjoHFyb39VVG5wtaM9KTnHyZSk\"]},\"node_modules/@ERC4337/account-abstraction/contracts/interfaces/IPaymaster.sol\":{\"keccak256\":\"0x49d8dbf8a85b006bcd89bbc40e4e9e113997cc016007de85263bdae70572d07f\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://bc0d83804c1b795d5c216b3518cd176c48f90db28550f267cbd89746d6b476c8\",\"dweb:/ipfs/QmNdCm4c6hnt7f6Q8q21QjtCNZWWRUaMVEYnQHEv68VnKt\"]},\"node_modules/@ERC4337/account-abstraction/contracts/interfaces/IStakeManager.sol\":{\"keccak256\":\"0xbe5ca9e7f254d031687419e7b96ef48c9c63e9398bbe992dc72ffc6dc14e0a04\",\"license\":\"GPL-3.0-only\",\"urls\":[\"bzz-raw://1fffec71c38627a26fabb423350148009579f092623fb02b471a12d973763a00\",\"dweb:/ipfs/QmRBi31QEYXHj3x1AnQ2jKa2eziZH1b9av396P3b4dw6bj\"]},\"node_modules/@ERC4337/account-abstraction/contracts/interfaces/PackedUserOperation.sol\":{\"keccak256\":\"0x1129b46381db68eddbc5cb49e50664667b66b03c480453858e7b25eabe444359\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://499a948aba60480dba6e25c763b8d918f1c246eb7a3302e04f493e080f3295be\",\"dweb:/ipfs/QmeRhhswf4NACcBKam2PyjpTP2ddSm648kah5kkQJsvwz3\"]},\"node_modules/@ERC4337/account-abstraction/contracts/utils/Exec.sol\":{\"keccak256\":\"0x86b1b1cd11158dddb9d381040c57fdc643c74b5e4eed3e7e036f32452672ad74\",\"license\":\"LGPL-3.0-only\",\"urls\":[\"bzz-raw://ad88663b6c76df73cf09a272cf333d038df7bb4c51281284b572bf9b46e1cd77\",\"dweb:/ipfs/QmVKxYF8avyPBtqejVhFCM2CuHsfpsCh7TsPqkBLtrgwJQ\"]},\"node_modules/@openzeppelin/contracts/utils/ReentrancyGuard.sol\":{\"keccak256\":\"0x11a5a79827df29e915a12740caf62fe21ebe27c08c9ae3e09abe9ee3ba3866d3\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://3cf0c69ab827e3251db9ee6a50647d62c90ba580a4d7bbff21f2bea39e7b2f4a\",\"dweb:/ipfs/QmZiKwtKU1SBX4RGfQtY7PZfiapbbu6SZ9vizGQD9UHjRA\"]},\"node_modules/@openzeppelin/contracts/utils/introspection/ERC165.sol\":{\"keccak256\":\"0xddce8e17e3d3f9ed818b4f4c4478a8262aab8b11ed322f1bf5ed705bb4bd97fa\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8084aa71a4cc7d2980972412a88fe4f114869faea3fefa5436431644eb5c0287\",\"dweb:/ipfs/Qmbqfs5dRdPvHVKY8kTaeyc65NdqXRQwRK7h9s5UJEhD1p\"]},\"node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x79796192ec90263f21b464d5bc90b777a525971d3de8232be80d9c4f9fb353b8\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://f6fda447a62815e8064f47eff0dd1cf58d9207ad69b5d32280f8d7ed1d1e4621\",\"dweb:/ipfs/QmfDRc7pxfaXB2Dh9np5Uf29Na3pQ7tafRS684wd3GLjVL\"]},\"node_modules/@rhinestone/checknsignatures/src/CheckNSignatures.sol\":{\"keccak256\":\"0xa7ebba59118cb54c70cf7654be78586889cee323b7659af4b66e7c7c808f18e0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6a668830d1a982e0497ff4aac55c30a128c2a29162e3cad8cc0144c39bafb85e\",\"dweb:/ipfs/QmeLRXa4tFzba8s6sawCAPdrbgsJFQyQzor8iU1vMPHgHJ\"]},\"node_modules/@rhinestone/modulekit/src/Modules.sol\":{\"keccak256\":\"0xf645c15937e85eb04e162798b9443467a363d4adfcfcf18a2c4d6b2b7f1afb84\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ed469757561cfad9da9aa361fd9c0a4697cf4fa37494143b38f6983fb662241c\",\"dweb:/ipfs/QmPYSVcdYk1NXLojCMKj14k3pvqBUfdPdn6Mt59YWiwZgT\"]},\"node_modules/@rhinestone/modulekit/src/accounts/common/interfaces/IERC7579Account.sol\":{\"keccak256\":\"0xdfa4eea2e7d608e6b3681d8caebb92c29fbcc9a09e1cec0ac45db52a77d7bea9\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://82cf46f8346867884d531139cffbbc62929e56e7a5e38bc7377dbe1566300417\",\"dweb:/ipfs/QmZSr9gaDe3sns3ai6ikr58ZYaBuhcdpzUZ2DWvDWhXYaJ\"]},\"node_modules/@rhinestone/modulekit/src/accounts/common/interfaces/IERC7579Module.sol\":{\"keccak256\":\"0xfee8bc6130ac2cbbdb3c5d28c2d9bc4611959039e7b63b4d089478446e07c70e\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://7656b57b1e9ab7c4ccde15ce2ffcf8d556cde092a12895a5ecb96b7108342bb2\",\"dweb:/ipfs/QmVx5pMfXULEgHb7iHgodwWLKEbEbQrPYLV6zE75rpsy5M\"]},\"node_modules/@rhinestone/modulekit/src/accounts/common/lib/ModeLib.sol\":{\"keccak256\":\"0x11b48cd992efe381edabe7fd70b8e9dc61e4eae683c696c44f37b625582d712a\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://5ba56d9bdba0f616da1728ceb19e4f34a3c085f46bfae413e297ab664d9a46e9\",\"dweb:/ipfs/QmbSXxis2vsCHupcBHv6hj5YHcqdQcrcmT73fNSqxrmGmN\"]},\"node_modules/@rhinestone/modulekit/src/accounts/erc7579/lib/ExecutionLib.sol\":{\"keccak256\":\"0x7f44dd6d3b30632196d6ce5195c9774db8ed6093b4b9492d2d93b0188a39d03e\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://80363d69d6fae4515be36f0656aad3b604f0adecb9739716173e89d965738d5b\",\"dweb:/ipfs/QmY2wndmRcSVjtkBR1s1Ynd3qsUzqnhbD3Yia4HxESxWo7\"]},\"node_modules/@rhinestone/modulekit/src/external/ERC4337.sol\":{\"keccak256\":\"0x3b618977f0270c023672951ec6851631b77f909149ff24aeadf9632a0f3e951f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://0fc0f8554c4cc57f8684523bef40f4fab20261f4ea417c3904011d4e23cf4709\",\"dweb:/ipfs/QmeR4ydYCGBG7tZ4dMA9GWoqNkBkqbGrbsmz7oZm7EnxCW\"]},\"node_modules/@rhinestone/modulekit/src/module-bases/ERC1271Policy.sol\":{\"keccak256\":\"0x57f200dfcbf437eeec106a5ecb22913cb8c56bb8c97df810aa95d5a9f40be555\",\"license\":\"AGPL-3.0-only\",\"urls\":[\"bzz-raw://4eec64a5618c4d756b409f0ba6d18c0513809d7343fa6f7197f723e7f5863530\",\"dweb:/ipfs/QmTUrwdifuKuiqQxbqtaNq6hijvUaDCz2fNSzauikuCcxk\"]},\"node_modules/@rhinestone/modulekit/src/module-bases/ERC7484RegistryAdapter.sol\":{\"keccak256\":\"0xd04ec510f52292bf4f4d28022107ccad6676c6633d9af9c98657be241a8a0b00\",\"license\":\"AGPL-3.0-only\",\"urls\":[\"bzz-raw://743d4945bb5575f80e07a943c183c85973b45804a27037205034e0051b821157\",\"dweb:/ipfs/QmZC7LEZUKMpsoADovf2ZmMypQNxfzGC7NXxg6Nt83m1Vu\"]},\"node_modules/@rhinestone/modulekit/src/module-bases/ERC7579ActionPolicy.sol\":{\"keccak256\":\"0x53e32f3a2a942012bbdb107fa998b08330af922190872334be6fdfe161b9953a\",\"license\":\"AGPL-3.0-only\",\"urls\":[\"bzz-raw://b280d3723ac6a854c28f07892686167fab227c2df95005bc4e26dd944ed47fa6\",\"dweb:/ipfs/QmQSeUTPyVEUV6nxGsk6TTMVNhX29tcDwvN4cZo69rwYod\"]},\"node_modules/@rhinestone/modulekit/src/module-bases/ERC7579ExecutorBase.sol\":{\"keccak256\":\"0x3bc15dbe5c06aef0eef2fd1bab501acd09eea55564d5a72c44dc87b2cd402452\",\"license\":\"AGPL-3.0-only\",\"urls\":[\"bzz-raw://25eee3dd1e6f6de598ddc18ac1592f9370bea153f407cfd9da9676a26abcdcf5\",\"dweb:/ipfs/QmQoHBTYW4E7UsfxN5ezSPhzooxGXxSQCQCYhMAf23Gyhk\"]},\"node_modules/@rhinestone/modulekit/src/module-bases/ERC7579FallbackBase.sol\":{\"keccak256\":\"0x51512f893cfd2f86e912e71ace40ff6c76f1bc1899067989a6e8dcfef974c2aa\",\"license\":\"AGPL-3.0-only\",\"urls\":[\"bzz-raw://38cc0f491095168dae886ca6c4a651a305e733160ed736a5115b6ae056913af5\",\"dweb:/ipfs/QmUZVCFY33GrEeuVmwLexEFQLMz9UYMCUWj4NoEBxHWTQL\"]},\"node_modules/@rhinestone/modulekit/src/module-bases/ERC7579HookBase.sol\":{\"keccak256\":\"0xaa3b73e5331af99e5ae5f2a1cd7638e39d23cf952cf27b21bc029afbf988d9a1\",\"license\":\"AGPL-3.0-only\",\"urls\":[\"bzz-raw://a3263e270433ec4b9680f2383e840d788e542555b80c7b86ac408b06964939f7\",\"dweb:/ipfs/QmQk7XmrtDTtkKhBMeomRWznPegJTM7ht12QdetwfjWUer\"]},\"node_modules/@rhinestone/modulekit/src/module-bases/ERC7579HookDestruct.sol\":{\"keccak256\":\"0xb7d1a8a4eee87b446ef2288da1913448e047f213ad347a1a6f5e5642a99f6453\",\"license\":\"AGPL-3.0-only\",\"urls\":[\"bzz-raw://a948a926cbd412bbb0806ef2105ddb72b2606f6b1fe05894e1925aa87e8147be\",\"dweb:/ipfs/QmPECjFWt73BfZD1wVRB4KcdDZwLJUGxpNNcgDtmpZpnLq\"]},\"node_modules/@rhinestone/modulekit/src/module-bases/ERC7579HybridValidatorBase.sol\":{\"keccak256\":\"0x0cd6cceced1db0ce9675e40f2fa3ef4117292b217105f94d879b3cdfa42b9ad5\",\"license\":\"AGPL-3.0-only\",\"urls\":[\"bzz-raw://9959eef2047910a56bd1240f717607060ae2633a065307f6ace7a60f73ea68c8\",\"dweb:/ipfs/QmT1YYdR2CuDAT7nVZLnCnZvxhiP2fqPTa9CgMDftLdPNy\"]},\"node_modules/@rhinestone/modulekit/src/module-bases/ERC7579ModuleBase.sol\":{\"keccak256\":\"0xb7c53d0c4d0f89e66f2515cbf0301b53eae618d31b1eeb265618ca5455b90635\",\"license\":\"AGPL-3.0-only\",\"urls\":[\"bzz-raw://a83a1289dad42538b822c0db93603088ca9a466cd264058003054d4e4c51bb22\",\"dweb:/ipfs/QmTt5sjJddkprDKaYJ3agCMFnY2dCKLBBCoCfHBBrm7Zvd\"]},\"node_modules/@rhinestone/modulekit/src/module-bases/ERC7579PolicyBase.sol\":{\"keccak256\":\"0xcb718e2571d570c41c8743df9cb5024b59070c2c7d53bcd5f12fc074872a5ac9\",\"license\":\"AGPL-3.0-only\",\"urls\":[\"bzz-raw://bf145b5430ff9119c34e67a3dc7bf7c7f3cb790b1c23370bb11a8325f74a5e5c\",\"dweb:/ipfs/QmddY22ziXCicJPWzLPDnoUxKyGdBH18jPdqU96XVjEtMU\"]},\"node_modules/@rhinestone/modulekit/src/module-bases/ERC7579StatelessValidatorBase.sol\":{\"keccak256\":\"0xa48e6c5c489141edf3512b7c323f1287d4a62d7f8599c8c50fb5ed39086be608\",\"license\":\"AGPL-3.0-only\",\"urls\":[\"bzz-raw://f7c3cd5ce3d02ce5bb4733df1ef599fd36d1ca01dee27981701e8fe5b725fcf2\",\"dweb:/ipfs/QmU9U1RHsHCGDnMVCkwXoBbtqGmBP6grh5ovV9YsXw6svx\"]},\"node_modules/@rhinestone/modulekit/src/module-bases/ERC7579UserOpPolicy.sol\":{\"keccak256\":\"0xc8b26e65beb6964a536c03b4eb6d075df76a80c774ed2ae40e66c7b36a10fe41\",\"license\":\"AGPL-3.0-only\",\"urls\":[\"bzz-raw://b719036038aa616a25f5551a9c52d385bb1c168874e94535170364d21e02476a\",\"dweb:/ipfs/QmUrZNVjbADJQGyhPh6akNAsRBixYgyjgyX2DrBdZm5KNh\"]},\"node_modules/@rhinestone/modulekit/src/module-bases/ERC7579ValidatorBase.sol\":{\"keccak256\":\"0x5a85c53cea028a03a6c6aa005f475d7241a9b120c21e4e773a9e9b5084c18428\",\"license\":\"AGPL-3.0-only\",\"urls\":[\"bzz-raw://79ef9f1b63888e7792ddf70335f086c06676ad6e13a750648fa7f69773764916\",\"dweb:/ipfs/QmTjVVefugMU5BdXgdEccmS352Ah9nn1KCPNiCyyhugcfP\"]},\"node_modules/@rhinestone/modulekit/src/module-bases/SchedulingBase.sol\":{\"keccak256\":\"0xed8224ace5d41ef74ff399440d45313e95dc1930d6ee559833c07e8a66a11b16\",\"license\":\"AGPL-3.0-only\",\"urls\":[\"bzz-raw://a61855e4743b1f4869c5738ac9314ab06d109b346f6986c740b8af8c99aed5b0\",\"dweb:/ipfs/QmWVDTC71MpUWwUV6fj9mehB2u3wZ2zwRrGkmYjtmf1bV2\"]},\"node_modules/@rhinestone/modulekit/src/module-bases/interfaces/IERC7484.sol\":{\"keccak256\":\"0xb4c149815fe8a943201d145d5ba6bd494560785db764b180559c8cd11a8048fc\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c1687a18731256611519cef74491665a4ec374c3185a56b0fa5f250ce70bb850\",\"dweb:/ipfs/QmRvSU1drCoC94jUZZh5eG3gaRLR29zAAvyGxHRRAnbWme\"]},\"node_modules/@rhinestone/modulekit/src/module-bases/interfaces/IPolicy.sol\":{\"keccak256\":\"0x096e3f9850d1b05ffc9c057fd3380006e1fbabaa11148d3790a12dd924b543d0\",\"license\":\"LGPL-3.0-only\",\"urls\":[\"bzz-raw://5b97d9829d02661726d351783e3093d2cd5b2a518fdbaf9d7eee5787b183cf0a\",\"dweb:/ipfs/QmWPS64aZjRxNYizTMMFJGQgjygdaKfAnUEzyuMHJFrRTB\"]},\"node_modules/@rhinestone/modulekit/src/module-bases/interfaces/IStatelessValidator.sol\":{\"keccak256\":\"0x7a217ecb0c1a99eda30bded8adf5bb0dcc0e89e078c847fd9f1eeab0b928dc1e\",\"license\":\"AGPL-3.0-only\",\"urls\":[\"bzz-raw://29c4d6b519b608c0ad0f4a0115ab71d1b5d056702db05bc1c9571944d2770ce6\",\"dweb:/ipfs/QmbJTThHy3ympkLUUdAuxYwy8j4XGy7f3HHGcE6HzW73gc\"]},\"node_modules/@rhinestone/modulekit/src/module-bases/utils/ERC7579Constants.sol\":{\"keccak256\":\"0xcc1e1cad832005b57588f1fb216ed0424f2c20cb2e55001d96a198f9a5c4d4ad\",\"license\":\"AGPL-3.0-only\",\"urls\":[\"bzz-raw://12c88dc886effaafa389a72299f98b64f7b8ae87c430eb65d3780b821ea54178\",\"dweb:/ipfs/QmQaNc2NQGz2MPcYBLaZdAHLngEWiYwffQ64bxEetZH3mb\"]},\"node_modules/@rhinestone/modulekit/src/module-bases/utils/TrustedForwarder.sol\":{\"keccak256\":\"0x9b61fc17327922e85ac6ae0eb00836b09315dad2b297f1fed8f193b13bcee7c3\",\"license\":\"AGPL-3.0-only\",\"urls\":[\"bzz-raw://60d43af97695deba72f172ac4dd6402c7818ad52c5dd503fd8aac70ff566de7d\",\"dweb:/ipfs/QmdnbFF7bzBcowpotmPawFBrsVZqCw4tnFb5qc366vJMYo\"]},\"node_modules/@rhinestone/sentinellist/src/SentinelList4337.sol\":{\"keccak256\":\"0x21cbe60aac0ddd77dd8430d96b6b59c6e31eeee5918c4097aecf594e9fc0fa64\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://e2e6bffd163bf1f406ba14388f5cc94e419d976087fc008a7028e9d6e2396643\",\"dweb:/ipfs/QmQ2ipNcRMpyE4kaHqio4TEoDMNTVkSTuFbzFScfPhoFVk\"]},\"node_modules/forge-std/src/interfaces/IERC165.sol\":{\"keccak256\":\"0x414b2861b1acbf816ccb7346d3f16cf6c1e002e9e5e40d2f1f26fa5ddc2ea600\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://698352fb240868ea8f1d1fe389993035eeab930f10d06934f80ccfb2b6ccbfbc\",\"dweb:/ipfs/QmT6WLHAgXxFhh12kWym895oTzXid1326iZiwT3pyfggoT\"]},\"node_modules/solady/src/utils/ECDSA.sol\":{\"keccak256\":\"0xb0754260daabfe6f20dd16f2213823f27c8df1089b43c8eda9b3c2a6eca07478\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ffef4ca363ec0e2437b5e195fbb3d58bdc6750921fce32f351ca1c092ad36a75\",\"dweb:/ipfs/QmTcnAyxwvQg3h357PdB8S8oz5bBt85J4SvEgmMqwAfPKF\"]},\"node_modules/solady/src/utils/LibSort.sol\":{\"keccak256\":\"0x3fc758c5e83f389058e156537c060ff0d952b82c767ecebf8047b698cfc7ffb1\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://e09190e7b4e67a6fdb7da01448229fd69207e0249ff1b910ef6b10ce4aa21f76\",\"dweb:/ipfs/QmW7uGJq7vE94sC4VGFuHfxTmDGZdqWLBjR43FuTwgin9R\"]},\"node_modules/solady/src/utils/SignatureCheckerLib.sol\":{\"keccak256\":\"0x098c7eb88b3048f227b240e0e5bf1da4a8f7622b30f6d7c06416bfcab3225e77\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://50c2766f652916c5d6433665fb1c3b2f04c3d9292a35c12e0f8d7c71dd6438cb\",\"dweb:/ipfs/QmWTMwN2RDZUUPg7KkH1qFBjTSh84Zw8bbYwRBCQUtLN2h\"]},\"src/OwnableValidator/OwnableValidator.sol\":{\"keccak256\":\"0x36de797dd515f4088dbb7addbf828bf7fbf6089de37d6f9aca5038c2ed84c0b2\",\"license\":\"AGPL-3.0-only\",\"urls\":[\"bzz-raw://a7585dfdf2e31d35645c9cf7de91c8323a3f774fb3df0b52930216c45380ea00\",\"dweb:/ipfs/QmSna2aJB5knECCTTS3iQDab9qCcY2d8d6PRkyBKUe58T9\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.28+commit.7893614a"},"language":"Solidity","output":{"abi":[{"inputs":[],"type":"error","name":"CannotRemoveOwner"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"type":"error","name":"InvalidOwner"},{"inputs":[],"type":"error","name":"InvalidSignature"},{"inputs":[],"type":"error","name":"InvalidThreshold"},{"inputs":[],"type":"error","name":"LinkedList_AlreadyInitialized"},{"inputs":[{"internalType":"address","name":"entry","type":"address"}],"type":"error","name":"LinkedList_EntryAlreadyInList"},{"inputs":[{"internalType":"address","name":"entry","type":"address"}],"type":"error","name":"LinkedList_InvalidEntry"},{"inputs":[],"type":"error","name":"LinkedList_InvalidPage"},{"inputs":[],"type":"error","name":"MaxOwnersReached"},{"inputs":[{"internalType":"address","name":"smartAccount","type":"address"}],"type":"error","name":"ModuleAlreadyInitialized"},{"inputs":[{"internalType":"address","name":"smartAccount","type":"address"}],"type":"error","name":"NotInitialized"},{"inputs":[],"type":"error","name":"NotSortedAndUnique"},{"inputs":[],"type":"error","name":"ThresholdNotSet"},{"inputs":[{"internalType":"address","name":"account","type":"address","indexed":true}],"type":"event","name":"ModuleInitialized","anonymous":false},{"inputs":[{"internalType":"address","name":"account","type":"address","indexed":true}],"type":"event","name":"ModuleUninitialized","anonymous":false},{"inputs":[{"internalType":"address","name":"account","type":"address","indexed":true},{"internalType":"address","name":"owner","type":"address","indexed":true}],"type":"event","name":"OwnerAdded","anonymous":false},{"inputs":[{"internalType":"address","name":"account","type":"address","indexed":true},{"internalType":"address","name":"owner","type":"address","indexed":true}],"type":"event","name":"OwnerRemoved","anonymous":false},{"inputs":[{"internalType":"address","name":"account","type":"address","indexed":true},{"internalType":"uint256","name":"threshold","type":"uint256","indexed":false}],"type":"event","name":"ThresholdSet","anonymous":false},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"addOwner"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"stateMutability":"view","type":"function","name":"getOwners","outputs":[{"internalType":"address[]","name":"ownersArray","type":"address[]"}]},{"inputs":[{"internalType":"address","name":"smartAccount","type":"address"}],"stateMutability":"view","type":"function","name":"isInitialized","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"uint256","name":"typeID","type":"uint256"}],"stateMutability":"pure","type":"function","name":"isModuleType","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"bytes32","name":"hash","type":"bytes32"},{"internalType":"bytes","name":"data","type":"bytes"}],"stateMutability":"view","type":"function","name":"isValidSignatureWithSender","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}]},{"inputs":[],"stateMutability":"pure","type":"function","name":"name","outputs":[{"internalType":"string","name":"","type":"string"}]},{"inputs":[{"internalType":"bytes","name":"data","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"onInstall"},{"inputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"onUninstall"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function","name":"ownerCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"address","name":"prevOwner","type":"address"},{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"removeOwner"},{"inputs":[{"internalType":"uint256","name":"_threshold","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"setThreshold"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"stateMutability":"view","type":"function","name":"threshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"bytes32","name":"hash","type":"bytes32"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"bytes","name":"data","type":"bytes"}],"stateMutability":"view","type":"function","name":"validateSignatureWithData","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"struct PackedUserOperation","name":"userOp","type":"tuple","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":"bytes32","name":"accountGasLimits","type":"bytes32"},{"internalType":"uint256","name":"preVerificationGas","type":"uint256"},{"internalType":"bytes32","name":"gasFees","type":"bytes32"},{"internalType":"bytes","name":"paymasterAndData","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}]},{"internalType":"bytes32","name":"userOpHash","type":"bytes32"}],"stateMutability":"view","type":"function","name":"validateUserOp","outputs":[{"internalType":"ERC7579ValidatorBase.ValidationData","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"pure","type":"function","name":"version","outputs":[{"internalType":"string","name":"","type":"string"}]}],"devdoc":{"kind":"dev","methods":{"addOwner(address)":{"details":"will revert if the owner is already added","params":{"owner":"address of the owner to add"}},"getOwners(address)":{"params":{"account":"address of the account"},"returns":{"ownersArray":"array of owners"}},"isInitialized(address)":{"params":{"smartAccount":"address of the smart account"},"returns":{"_0":"true if the module is initialized, false otherwise"}},"isModuleType(uint256)":{"params":{"typeID":"type of the module"},"returns":{"_0":"true if the type is a module type, false otherwise"}},"isValidSignatureWithSender(address,bytes32,bytes)":{"params":{"data":"bytes data containing the signatures","hash":"bytes32 hash of the data"},"returns":{"_0":"bytes4 EIP1271_SUCCESS if the signature is valid, EIP1271_FAILED otherwise"}},"name()":{"returns":{"_0":"name of the module"}},"onInstall(bytes)":{"details":"data is encoded as follows: abi.encode(threshold, owners)","params":{"data":"encoded data containing the threshold and owners"}},"onUninstall(bytes)":{"details":"the data parameter is not used"},"removeOwner(address,address)":{"details":"will revert if the owner is not added or the previous owner is invalid","params":{"owner":"address of the owner to remove","prevOwner":"address of the previous owner"}},"setThreshold(uint256)":{"details":"the function will revert if the module is not initialized","params":{"_threshold":"uint256 threshold to set"}},"validateSignatureWithData(bytes32,bytes,bytes)":{"params":{"data":"bytes data containing the data","hash":"bytes32 hash of the data","signature":"bytes data containing the signatures"},"returns":{"_0":"bool true if the signature is valid, false otherwise"}},"validateUserOp((address,uint256,bytes,bytes,bytes32,uint256,bytes32,bytes,bytes),bytes32)":{"params":{"userOp":"PackedUserOperation struct containing the UserOperation","userOpHash":"bytes32 hash of the UserOperation"},"returns":{"_0":"ValidationData the UserOperation validation result"}},"version()":{"returns":{"_0":"version of the module"}}},"version":1},"userdoc":{"kind":"user","methods":{"addOwner(address)":{"notice":"Adds an owner to the account"},"getOwners(address)":{"notice":"Returns the owners of the account"},"isInitialized(address)":{"notice":"Checks if the module is initialized"},"isModuleType(uint256)":{"notice":"Returns the type of the module"},"isValidSignatureWithSender(address,bytes32,bytes)":{"notice":"Validates an ERC-1271 signature with the sender"},"name()":{"notice":"Returns the name of the module"},"onInstall(bytes)":{"notice":"Initializes the module with the threshold and owners"},"onUninstall(bytes)":{"notice":"Handles the uninstallation of the module and clears the threshold and owners"},"removeOwner(address,address)":{"notice":"Removes an owner from the account"},"setThreshold(uint256)":{"notice":"Sets the threshold for the account"},"validateSignatureWithData(bytes32,bytes,bytes)":{"notice":"Validates a signature with the data (stateless validation)"},"validateUserOp((address,uint256,bytes,bytes,bytes32,uint256,bytes32,bytes,bytes),bytes32)":{"notice":"Validates a user operation"},"version()":{"notice":"Returns the version of the module"}},"version":1}},"settings":{"remappings":["@ERC4337/=node_modules/@ERC4337/","@erc7579/enumerablemap4337/=node_modules/@erc7579/enumerablemap4337/src/","@gnosis.pm/=node_modules/@gnosis.pm/","@openzeppelin/=node_modules/@openzeppelin/","@prb/math/=node_modules/@prb/math/src/","@rhinestone/=node_modules/@rhinestone/","@safe-global/=node_modules/@safe-global/","@webauthn/=node_modules/webauthn-sol/src/","ExcessivelySafeCall/=node_modules/excessively-safe-call/src/","FreshCryptoLib/=node_modules/FreshCryptoLib/solidity/src/","account-abstraction-v0.6/=node_modules/@ERC4337/account-abstraction-v0.6/contracts/","account-abstraction/=node_modules/@ERC4337/account-abstraction/contracts/","checknsignatures/=node_modules/@rhinestone/checknsignatures/src/","ds-test/=node_modules/ds-test/src/","erc4337-validation/=node_modules/@rhinestone/erc4337-validation/src/","excessively-safe-call/=node_modules/excessively-safe-call/","flatbytes/=node_modules/@rhinestone/flatbytes/src/","forge-std/=node_modules/forge-std/src/","hardhat-deploy/=node_modules/hardhat-deploy/","hardhat/=node_modules/hardhat/","modulekit/=node_modules/@rhinestone/modulekit/src/","sentinellist/=node_modules/@rhinestone/sentinellist/src/","solady/=node_modules/solady/src/","solarray/=node_modules/solarray/src/","solmate/=node_modules/solmate/src/","webauthn-sol/=node_modules/webauthn-sol/","node_modules/webauthn-sol/src/:openzeppelin-contracts/=node_modules/@openzeppelin/"],"optimizer":{"enabled":false,"runs":200},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"src/OwnableValidator/OwnableValidator.sol":"OwnableValidator"},"evmVersion":"cancun","libraries":{}},"sources":{"node_modules/@ERC4337/account-abstraction/contracts/core/EntryPoint.sol":{"keccak256":"0x87549d2e99e1dee6d6eab5b53bcb612014f22fa39818a443c90b7c577505cb44","urls":["bzz-raw://e40dc804f53fe6cf45ac86d65df8a18ccb613ec966da56188b2509b8745ff98b","dweb:/ipfs/QmXmpjRbJemM3jcKSHLLH8wMNrq3hCQtDEv4B9Wx6HjdCh"],"license":"GPL-3.0"},"node_modules/@ERC4337/account-abstraction/contracts/core/EntryPointSimulations.sol":{"keccak256":"0x22173c730ae4f6aa1fd0ab43ea9212debd1070e4c5835b6d3e50f96bf07771b3","urls":["bzz-raw://ca711a75a06f2d641d1dc3491a0680ce091c5a50cb451b775e46db9e7190a441","dweb:/ipfs/QmZUhDH7G9Sd7KbHswNKF81VYV8kJRr893Ur7z33aryj5V"],"license":"GPL-3.0"},"node_modules/@ERC4337/account-abstraction/contracts/core/GasDebug.sol":{"keccak256":"0x8c516bd5a7fe0a26523708518322045447c5275ace64f19800691eb980f69faf","urls":["bzz-raw://1d4f4ed9fd4ea3b835205ea56f1572c73f32f26f815328b7eafc8630929abcac","dweb:/ipfs/QmT9AMMdvv3vzxFRdRJrEcfus65dVPq512BiVx4E4qkggG"],"license":"GPL-3.0"},"node_modules/@ERC4337/account-abstraction/contracts/core/Helpers.sol":{"keccak256":"0x6247e011a6cb0b263b3aa098822977181674d91b62e5bdfe04c6e66f72da25d6","urls":["bzz-raw://ca829a69b3fbc74fec8e140d42a2bf93bc3512609272f031c846470f61f0ab7e","dweb:/ipfs/QmP3r3MBgAN39KeVB1rCGJWwcBcotNt26ALtAR54poQ1Jc"],"license":"GPL-3.0"},"node_modules/@ERC4337/account-abstraction/contracts/core/NonceManager.sol":{"keccak256":"0x1f951786ce6f171e7ed0242fee73ee4a205c7523404ee6cffca48b8c64ea5fe9","urls":["bzz-raw://a602bf2274d478dae7a532cca31f8179131808c324cc26ece5c7e87c5a1015a6","dweb:/ipfs/QmaaSyw5GGbAWzUhAPCtsb38P3MmaVr1ngp61PYHCU2a5a"],"license":"GPL-3.0"},"node_modules/@ERC4337/account-abstraction/contracts/core/SenderCreator.sol":{"keccak256":"0xeb95afb6e4cf921c1ed105ecb9f549ca46bee57f68acd1d2f4f84607ac0db5c5","urls":["bzz-raw://d2ac91562f1fcabe4809a1b4256895efebcf46f89e08336a6c09ee2d29733238","dweb:/ipfs/QmPsQnPcCzioPwVtUhxkbnwKPC1bnhHSbAwK9GXVpjN3mH"],"license":"GPL-3.0"},"node_modules/@ERC4337/account-abstraction/contracts/core/StakeManager.sol":{"keccak256":"0x673eb19600058d8642605ca409c9e1d4cab13735564b856270b92c330ffb1b8d","urls":["bzz-raw://06599c57c7075ee8eb5f1710fccca3eb322876b968ec271e1fb34af41510ab2c","dweb:/ipfs/QmVsDEjmZYtzgXa4AYKxbQEYQVh6NBq8GmFJCariBUqK4G"],"license":"GPL-3.0-only"},"node_modules/@ERC4337/account-abstraction/contracts/core/UserOperationLib.sol":{"keccak256":"0x9d50ece985d35f82e33e5da417595c86fac10449e3d10895d08363d33aad454b","urls":["bzz-raw://b1d11cc364c8bf7ed5388268c895b5ffed16e87dfbcb320ddeeba5e7974315dc","dweb:/ipfs/QmYSpvjxEjweietQrYZagwQ52ipy7eXx4rwvnTzXKeGeMS"],"license":"GPL-3.0"},"node_modules/@ERC4337/account-abstraction/contracts/interfaces/IAccount.sol":{"keccak256":"0x38710bec0cb20ff4ceef46a80475b5bdabc27b7efd2687fd473db68332f61b78","urls":["bzz-raw://dea7a723e1ef852e8764e69914a345d2e8bc5e13facfc9d5c29d791cb4ab0020","dweb:/ipfs/QmU8dYgyF4DBJXFqjwLAtnE3q8q259ChfoEk9a6wyhHzEP"],"license":"GPL-3.0"},"node_modules/@ERC4337/account-abstraction/contracts/interfaces/IAccountExecute.sol":{"keccak256":"0xd3dc32dde1add1fb6377f939ceff6be31c2e21343522311f7b88db666be9ee6c","urls":["bzz-raw://5b8f065171bd32e23b306868189c730f849ce6147f753c59e396e7afcf384577","dweb:/ipfs/QmZpDRNEZ9YNgGgyLQo5yM4bB1FNbtnfDABsChbgSQKXUh"],"license":"GPL-3.0"},"node_modules/@ERC4337/account-abstraction/contracts/interfaces/IAggregator.sol":{"keccak256":"0xf100d6fcc0c3b450b13e979b6a42c628c292a1bc340eccc2e7796b80e3975588","urls":["bzz-raw://192938b5b27234d35c8098a319e879363c79f750eea4d0e409dc889a8ce5b155","dweb:/ipfs/QmURpaJFPqEtkKP2ngBsgZhAGN8wAWh5XQpYmCkiz4Urz5"],"license":"GPL-3.0"},"node_modules/@ERC4337/account-abstraction/contracts/interfaces/IEntryPoint.sol":{"keccak256":"0x1972a5fcb3a808b58c85af5741949ef6af11ab0debd3ae8c708171ae1ae0d0c4","urls":["bzz-raw://baa9837ae73b9e2362a47d42d081d7c0f3d8e878e5edb381117d94a6968949c9","dweb:/ipfs/QmUmo6FUE7fv5z1WzW1YFjxp8PqaeN2JrEee9au59w3Xhe"],"license":"GPL-3.0"},"node_modules/@ERC4337/account-abstraction/contracts/interfaces/IEntryPointSimulations.sol":{"keccak256":"0x454c515668b9088d000535fa162e1478b39d38a5c615baba2a6efe6ddb88509c","urls":["bzz-raw://492fd691024b4424b2d47f43bc9fcdcf702868c5913eb741a472b496280355f3","dweb:/ipfs/QmZZgGgzBtXbPWpVoBentShqYNfZ6FsRA9oNQcVHiXxCPh"],"license":"GPL-3.0"},"node_modules/@ERC4337/account-abstraction/contracts/interfaces/INonceManager.sol":{"keccak256":"0xd575af0f6ebbd5f0b2933307d44cd7b4e03a69f4b817a67db5409bd3c89aeecb","urls":["bzz-raw://3b1e2dea9b05cfba9d13339ed16d96457dc861013cc4f3f35b71a80f82448db3","dweb:/ipfs/QmVaGy5uGDMSiU2SzyokTjoHFyb39VVG5wtaM9KTnHyZSk"],"license":"GPL-3.0"},"node_modules/@ERC4337/account-abstraction/contracts/interfaces/IPaymaster.sol":{"keccak256":"0x49d8dbf8a85b006bcd89bbc40e4e9e113997cc016007de85263bdae70572d07f","urls":["bzz-raw://bc0d83804c1b795d5c216b3518cd176c48f90db28550f267cbd89746d6b476c8","dweb:/ipfs/QmNdCm4c6hnt7f6Q8q21QjtCNZWWRUaMVEYnQHEv68VnKt"],"license":"GPL-3.0"},"node_modules/@ERC4337/account-abstraction/contracts/interfaces/IStakeManager.sol":{"keccak256":"0xbe5ca9e7f254d031687419e7b96ef48c9c63e9398bbe992dc72ffc6dc14e0a04","urls":["bzz-raw://1fffec71c38627a26fabb423350148009579f092623fb02b471a12d973763a00","dweb:/ipfs/QmRBi31QEYXHj3x1AnQ2jKa2eziZH1b9av396P3b4dw6bj"],"license":"GPL-3.0-only"},"node_modules/@ERC4337/account-abstraction/contracts/interfaces/PackedUserOperation.sol":{"keccak256":"0x1129b46381db68eddbc5cb49e50664667b66b03c480453858e7b25eabe444359","urls":["bzz-raw://499a948aba60480dba6e25c763b8d918f1c246eb7a3302e04f493e080f3295be","dweb:/ipfs/QmeRhhswf4NACcBKam2PyjpTP2ddSm648kah5kkQJsvwz3"],"license":"GPL-3.0"},"node_modules/@ERC4337/account-abstraction/contracts/utils/Exec.sol":{"keccak256":"0x86b1b1cd11158dddb9d381040c57fdc643c74b5e4eed3e7e036f32452672ad74","urls":["bzz-raw://ad88663b6c76df73cf09a272cf333d038df7bb4c51281284b572bf9b46e1cd77","dweb:/ipfs/QmVKxYF8avyPBtqejVhFCM2CuHsfpsCh7TsPqkBLtrgwJQ"],"license":"LGPL-3.0-only"},"node_modules/@openzeppelin/contracts/utils/ReentrancyGuard.sol":{"keccak256":"0x11a5a79827df29e915a12740caf62fe21ebe27c08c9ae3e09abe9ee3ba3866d3","urls":["bzz-raw://3cf0c69ab827e3251db9ee6a50647d62c90ba580a4d7bbff21f2bea39e7b2f4a","dweb:/ipfs/QmZiKwtKU1SBX4RGfQtY7PZfiapbbu6SZ9vizGQD9UHjRA"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0xddce8e17e3d3f9ed818b4f4c4478a8262aab8b11ed322f1bf5ed705bb4bd97fa","urls":["bzz-raw://8084aa71a4cc7d2980972412a88fe4f114869faea3fefa5436431644eb5c0287","dweb:/ipfs/Qmbqfs5dRdPvHVKY8kTaeyc65NdqXRQwRK7h9s5UJEhD1p"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x79796192ec90263f21b464d5bc90b777a525971d3de8232be80d9c4f9fb353b8","urls":["bzz-raw://f6fda447a62815e8064f47eff0dd1cf58d9207ad69b5d32280f8d7ed1d1e4621","dweb:/ipfs/QmfDRc7pxfaXB2Dh9np5Uf29Na3pQ7tafRS684wd3GLjVL"],"license":"MIT"},"node_modules/@rhinestone/checknsignatures/src/CheckNSignatures.sol":{"keccak256":"0xa7ebba59118cb54c70cf7654be78586889cee323b7659af4b66e7c7c808f18e0","urls":["bzz-raw://6a668830d1a982e0497ff4aac55c30a128c2a29162e3cad8cc0144c39bafb85e","dweb:/ipfs/QmeLRXa4tFzba8s6sawCAPdrbgsJFQyQzor8iU1vMPHgHJ"],"license":"MIT"},"node_modules/@rhinestone/modulekit/src/Modules.sol":{"keccak256":"0xf645c15937e85eb04e162798b9443467a363d4adfcfcf18a2c4d6b2b7f1afb84","urls":["bzz-raw://ed469757561cfad9da9aa361fd9c0a4697cf4fa37494143b38f6983fb662241c","dweb:/ipfs/QmPYSVcdYk1NXLojCMKj14k3pvqBUfdPdn6Mt59YWiwZgT"],"license":"MIT"},"node_modules/@rhinestone/modulekit/src/accounts/common/interfaces/IERC7579Account.sol":{"keccak256":"0xdfa4eea2e7d608e6b3681d8caebb92c29fbcc9a09e1cec0ac45db52a77d7bea9","urls":["bzz-raw://82cf46f8346867884d531139cffbbc62929e56e7a5e38bc7377dbe1566300417","dweb:/ipfs/QmZSr9gaDe3sns3ai6ikr58ZYaBuhcdpzUZ2DWvDWhXYaJ"],"license":"MIT"},"node_modules/@rhinestone/modulekit/src/accounts/common/interfaces/IERC7579Module.sol":{"keccak256":"0xfee8bc6130ac2cbbdb3c5d28c2d9bc4611959039e7b63b4d089478446e07c70e","urls":["bzz-raw://7656b57b1e9ab7c4ccde15ce2ffcf8d556cde092a12895a5ecb96b7108342bb2","dweb:/ipfs/QmVx5pMfXULEgHb7iHgodwWLKEbEbQrPYLV6zE75rpsy5M"],"license":"MIT"},"node_modules/@rhinestone/modulekit/src/accounts/common/lib/ModeLib.sol":{"keccak256":"0x11b48cd992efe381edabe7fd70b8e9dc61e4eae683c696c44f37b625582d712a","urls":["bzz-raw://5ba56d9bdba0f616da1728ceb19e4f34a3c085f46bfae413e297ab664d9a46e9","dweb:/ipfs/QmbSXxis2vsCHupcBHv6hj5YHcqdQcrcmT73fNSqxrmGmN"],"license":"GPL-3.0"},"node_modules/@rhinestone/modulekit/src/accounts/erc7579/lib/ExecutionLib.sol":{"keccak256":"0x7f44dd6d3b30632196d6ce5195c9774db8ed6093b4b9492d2d93b0188a39d03e","urls":["bzz-raw://80363d69d6fae4515be36f0656aad3b604f0adecb9739716173e89d965738d5b","dweb:/ipfs/QmY2wndmRcSVjtkBR1s1Ynd3qsUzqnhbD3Yia4HxESxWo7"],"license":"MIT"},"node_modules/@rhinestone/modulekit/src/external/ERC4337.sol":{"keccak256":"0x3b618977f0270c023672951ec6851631b77f909149ff24aeadf9632a0f3e951f","urls":["bzz-raw://0fc0f8554c4cc57f8684523bef40f4fab20261f4ea417c3904011d4e23cf4709","dweb:/ipfs/QmeR4ydYCGBG7tZ4dMA9GWoqNkBkqbGrbsmz7oZm7EnxCW"],"license":"MIT"},"node_modules/@rhinestone/modulekit/src/module-bases/ERC1271Policy.sol":{"keccak256":"0x57f200dfcbf437eeec106a5ecb22913cb8c56bb8c97df810aa95d5a9f40be555","urls":["bzz-raw://4eec64a5618c4d756b409f0ba6d18c0513809d7343fa6f7197f723e7f5863530","dweb:/ipfs/QmTUrwdifuKuiqQxbqtaNq6hijvUaDCz2fNSzauikuCcxk"],"license":"AGPL-3.0-only"},"node_modules/@rhinestone/modulekit/src/module-bases/ERC7484RegistryAdapter.sol":{"keccak256":"0xd04ec510f52292bf4f4d28022107ccad6676c6633d9af9c98657be241a8a0b00","urls":["bzz-raw://743d4945bb5575f80e07a943c183c85973b45804a27037205034e0051b821157","dweb:/ipfs/QmZC7LEZUKMpsoADovf2ZmMypQNxfzGC7NXxg6Nt83m1Vu"],"license":"AGPL-3.0-only"},"node_modules/@rhinestone/modulekit/src/module-bases/ERC7579ActionPolicy.sol":{"keccak256":"0x53e32f3a2a942012bbdb107fa998b08330af922190872334be6fdfe161b9953a","urls":["bzz-raw://b280d3723ac6a854c28f07892686167fab227c2df95005bc4e26dd944ed47fa6","dweb:/ipfs/QmQSeUTPyVEUV6nxGsk6TTMVNhX29tcDwvN4cZo69rwYod"],"license":"AGPL-3.0-only"},"node_modules/@rhinestone/modulekit/src/module-bases/ERC7579ExecutorBase.sol":{"keccak256":"0x3bc15dbe5c06aef0eef2fd1bab501acd09eea55564d5a72c44dc87b2cd402452","urls":["bzz-raw://25eee3dd1e6f6de598ddc18ac1592f9370bea153f407cfd9da9676a26abcdcf5","dweb:/ipfs/QmQoHBTYW4E7UsfxN5ezSPhzooxGXxSQCQCYhMAf23Gyhk"],"license":"AGPL-3.0-only"},"node_modules/@rhinestone/modulekit/src/module-bases/ERC7579FallbackBase.sol":{"keccak256":"0x51512f893cfd2f86e912e71ace40ff6c76f1bc1899067989a6e8dcfef974c2aa","urls":["bzz-raw://38cc0f491095168dae886ca6c4a651a305e733160ed736a5115b6ae056913af5","dweb:/ipfs/QmUZVCFY33GrEeuVmwLexEFQLMz9UYMCUWj4NoEBxHWTQL"],"license":"AGPL-3.0-only"},"node_modules/@rhinestone/modulekit/src/module-bases/ERC7579HookBase.sol":{"keccak256":"0xaa3b73e5331af99e5ae5f2a1cd7638e39d23cf952cf27b21bc029afbf988d9a1","urls":["bzz-raw://a3263e270433ec4b9680f2383e840d788e542555b80c7b86ac408b06964939f7","dweb:/ipfs/QmQk7XmrtDTtkKhBMeomRWznPegJTM7ht12QdetwfjWUer"],"license":"AGPL-3.0-only"},"node_modules/@rhinestone/modulekit/src/module-bases/ERC7579HookDestruct.sol":{"keccak256":"0xb7d1a8a4eee87b446ef2288da1913448e047f213ad347a1a6f5e5642a99f6453","urls":["bzz-raw://a948a926cbd412bbb0806ef2105ddb72b2606f6b1fe05894e1925aa87e8147be","dweb:/ipfs/QmPECjFWt73BfZD1wVRB4KcdDZwLJUGxpNNcgDtmpZpnLq"],"license":"AGPL-3.0-only"},"node_modules/@rhinestone/modulekit/src/module-bases/ERC7579HybridValidatorBase.sol":{"keccak256":"0x0cd6cceced1db0ce9675e40f2fa3ef4117292b217105f94d879b3cdfa42b9ad5","urls":["bzz-raw://9959eef2047910a56bd1240f717607060ae2633a065307f6ace7a60f73ea68c8","dweb:/ipfs/QmT1YYdR2CuDAT7nVZLnCnZvxhiP2fqPTa9CgMDftLdPNy"],"license":"AGPL-3.0-only"},"node_modules/@rhinestone/modulekit/src/module-bases/ERC7579ModuleBase.sol":{"keccak256":"0xb7c53d0c4d0f89e66f2515cbf0301b53eae618d31b1eeb265618ca5455b90635","urls":["bzz-raw://a83a1289dad42538b822c0db93603088ca9a466cd264058003054d4e4c51bb22","dweb:/ipfs/QmTt5sjJddkprDKaYJ3agCMFnY2dCKLBBCoCfHBBrm7Zvd"],"license":"AGPL-3.0-only"},"node_modules/@rhinestone/modulekit/src/module-bases/ERC7579PolicyBase.sol":{"keccak256":"0xcb718e2571d570c41c8743df9cb5024b59070c2c7d53bcd5f12fc074872a5ac9","urls":["bzz-raw://bf145b5430ff9119c34e67a3dc7bf7c7f3cb790b1c23370bb11a8325f74a5e5c","dweb:/ipfs/QmddY22ziXCicJPWzLPDnoUxKyGdBH18jPdqU96XVjEtMU"],"license":"AGPL-3.0-only"},"node_modules/@rhinestone/modulekit/src/module-bases/ERC7579StatelessValidatorBase.sol":{"keccak256":"0xa48e6c5c489141edf3512b7c323f1287d4a62d7f8599c8c50fb5ed39086be608","urls":["bzz-raw://f7c3cd5ce3d02ce5bb4733df1ef599fd36d1ca01dee27981701e8fe5b725fcf2","dweb:/ipfs/QmU9U1RHsHCGDnMVCkwXoBbtqGmBP6grh5ovV9YsXw6svx"],"license":"AGPL-3.0-only"},"node_modules/@rhinestone/modulekit/src/module-bases/ERC7579UserOpPolicy.sol":{"keccak256":"0xc8b26e65beb6964a536c03b4eb6d075df76a80c774ed2ae40e66c7b36a10fe41","urls":["bzz-raw://b719036038aa616a25f5551a9c52d385bb1c168874e94535170364d21e02476a","dweb:/ipfs/QmUrZNVjbADJQGyhPh6akNAsRBixYgyjgyX2DrBdZm5KNh"],"license":"AGPL-3.0-only"},"node_modules/@rhinestone/modulekit/src/module-bases/ERC7579ValidatorBase.sol":{"keccak256":"0x5a85c53cea028a03a6c6aa005f475d7241a9b120c21e4e773a9e9b5084c18428","urls":["bzz-raw://79ef9f1b63888e7792ddf70335f086c06676ad6e13a750648fa7f69773764916","dweb:/ipfs/QmTjVVefugMU5BdXgdEccmS352Ah9nn1KCPNiCyyhugcfP"],"license":"AGPL-3.0-only"},"node_modules/@rhinestone/modulekit/src/module-bases/SchedulingBase.sol":{"keccak256":"0xed8224ace5d41ef74ff399440d45313e95dc1930d6ee559833c07e8a66a11b16","urls":["bzz-raw://a61855e4743b1f4869c5738ac9314ab06d109b346f6986c740b8af8c99aed5b0","dweb:/ipfs/QmWVDTC71MpUWwUV6fj9mehB2u3wZ2zwRrGkmYjtmf1bV2"],"license":"AGPL-3.0-only"},"node_modules/@rhinestone/modulekit/src/module-bases/interfaces/IERC7484.sol":{"keccak256":"0xb4c149815fe8a943201d145d5ba6bd494560785db764b180559c8cd11a8048fc","urls":["bzz-raw://c1687a18731256611519cef74491665a4ec374c3185a56b0fa5f250ce70bb850","dweb:/ipfs/QmRvSU1drCoC94jUZZh5eG3gaRLR29zAAvyGxHRRAnbWme"],"license":"MIT"},"node_modules/@rhinestone/modulekit/src/module-bases/interfaces/IPolicy.sol":{"keccak256":"0x096e3f9850d1b05ffc9c057fd3380006e1fbabaa11148d3790a12dd924b543d0","urls":["bzz-raw://5b97d9829d02661726d351783e3093d2cd5b2a518fdbaf9d7eee5787b183cf0a","dweb:/ipfs/QmWPS64aZjRxNYizTMMFJGQgjygdaKfAnUEzyuMHJFrRTB"],"license":"LGPL-3.0-only"},"node_modules/@rhinestone/modulekit/src/module-bases/interfaces/IStatelessValidator.sol":{"keccak256":"0x7a217ecb0c1a99eda30bded8adf5bb0dcc0e89e078c847fd9f1eeab0b928dc1e","urls":["bzz-raw://29c4d6b519b608c0ad0f4a0115ab71d1b5d056702db05bc1c9571944d2770ce6","dweb:/ipfs/QmbJTThHy3ympkLUUdAuxYwy8j4XGy7f3HHGcE6HzW73gc"],"license":"AGPL-3.0-only"},"node_modules/@rhinestone/modulekit/src/module-bases/utils/ERC7579Constants.sol":{"keccak256":"0xcc1e1cad832005b57588f1fb216ed0424f2c20cb2e55001d96a198f9a5c4d4ad","urls":["bzz-raw://12c88dc886effaafa389a72299f98b64f7b8ae87c430eb65d3780b821ea54178","dweb:/ipfs/QmQaNc2NQGz2MPcYBLaZdAHLngEWiYwffQ64bxEetZH3mb"],"license":"AGPL-3.0-only"},"node_modules/@rhinestone/modulekit/src/module-bases/utils/TrustedForwarder.sol":{"keccak256":"0x9b61fc17327922e85ac6ae0eb00836b09315dad2b297f1fed8f193b13bcee7c3","urls":["bzz-raw://60d43af97695deba72f172ac4dd6402c7818ad52c5dd503fd8aac70ff566de7d","dweb:/ipfs/QmdnbFF7bzBcowpotmPawFBrsVZqCw4tnFb5qc366vJMYo"],"license":"AGPL-3.0-only"},"node_modules/@rhinestone/sentinellist/src/SentinelList4337.sol":{"keccak256":"0x21cbe60aac0ddd77dd8430d96b6b59c6e31eeee5918c4097aecf594e9fc0fa64","urls":["bzz-raw://e2e6bffd163bf1f406ba14388f5cc94e419d976087fc008a7028e9d6e2396643","dweb:/ipfs/QmQ2ipNcRMpyE4kaHqio4TEoDMNTVkSTuFbzFScfPhoFVk"],"license":"MIT"},"node_modules/forge-std/src/interfaces/IERC165.sol":{"keccak256":"0x414b2861b1acbf816ccb7346d3f16cf6c1e002e9e5e40d2f1f26fa5ddc2ea600","urls":["bzz-raw://698352fb240868ea8f1d1fe389993035eeab930f10d06934f80ccfb2b6ccbfbc","dweb:/ipfs/QmT6WLHAgXxFhh12kWym895oTzXid1326iZiwT3pyfggoT"],"license":"MIT"},"node_modules/solady/src/utils/ECDSA.sol":{"keccak256":"0xb0754260daabfe6f20dd16f2213823f27c8df1089b43c8eda9b3c2a6eca07478","urls":["bzz-raw://ffef4ca363ec0e2437b5e195fbb3d58bdc6750921fce32f351ca1c092ad36a75","dweb:/ipfs/QmTcnAyxwvQg3h357PdB8S8oz5bBt85J4SvEgmMqwAfPKF"],"license":"MIT"},"node_modules/solady/src/utils/LibSort.sol":{"keccak256":"0x3fc758c5e83f389058e156537c060ff0d952b82c767ecebf8047b698cfc7ffb1","urls":["bzz-raw://e09190e7b4e67a6fdb7da01448229fd69207e0249ff1b910ef6b10ce4aa21f76","dweb:/ipfs/QmW7uGJq7vE94sC4VGFuHfxTmDGZdqWLBjR43FuTwgin9R"],"license":"MIT"},"node_modules/solady/src/utils/SignatureCheckerLib.sol":{"keccak256":"0x098c7eb88b3048f227b240e0e5bf1da4a8f7622b30f6d7c06416bfcab3225e77","urls":["bzz-raw://50c2766f652916c5d6433665fb1c3b2f04c3d9292a35c12e0f8d7c71dd6438cb","dweb:/ipfs/QmWTMwN2RDZUUPg7KkH1qFBjTSh84Zw8bbYwRBCQUtLN2h"],"license":"MIT"},"src/OwnableValidator/OwnableValidator.sol":{"keccak256":"0x36de797dd515f4088dbb7addbf828bf7fbf6089de37d6f9aca5038c2ed84c0b2","urls":["bzz-raw://a7585dfdf2e31d35645c9cf7de91c8323a3f774fb3df0b52930216c45380ea00","dweb:/ipfs/QmSna2aJB5knECCTTS3iQDab9qCcY2d8d6PRkyBKUe58T9"],"license":"AGPL-3.0-only"}},"version":1},"id":52} \ No newline at end of file diff --git a/artifacts/OwnableValidator/verify.json b/artifacts/OwnableValidator/verify.json index 928fe6f..f962f7a 100644 --- a/artifacts/OwnableValidator/verify.json +++ b/artifacts/OwnableValidator/verify.json @@ -1 +1 @@ -{"language":"Solidity","sources":{"src/OwnableValidator/OwnableValidator.sol":{"content":"// SPDX-License-Identifier: AGPL-3.0-only\npragma solidity ^0.8.25;\n\nimport { ERC7579ValidatorBase } from \"modulekit/Modules.sol\";\nimport { PackedUserOperation } from \"modulekit/external/ERC4337.sol\";\nimport { SignatureCheckerLib } from \"solady/utils/SignatureCheckerLib.sol\";\nimport { SentinelList4337Lib, SENTINEL } from \"sentinellist/SentinelList4337.sol\";\nimport { LibSort } from \"solady/utils/LibSort.sol\";\nimport { CheckSignatures } from \"checknsignatures/CheckNSignatures.sol\";\nimport { ECDSA } from \"solady/utils/ECDSA.sol\";\n\nuint256 constant TYPE_STATELESS_VALIDATOR = 7;\n/**\n * @title OwnableValidator\n * @dev Module that allows users to designate EOA owners that can validate transactions using a\n * threshold\n * @author Rhinestone\n */\n\ncontract OwnableValidator is ERC7579ValidatorBase {\n using LibSort for *;\n using SentinelList4337Lib for SentinelList4337Lib.SentinelList;\n\n /*//////////////////////////////////////////////////////////////////////////\n CONSTANTS & STORAGE\n //////////////////////////////////////////////////////////////////////////*/\n\n event ModuleInitialized(address indexed account);\n event ModuleUninitialized(address indexed account);\n event ThresholdSet(address indexed account, uint256 threshold);\n event OwnerAdded(address indexed account, address indexed owner);\n event OwnerRemoved(address indexed account, address indexed owner);\n\n error ThresholdNotSet();\n error InvalidThreshold();\n error NotSortedAndUnique();\n error MaxOwnersReached();\n error InvalidOwner(address owner);\n error CannotRemoveOwner();\n\n // maximum number of owners per account\n uint256 constant MAX_OWNERS = 32;\n\n // account => owners\n SentinelList4337Lib.SentinelList owners;\n // account => threshold\n mapping(address account => uint256) public threshold;\n // account => ownerCount\n mapping(address => uint256) public ownerCount;\n\n /*//////////////////////////////////////////////////////////////////////////\n CONFIG\n //////////////////////////////////////////////////////////////////////////*/\n\n /**\n * Initializes the module with the threshold and owners\n * @dev data is encoded as follows: abi.encode(threshold, owners)\n *\n * @param data encoded data containing the threshold and owners\n */\n function onInstall(bytes calldata data) external override {\n // decode the threshold and owners\n (uint256 _threshold, address[] memory _owners) = abi.decode(data, (uint256, address[]));\n\n // check that owners are sorted and uniquified\n if (!_owners.isSortedAndUniquified()) {\n revert NotSortedAndUnique();\n }\n\n // make sure the threshold is set\n if (_threshold == 0) {\n revert ThresholdNotSet();\n }\n\n // make sure the threshold is less than the number of owners\n uint256 ownersLength = _owners.length;\n if (ownersLength < _threshold) {\n revert InvalidThreshold();\n }\n\n // cache the account address\n address account = msg.sender;\n\n // set threshold\n threshold[account] = _threshold;\n\n // check if max owners is reached\n if (ownersLength > MAX_OWNERS) {\n revert MaxOwnersReached();\n }\n\n // set owner count\n ownerCount[account] = ownersLength;\n\n // initialize the owner list\n owners.init(account);\n\n // add owners to the list\n for (uint256 i = 0; i < ownersLength; i++) {\n address _owner = _owners[i];\n if (_owner == address(0)) {\n revert InvalidOwner(_owner);\n }\n owners.push(account, _owner);\n emit OwnerAdded(account, _owner);\n }\n\n emit ModuleInitialized(account);\n }\n\n /**\n * Handles the uninstallation of the module and clears the threshold and owners\n * @dev the data parameter is not used\n */\n function onUninstall(bytes calldata) external override {\n // cache the account address\n address account = msg.sender;\n\n // clear the owners\n address[] memory ownersArray;\n (ownersArray,) = owners.getEntriesPaginated(account, SENTINEL, MAX_OWNERS);\n for (uint256 i = 0; i < ownersArray.length; i++) {\n address owner = ownersArray[i];\n // remove the owner from the list\n owners.pop(account, SENTINEL, owner);\n emit OwnerRemoved(account, owner);\n }\n\n // remove the threshold\n threshold[account] = 0;\n\n // remove the owner count\n ownerCount[account] = 0;\n\n emit ModuleUninitialized(account);\n }\n\n /**\n * Checks if the module is initialized\n *\n * @param smartAccount address of the smart account\n * @return true if the module is initialized, false otherwise\n */\n function isInitialized(address smartAccount) public view returns (bool) {\n return threshold[smartAccount] != 0;\n }\n\n /**\n * Sets the threshold for the account\n * @dev the function will revert if the module is not initialized\n *\n * @param _threshold uint256 threshold to set\n */\n function setThreshold(uint256 _threshold) external {\n // cache the account address\n address account = msg.sender;\n // check if the module is initialized and revert if it is not\n if (!isInitialized(account)) revert NotInitialized(account);\n\n // make sure that the threshold is set\n if (_threshold == 0) {\n revert InvalidThreshold();\n }\n\n // make sure the threshold is less than the number of owners\n if (ownerCount[account] < _threshold) {\n revert InvalidThreshold();\n }\n\n // set the threshold\n threshold[account] = _threshold;\n\n emit ThresholdSet(account, _threshold);\n }\n\n /**\n * Adds an owner to the account\n * @dev will revert if the owner is already added\n *\n * @param owner address of the owner to add\n */\n function addOwner(address owner) external {\n // cache the account address\n address account = msg.sender;\n // check if the module is initialized and revert if it is not\n if (!isInitialized(account)) revert NotInitialized(account);\n\n // revert if the owner is address(0)\n if (owner == address(0)) {\n revert InvalidOwner(owner);\n }\n\n // check if max owners is reached\n if (ownerCount[account] >= MAX_OWNERS) {\n revert MaxOwnersReached();\n }\n\n // increment the owner count\n ownerCount[account]++;\n\n // add the owner to the linked list\n owners.push(account, owner);\n\n emit OwnerAdded(account, owner);\n }\n\n /**\n * Removes an owner from the account\n * @dev will revert if the owner is not added or the previous owner is invalid\n *\n * @param prevOwner address of the previous owner\n * @param owner address of the owner to remove\n */\n function removeOwner(address prevOwner, address owner) external {\n // cache the account address\n address account = msg.sender;\n\n // check if an owner can be removed\n if (ownerCount[account] == threshold[account]) {\n // if the owner count is equal to the threshold, revert\n // this means that removing an owner would make the threshold unreachable\n revert CannotRemoveOwner();\n }\n\n // remove the owner\n owners.pop(account, prevOwner, owner);\n\n // decrement the owner count\n ownerCount[account]--;\n\n emit OwnerRemoved(account, owner);\n }\n\n /**\n * Returns the owners of the account\n *\n * @param account address of the account\n *\n * @return ownersArray array of owners\n */\n function getOwners(address account) external view returns (address[] memory ownersArray) {\n // get the owners from the linked list\n (ownersArray,) = owners.getEntriesPaginated(account, SENTINEL, MAX_OWNERS);\n }\n\n /*//////////////////////////////////////////////////////////////////////////\n MODULE LOGIC\n //////////////////////////////////////////////////////////////////////////*/\n\n /**\n * Validates a user operation\n *\n * @param userOp PackedUserOperation struct containing the UserOperation\n * @param userOpHash bytes32 hash of the UserOperation\n *\n * @return ValidationData the UserOperation validation result\n */\n function validateUserOp(\n PackedUserOperation calldata userOp,\n bytes32 userOpHash\n )\n external\n view\n override\n returns (ValidationData)\n {\n // validate the signature with the config\n bool isValid = _validateSignatureWithConfig(userOp.sender, userOpHash, userOp.signature);\n\n // return the result\n if (isValid) {\n return VALIDATION_SUCCESS;\n }\n return VALIDATION_FAILED;\n }\n\n /**\n * Validates an ERC-1271 signature with the sender\n *\n * @param hash bytes32 hash of the data\n * @param data bytes data containing the signatures\n *\n * @return bytes4 EIP1271_SUCCESS if the signature is valid, EIP1271_FAILED otherwise\n */\n function isValidSignatureWithSender(\n address,\n bytes32 hash,\n bytes calldata data\n )\n external\n view\n override\n returns (bytes4)\n {\n // validate the signature with the config\n bool isValid = _validateSignatureWithConfig(msg.sender, hash, data);\n\n // return the result\n if (isValid) {\n return EIP1271_SUCCESS;\n }\n return EIP1271_FAILED;\n }\n\n /**\n * Validates a signature with the data (stateless validation)\n *\n * @param hash bytes32 hash of the data\n * @param signature bytes data containing the signatures\n * @param data bytes data containing the data\n *\n * @return bool true if the signature is valid, false otherwise\n */\n function validateSignatureWithData(\n bytes32 hash,\n bytes calldata signature,\n bytes calldata data\n )\n external\n view\n returns (bool)\n {\n // decode the threshold and owners\n (uint256 _threshold, address[] memory _owners) = abi.decode(data, (uint256, address[]));\n\n // check that owners are sorted and uniquified\n if (!_owners.isSortedAndUniquified()) {\n return false;\n }\n\n // check that threshold is set\n if (_threshold == 0) {\n return false;\n }\n\n // recover the signers from the signatures\n address[] memory signers = CheckSignatures.recoverNSignatures(\n ECDSA.toEthSignedMessageHash(hash), signature, _threshold\n );\n\n // sort and uniquify the signers to make sure a signer is not reused\n signers.sort();\n signers.uniquifySorted();\n\n // check if the signers are owners\n uint256 validSigners;\n uint256 signersLength = signers.length;\n for (uint256 i = 0; i < signersLength; i++) {\n (bool found,) = _owners.searchSorted(signers[i]);\n if (found) {\n validSigners++;\n }\n }\n\n // check if the threshold is met and return the result\n if (validSigners >= _threshold) {\n // if the threshold is met, return true\n return true;\n }\n // if the threshold is not met, false\n return false;\n }\n\n /*//////////////////////////////////////////////////////////////////////////\n INTERNAL\n //////////////////////////////////////////////////////////////////////////*/\n\n function _validateSignatureWithConfig(\n address account,\n bytes32 hash,\n bytes calldata data\n )\n internal\n view\n returns (bool)\n {\n // get the threshold and check that its set\n uint256 _threshold = threshold[account];\n if (_threshold == 0) {\n return false;\n }\n\n // recover the signers from the signatures\n address[] memory signers =\n CheckSignatures.recoverNSignatures(ECDSA.toEthSignedMessageHash(hash), data, _threshold);\n\n // sort and uniquify the signers to make sure a signer is not reused\n signers.sort();\n signers.uniquifySorted();\n\n // check if the signers are owners\n uint256 validSigners;\n uint256 signersLength = signers.length;\n for (uint256 i = 0; i < signersLength; i++) {\n if (owners.contains(account, signers[i])) {\n validSigners++;\n }\n }\n\n // check if the threshold is met and return the result\n if (validSigners >= _threshold) {\n // if the threshold is met, return true\n return true;\n }\n // if the threshold is not met, return false\n return false;\n }\n\n /*//////////////////////////////////////////////////////////////////////////\n METADATA\n //////////////////////////////////////////////////////////////////////////*/\n\n /**\n * Returns the type of the module\n *\n * @param typeID type of the module\n *\n * @return true if the type is a module type, false otherwise\n */\n function isModuleType(uint256 typeID) external pure override returns (bool) {\n return typeID == TYPE_VALIDATOR || typeID == TYPE_STATELESS_VALIDATOR;\n }\n\n /**\n * Returns the name of the module\n *\n * @return name of the module\n */\n function name() external pure virtual returns (string memory) {\n return \"OwnableValidator\";\n }\n\n /**\n * Returns the version of the module\n *\n * @return version of the module\n */\n function version() external pure virtual returns (string memory) {\n return \"1.0.0\";\n }\n}\n"},"node_modules/@rhinestone/modulekit/src/Modules.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity >=0.8.23 <0.9.0;\n\n/* solhint-disable no-unused-import */\n\n/*//////////////////////////////////////////////////////////////\n INTERFACES\n//////////////////////////////////////////////////////////////*/\n\nimport {\n IValidator as IERC7579Validator,\n IExecutor as IERC7579Executor,\n IFallback as IERC7579Fallback,\n IHook as IERC7579Hook,\n IModule as IERC7579Module\n} from \"./accounts/common/interfaces/IERC7579Module.sol\";\n\n/*//////////////////////////////////////////////////////////////\n BASES\n//////////////////////////////////////////////////////////////*/\n\n// Core\nimport { ERC7579ModuleBase } from \"./module-bases/ERC7579ModuleBase.sol\";\n\n// Validators\nimport { ERC7579ValidatorBase } from \"./module-bases/ERC7579ValidatorBase.sol\";\nimport { ERC7579StatelessValidatorBase } from \"./module-bases/ERC7579StatelessValidatorBase.sol\";\nimport { ERC7579HybridValidatorBase } from \"./module-bases/ERC7579HybridValidatorBase.sol\";\n\n// Executors\nimport { ERC7579ExecutorBase } from \"./module-bases/ERC7579ExecutorBase.sol\";\n\n// Hooks\nimport { ERC7579HookBase } from \"./module-bases/ERC7579HookBase.sol\";\nimport { ERC7579HookDestruct } from \"./module-bases/ERC7579HookDestruct.sol\";\n\n// Fallbacks\nimport { ERC7579FallbackBase } from \"./module-bases/ERC7579FallbackBase.sol\";\n\n// Misc\nimport { SchedulingBase } from \"./module-bases/SchedulingBase.sol\";\nimport { ERC7484RegistryAdapter } from \"./module-bases/ERC7484RegistryAdapter.sol\";\n\n// Policies\nimport { ERC7579PolicyBase } from \"./module-bases/ERC7579PolicyBase.sol\";\nimport { ERC1271Policy } from \"./module-bases/ERC1271Policy.sol\";\nimport { ERC7579ActionPolicy } from \"./module-bases/ERC7579ActionPolicy.sol\";\nimport { ERC7579UserOpPolicy } from \"./module-bases/ERC7579UserOpPolicy.sol\";\n\n/*//////////////////////////////////////////////////////////////\n UTIL\n//////////////////////////////////////////////////////////////*/\n\nimport { TrustedForwarder } from \"./module-bases/utils/TrustedForwarder.sol\";\n"},"node_modules/@rhinestone/modulekit/src/external/ERC4337.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity >=0.8.23 <0.9.0;\n\n/* solhint-disable no-unused-import */\n\n/*//////////////////////////////////////////////////////////////\n USEROP\n//////////////////////////////////////////////////////////////*/\n\nimport { PackedUserOperation } from\n \"@ERC4337/account-abstraction/contracts/interfaces/PackedUserOperation.sol\";\nimport { UserOperationLib } from \"@ERC4337/account-abstraction/contracts/core/UserOperationLib.sol\";\n\n/*//////////////////////////////////////////////////////////////\n ENTRYPOINT\n//////////////////////////////////////////////////////////////*/\n\nimport { EntryPointSimulations } from\n \"@ERC4337/account-abstraction/contracts/core/EntryPointSimulations.sol\";\n\n/*//////////////////////////////////////////////////////////////\n VALIDATION\n//////////////////////////////////////////////////////////////*/\n\nimport {\n ValidationData,\n _packValidationData\n} from \"@ERC4337/account-abstraction/contracts/core/Helpers.sol\";\n\n/*//////////////////////////////////////////////////////////////\n INTERFACES\n//////////////////////////////////////////////////////////////*/\n\nimport { IStakeManager } from \"@ERC4337/account-abstraction/contracts/interfaces/IStakeManager.sol\";\nimport { IAccount as IERC4337 } from\n \"@ERC4337/account-abstraction/contracts/interfaces/IAccount.sol\";\nimport { IAccountExecute } from\n \"@ERC4337/account-abstraction/contracts/interfaces/IAccountExecute.sol\";\nimport { IEntryPoint } from \"@ERC4337/account-abstraction/contracts/interfaces/IEntryPoint.sol\";\nimport { IEntryPointSimulations } from\n \"@ERC4337/account-abstraction/contracts/interfaces/IEntryPointSimulations.sol\";\n"},"node_modules/solady/src/utils/SignatureCheckerLib.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.4;\n\n/// @notice Signature verification helper that supports both ECDSA signatures from EOAs\n/// and ERC1271 signatures from smart contract wallets like Argent and Gnosis safe.\n/// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/SignatureCheckerLib.sol)\n/// @author Modified from OpenZeppelin (https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/cryptography/SignatureChecker.sol)\n///\n/// @dev Note:\n/// - The signature checking functions use the ecrecover precompile (0x1).\n/// - The `bytes memory signature` variants use the identity precompile (0x4)\n/// to copy memory internally.\n/// - Unlike ECDSA signatures, contract signatures are revocable.\n/// - As of Solady version 0.0.134, all `bytes signature` variants accept both\n/// regular 65-byte `(r, s, v)` and EIP-2098 `(r, vs)` short form signatures.\n/// See: https://eips.ethereum.org/EIPS/eip-2098\n/// This is for calldata efficiency on smart accounts prevalent on L2s.\n///\n/// WARNING! Do NOT use signatures as unique identifiers:\n/// - Use a nonce in the digest to prevent replay attacks on the same contract.\n/// - Use EIP-712 for the digest to prevent replay attacks across different chains and contracts.\n/// EIP-712 also enables readable signing of typed data for better user safety.\n/// This implementation does NOT check if a signature is non-malleable.\nlibrary SignatureCheckerLib {\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* SIGNATURE CHECKING OPERATIONS */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n /// @dev Returns whether `signature` is valid for `signer` and `hash`.\n /// If `signer.code.length == 0`, then validate with `ecrecover`, else\n /// it will validate with ERC1271 on `signer`.\n function isValidSignatureNow(address signer, bytes32 hash, bytes memory signature)\n internal\n view\n returns (bool isValid)\n {\n if (signer == address(0)) return isValid;\n /// @solidity memory-safe-assembly\n assembly {\n let m := mload(0x40)\n for {} 1 {} {\n if iszero(extcodesize(signer)) {\n switch mload(signature)\n case 64 {\n let vs := mload(add(signature, 0x40))\n mstore(0x20, add(shr(255, vs), 27)) // `v`.\n mstore(0x60, shr(1, shl(1, vs))) // `s`.\n }\n case 65 {\n mstore(0x20, byte(0, mload(add(signature, 0x60)))) // `v`.\n mstore(0x60, mload(add(signature, 0x40))) // `s`.\n }\n default { break }\n mstore(0x00, hash)\n mstore(0x40, mload(add(signature, 0x20))) // `r`.\n let recovered := mload(staticcall(gas(), 1, 0x00, 0x80, 0x01, 0x20))\n isValid := gt(returndatasize(), shl(96, xor(signer, recovered)))\n mstore(0x60, 0) // Restore the zero slot.\n mstore(0x40, m) // Restore the free memory pointer.\n break\n }\n let f := shl(224, 0x1626ba7e)\n mstore(m, f) // `bytes4(keccak256(\"isValidSignature(bytes32,bytes)\"))`.\n mstore(add(m, 0x04), hash)\n let d := add(m, 0x24)\n mstore(d, 0x40) // The offset of the `signature` in the calldata.\n // Copy the `signature` over.\n let n := add(0x20, mload(signature))\n let copied := staticcall(gas(), 4, signature, n, add(m, 0x44), n)\n isValid := staticcall(gas(), signer, m, add(returndatasize(), 0x44), d, 0x20)\n isValid := and(eq(mload(d), f), and(isValid, copied))\n break\n }\n }\n }\n\n /// @dev Returns whether `signature` is valid for `signer` and `hash`.\n /// If `signer.code.length == 0`, then validate with `ecrecover`, else\n /// it will validate with ERC1271 on `signer`.\n function isValidSignatureNowCalldata(address signer, bytes32 hash, bytes calldata signature)\n internal\n view\n returns (bool isValid)\n {\n if (signer == address(0)) return isValid;\n /// @solidity memory-safe-assembly\n assembly {\n let m := mload(0x40)\n for {} 1 {} {\n if iszero(extcodesize(signer)) {\n switch signature.length\n case 64 {\n let vs := calldataload(add(signature.offset, 0x20))\n mstore(0x20, add(shr(255, vs), 27)) // `v`.\n mstore(0x40, calldataload(signature.offset)) // `r`.\n mstore(0x60, shr(1, shl(1, vs))) // `s`.\n }\n case 65 {\n mstore(0x20, byte(0, calldataload(add(signature.offset, 0x40)))) // `v`.\n calldatacopy(0x40, signature.offset, 0x40) // `r`, `s`.\n }\n default { break }\n mstore(0x00, hash)\n let recovered := mload(staticcall(gas(), 1, 0x00, 0x80, 0x01, 0x20))\n isValid := gt(returndatasize(), shl(96, xor(signer, recovered)))\n mstore(0x60, 0) // Restore the zero slot.\n mstore(0x40, m) // Restore the free memory pointer.\n break\n }\n let f := shl(224, 0x1626ba7e)\n mstore(m, f) // `bytes4(keccak256(\"isValidSignature(bytes32,bytes)\"))`.\n mstore(add(m, 0x04), hash)\n let d := add(m, 0x24)\n mstore(d, 0x40) // The offset of the `signature` in the calldata.\n mstore(add(m, 0x44), signature.length)\n // Copy the `signature` over.\n calldatacopy(add(m, 0x64), signature.offset, signature.length)\n isValid := staticcall(gas(), signer, m, add(signature.length, 0x64), d, 0x20)\n isValid := and(eq(mload(d), f), isValid)\n break\n }\n }\n }\n\n /// @dev Returns whether the signature (`r`, `vs`) is valid for `signer` and `hash`.\n /// If `signer.code.length == 0`, then validate with `ecrecover`, else\n /// it will validate with ERC1271 on `signer`.\n function isValidSignatureNow(address signer, bytes32 hash, bytes32 r, bytes32 vs)\n internal\n view\n returns (bool isValid)\n {\n if (signer == address(0)) return isValid;\n /// @solidity memory-safe-assembly\n assembly {\n let m := mload(0x40)\n for {} 1 {} {\n if iszero(extcodesize(signer)) {\n mstore(0x00, hash)\n mstore(0x20, add(shr(255, vs), 27)) // `v`.\n mstore(0x40, r) // `r`.\n mstore(0x60, shr(1, shl(1, vs))) // `s`.\n let recovered := mload(staticcall(gas(), 1, 0x00, 0x80, 0x01, 0x20))\n isValid := gt(returndatasize(), shl(96, xor(signer, recovered)))\n mstore(0x60, 0) // Restore the zero slot.\n mstore(0x40, m) // Restore the free memory pointer.\n break\n }\n let f := shl(224, 0x1626ba7e)\n mstore(m, f) // `bytes4(keccak256(\"isValidSignature(bytes32,bytes)\"))`.\n mstore(add(m, 0x04), hash)\n let d := add(m, 0x24)\n mstore(d, 0x40) // The offset of the `signature` in the calldata.\n mstore(add(m, 0x44), 65) // Length of the signature.\n mstore(add(m, 0x64), r) // `r`.\n mstore(add(m, 0x84), shr(1, shl(1, vs))) // `s`.\n mstore8(add(m, 0xa4), add(shr(255, vs), 27)) // `v`.\n isValid := staticcall(gas(), signer, m, 0xa5, d, 0x20)\n isValid := and(eq(mload(d), f), isValid)\n break\n }\n }\n }\n\n /// @dev Returns whether the signature (`v`, `r`, `s`) is valid for `signer` and `hash`.\n /// If `signer.code.length == 0`, then validate with `ecrecover`, else\n /// it will validate with ERC1271 on `signer`.\n function isValidSignatureNow(address signer, bytes32 hash, uint8 v, bytes32 r, bytes32 s)\n internal\n view\n returns (bool isValid)\n {\n if (signer == address(0)) return isValid;\n /// @solidity memory-safe-assembly\n assembly {\n let m := mload(0x40)\n for {} 1 {} {\n if iszero(extcodesize(signer)) {\n mstore(0x00, hash)\n mstore(0x20, and(v, 0xff)) // `v`.\n mstore(0x40, r) // `r`.\n mstore(0x60, s) // `s`.\n let recovered := mload(staticcall(gas(), 1, 0x00, 0x80, 0x01, 0x20))\n isValid := gt(returndatasize(), shl(96, xor(signer, recovered)))\n mstore(0x60, 0) // Restore the zero slot.\n mstore(0x40, m) // Restore the free memory pointer.\n break\n }\n let f := shl(224, 0x1626ba7e)\n mstore(m, f) // `bytes4(keccak256(\"isValidSignature(bytes32,bytes)\"))`.\n mstore(add(m, 0x04), hash)\n let d := add(m, 0x24)\n mstore(d, 0x40) // The offset of the `signature` in the calldata.\n mstore(add(m, 0x44), 65) // Length of the signature.\n mstore(add(m, 0x64), r) // `r`.\n mstore(add(m, 0x84), s) // `s`.\n mstore8(add(m, 0xa4), v) // `v`.\n isValid := staticcall(gas(), signer, m, 0xa5, d, 0x20)\n isValid := and(eq(mload(d), f), isValid)\n break\n }\n }\n }\n\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* ERC1271 OPERATIONS */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n // Note: These ERC1271 operations do NOT have an ECDSA fallback.\n\n /// @dev Returns whether `signature` is valid for `hash` for an ERC1271 `signer` contract.\n function isValidERC1271SignatureNow(address signer, bytes32 hash, bytes memory signature)\n internal\n view\n returns (bool isValid)\n {\n /// @solidity memory-safe-assembly\n assembly {\n let m := mload(0x40)\n let f := shl(224, 0x1626ba7e)\n mstore(m, f) // `bytes4(keccak256(\"isValidSignature(bytes32,bytes)\"))`.\n mstore(add(m, 0x04), hash)\n let d := add(m, 0x24)\n mstore(d, 0x40) // The offset of the `signature` in the calldata.\n // Copy the `signature` over.\n let n := add(0x20, mload(signature))\n let copied := staticcall(gas(), 4, signature, n, add(m, 0x44), n)\n isValid := staticcall(gas(), signer, m, add(returndatasize(), 0x44), d, 0x20)\n isValid := and(eq(mload(d), f), and(isValid, copied))\n }\n }\n\n /// @dev Returns whether `signature` is valid for `hash` for an ERC1271 `signer` contract.\n function isValidERC1271SignatureNowCalldata(\n address signer,\n bytes32 hash,\n bytes calldata signature\n ) internal view returns (bool isValid) {\n /// @solidity memory-safe-assembly\n assembly {\n let m := mload(0x40)\n let f := shl(224, 0x1626ba7e)\n mstore(m, f) // `bytes4(keccak256(\"isValidSignature(bytes32,bytes)\"))`.\n mstore(add(m, 0x04), hash)\n let d := add(m, 0x24)\n mstore(d, 0x40) // The offset of the `signature` in the calldata.\n mstore(add(m, 0x44), signature.length)\n // Copy the `signature` over.\n calldatacopy(add(m, 0x64), signature.offset, signature.length)\n isValid := staticcall(gas(), signer, m, add(signature.length, 0x64), d, 0x20)\n isValid := and(eq(mload(d), f), isValid)\n }\n }\n\n /// @dev Returns whether the signature (`r`, `vs`) is valid for `hash`\n /// for an ERC1271 `signer` contract.\n function isValidERC1271SignatureNow(address signer, bytes32 hash, bytes32 r, bytes32 vs)\n internal\n view\n returns (bool isValid)\n {\n /// @solidity memory-safe-assembly\n assembly {\n let m := mload(0x40)\n let f := shl(224, 0x1626ba7e)\n mstore(m, f) // `bytes4(keccak256(\"isValidSignature(bytes32,bytes)\"))`.\n mstore(add(m, 0x04), hash)\n let d := add(m, 0x24)\n mstore(d, 0x40) // The offset of the `signature` in the calldata.\n mstore(add(m, 0x44), 65) // Length of the signature.\n mstore(add(m, 0x64), r) // `r`.\n mstore(add(m, 0x84), shr(1, shl(1, vs))) // `s`.\n mstore8(add(m, 0xa4), add(shr(255, vs), 27)) // `v`.\n isValid := staticcall(gas(), signer, m, 0xa5, d, 0x20)\n isValid := and(eq(mload(d), f), isValid)\n }\n }\n\n /// @dev Returns whether the signature (`v`, `r`, `s`) is valid for `hash`\n /// for an ERC1271 `signer` contract.\n function isValidERC1271SignatureNow(address signer, bytes32 hash, uint8 v, bytes32 r, bytes32 s)\n internal\n view\n returns (bool isValid)\n {\n /// @solidity memory-safe-assembly\n assembly {\n let m := mload(0x40)\n let f := shl(224, 0x1626ba7e)\n mstore(m, f) // `bytes4(keccak256(\"isValidSignature(bytes32,bytes)\"))`.\n mstore(add(m, 0x04), hash)\n let d := add(m, 0x24)\n mstore(d, 0x40) // The offset of the `signature` in the calldata.\n mstore(add(m, 0x44), 65) // Length of the signature.\n mstore(add(m, 0x64), r) // `r`.\n mstore(add(m, 0x84), s) // `s`.\n mstore8(add(m, 0xa4), v) // `v`.\n isValid := staticcall(gas(), signer, m, 0xa5, d, 0x20)\n isValid := and(eq(mload(d), f), isValid)\n }\n }\n\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* ERC6492 OPERATIONS */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n // Note: These ERC6492 operations now include an ECDSA fallback at the very end.\n // The calldata variants are excluded for brevity.\n\n /// @dev Returns whether `signature` is valid for `hash`.\n /// If the signature is postfixed with the ERC6492 magic number, it will attempt to\n /// deploy / prepare the `signer` smart account before doing a regular ERC1271 check.\n /// Note: This function is NOT reentrancy safe.\n /// The verifier must be deployed.\n /// Otherwise, the function will return false if `signer` is not yet deployed / prepared.\n /// See: https://gist.github.com/Vectorized/011d6becff6e0a73e42fe100f8d7ef04\n /// With a dedicated verifier, this function is safe to use in contracts\n /// that have been granted special permissions.\n function isValidERC6492SignatureNowAllowSideEffects(\n address signer,\n bytes32 hash,\n bytes memory signature\n ) internal returns (bool isValid) {\n /// @solidity memory-safe-assembly\n assembly {\n function callIsValidSignature(signer_, hash_, signature_) -> _isValid {\n let m_ := mload(0x40)\n let f_ := shl(224, 0x1626ba7e)\n mstore(m_, f_) // `bytes4(keccak256(\"isValidSignature(bytes32,bytes)\"))`.\n mstore(add(m_, 0x04), hash_)\n let d_ := add(m_, 0x24)\n mstore(d_, 0x40) // The offset of the `signature` in the calldata.\n let n_ := add(0x20, mload(signature_))\n let copied_ := staticcall(gas(), 4, signature_, n_, add(m_, 0x44), n_)\n _isValid := staticcall(gas(), signer_, m_, add(returndatasize(), 0x44), d_, 0x20)\n _isValid := and(eq(mload(d_), f_), and(_isValid, copied_))\n }\n let noCode := iszero(extcodesize(signer))\n let n := mload(signature)\n for {} 1 {} {\n if iszero(eq(mload(add(signature, n)), mul(0x6492, div(not(isValid), 0xffff)))) {\n if iszero(noCode) { isValid := callIsValidSignature(signer, hash, signature) }\n break\n }\n if iszero(noCode) {\n let o := add(signature, 0x20) // Signature bytes.\n isValid := callIsValidSignature(signer, hash, add(o, mload(add(o, 0x40))))\n if isValid { break }\n }\n let m := mload(0x40)\n mstore(m, signer)\n mstore(add(m, 0x20), hash)\n pop(\n call(\n gas(), // Remaining gas.\n 0x0000bc370E4DC924F427d84e2f4B9Ec81626ba7E, // Non-reverting verifier.\n 0, // Send zero ETH.\n m, // Start of memory.\n add(returndatasize(), 0x40), // Length of calldata in memory.\n staticcall(gas(), 4, add(signature, 0x20), n, add(m, 0x40), n), // 1.\n 0x00 // Length of returndata to write.\n )\n )\n isValid := returndatasize()\n break\n }\n // Do `ecrecover` fallback if `noCode && !isValid`.\n for {} gt(noCode, isValid) {} {\n switch n\n case 64 {\n let vs := mload(add(signature, 0x40))\n mstore(0x20, add(shr(255, vs), 27)) // `v`.\n mstore(0x60, shr(1, shl(1, vs))) // `s`.\n }\n case 65 {\n mstore(0x20, byte(0, mload(add(signature, 0x60)))) // `v`.\n mstore(0x60, mload(add(signature, 0x40))) // `s`.\n }\n default { break }\n let m := mload(0x40)\n mstore(0x00, hash)\n mstore(0x40, mload(add(signature, 0x20))) // `r`.\n let recovered := mload(staticcall(gas(), 1, 0x00, 0x80, 0x01, 0x20))\n isValid := gt(returndatasize(), shl(96, xor(signer, recovered)))\n mstore(0x60, 0) // Restore the zero slot.\n mstore(0x40, m) // Restore the free memory pointer.\n break\n }\n }\n }\n\n /// @dev Returns whether `signature` is valid for `hash`.\n /// If the signature is postfixed with the ERC6492 magic number, it will attempt\n /// to use a reverting verifier to deploy / prepare the `signer` smart account\n /// and do a `isValidSignature` check via the reverting verifier.\n /// Note: This function is reentrancy safe.\n /// The reverting verifier must be deployed.\n /// Otherwise, the function will return false if `signer` is not yet deployed / prepared.\n /// See: https://gist.github.com/Vectorized/846a474c855eee9e441506676800a9ad\n function isValidERC6492SignatureNow(address signer, bytes32 hash, bytes memory signature)\n internal\n returns (bool isValid)\n {\n /// @solidity memory-safe-assembly\n assembly {\n function callIsValidSignature(signer_, hash_, signature_) -> _isValid {\n let m_ := mload(0x40)\n let f_ := shl(224, 0x1626ba7e)\n mstore(m_, f_) // `bytes4(keccak256(\"isValidSignature(bytes32,bytes)\"))`.\n mstore(add(m_, 0x04), hash_)\n let d_ := add(m_, 0x24)\n mstore(d_, 0x40) // The offset of the `signature` in the calldata.\n let n_ := add(0x20, mload(signature_))\n let copied_ := staticcall(gas(), 4, signature_, n_, add(m_, 0x44), n_)\n _isValid := staticcall(gas(), signer_, m_, add(returndatasize(), 0x44), d_, 0x20)\n _isValid := and(eq(mload(d_), f_), and(_isValid, copied_))\n }\n let noCode := iszero(extcodesize(signer))\n let n := mload(signature)\n for {} 1 {} {\n if iszero(eq(mload(add(signature, n)), mul(0x6492, div(not(isValid), 0xffff)))) {\n if iszero(noCode) { isValid := callIsValidSignature(signer, hash, signature) }\n break\n }\n if iszero(noCode) {\n let o := add(signature, 0x20) // Signature bytes.\n isValid := callIsValidSignature(signer, hash, add(o, mload(add(o, 0x40))))\n if isValid { break }\n }\n let m := mload(0x40)\n mstore(m, signer)\n mstore(add(m, 0x20), hash)\n let willBeZeroIfRevertingVerifierExists :=\n call(\n gas(), // Remaining gas.\n 0x00007bd799e4A591FeA53f8A8a3E9f931626Ba7e, // Reverting verifier.\n 0, // Send zero ETH.\n m, // Start of memory.\n add(returndatasize(), 0x40), // Length of calldata in memory.\n staticcall(gas(), 4, add(signature, 0x20), n, add(m, 0x40), n), // 1.\n 0x00 // Length of returndata to write.\n )\n isValid := gt(returndatasize(), willBeZeroIfRevertingVerifierExists)\n break\n }\n // Do `ecrecover` fallback if `noCode && !isValid`.\n for {} gt(noCode, isValid) {} {\n switch n\n case 64 {\n let vs := mload(add(signature, 0x40))\n mstore(0x20, add(shr(255, vs), 27)) // `v`.\n mstore(0x60, shr(1, shl(1, vs))) // `s`.\n }\n case 65 {\n mstore(0x20, byte(0, mload(add(signature, 0x60)))) // `v`.\n mstore(0x60, mload(add(signature, 0x40))) // `s`.\n }\n default { break }\n let m := mload(0x40)\n mstore(0x00, hash)\n mstore(0x40, mload(add(signature, 0x20))) // `r`.\n let recovered := mload(staticcall(gas(), 1, 0x00, 0x80, 0x01, 0x20))\n isValid := gt(returndatasize(), shl(96, xor(signer, recovered)))\n mstore(0x60, 0) // Restore the zero slot.\n mstore(0x40, m) // Restore the free memory pointer.\n break\n }\n }\n }\n\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* HASHING OPERATIONS */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n /// @dev Returns an Ethereum Signed Message, created from a `hash`.\n /// This produces a hash corresponding to the one signed with the\n /// [`eth_sign`](https://eth.wiki/json-rpc/API#eth_sign)\n /// JSON-RPC method as part of EIP-191.\n function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32 result) {\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x20, hash) // Store into scratch space for keccak256.\n mstore(0x00, \"\\x00\\x00\\x00\\x00\\x19Ethereum Signed Message:\\n32\") // 28 bytes.\n result := keccak256(0x04, 0x3c) // `32 * 2 - (32 - 28) = 60 = 0x3c`.\n }\n }\n\n /// @dev Returns an Ethereum Signed Message, created from `s`.\n /// This produces a hash corresponding to the one signed with the\n /// [`eth_sign`](https://eth.wiki/json-rpc/API#eth_sign)\n /// JSON-RPC method as part of EIP-191.\n /// Note: Supports lengths of `s` up to 999999 bytes.\n function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32 result) {\n /// @solidity memory-safe-assembly\n assembly {\n let sLength := mload(s)\n let o := 0x20\n mstore(o, \"\\x19Ethereum Signed Message:\\n\") // 26 bytes, zero-right-padded.\n mstore(0x00, 0x00)\n // Convert the `s.length` to ASCII decimal representation: `base10(s.length)`.\n for { let temp := sLength } 1 {} {\n o := sub(o, 1)\n mstore8(o, add(48, mod(temp, 10)))\n temp := div(temp, 10)\n if iszero(temp) { break }\n }\n let n := sub(0x3a, o) // Header length: `26 + 32 - o`.\n // Throw an out-of-offset error (consumes all gas) if the header exceeds 32 bytes.\n returndatacopy(returndatasize(), returndatasize(), gt(n, 0x20))\n mstore(s, or(mload(0x00), mload(n))) // Temporarily store the header.\n result := keccak256(add(s, sub(0x20, n)), add(n, sLength))\n mstore(s, sLength) // Restore the length.\n }\n }\n\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* EMPTY CALLDATA HELPERS */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n /// @dev Returns an empty calldata bytes.\n function emptySignature() internal pure returns (bytes calldata signature) {\n /// @solidity memory-safe-assembly\n assembly {\n signature.length := 0\n }\n }\n}\n"},"node_modules/@rhinestone/sentinellist/src/SentinelList4337.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n// Sentinel address\naddress constant SENTINEL = address(0x1);\n// Zero address\naddress constant ZERO_ADDRESS = address(0x0);\n\n/**\n * @title SentinelListLib\n * @dev Library for managing a linked list of addresses that is compliant with the ERC-4337\n * validation rules\n * @author Rhinestone\n */\nlibrary SentinelList4337Lib {\n // Struct to hold the linked list\n // This linked list has the account address as the inner key so it is ERC-4337 compliant\n struct SentinelList {\n mapping(address key => mapping(address account => address entry)) entries;\n }\n\n error LinkedList_AlreadyInitialized();\n error LinkedList_InvalidPage();\n error LinkedList_InvalidEntry(address entry);\n error LinkedList_EntryAlreadyInList(address entry);\n\n /**\n * Initialize the linked list\n *\n * @param self The linked list\n * @param account The account to initialize the linked list for\n */\n function init(SentinelList storage self, address account) internal {\n if (alreadyInitialized(self, account)) revert LinkedList_AlreadyInitialized();\n self.entries[SENTINEL][account] = SENTINEL;\n }\n\n /**\n * Check if the linked list is already initialized\n *\n * @param self The linked list\n * @param account The account to check if the linked list is initialized for\n *\n * @return bool True if the linked list is already initialized\n */\n function alreadyInitialized(\n SentinelList storage self,\n address account\n )\n internal\n view\n returns (bool)\n {\n return self.entries[SENTINEL][account] != ZERO_ADDRESS;\n }\n\n /**\n * Get the next entry in the linked list\n *\n * @param self The linked list\n * @param account The account to get the next entry for\n * @param entry The current entry\n *\n * @return address The next entry\n */\n function getNext(\n SentinelList storage self,\n address account,\n address entry\n )\n internal\n view\n returns (address)\n {\n if (entry == ZERO_ADDRESS) {\n revert LinkedList_InvalidEntry(entry);\n }\n return self.entries[entry][account];\n }\n\n /**\n * Push a new entry to the linked list\n *\n * @param self The linked list\n * @param account The account to push the new entry for\n * @param newEntry The new entry\n */\n function push(SentinelList storage self, address account, address newEntry) internal {\n if (newEntry == ZERO_ADDRESS || newEntry == SENTINEL) {\n revert LinkedList_InvalidEntry(newEntry);\n }\n if (self.entries[newEntry][account] != ZERO_ADDRESS) {\n revert LinkedList_EntryAlreadyInList(newEntry);\n }\n self.entries[newEntry][account] = self.entries[SENTINEL][account];\n self.entries[SENTINEL][account] = newEntry;\n }\n\n /**\n * Safe push a new entry to the linked list\n * @dev This ensures that the linked list is initialized and initializes it if it is not\n *\n * @param self The linked list\n * @param account The account to push the new entry for\n * @param newEntry The new entry\n */\n function safePush(SentinelList storage self, address account, address newEntry) internal {\n if (!alreadyInitialized(self, account)) {\n init({ self: self, account: account });\n }\n push({ self: self, account: account, newEntry: newEntry });\n }\n\n /**\n * Pop an entry from the linked list\n *\n * @param self The linked list\n * @param account The account to pop the entry for\n * @param prevEntry The entry before the entry to pop\n * @param popEntry The entry to pop\n */\n function pop(\n SentinelList storage self,\n address account,\n address prevEntry,\n address popEntry\n )\n internal\n {\n if (popEntry == ZERO_ADDRESS || popEntry == SENTINEL) {\n revert LinkedList_InvalidEntry(prevEntry);\n }\n if (self.entries[prevEntry][account] != popEntry) {\n revert LinkedList_InvalidEntry(popEntry);\n }\n self.entries[prevEntry][account] = self.entries[popEntry][account];\n self.entries[popEntry][account] = ZERO_ADDRESS;\n }\n\n /**\n * Pop all entries from the linked list\n *\n * @param self The linked list\n * @param account The account to pop all entries for\n */\n function popAll(SentinelList storage self, address account) internal {\n address next = self.entries[SENTINEL][account];\n while (next != ZERO_ADDRESS) {\n address current = next;\n next = self.entries[next][account];\n self.entries[current][account] = ZERO_ADDRESS;\n }\n }\n\n /**\n * Check if the linked list contains an entry\n *\n * @param self The linked list\n * @param account The account to check if the entry is in the linked list for\n * @param entry The entry to check for\n *\n * @return bool True if the linked list contains the entry\n */\n function contains(\n SentinelList storage self,\n address account,\n address entry\n )\n internal\n view\n returns (bool)\n {\n return SENTINEL != entry && self.entries[entry][account] != ZERO_ADDRESS;\n }\n\n /**\n * Get all entries in the linked list\n *\n * @param self The linked list\n * @param account The account to get the entries for\n * @param start The start entry\n * @param pageSize The page size\n *\n * @return array All entries in the linked list\n * @return next The next entry\n */\n function getEntriesPaginated(\n SentinelList storage self,\n address account,\n address start,\n uint256 pageSize\n )\n internal\n view\n returns (address[] memory array, address next)\n {\n if (start != SENTINEL && !contains(self, account, start)) {\n revert LinkedList_InvalidEntry(start);\n }\n if (pageSize == 0) revert LinkedList_InvalidPage();\n // Init array with max page size\n array = new address[](pageSize);\n\n // Populate return array\n uint256 entryCount = 0;\n next = self.entries[start][account];\n while (next != ZERO_ADDRESS && next != SENTINEL && entryCount < pageSize) {\n array[entryCount] = next;\n next = self.entries[next][account];\n entryCount++;\n }\n\n /**\n * Because of the argument validation, we can assume that the loop will always iterate over\n * the valid entry list values\n * and the `next` variable will either be an enabled entry or a sentinel address\n * (signalling the end).\n *\n * If we haven't reached the end inside the loop, we need to set the next pointer to\n * the last element of the entry array\n * because the `next` variable (which is a entry by itself) acting as a pointer to the\n * start of the next page is neither\n * incSENTINELrent page, nor will it be included in the next one if you pass it as a\n * start.\n */\n if (next != SENTINEL && entryCount > 0) {\n next = array[entryCount - 1];\n }\n // Set correct size of returned array\n // solhint-disable-next-line no-inline-assembly\n /// @solidity memory-safe-assembly\n assembly {\n mstore(array, entryCount)\n }\n }\n}\n"},"node_modules/solady/src/utils/LibSort.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.4;\n\n/// @notice Optimized sorts and operations for sorted arrays.\n/// @author Solady (https://github.com/Vectorized/solady/blob/main/src/utils/LibSort.sol)\nlibrary LibSort {\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* INSERTION SORT */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n // - Faster on small arrays (32 or lesser elements).\n // - Faster on almost sorted arrays.\n // - Smaller bytecode (about 300 bytes smaller than sort, which uses intro-quicksort).\n // - May be suitable for view functions intended for off-chain querying.\n\n /// @dev Sorts the array in-place with insertion sort.\n function insertionSort(uint256[] memory a) internal pure {\n /// @solidity memory-safe-assembly\n assembly {\n let n := mload(a) // Length of `a`.\n mstore(a, 0) // For insertion sort's inner loop to terminate.\n let h := add(a, shl(5, n)) // High slot.\n let w := not(0x1f)\n for { let i := add(a, 0x20) } 1 {} {\n i := add(i, 0x20)\n if gt(i, h) { break }\n let k := mload(i) // Key.\n let j := add(i, w) // The slot before the current slot.\n let v := mload(j) // The value of `j`.\n if iszero(gt(v, k)) { continue }\n for {} 1 {} {\n mstore(add(j, 0x20), v)\n j := add(j, w) // `sub(j, 0x20)`.\n v := mload(j)\n if iszero(gt(v, k)) { break }\n }\n mstore(add(j, 0x20), k)\n }\n mstore(a, n) // Restore the length of `a`.\n }\n }\n\n /// @dev Sorts the array in-place with insertion sort.\n function insertionSort(int256[] memory a) internal pure {\n _flipSign(a);\n insertionSort(_toUints(a));\n _flipSign(a);\n }\n\n /// @dev Sorts the array in-place with insertion sort.\n function insertionSort(address[] memory a) internal pure {\n insertionSort(_toUints(a));\n }\n\n /// @dev Sorts the array in-place with insertion sort.\n function insertionSort(bytes32[] memory a) internal pure {\n insertionSort(_toUints(a));\n }\n\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* INTRO-QUICKSORT */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n // - Faster on larger arrays (more than 32 elements).\n // - Robust performance.\n // - Larger bytecode.\n\n /// @dev Sorts the array in-place with intro-quicksort.\n function sort(uint256[] memory a) internal pure {\n /// @solidity memory-safe-assembly\n assembly {\n function swap(a_, b_) -> _a, _b {\n _b := a_\n _a := b_\n }\n function mswap(i_, j_) {\n let t_ := mload(i_)\n mstore(i_, mload(j_))\n mstore(j_, t_)\n }\n function sortInner(w_, l_, h_) {\n // Do insertion sort if `h_ - l_ <= 0x20 * 12`.\n // Threshold is fine-tuned via trial and error.\n if iszero(gt(sub(h_, l_), 0x180)) {\n // Hardcode sort the first 2 elements.\n let i_ := add(l_, 0x20)\n if iszero(lt(mload(l_), mload(i_))) { mswap(i_, l_) }\n for {} 1 {} {\n i_ := add(i_, 0x20)\n if gt(i_, h_) { break }\n let k_ := mload(i_) // Key.\n let j_ := add(i_, w_) // The slot before the current slot.\n let v_ := mload(j_) // The value of `j_`.\n if iszero(gt(v_, k_)) { continue }\n for {} 1 {} {\n mstore(add(j_, 0x20), v_)\n j_ := add(j_, w_)\n v_ := mload(j_)\n if iszero(gt(v_, k_)) { break }\n }\n mstore(add(j_, 0x20), k_)\n }\n leave\n }\n // Pivot slot is the average of `l_` and `h_`.\n let p_ := add(shl(5, shr(6, add(l_, h_))), and(31, l_))\n // Median of 3 with sorting.\n {\n let e0_ := mload(l_)\n let e1_ := mload(p_)\n if iszero(lt(e0_, e1_)) { e0_, e1_ := swap(e0_, e1_) }\n let e2_ := mload(h_)\n if iszero(lt(e1_, e2_)) {\n e1_, e2_ := swap(e1_, e2_)\n if iszero(lt(e0_, e1_)) { e0_, e1_ := swap(e0_, e1_) }\n }\n mstore(h_, e2_)\n mstore(p_, e1_)\n mstore(l_, e0_)\n }\n // Hoare's partition.\n {\n // The value of the pivot slot.\n let x_ := mload(p_)\n p_ := h_\n for { let i_ := l_ } 1 {} {\n for {} 1 {} {\n i_ := add(0x20, i_)\n if iszero(gt(x_, mload(i_))) { break }\n }\n let j_ := p_\n for {} 1 {} {\n j_ := add(w_, j_)\n if iszero(lt(x_, mload(j_))) { break }\n }\n p_ := j_\n if iszero(lt(i_, p_)) { break }\n mswap(i_, p_)\n }\n }\n if iszero(eq(add(p_, 0x20), h_)) { sortInner(w_, add(p_, 0x20), h_) }\n if iszero(eq(p_, l_)) { sortInner(w_, l_, p_) }\n }\n\n for { let n := mload(a) } iszero(lt(n, 2)) {} {\n let w := not(0x1f) // `-0x20`.\n let l := add(a, 0x20) // Low slot.\n let h := add(a, shl(5, n)) // High slot.\n let j := h\n // While `mload(j - 0x20) <= mload(j): j -= 0x20`.\n for {} iszero(gt(mload(add(w, j)), mload(j))) {} { j := add(w, j) }\n // If the array is already sorted, break.\n if iszero(gt(j, l)) { break }\n // While `mload(j - 0x20) >= mload(j): j -= 0x20`.\n for { j := h } iszero(lt(mload(add(w, j)), mload(j))) {} { j := add(w, j) }\n // If the array is reversed sorted.\n if iszero(gt(j, l)) {\n for {} 1 {} {\n let t := mload(l)\n mstore(l, mload(h))\n mstore(h, t)\n h := add(w, h)\n l := add(l, 0x20)\n if iszero(lt(l, h)) { break }\n }\n break\n }\n mstore(a, 0) // For insertion sort's inner loop to terminate.\n sortInner(w, l, h)\n mstore(a, n) // Restore the length of `a`.\n break\n }\n }\n }\n\n /// @dev Sorts the array in-place with intro-quicksort.\n function sort(int256[] memory a) internal pure {\n _flipSign(a);\n sort(_toUints(a));\n _flipSign(a);\n }\n\n /// @dev Sorts the array in-place with intro-quicksort.\n function sort(address[] memory a) internal pure {\n sort(_toUints(a));\n }\n\n /// @dev Sorts the array in-place with intro-quicksort.\n function sort(bytes32[] memory a) internal pure {\n sort(_toUints(a));\n }\n\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* OTHER USEFUL OPERATIONS */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n // For performance, the `uniquifySorted` methods will not revert if the\n // array is not sorted -- it will simply remove consecutive duplicate elements.\n\n /// @dev Removes duplicate elements from a ascendingly sorted memory array.\n function uniquifySorted(uint256[] memory a) internal pure {\n /// @solidity memory-safe-assembly\n assembly {\n // If the length of `a` is greater than 1.\n if iszero(lt(mload(a), 2)) {\n let x := add(a, 0x20)\n let y := add(a, 0x40)\n let end := add(a, shl(5, add(mload(a), 1)))\n for {} 1 {} {\n if iszero(eq(mload(x), mload(y))) {\n x := add(x, 0x20)\n mstore(x, mload(y))\n }\n y := add(y, 0x20)\n if eq(y, end) { break }\n }\n mstore(a, shr(5, sub(x, a)))\n }\n }\n }\n\n /// @dev Removes duplicate elements from a ascendingly sorted memory array.\n function uniquifySorted(int256[] memory a) internal pure {\n uniquifySorted(_toUints(a));\n }\n\n /// @dev Removes duplicate elements from a ascendingly sorted memory array.\n function uniquifySorted(address[] memory a) internal pure {\n uniquifySorted(_toUints(a));\n }\n\n /// @dev Removes duplicate elements from a ascendingly sorted memory array.\n function uniquifySorted(bytes32[] memory a) internal pure {\n uniquifySorted(_toUints(a));\n }\n\n /// @dev Returns whether `a` contains `needle`, and the index of `needle`.\n /// `index` precedence: equal to > nearest before > nearest after.\n function searchSorted(uint256[] memory a, uint256 needle)\n internal\n pure\n returns (bool found, uint256 index)\n {\n (found, index) = _searchSorted(a, needle, 0);\n }\n\n /// @dev Returns whether `a` contains `needle`, and the index of `needle`.\n /// `index` precedence: equal to > nearest before > nearest after.\n function searchSorted(int256[] memory a, int256 needle)\n internal\n pure\n returns (bool found, uint256 index)\n {\n (found, index) = _searchSorted(_toUints(a), uint256(needle), 1 << 255);\n }\n\n /// @dev Returns whether `a` contains `needle`, and the index of `needle`.\n /// `index` precedence: equal to > nearest before > nearest after.\n function searchSorted(address[] memory a, address needle)\n internal\n pure\n returns (bool found, uint256 index)\n {\n (found, index) = _searchSorted(_toUints(a), uint160(needle), 0);\n }\n\n /// @dev Returns whether `a` contains `needle`, and the index of `needle`.\n /// `index` precedence: equal to > nearest before > nearest after.\n function searchSorted(bytes32[] memory a, bytes32 needle)\n internal\n pure\n returns (bool found, uint256 index)\n {\n (found, index) = _searchSorted(_toUints(a), uint256(needle), 0);\n }\n\n /// @dev Returns whether `a` contains `needle`.\n function inSorted(uint256[] memory a, uint256 needle) internal pure returns (bool found) {\n (found,) = searchSorted(a, needle);\n }\n\n /// @dev Returns whether `a` contains `needle`.\n function inSorted(int256[] memory a, int256 needle) internal pure returns (bool found) {\n (found,) = searchSorted(a, needle);\n }\n\n /// @dev Returns whether `a` contains `needle`.\n function inSorted(address[] memory a, address needle) internal pure returns (bool found) {\n (found,) = searchSorted(a, needle);\n }\n\n /// @dev Returns whether `a` contains `needle`.\n function inSorted(bytes32[] memory a, bytes32 needle) internal pure returns (bool found) {\n (found,) = searchSorted(a, needle);\n }\n\n /// @dev Reverses the array in-place.\n function reverse(uint256[] memory a) internal pure {\n /// @solidity memory-safe-assembly\n assembly {\n if iszero(lt(mload(a), 2)) {\n let s := 0x20\n let w := not(0x1f)\n let h := add(a, shl(5, mload(a)))\n for { a := add(a, s) } 1 {} {\n let t := mload(a)\n mstore(a, mload(h))\n mstore(h, t)\n h := add(h, w)\n a := add(a, s)\n if iszero(lt(a, h)) { break }\n }\n }\n }\n }\n\n /// @dev Reverses the array in-place.\n function reverse(int256[] memory a) internal pure {\n reverse(_toUints(a));\n }\n\n /// @dev Reverses the array in-place.\n function reverse(address[] memory a) internal pure {\n reverse(_toUints(a));\n }\n\n /// @dev Reverses the array in-place.\n function reverse(bytes32[] memory a) internal pure {\n reverse(_toUints(a));\n }\n\n /// @dev Returns a copy of the array.\n function copy(uint256[] memory a) internal pure returns (uint256[] memory result) {\n /// @solidity memory-safe-assembly\n assembly {\n result := mload(0x40)\n let end := add(add(result, 0x20), shl(5, mload(a)))\n let o := result\n for { let d := sub(a, result) } 1 {} {\n mstore(o, mload(add(o, d)))\n o := add(0x20, o)\n if eq(o, end) { break }\n }\n mstore(0x40, o)\n }\n }\n\n /// @dev Returns a copy of the array.\n function copy(int256[] memory a) internal pure returns (int256[] memory result) {\n result = _toInts(copy(_toUints(a)));\n }\n\n /// @dev Returns a copy of the array.\n function copy(address[] memory a) internal pure returns (address[] memory result) {\n result = _toAddresses(copy(_toUints(a)));\n }\n\n /// @dev Returns a copy of the array.\n function copy(bytes32[] memory a) internal pure returns (bytes32[] memory result) {\n result = _toBytes32s(copy(_toUints(a)));\n }\n\n /// @dev Returns whether the array is sorted in ascending order.\n function isSorted(uint256[] memory a) internal pure returns (bool result) {\n /// @solidity memory-safe-assembly\n assembly {\n result := 1\n if iszero(lt(mload(a), 2)) {\n let end := add(a, shl(5, mload(a)))\n for { a := add(a, 0x20) } 1 {} {\n let p := mload(a)\n a := add(a, 0x20)\n result := iszero(gt(p, mload(a)))\n if iszero(mul(result, xor(a, end))) { break }\n }\n }\n }\n }\n\n /// @dev Returns whether the array is sorted in ascending order.\n function isSorted(int256[] memory a) internal pure returns (bool result) {\n /// @solidity memory-safe-assembly\n assembly {\n result := 1\n if iszero(lt(mload(a), 2)) {\n let end := add(a, shl(5, mload(a)))\n for { a := add(a, 0x20) } 1 {} {\n let p := mload(a)\n a := add(a, 0x20)\n result := iszero(sgt(p, mload(a)))\n if iszero(mul(result, xor(a, end))) { break }\n }\n }\n }\n }\n\n /// @dev Returns whether the array is sorted in ascending order.\n function isSorted(address[] memory a) internal pure returns (bool result) {\n result = isSorted(_toUints(a));\n }\n\n /// @dev Returns whether the array is sorted in ascending order.\n function isSorted(bytes32[] memory a) internal pure returns (bool result) {\n result = isSorted(_toUints(a));\n }\n\n /// @dev Returns whether the array is strictly ascending (sorted and uniquified).\n function isSortedAndUniquified(uint256[] memory a) internal pure returns (bool result) {\n /// @solidity memory-safe-assembly\n assembly {\n result := 1\n if iszero(lt(mload(a), 2)) {\n let end := add(a, shl(5, mload(a)))\n for { a := add(a, 0x20) } 1 {} {\n let p := mload(a)\n a := add(a, 0x20)\n result := lt(p, mload(a))\n if iszero(mul(result, xor(a, end))) { break }\n }\n }\n }\n }\n\n /// @dev Returns whether the array is strictly ascending (sorted and uniquified).\n function isSortedAndUniquified(int256[] memory a) internal pure returns (bool result) {\n /// @solidity memory-safe-assembly\n assembly {\n result := 1\n if iszero(lt(mload(a), 2)) {\n let end := add(a, shl(5, mload(a)))\n for { a := add(a, 0x20) } 1 {} {\n let p := mload(a)\n a := add(a, 0x20)\n result := slt(p, mload(a))\n if iszero(mul(result, xor(a, end))) { break }\n }\n }\n }\n }\n\n /// @dev Returns whether the array is strictly ascending (sorted and uniquified).\n function isSortedAndUniquified(address[] memory a) internal pure returns (bool result) {\n result = isSortedAndUniquified(_toUints(a));\n }\n\n /// @dev Returns whether the array is strictly ascending (sorted and uniquified).\n function isSortedAndUniquified(bytes32[] memory a) internal pure returns (bool result) {\n result = isSortedAndUniquified(_toUints(a));\n }\n\n /// @dev Returns the sorted set difference of `a` and `b`.\n /// Note: Behaviour is undefined if inputs are not sorted and uniquified.\n function difference(uint256[] memory a, uint256[] memory b)\n internal\n pure\n returns (uint256[] memory c)\n {\n c = _difference(a, b, 0);\n }\n\n /// @dev Returns the sorted set difference between `a` and `b`.\n /// Note: Behaviour is undefined if inputs are not sorted and uniquified.\n function difference(int256[] memory a, int256[] memory b)\n internal\n pure\n returns (int256[] memory c)\n {\n c = _toInts(_difference(_toUints(a), _toUints(b), 1 << 255));\n }\n\n /// @dev Returns the sorted set difference between `a` and `b`.\n /// Note: Behaviour is undefined if inputs are not sorted and uniquified.\n function difference(address[] memory a, address[] memory b)\n internal\n pure\n returns (address[] memory c)\n {\n c = _toAddresses(_difference(_toUints(a), _toUints(b), 0));\n }\n\n /// @dev Returns the sorted set difference between `a` and `b`.\n /// Note: Behaviour is undefined if inputs are not sorted and uniquified.\n function difference(bytes32[] memory a, bytes32[] memory b)\n internal\n pure\n returns (bytes32[] memory c)\n {\n c = _toBytes32s(_difference(_toUints(a), _toUints(b), 0));\n }\n\n /// @dev Returns the sorted set intersection between `a` and `b`.\n /// Note: Behaviour is undefined if inputs are not sorted and uniquified.\n function intersection(uint256[] memory a, uint256[] memory b)\n internal\n pure\n returns (uint256[] memory c)\n {\n c = _intersection(a, b, 0);\n }\n\n /// @dev Returns the sorted set intersection between `a` and `b`.\n /// Note: Behaviour is undefined if inputs are not sorted and uniquified.\n function intersection(int256[] memory a, int256[] memory b)\n internal\n pure\n returns (int256[] memory c)\n {\n c = _toInts(_intersection(_toUints(a), _toUints(b), 1 << 255));\n }\n\n /// @dev Returns the sorted set intersection between `a` and `b`.\n /// Note: Behaviour is undefined if inputs are not sorted and uniquified.\n function intersection(address[] memory a, address[] memory b)\n internal\n pure\n returns (address[] memory c)\n {\n c = _toAddresses(_intersection(_toUints(a), _toUints(b), 0));\n }\n\n /// @dev Returns the sorted set intersection between `a` and `b`.\n /// Note: Behaviour is undefined if inputs are not sorted and uniquified.\n function intersection(bytes32[] memory a, bytes32[] memory b)\n internal\n pure\n returns (bytes32[] memory c)\n {\n c = _toBytes32s(_intersection(_toUints(a), _toUints(b), 0));\n }\n\n /// @dev Returns the sorted set union of `a` and `b`.\n /// Note: Behaviour is undefined if inputs are not sorted and uniquified.\n function union(uint256[] memory a, uint256[] memory b)\n internal\n pure\n returns (uint256[] memory c)\n {\n c = _union(a, b, 0);\n }\n\n /// @dev Returns the sorted set union of `a` and `b`.\n /// Note: Behaviour is undefined if inputs are not sorted and uniquified.\n function union(int256[] memory a, int256[] memory b)\n internal\n pure\n returns (int256[] memory c)\n {\n c = _toInts(_union(_toUints(a), _toUints(b), 1 << 255));\n }\n\n /// @dev Returns the sorted set union between `a` and `b`.\n /// Note: Behaviour is undefined if inputs are not sorted and uniquified.\n function union(address[] memory a, address[] memory b)\n internal\n pure\n returns (address[] memory c)\n {\n c = _toAddresses(_union(_toUints(a), _toUints(b), 0));\n }\n\n /// @dev Returns the sorted set union between `a` and `b`.\n /// Note: Behaviour is undefined if inputs are not sorted and uniquified.\n function union(bytes32[] memory a, bytes32[] memory b)\n internal\n pure\n returns (bytes32[] memory c)\n {\n c = _toBytes32s(_union(_toUints(a), _toUints(b), 0));\n }\n\n /// @dev Cleans the upper 96 bits of the addresses.\n /// In case `a` is produced via assembly and might have dirty upper bits.\n function clean(address[] memory a) internal pure {\n /// @solidity memory-safe-assembly\n assembly {\n let addressMask := shr(96, not(0))\n for { let end := add(a, shl(5, mload(a))) } iszero(eq(a, end)) {} {\n a := add(a, 0x20)\n mstore(a, and(mload(a), addressMask))\n }\n }\n }\n\n /// @dev Sorts and uniquifies `keys`. Updates `values` with the grouped sums by key.\n function groupSum(uint256[] memory keys, uint256[] memory values) internal pure {\n uint256 m;\n /// @solidity memory-safe-assembly\n assembly {\n m := mload(0x40) // Cache the free memory pointer, for freeing the memory.\n if iszero(eq(mload(keys), mload(values))) {\n mstore(0x00, 0x4e487b71)\n mstore(0x20, 0x32) // Array out of bounds panic if the arrays lengths differ.\n revert(0x1c, 0x24)\n }\n }\n if (keys.length == uint256(0)) return;\n (uint256[] memory oriKeys, uint256[] memory oriValues) = (copy(keys), copy(values));\n insertionSort(keys); // Optimize for small `n` and bytecode size.\n uniquifySorted(keys);\n /// @solidity memory-safe-assembly\n assembly {\n let d := sub(values, keys)\n let w := not(0x1f)\n let s := add(keys, 0x20) // Location of `keys[0]`.\n mstore(values, mload(keys)) // Truncate.\n calldatacopy(add(s, d), calldatasize(), shl(5, mload(keys))) // Zeroize.\n for { let i := shl(5, mload(oriKeys)) } 1 {} {\n let k := mload(add(oriKeys, i))\n let v := mload(add(oriValues, i))\n let j := s // Just do a linear scan to optimize for small `n` and bytecode size.\n for {} iszero(eq(mload(j), k)) {} { j := add(j, 0x20) }\n j := add(j, d) // Convert `j` to point into `values`.\n mstore(j, add(mload(j), v))\n if lt(mload(j), v) {\n mstore(0x00, 0x4e487b71)\n mstore(0x20, 0x11) // Overflow panic if the addition overflows.\n revert(0x1c, 0x24)\n }\n i := add(i, w) // `sub(i, 0x20)`.\n if iszero(i) { break }\n }\n mstore(0x40, m) // Frees the memory allocated for the temporary copies.\n }\n }\n\n /// @dev Sorts and uniquifies `keys`. Updates `values` with the grouped sums by key.\n function groupSum(address[] memory keys, uint256[] memory values) internal pure {\n groupSum(_toUints(keys), values);\n }\n\n /// @dev Sorts and uniquifies `keys`. Updates `values` with the grouped sums by key.\n function groupSum(bytes32[] memory keys, uint256[] memory values) internal pure {\n groupSum(_toUints(keys), values);\n }\n\n /// @dev Sorts and uniquifies `keys`. Updates `values` with the grouped sums by key.\n function groupSum(int256[] memory keys, uint256[] memory values) internal pure {\n groupSum(_toUints(keys), values);\n }\n\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* PRIVATE HELPERS */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n /// @dev Reinterpret cast to an uint256 array.\n function _toUints(int256[] memory a) private pure returns (uint256[] memory casted) {\n /// @solidity memory-safe-assembly\n assembly {\n casted := a\n }\n }\n\n /// @dev Reinterpret cast to an uint256 array.\n function _toUints(address[] memory a) private pure returns (uint256[] memory casted) {\n /// @solidity memory-safe-assembly\n assembly {\n // As any address written to memory will have the upper 96 bits\n // of the word zeroized (as per Solidity spec), we can directly\n // compare these addresses as if they are whole uint256 words.\n casted := a\n }\n }\n\n /// @dev Reinterpret cast to an uint256 array.\n function _toUints(bytes32[] memory a) private pure returns (uint256[] memory casted) {\n /// @solidity memory-safe-assembly\n assembly {\n casted := a\n }\n }\n\n /// @dev Reinterpret cast to an int array.\n function _toInts(uint256[] memory a) private pure returns (int256[] memory casted) {\n /// @solidity memory-safe-assembly\n assembly {\n casted := a\n }\n }\n\n /// @dev Reinterpret cast to an address array.\n function _toAddresses(uint256[] memory a) private pure returns (address[] memory casted) {\n /// @solidity memory-safe-assembly\n assembly {\n casted := a\n }\n }\n\n /// @dev Reinterpret cast to an bytes32 array.\n function _toBytes32s(uint256[] memory a) private pure returns (bytes32[] memory casted) {\n /// @solidity memory-safe-assembly\n assembly {\n casted := a\n }\n }\n\n /// @dev Converts an array of signed integers to unsigned\n /// integers suitable for sorting or vice versa.\n function _flipSign(int256[] memory a) private pure {\n /// @solidity memory-safe-assembly\n assembly {\n let w := shl(255, 1)\n for { let end := add(a, shl(5, mload(a))) } iszero(eq(a, end)) {} {\n a := add(a, 0x20)\n mstore(a, add(mload(a), w))\n }\n }\n }\n\n /// @dev Returns whether `a` contains `needle`, and the index of `needle`.\n /// `index` precedence: equal to > nearest before > nearest after.\n function _searchSorted(uint256[] memory a, uint256 needle, uint256 signed)\n private\n pure\n returns (bool found, uint256 index)\n {\n /// @solidity memory-safe-assembly\n assembly {\n let w := not(0)\n let l := 1\n let h := mload(a)\n let t := 0\n for { needle := add(signed, needle) } 1 {} {\n index := shr(1, add(l, h))\n t := add(signed, mload(add(a, shl(5, index))))\n if or(gt(l, h), eq(t, needle)) { break }\n // Decide whether to search the left or right half.\n if iszero(gt(needle, t)) {\n h := add(index, w)\n continue\n }\n l := add(index, 1)\n }\n // `index` will be zero in the case of an empty array,\n // or when the value is less than the smallest value in the array.\n found := eq(t, needle)\n t := iszero(iszero(index))\n index := mul(add(index, w), t)\n found := and(found, t)\n }\n }\n\n /// @dev Returns the sorted set difference of `a` and `b`.\n /// Note: Behaviour is undefined if inputs are not sorted and uniquified.\n function _difference(uint256[] memory a, uint256[] memory b, uint256 signed)\n private\n pure\n returns (uint256[] memory c)\n {\n /// @solidity memory-safe-assembly\n assembly {\n let s := 0x20\n let aEnd := add(a, shl(5, mload(a)))\n let bEnd := add(b, shl(5, mload(b)))\n c := mload(0x40) // Set `c` to the free memory pointer.\n a := add(a, s)\n b := add(b, s)\n let k := c\n for {} iszero(or(gt(a, aEnd), gt(b, bEnd))) {} {\n let u := mload(a)\n let v := mload(b)\n if iszero(xor(u, v)) {\n a := add(a, s)\n b := add(b, s)\n continue\n }\n if iszero(lt(add(u, signed), add(v, signed))) {\n b := add(b, s)\n continue\n }\n k := add(k, s)\n mstore(k, u)\n a := add(a, s)\n }\n for {} iszero(gt(a, aEnd)) {} {\n k := add(k, s)\n mstore(k, mload(a))\n a := add(a, s)\n }\n mstore(c, shr(5, sub(k, c))) // Store the length of `c`.\n mstore(0x40, add(k, s)) // Allocate the memory for `c`.\n }\n }\n\n /// @dev Returns the sorted set intersection between `a` and `b`.\n /// Note: Behaviour is undefined if inputs are not sorted and uniquified.\n function _intersection(uint256[] memory a, uint256[] memory b, uint256 signed)\n private\n pure\n returns (uint256[] memory c)\n {\n /// @solidity memory-safe-assembly\n assembly {\n let s := 0x20\n let aEnd := add(a, shl(5, mload(a)))\n let bEnd := add(b, shl(5, mload(b)))\n c := mload(0x40) // Set `c` to the free memory pointer.\n a := add(a, s)\n b := add(b, s)\n let k := c\n for {} iszero(or(gt(a, aEnd), gt(b, bEnd))) {} {\n let u := mload(a)\n let v := mload(b)\n if iszero(xor(u, v)) {\n k := add(k, s)\n mstore(k, u)\n a := add(a, s)\n b := add(b, s)\n continue\n }\n if iszero(lt(add(u, signed), add(v, signed))) {\n b := add(b, s)\n continue\n }\n a := add(a, s)\n }\n mstore(c, shr(5, sub(k, c))) // Store the length of `c`.\n mstore(0x40, add(k, s)) // Allocate the memory for `c`.\n }\n }\n\n /// @dev Returns the sorted set union of `a` and `b`.\n /// Note: Behaviour is undefined if inputs are not sorted and uniquified.\n function _union(uint256[] memory a, uint256[] memory b, uint256 signed)\n private\n pure\n returns (uint256[] memory c)\n {\n /// @solidity memory-safe-assembly\n assembly {\n let s := 0x20\n let aEnd := add(a, shl(5, mload(a)))\n let bEnd := add(b, shl(5, mload(b)))\n c := mload(0x40) // Set `c` to the free memory pointer.\n a := add(a, s)\n b := add(b, s)\n let k := c\n for {} iszero(or(gt(a, aEnd), gt(b, bEnd))) {} {\n let u := mload(a)\n let v := mload(b)\n if iszero(xor(u, v)) {\n k := add(k, s)\n mstore(k, u)\n a := add(a, s)\n b := add(b, s)\n continue\n }\n if iszero(lt(add(u, signed), add(v, signed))) {\n k := add(k, s)\n mstore(k, v)\n b := add(b, s)\n continue\n }\n k := add(k, s)\n mstore(k, u)\n a := add(a, s)\n }\n for {} iszero(gt(a, aEnd)) {} {\n k := add(k, s)\n mstore(k, mload(a))\n a := add(a, s)\n }\n for {} iszero(gt(b, bEnd)) {} {\n k := add(k, s)\n mstore(k, mload(b))\n b := add(b, s)\n }\n mstore(c, shr(5, sub(k, c))) // Store the length of `c`.\n mstore(0x40, add(k, s)) // Allocate the memory for `c`.\n }\n }\n}\n"},"node_modules/@rhinestone/checknsignatures/src/CheckNSignatures.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.19;\n\nimport { ECDSA } from \"solady/utils/ECDSA.sol\";\n\n// EIP1271 magic value\nbytes4 constant EIP1271_MAGIC_VALUE = 0x1626ba7e;\n\nerror InvalidSignature();\nerror WrongContractSignatureFormat(uint256 s, uint256 contractSignatureLen, uint256 signaturesLen);\nerror WrongContractSignature(bytes contractSignature);\nerror WrongSignature(bytes signature);\n\n/**\n * @title CheckSignatures\n * @dev Library for recovering n signatures\n * @author Rhinestone\n * @notice This library is based on the Gnosis Safe signature recovery library\n */\nlibrary CheckSignatures {\n /**\n * Recover n signatures from a data hash\n *\n * @param dataHash The hash of the data\n * @param signatures The concatenated signatures\n * @param requiredSignatures The number of signatures required\n *\n * @return recoveredSigners The recovered signers\n */\n function recoverNSignatures(\n bytes32 dataHash,\n bytes memory signatures,\n uint256 requiredSignatures\n )\n internal\n view\n returns (address[] memory recoveredSigners)\n {\n uint256 signaturesLength = signatures.length;\n uint256 totalSignatures = signaturesLength / 65;\n recoveredSigners = new address[](totalSignatures);\n if (totalSignatures < requiredSignatures) revert InvalidSignature();\n uint256 validSigCount;\n for (uint256 i; i < totalSignatures; i++) {\n // split v,r,s from signatures\n address _signer;\n (uint8 v, bytes32 r, bytes32 s) = signatureSplit({ signatures: signatures, pos: i });\n\n if (v == 0) {\n // If v is 0 then it is a contract signature\n _signer = isValidContractSignature(dataHash, signatures, r, s, signaturesLength);\n } else if (v > 30) {\n // If v > 30 then default va (27,28) has been adjusted for eth_sign flow\n // To support eth_sign and similar we adjust v and hash the messageHash with the\n // Ethereum message prefix before applying ecrecover\n _signer = ECDSA.tryRecover({\n hash: ECDSA.toEthSignedMessageHash(dataHash),\n v: v - 4,\n r: r,\n s: s\n });\n } else {\n _signer = ECDSA.tryRecover({ hash: dataHash, v: v, r: r, s: s });\n }\n if (_signer != address(0)) {\n validSigCount++;\n }\n recoveredSigners[i] = _signer;\n }\n if (validSigCount < requiredSignatures) revert InvalidSignature();\n }\n\n /**\n * @notice Validates a contract signature following the ERC-1271 standard\n * @param dataHash Hash of the data that has been signed\n * @param signatures The concatenated signatures\n * @param r Signature r value\n * @param s Signature s value\n * @param signaturesLength The length of the signatures\n */\n function isValidContractSignature(\n bytes32 dataHash,\n bytes memory signatures,\n bytes32 r,\n bytes32 s,\n uint256 signaturesLength\n )\n internal\n view\n returns (address _signer)\n {\n // When handling contract signatures the address of the signer contract is encoded\n // into r\n _signer = address(uint160(uint256(r)));\n\n // Check if the contract signature is in bounds: start of data is s + 32 and end is\n // start + signature length\n uint256 contractSignatureLen;\n // solhint-disable-next-line no-inline-assembly\n assembly {\n contractSignatureLen := mload(add(add(signatures, s), 0x20))\n }\n\n // Check if the contract signature is in bounds\n if (contractSignatureLen + uint256(s) + 32 > signaturesLength) {\n return address(0);\n }\n\n // Check signature\n bytes memory contractSignature;\n // solhint-disable-next-line no-inline-assembly\n assembly {\n // The signature data for contract signatures is appended to the concatenated\n // signatures and the offset is stored in s\n contractSignature := add(add(signatures, s), 0x20)\n }\n if (\n ISignatureValidator(_signer).isValidSignature(dataHash, contractSignature)\n != EIP1271_MAGIC_VALUE\n ) return address(0);\n }\n\n /**\n * @notice Splits signature bytes into `uint8 v, bytes32 r, bytes32 s`.\n * @dev Make sure to perform a bounds check for @param pos, to avoid out of bounds access on\n * @param signatures The signature format is a compact form of {bytes32 r}{bytes32 s}{uint8 v}\n * Compact means uint8 is not padded to 32 bytes.\n * @param pos Which signature to read. A prior bounds check of this parameter should be\n * performed, to avoid out of bounds access.\n * @param signatures Concatenated {r, s, v} signatures.\n * @return v Recovery ID or Safe signature type.\n * @return r Output value r of the signature.\n * @return s Output value s of the signature.\n *\n * @ author Gnosis Team /rmeissner\n */\n function signatureSplit(\n bytes memory signatures,\n uint256 pos\n )\n internal\n pure\n returns (uint8 v, bytes32 r, bytes32 s)\n {\n // solhint-disable-next-line no-inline-assembly\n /// @solidity memory-safe-assembly\n assembly {\n let signaturePos := mul(0x41, pos)\n r := mload(add(signatures, add(signaturePos, 0x20)))\n s := mload(add(signatures, add(signaturePos, 0x40)))\n v := byte(0, mload(add(signatures, add(signaturePos, 0x60))))\n }\n }\n}\n\nabstract contract ISignatureValidator {\n /**\n * @dev Should return whether the signature provided is valid for the provided data\n * @param _dataHash Arbitrary length data signed on behalf of address(this)\n * @param _signature Signature byte array associated with _data\n *\n * MUST return the bytes4 magic value when function passes.\n * MUST NOT modify state (using STATICCALL for solc < 0.5, view modifier for solc > 0.5)\n * MUST allow external calls\n */\n function isValidSignature(\n bytes32 _dataHash,\n bytes memory _signature\n )\n public\n view\n virtual\n returns (bytes4);\n}\n"},"node_modules/solady/src/utils/ECDSA.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.4;\n\n/// @notice Gas optimized ECDSA wrapper.\n/// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/ECDSA.sol)\n/// @author Modified from Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/ECDSA.sol)\n/// @author Modified from OpenZeppelin (https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/cryptography/ECDSA.sol)\n///\n/// @dev Note:\n/// - The recovery functions use the ecrecover precompile (0x1).\n/// - As of Solady version 0.0.68, the `recover` variants will revert upon recovery failure.\n/// This is for more safety by default.\n/// Use the `tryRecover` variants if you need to get the zero address back\n/// upon recovery failure instead.\n/// - As of Solady version 0.0.134, all `bytes signature` variants accept both\n/// regular 65-byte `(r, s, v)` and EIP-2098 `(r, vs)` short form signatures.\n/// See: https://eips.ethereum.org/EIPS/eip-2098\n/// This is for calldata efficiency on smart accounts prevalent on L2s.\n///\n/// WARNING! Do NOT directly use signatures as unique identifiers:\n/// - The recovery operations do NOT check if a signature is non-malleable.\n/// - Use a nonce in the digest to prevent replay attacks on the same contract.\n/// - Use EIP-712 for the digest to prevent replay attacks across different chains and contracts.\n/// EIP-712 also enables readable signing of typed data for better user safety.\n/// - If you need a unique hash from a signature, please use the `canonicalHash` functions.\nlibrary ECDSA {\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* CONSTANTS */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n /// @dev The order of the secp256k1 elliptic curve.\n uint256 internal constant N = 0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141;\n\n /// @dev `N/2 + 1`. Used for checking the malleability of the signature.\n uint256 private constant _HALF_N_PLUS_1 =\n 0x7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a1;\n\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* CUSTOM ERRORS */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n /// @dev The signature is invalid.\n error InvalidSignature();\n\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* RECOVERY OPERATIONS */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n /// @dev Recovers the signer's address from a message digest `hash`, and the `signature`.\n function recover(bytes32 hash, bytes memory signature) internal view returns (address result) {\n /// @solidity memory-safe-assembly\n assembly {\n for { let m := mload(0x40) } 1 {\n mstore(0x00, 0x8baa579f) // `InvalidSignature()`.\n revert(0x1c, 0x04)\n } {\n switch mload(signature)\n case 64 {\n let vs := mload(add(signature, 0x40))\n mstore(0x20, add(shr(255, vs), 27)) // `v`.\n mstore(0x60, shr(1, shl(1, vs))) // `s`.\n }\n case 65 {\n mstore(0x20, byte(0, mload(add(signature, 0x60)))) // `v`.\n mstore(0x60, mload(add(signature, 0x40))) // `s`.\n }\n default { continue }\n mstore(0x00, hash)\n mstore(0x40, mload(add(signature, 0x20))) // `r`.\n result := mload(staticcall(gas(), 1, 0x00, 0x80, 0x01, 0x20))\n mstore(0x60, 0) // Restore the zero slot.\n mstore(0x40, m) // Restore the free memory pointer.\n // `returndatasize()` will be `0x20` upon success, and `0x00` otherwise.\n if returndatasize() { break }\n }\n }\n }\n\n /// @dev Recovers the signer's address from a message digest `hash`, and the `signature`.\n function recoverCalldata(bytes32 hash, bytes calldata signature)\n internal\n view\n returns (address result)\n {\n /// @solidity memory-safe-assembly\n assembly {\n for { let m := mload(0x40) } 1 {\n mstore(0x00, 0x8baa579f) // `InvalidSignature()`.\n revert(0x1c, 0x04)\n } {\n switch signature.length\n case 64 {\n let vs := calldataload(add(signature.offset, 0x20))\n mstore(0x20, add(shr(255, vs), 27)) // `v`.\n mstore(0x40, calldataload(signature.offset)) // `r`.\n mstore(0x60, shr(1, shl(1, vs))) // `s`.\n }\n case 65 {\n mstore(0x20, byte(0, calldataload(add(signature.offset, 0x40)))) // `v`.\n calldatacopy(0x40, signature.offset, 0x40) // Copy `r` and `s`.\n }\n default { continue }\n mstore(0x00, hash)\n result := mload(staticcall(gas(), 1, 0x00, 0x80, 0x01, 0x20))\n mstore(0x60, 0) // Restore the zero slot.\n mstore(0x40, m) // Restore the free memory pointer.\n // `returndatasize()` will be `0x20` upon success, and `0x00` otherwise.\n if returndatasize() { break }\n }\n }\n }\n\n /// @dev Recovers the signer's address from a message digest `hash`,\n /// and the EIP-2098 short form signature defined by `r` and `vs`.\n function recover(bytes32 hash, bytes32 r, bytes32 vs) internal view returns (address result) {\n /// @solidity memory-safe-assembly\n assembly {\n let m := mload(0x40) // Cache the free memory pointer.\n mstore(0x00, hash)\n mstore(0x20, add(shr(255, vs), 27)) // `v`.\n mstore(0x40, r)\n mstore(0x60, shr(1, shl(1, vs))) // `s`.\n result := mload(staticcall(gas(), 1, 0x00, 0x80, 0x01, 0x20))\n // `returndatasize()` will be `0x20` upon success, and `0x00` otherwise.\n if iszero(returndatasize()) {\n mstore(0x00, 0x8baa579f) // `InvalidSignature()`.\n revert(0x1c, 0x04)\n }\n mstore(0x60, 0) // Restore the zero slot.\n mstore(0x40, m) // Restore the free memory pointer.\n }\n }\n\n /// @dev Recovers the signer's address from a message digest `hash`,\n /// and the signature defined by `v`, `r`, `s`.\n function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s)\n internal\n view\n returns (address result)\n {\n /// @solidity memory-safe-assembly\n assembly {\n let m := mload(0x40) // Cache the free memory pointer.\n mstore(0x00, hash)\n mstore(0x20, and(v, 0xff))\n mstore(0x40, r)\n mstore(0x60, s)\n result := mload(staticcall(gas(), 1, 0x00, 0x80, 0x01, 0x20))\n // `returndatasize()` will be `0x20` upon success, and `0x00` otherwise.\n if iszero(returndatasize()) {\n mstore(0x00, 0x8baa579f) // `InvalidSignature()`.\n revert(0x1c, 0x04)\n }\n mstore(0x60, 0) // Restore the zero slot.\n mstore(0x40, m) // Restore the free memory pointer.\n }\n }\n\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* TRY-RECOVER OPERATIONS */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n // WARNING!\n // These functions will NOT revert upon recovery failure.\n // Instead, they will return the zero address upon recovery failure.\n // It is critical that the returned address is NEVER compared against\n // a zero address (e.g. an uninitialized address variable).\n\n /// @dev Recovers the signer's address from a message digest `hash`, and the `signature`.\n function tryRecover(bytes32 hash, bytes memory signature)\n internal\n view\n returns (address result)\n {\n /// @solidity memory-safe-assembly\n assembly {\n for { let m := mload(0x40) } 1 {} {\n switch mload(signature)\n case 64 {\n let vs := mload(add(signature, 0x40))\n mstore(0x20, add(shr(255, vs), 27)) // `v`.\n mstore(0x60, shr(1, shl(1, vs))) // `s`.\n }\n case 65 {\n mstore(0x20, byte(0, mload(add(signature, 0x60)))) // `v`.\n mstore(0x60, mload(add(signature, 0x40))) // `s`.\n }\n default { break }\n mstore(0x00, hash)\n mstore(0x40, mload(add(signature, 0x20))) // `r`.\n pop(staticcall(gas(), 1, 0x00, 0x80, 0x40, 0x20))\n mstore(0x60, 0) // Restore the zero slot.\n // `returndatasize()` will be `0x20` upon success, and `0x00` otherwise.\n result := mload(xor(0x60, returndatasize()))\n mstore(0x40, m) // Restore the free memory pointer.\n break\n }\n }\n }\n\n /// @dev Recovers the signer's address from a message digest `hash`, and the `signature`.\n function tryRecoverCalldata(bytes32 hash, bytes calldata signature)\n internal\n view\n returns (address result)\n {\n /// @solidity memory-safe-assembly\n assembly {\n for { let m := mload(0x40) } 1 {} {\n switch signature.length\n case 64 {\n let vs := calldataload(add(signature.offset, 0x20))\n mstore(0x20, add(shr(255, vs), 27)) // `v`.\n mstore(0x40, calldataload(signature.offset)) // `r`.\n mstore(0x60, shr(1, shl(1, vs))) // `s`.\n }\n case 65 {\n mstore(0x20, byte(0, calldataload(add(signature.offset, 0x40)))) // `v`.\n calldatacopy(0x40, signature.offset, 0x40) // Copy `r` and `s`.\n }\n default { break }\n mstore(0x00, hash)\n pop(staticcall(gas(), 1, 0x00, 0x80, 0x40, 0x20))\n mstore(0x60, 0) // Restore the zero slot.\n // `returndatasize()` will be `0x20` upon success, and `0x00` otherwise.\n result := mload(xor(0x60, returndatasize()))\n mstore(0x40, m) // Restore the free memory pointer.\n break\n }\n }\n }\n\n /// @dev Recovers the signer's address from a message digest `hash`,\n /// and the EIP-2098 short form signature defined by `r` and `vs`.\n function tryRecover(bytes32 hash, bytes32 r, bytes32 vs)\n internal\n view\n returns (address result)\n {\n /// @solidity memory-safe-assembly\n assembly {\n let m := mload(0x40) // Cache the free memory pointer.\n mstore(0x00, hash)\n mstore(0x20, add(shr(255, vs), 27)) // `v`.\n mstore(0x40, r)\n mstore(0x60, shr(1, shl(1, vs))) // `s`.\n pop(staticcall(gas(), 1, 0x00, 0x80, 0x40, 0x20))\n mstore(0x60, 0) // Restore the zero slot.\n // `returndatasize()` will be `0x20` upon success, and `0x00` otherwise.\n result := mload(xor(0x60, returndatasize()))\n mstore(0x40, m) // Restore the free memory pointer.\n }\n }\n\n /// @dev Recovers the signer's address from a message digest `hash`,\n /// and the signature defined by `v`, `r`, `s`.\n function tryRecover(bytes32 hash, uint8 v, bytes32 r, bytes32 s)\n internal\n view\n returns (address result)\n {\n /// @solidity memory-safe-assembly\n assembly {\n let m := mload(0x40) // Cache the free memory pointer.\n mstore(0x00, hash)\n mstore(0x20, and(v, 0xff))\n mstore(0x40, r)\n mstore(0x60, s)\n pop(staticcall(gas(), 1, 0x00, 0x80, 0x40, 0x20))\n mstore(0x60, 0) // Restore the zero slot.\n // `returndatasize()` will be `0x20` upon success, and `0x00` otherwise.\n result := mload(xor(0x60, returndatasize()))\n mstore(0x40, m) // Restore the free memory pointer.\n }\n }\n\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* HASHING OPERATIONS */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n /// @dev Returns an Ethereum Signed Message, created from a `hash`.\n /// This produces a hash corresponding to the one signed with the\n /// [`eth_sign`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_sign)\n /// JSON-RPC method as part of EIP-191.\n function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32 result) {\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x20, hash) // Store into scratch space for keccak256.\n mstore(0x00, \"\\x00\\x00\\x00\\x00\\x19Ethereum Signed Message:\\n32\") // 28 bytes.\n result := keccak256(0x04, 0x3c) // `32 * 2 - (32 - 28) = 60 = 0x3c`.\n }\n }\n\n /// @dev Returns an Ethereum Signed Message, created from `s`.\n /// This produces a hash corresponding to the one signed with the\n /// [`eth_sign`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_sign)\n /// JSON-RPC method as part of EIP-191.\n /// Note: Supports lengths of `s` up to 999999 bytes.\n function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32 result) {\n /// @solidity memory-safe-assembly\n assembly {\n let sLength := mload(s)\n let o := 0x20\n mstore(o, \"\\x19Ethereum Signed Message:\\n\") // 26 bytes, zero-right-padded.\n mstore(0x00, 0x00)\n // Convert the `s.length` to ASCII decimal representation: `base10(s.length)`.\n for { let temp := sLength } 1 {} {\n o := sub(o, 1)\n mstore8(o, add(48, mod(temp, 10)))\n temp := div(temp, 10)\n if iszero(temp) { break }\n }\n let n := sub(0x3a, o) // Header length: `26 + 32 - o`.\n // Throw an out-of-offset error (consumes all gas) if the header exceeds 32 bytes.\n returndatacopy(returndatasize(), returndatasize(), gt(n, 0x20))\n mstore(s, or(mload(0x00), mload(n))) // Temporarily store the header.\n result := keccak256(add(s, sub(0x20, n)), add(n, sLength))\n mstore(s, sLength) // Restore the length.\n }\n }\n\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* CANONICAL HASH FUNCTIONS */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n // The following functions return the hash of the signature in its canonicalized format,\n // which is the 65-byte `abi.encodePacked(r, s, uint8(v))`, where `v` is either 27 or 28.\n // If `s` is greater than `N / 2` then it will be converted to `N - s`\n // and the `v` value will be flipped.\n // If the signature has an invalid length, or if `v` is invalid,\n // a uniquely corrupt hash will be returned.\n // These functions are useful for \"poor-mans-VRF\".\n\n /// @dev Returns the canonical hash of `signature`.\n function canonicalHash(bytes memory signature) internal pure returns (bytes32 result) {\n /// @solidity memory-safe-assembly\n assembly {\n let l := mload(signature)\n for {} 1 {} {\n mstore(0x00, mload(add(signature, 0x20))) // `r`.\n let s := mload(add(signature, 0x40))\n let v := mload(add(signature, 0x41))\n if eq(l, 64) {\n v := add(shr(255, s), 27)\n s := shr(1, shl(1, s))\n }\n if iszero(lt(s, _HALF_N_PLUS_1)) {\n v := xor(v, 7)\n s := sub(N, s)\n }\n mstore(0x21, v)\n mstore(0x20, s)\n result := keccak256(0x00, 0x41)\n mstore(0x21, 0) // Restore the overwritten part of the free memory pointer.\n break\n }\n\n // If the length is neither 64 nor 65, return a uniquely corrupted hash.\n if iszero(lt(sub(l, 64), 2)) {\n // `bytes4(keccak256(\"InvalidSignatureLength\"))`.\n result := xor(keccak256(add(signature, 0x20), l), 0xd62f1ab2)\n }\n }\n }\n\n /// @dev Returns the canonical hash of `signature`.\n function canonicalHashCalldata(bytes calldata signature)\n internal\n pure\n returns (bytes32 result)\n {\n /// @solidity memory-safe-assembly\n assembly {\n for {} 1 {} {\n mstore(0x00, calldataload(signature.offset)) // `r`.\n let s := calldataload(add(signature.offset, 0x20))\n let v := calldataload(add(signature.offset, 0x21))\n if eq(signature.length, 64) {\n v := add(shr(255, s), 27)\n s := shr(1, shl(1, s))\n }\n if iszero(lt(s, _HALF_N_PLUS_1)) {\n v := xor(v, 7)\n s := sub(N, s)\n }\n mstore(0x21, v)\n mstore(0x20, s)\n result := keccak256(0x00, 0x41)\n mstore(0x21, 0) // Restore the overwritten part of the free memory pointer.\n break\n }\n // If the length is neither 64 nor 65, return a uniquely corrupted hash.\n if iszero(lt(sub(signature.length, 64), 2)) {\n calldatacopy(mload(0x40), signature.offset, signature.length)\n // `bytes4(keccak256(\"InvalidSignatureLength\"))`.\n result := xor(keccak256(mload(0x40), signature.length), 0xd62f1ab2)\n }\n }\n }\n\n /// @dev Returns the canonical hash of `signature`.\n function canonicalHash(bytes32 r, bytes32 vs) internal pure returns (bytes32 result) {\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, r) // `r`.\n let v := add(shr(255, vs), 27)\n let s := shr(1, shl(1, vs))\n mstore(0x21, v)\n mstore(0x20, s)\n result := keccak256(0x00, 0x41)\n mstore(0x21, 0) // Restore the overwritten part of the free memory pointer.\n }\n }\n\n /// @dev Returns the canonical hash of `signature`.\n function canonicalHash(uint8 v, bytes32 r, bytes32 s) internal pure returns (bytes32 result) {\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, r) // `r`.\n if iszero(lt(s, _HALF_N_PLUS_1)) {\n v := xor(v, 7)\n s := sub(N, s)\n }\n mstore(0x21, v)\n mstore(0x20, s)\n result := keccak256(0x00, 0x41)\n mstore(0x21, 0) // Restore the overwritten part of the free memory pointer.\n }\n }\n\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* EMPTY CALLDATA HELPERS */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n /// @dev Returns an empty calldata bytes.\n function emptySignature() internal pure returns (bytes calldata signature) {\n /// @solidity memory-safe-assembly\n assembly {\n signature.length := 0\n }\n }\n}\n"},"node_modules/@rhinestone/modulekit/src/accounts/common/interfaces/IERC7579Module.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity >=0.8.23 <0.9.0;\n\n// Types\nimport { PackedUserOperation } from\n \"@ERC4337/account-abstraction/contracts/core/UserOperationLib.sol\";\n\n// Constants\nuint256 constant VALIDATION_SUCCESS = 0;\nuint256 constant VALIDATION_FAILED = 1;\nuint256 constant MODULE_TYPE_VALIDATOR = 1;\nuint256 constant MODULE_TYPE_EXECUTOR = 2;\nuint256 constant MODULE_TYPE_FALLBACK = 3;\nuint256 constant MODULE_TYPE_HOOK = 4;\nuint256 constant MODULE_TYPE_PREVALIDATION_HOOK_ERC1271 = 8;\nuint256 constant MODULE_TYPE_PREVALIDATION_HOOK_ERC4337 = 9;\n\ninterface IModule {\n error ModuleAlreadyInitialized(address smartAccount);\n error NotInitialized(address smartAccount);\n\n /**\n * @dev This function is called by the smart account during installation of the module\n * @param data arbitrary data that may be required on the module during `onInstall`\n * initialization\n *\n * MUST revert on error (i.e. if module is already enabled)\n */\n function onInstall(bytes calldata data) external;\n\n /**\n * @dev This function is called by the smart account during uninstallation of the module\n * @param data arbitrary data that may be required on the module during `onUninstall`\n * de-initialization\n *\n * MUST revert on error\n */\n function onUninstall(bytes calldata data) external;\n\n /**\n * @dev Returns boolean value if module is a certain type\n * @param moduleTypeId the module type ID according the ERC-7579 spec\n *\n * MUST return true if the module is of the given type and false otherwise\n */\n function isModuleType(uint256 moduleTypeId) external view returns (bool);\n\n /**\n * @dev Returns if the module was already initialized for a provided smartaccount\n */\n function isInitialized(address smartAccount) external view returns (bool);\n}\n\ninterface IValidator is IModule {\n error InvalidTargetAddress(address target);\n\n /**\n * @dev Validates a transaction on behalf of the account.\n * This function is intended to be called by the MSA during the ERC-4337 validaton phase\n * Note: solely relying on bytes32 hash and signature is not sufficient for some\n * validation implementations (i.e. SessionKeys often need access to userOp.calldata)\n * @param userOp The user operation to be validated. The userOp MUST NOT contain any metadata.\n * The MSA MUST clean up the userOp before sending it to the validator.\n * @param userOpHash The hash of the user operation to be validated\n * @return return value according to ERC-4337\n */\n function validateUserOp(\n PackedUserOperation calldata userOp,\n bytes32 userOpHash\n )\n external\n payable\n returns (uint256);\n\n /**\n * Validator can be used for ERC-1271 validation\n */\n function isValidSignatureWithSender(\n address sender,\n bytes32 hash,\n bytes calldata data\n )\n external\n view\n returns (bytes4);\n}\n\ninterface IExecutor is IModule { }\n\ninterface IHook is IModule {\n function preCheck(\n address msgSender,\n uint256 msgValue,\n bytes calldata msgData\n )\n external\n returns (bytes memory hookData);\n\n function postCheck(bytes calldata hookData) external;\n}\n\ninterface IFallback is IModule { }\n\ninterface IPolicy is IModule {\n function checkUserOpPolicy(\n bytes32 id,\n PackedUserOperation calldata userOp\n )\n external\n payable\n returns (uint256);\n function checkSignaturePolicy(\n bytes32 id,\n address sender,\n bytes32 hash,\n bytes calldata sig\n )\n external\n view\n returns (uint256);\n}\n\ninterface ISigner is IModule {\n function checkUserOpSignature(\n bytes32 id,\n PackedUserOperation calldata userOp,\n bytes32 userOpHash\n )\n external\n payable\n returns (uint256);\n function checkSignature(\n bytes32 id,\n address sender,\n bytes32 hash,\n bytes calldata sig\n )\n external\n view\n returns (bytes4);\n}\n\ninterface IPreValidationHookERC1271 is IModule {\n function preValidationHookERC1271(\n address sender,\n bytes32 hash,\n bytes calldata data\n )\n external\n view\n returns (bytes32 hookHash, bytes memory hookSignature);\n}\n\ninterface IPreValidationHookERC4337 is IModule {\n function preValidationHookERC4337(\n PackedUserOperation calldata userOp,\n uint256 missingAccountFunds,\n bytes32 userOpHash\n )\n external\n returns (bytes32 hookHash, bytes memory hookSignature);\n}\n"},"node_modules/@rhinestone/modulekit/src/module-bases/ERC7579ModuleBase.sol":{"content":"// SPDX-License-Identifier: AGPL-3.0-only\npragma solidity >=0.8.0 <0.9.0;\n\nimport { IModule as IERC7579Module } from \"../accounts/common/interfaces/IERC7579Module.sol\";\nimport {\n MODULE_TYPE_VALIDATOR,\n MODULE_TYPE_EXECUTOR,\n MODULE_TYPE_FALLBACK,\n MODULE_TYPE_HOOK,\n MODULE_TYPE_POLICY,\n MODULE_TYPE_SIGNER,\n MODULE_TYPE_STATELESS_VALIDATOR\n} from \"./utils/ERC7579Constants.sol\";\n\nabstract contract ERC7579ModuleBase is IERC7579Module {\n uint256 internal constant TYPE_VALIDATOR = MODULE_TYPE_VALIDATOR;\n uint256 internal constant TYPE_EXECUTOR = MODULE_TYPE_EXECUTOR;\n uint256 internal constant TYPE_FALLBACK = MODULE_TYPE_FALLBACK;\n uint256 internal constant TYPE_HOOK = MODULE_TYPE_HOOK;\n uint256 internal constant TYPE_POLICY = MODULE_TYPE_POLICY;\n uint256 internal constant TYPE_SIGNER = MODULE_TYPE_SIGNER;\n uint256 internal constant TYPE_STATELESS_VALIDATOR = MODULE_TYPE_STATELESS_VALIDATOR;\n}\n"},"node_modules/@rhinestone/modulekit/src/module-bases/ERC7579ValidatorBase.sol":{"content":"// SPDX-License-Identifier: AGPL-3.0-only\npragma solidity >=0.8.0 <0.9.0;\n\nimport {\n PackedUserOperation,\n _packValidationData as _packValidationData4337\n} from \"../external/ERC4337.sol\";\nimport { ERC7579ModuleBase } from \"./ERC7579ModuleBase.sol\";\n\nabstract contract ERC7579ValidatorBase is ERC7579ModuleBase {\n type ValidationData is uint256;\n\n ValidationData internal constant VALIDATION_SUCCESS = ValidationData.wrap(0);\n ValidationData internal constant VALIDATION_FAILED = ValidationData.wrap(1);\n bytes4 internal constant EIP1271_SUCCESS = 0x1626ba7e;\n bytes4 internal constant EIP1271_FAILED = 0xFFFFFFFF;\n\n /**\n * Helper to pack the return value for validateUserOp, when not using an aggregator.\n * @param sigFailed - True for signature failure, false for success.\n * @param validUntil - Last timestamp this UserOperation is valid (or zero for\n * infinite).\n * @param validAfter - First timestamp this UserOperation is valid.\n */\n function _packValidationData(\n bool sigFailed,\n uint48 validUntil,\n uint48 validAfter\n )\n internal\n pure\n returns (ValidationData)\n {\n return ValidationData.wrap(_packValidationData4337(sigFailed, validUntil, validAfter));\n }\n\n function _unpackValidationData(ValidationData _packedData)\n internal\n pure\n returns (bool sigFailed, uint48 validUntil, uint48 validAfter)\n {\n uint256 packedData = ValidationData.unwrap(_packedData);\n sigFailed = (packedData & 1) == 1;\n validUntil = uint48((packedData >> 160) & ((1 << 48) - 1));\n validAfter = uint48((packedData >> (160 + 48)) & ((1 << 48) - 1));\n }\n\n function validateUserOp(\n PackedUserOperation calldata userOp,\n bytes32 userOpHash\n )\n external\n virtual\n returns (ValidationData);\n\n function isValidSignatureWithSender(\n address sender,\n bytes32 hash,\n bytes calldata data\n )\n external\n view\n virtual\n returns (bytes4);\n}\n"},"node_modules/@rhinestone/modulekit/src/module-bases/ERC7579StatelessValidatorBase.sol":{"content":"// SPDX-License-Identifier: AGPL-3.0-only\npragma solidity >=0.8.0 <0.9.0;\n\nimport { ERC7579ModuleBase } from \"./ERC7579ModuleBase.sol\";\nimport { IStatelessValidator } from \"./interfaces/IStatelessValidator.sol\";\n\nabstract contract ERC7579StatelessValidatorBase is ERC7579ModuleBase, IStatelessValidator {\n function validateSignatureWithData(\n bytes32,\n bytes calldata,\n bytes calldata\n )\n external\n view\n virtual\n returns (bool validSig);\n}\n"},"node_modules/@rhinestone/modulekit/src/module-bases/ERC7579HybridValidatorBase.sol":{"content":"// SPDX-License-Identifier: AGPL-3.0-only\npragma solidity >=0.8.0 <0.9.0;\n\n/* solhint-disable no-unused-import */\n\nimport {\n PackedUserOperation,\n _packValidationData as _packValidationData4337\n} from \"../external/ERC4337.sol\";\nimport { ERC7579ValidatorBase } from \"./ERC7579ValidatorBase.sol\";\nimport { ERC7579StatelessValidatorBase } from \"./ERC7579StatelessValidatorBase.sol\";\n\n/// @notice Base contract for hybrid validators, which are both stateful and stateless.\nabstract contract ERC7579HybridValidatorBase is\n ERC7579ValidatorBase,\n ERC7579StatelessValidatorBase\n{ }\n"},"node_modules/@rhinestone/modulekit/src/module-bases/ERC7579ExecutorBase.sol":{"content":"// SPDX-License-Identifier: AGPL-3.0-only\npragma solidity >=0.8.0 <0.9.0;\n\nimport { IExecutor as IERC7579Executor } from \"../accounts/common/interfaces/IERC7579Module.sol\";\nimport { IERC7579Account } from \"../accounts/common/interfaces/IERC7579Account.sol\";\nimport {\n Execution,\n ExecutionLib as ERC7579ExecutionLib\n} from \"../accounts/erc7579/lib/ExecutionLib.sol\";\nimport {\n ModeCode,\n ModeLib as ERC7579ModeLib,\n CALLTYPE_SINGLE,\n EXECTYPE_DEFAULT,\n MODE_DEFAULT,\n ModePayload,\n CALLTYPE_BATCH,\n EXECTYPE_DEFAULT,\n MODE_DEFAULT,\n CALLTYPE_DELEGATECALL\n} from \"../accounts/common/lib/ModeLib.sol\";\nimport { ERC7579ModuleBase } from \"./ERC7579ModuleBase.sol\";\n\nabstract contract ERC7579ExecutorBase is IERC7579Executor, ERC7579ModuleBase {\n function _execute(\n address account,\n address to,\n uint256 value,\n bytes memory data\n )\n internal\n returns (bytes memory result)\n {\n ModeCode modeCode = ERC7579ModeLib.encode({\n callType: CALLTYPE_SINGLE,\n execType: EXECTYPE_DEFAULT,\n mode: MODE_DEFAULT,\n payload: ModePayload.wrap(bytes22(0))\n });\n\n return IERC7579Account(account).executeFromExecutor(\n modeCode, ERC7579ExecutionLib.encodeSingle(to, value, data)\n )[0];\n }\n\n function _execute(\n address to,\n uint256 value,\n bytes memory data\n )\n internal\n returns (bytes memory result)\n {\n return _execute(msg.sender, to, value, data);\n }\n\n function _execute(\n address account,\n Execution[] memory execs\n )\n internal\n returns (bytes[] memory results)\n {\n ModeCode modeCode = ERC7579ModeLib.encode({\n callType: CALLTYPE_BATCH,\n execType: EXECTYPE_DEFAULT,\n mode: MODE_DEFAULT,\n payload: ModePayload.wrap(bytes22(0))\n });\n results = IERC7579Account(account).executeFromExecutor(\n modeCode, ERC7579ExecutionLib.encodeBatch(execs)\n );\n }\n\n function _execute(Execution[] memory execs) internal returns (bytes[] memory results) {\n return _execute(msg.sender, execs);\n }\n\n // Note: Not every account will support delegatecalls\n function _executeDelegateCall(\n address account,\n address delegateTarget,\n bytes memory callData\n )\n internal\n returns (bytes[] memory results)\n {\n ModeCode modeCode = ERC7579ModeLib.encode({\n callType: CALLTYPE_DELEGATECALL,\n execType: EXECTYPE_DEFAULT,\n mode: MODE_DEFAULT,\n payload: ModePayload.wrap(bytes22(0))\n });\n results = IERC7579Account(account).executeFromExecutor(\n modeCode, abi.encodePacked(delegateTarget, callData)\n );\n }\n\n // Note: Not every account will support delegatecalls\n function _executeDelegateCall(\n address delegateTarget,\n bytes memory callData\n )\n internal\n returns (bytes[] memory results)\n {\n return _executeDelegateCall(msg.sender, delegateTarget, callData);\n }\n}\n"},"node_modules/@rhinestone/modulekit/src/module-bases/ERC7579HookBase.sol":{"content":"// SPDX-License-Identifier: AGPL-3.0-only\npragma solidity >=0.8.0 <0.9.0;\n\nimport { IHook as IERC7579Hook } from \"../accounts/common/interfaces/IERC7579Module.sol\";\nimport { ERC7579ModuleBase } from \"./ERC7579ModuleBase.sol\";\nimport { TrustedForwarder } from \"./utils/TrustedForwarder.sol\";\n\nabstract contract ERC7579HookBase is IERC7579Hook, ERC7579ModuleBase, TrustedForwarder {\n /**\n * Precheck hook\n *\n * @param msgSender sender of the transaction\n * @param msgValue value of the transaction\n * @param msgData data of the transaction\n *\n * @return hookData data for the postcheck hook\n */\n function preCheck(\n address msgSender,\n uint256 msgValue,\n bytes calldata msgData\n )\n external\n virtual\n returns (bytes memory hookData)\n {\n // route to internal function\n return _preCheck(_getAccount(), msgSender, msgValue, msgData);\n }\n\n /**\n * Postcheck hook\n *\n * @param hookData data from the precheck hook\n */\n function postCheck(bytes calldata hookData) external virtual {\n // route to internal function\n _postCheck(_getAccount(), hookData);\n }\n\n /**\n * Precheck hook\n *\n * @param account account of the transaction\n * @param msgSender sender of the transaction\n * @param msgValue value of the transaction\n * @param msgData data of the transaction\n *\n * @return hookData data for the postcheck hook\n */\n function _preCheck(\n address account,\n address msgSender,\n uint256 msgValue,\n bytes calldata msgData\n )\n internal\n virtual\n returns (bytes memory hookData);\n\n /**\n * Postcheck hook\n *\n * @param account account of the transaction\n * @param hookData data from the precheck hook\n */\n function _postCheck(address account, bytes calldata hookData) internal virtual;\n}\n"},"node_modules/@rhinestone/modulekit/src/module-bases/ERC7579HookDestruct.sol":{"content":"// SPDX-License-Identifier: AGPL-3.0-only\npragma solidity >=0.8.0 <0.9.0;\n\nimport { IERC7579Account } from \"../accounts/common/interfaces/IERC7579Account.sol\";\nimport { IHook as IERC7579Hook } from \"../accounts/common/interfaces/IERC7579Module.sol\";\nimport { ExecutionLib, Execution } from \"../accounts/erc7579/lib/ExecutionLib.sol\";\nimport {\n ModeLib,\n CallType,\n ModeCode,\n CALLTYPE_SINGLE,\n CALLTYPE_BATCH,\n CALLTYPE_DELEGATECALL\n} from \"../accounts/common/lib/ModeLib.sol\";\nimport { IAccountExecute } from \"../external/ERC4337.sol\";\nimport { ERC7579ModuleBase } from \"./ERC7579ModuleBase.sol\";\nimport { TrustedForwarder } from \"./utils/TrustedForwarder.sol\";\n\nuint256 constant EXECUSEROP_OFFSET = 164;\nuint256 constant EXEC_OFFSET = 100;\nuint256 constant INSTALL_OFFSET = 132;\n\nabstract contract ERC7579HookDestruct is IERC7579Hook, ERC7579ModuleBase, TrustedForwarder {\n error HookInvalidSelector();\n error InvalidCallType();\n\n /*//////////////////////////////////////////////////////////////////////////\n CALLDATA DECODING\n //////////////////////////////////////////////////////////////////////////*/\n\n function preCheck(\n address msgSender,\n uint256 msgValue,\n bytes calldata msgData\n )\n external\n virtual\n override\n returns (bytes memory hookData)\n {\n bytes4 selector = bytes4(msgData[0:4]);\n\n if (selector == IAccountExecute.executeUserOp.selector) {\n uint256 offset =\n uint256(bytes32(msgData[EXECUSEROP_OFFSET:EXECUSEROP_OFFSET + 32])) + 68;\n uint256 paramLen = uint256(bytes32(msgData[offset:offset + 32]));\n offset += 32;\n bytes calldata _msgData = msgData[offset:offset + paramLen];\n return _decodeCallData(msgSender, msgValue, _msgData);\n } else {\n return _decodeCallData(msgSender, msgValue, msgData);\n }\n }\n\n function _decodeCallData(\n address msgSender,\n uint256 msgValue,\n bytes calldata msgData\n )\n internal\n returns (bytes memory hookData)\n {\n bytes4 selector = bytes4(msgData[0:4]);\n if (selector == IERC7579Account.execute.selector) {\n return _handle4337Executions(msgSender, msgData);\n } else if (selector == IERC7579Account.executeFromExecutor.selector) {\n return _handleExecutorExecutions(msgSender, msgData);\n } else if (selector == IERC7579Account.installModule.selector) {\n uint256 paramLen = msgData.length > INSTALL_OFFSET\n ? uint256(bytes32(msgData[INSTALL_OFFSET - 32:INSTALL_OFFSET]))\n : uint256(0);\n bytes calldata initData = msgData.length > INSTALL_OFFSET\n ? msgData[INSTALL_OFFSET:INSTALL_OFFSET + paramLen]\n : msgData[0:0];\n uint256 moduleType = uint256(bytes32(msgData[4:36]));\n address module = address(bytes20((msgData[48:68])));\n return onInstallModule(_getAccount(), msgSender, moduleType, module, initData);\n } else if (selector == IERC7579Account.uninstallModule.selector) {\n uint256 paramLen = msgData.length > INSTALL_OFFSET\n ? uint256(bytes32(msgData[INSTALL_OFFSET - 32:INSTALL_OFFSET]))\n : uint256(0);\n bytes calldata initData = msgData.length > INSTALL_OFFSET\n ? msgData[INSTALL_OFFSET:INSTALL_OFFSET + paramLen]\n : msgData[0:0];\n\n uint256 moduleType = uint256(bytes32(msgData[4:36]));\n address module = address(bytes20((msgData[48:68])));\n\n return onUninstallModule(_getAccount(), msgSender, moduleType, module, initData);\n } else {\n return onUnknownFunction(_getAccount(), msgSender, msgValue, msgData);\n }\n }\n\n function _handle4337Executions(\n address msgSender,\n bytes calldata msgData\n )\n internal\n returns (bytes memory hookData)\n {\n uint256 paramLen = uint256(bytes32(msgData[EXEC_OFFSET - 32:EXEC_OFFSET]));\n bytes calldata encodedExecutions = msgData[EXEC_OFFSET:EXEC_OFFSET + paramLen];\n\n ModeCode mode = ModeCode.wrap(bytes32(msgData[4:36]));\n CallType calltype = ModeLib.getCallType(mode);\n\n if (calltype == CALLTYPE_SINGLE) {\n (address to, uint256 value, bytes calldata callData) =\n ExecutionLib.decodeSingle(encodedExecutions);\n return onExecute(_getAccount(), msgSender, to, value, callData);\n } else if (calltype == CALLTYPE_BATCH) {\n Execution[] calldata execs = ExecutionLib.decodeBatch(encodedExecutions);\n return onExecuteBatch(_getAccount(), msgSender, execs);\n } else if (calltype == CALLTYPE_DELEGATECALL) {\n address to = address(bytes20(encodedExecutions[0:20]));\n bytes calldata callData = encodedExecutions[20:];\n return onExecuteDelegateCall(_getAccount(), msgSender, to, callData);\n } else {\n revert InvalidCallType();\n }\n }\n\n function _handleExecutorExecutions(\n address msgSender,\n bytes calldata msgData\n )\n internal\n returns (bytes memory hookData)\n {\n uint256 paramLen = uint256(bytes32(msgData[EXEC_OFFSET - 32:EXEC_OFFSET]));\n bytes calldata encodedExecutions = msgData[EXEC_OFFSET:EXEC_OFFSET + paramLen];\n\n ModeCode mode = ModeCode.wrap(bytes32(msgData[4:36]));\n CallType calltype = ModeLib.getCallType(mode);\n\n if (calltype == CALLTYPE_SINGLE) {\n (address to, uint256 value, bytes calldata callData) =\n ExecutionLib.decodeSingle(encodedExecutions);\n return onExecuteFromExecutor(_getAccount(), msgSender, to, value, callData);\n } else if (calltype == CALLTYPE_BATCH) {\n Execution[] calldata execs = ExecutionLib.decodeBatch(encodedExecutions);\n return onExecuteBatchFromExecutor(_getAccount(), msgSender, execs);\n } else if (calltype == CALLTYPE_DELEGATECALL) {\n address to = address(bytes20(encodedExecutions[0:20]));\n bytes calldata callData = encodedExecutions[20:];\n return onExecuteDelegateCallFromExecutor(_getAccount(), msgSender, to, callData);\n } else {\n revert InvalidCallType();\n }\n }\n\n function postCheck(bytes calldata hookData) external virtual override {\n onPostCheck(_getAccount(), hookData);\n }\n\n /*//////////////////////////////////////////////////////////////////////////\n EXECUTION\n //////////////////////////////////////////////////////////////////////////*/\n\n function onExecute(\n address account,\n address msgSender,\n address target,\n uint256 value,\n bytes calldata callData\n )\n internal\n virtual\n returns (bytes memory hookData)\n { }\n\n function onExecuteBatch(\n address account,\n address msgSender,\n Execution[] calldata\n )\n internal\n virtual\n returns (bytes memory hookData)\n { }\n\n function onExecuteDelegateCall(\n address account,\n address msgSender,\n address target,\n bytes calldata callData\n )\n internal\n virtual\n returns (bytes memory hookData)\n { }\n\n function onExecuteFromExecutor(\n address account,\n address msgSender,\n address target,\n uint256 value,\n bytes calldata callData\n )\n internal\n virtual\n returns (bytes memory hookData)\n { }\n\n function onExecuteBatchFromExecutor(\n address account,\n address msgSender,\n Execution[] calldata\n )\n internal\n virtual\n returns (bytes memory hookData)\n { }\n\n function onExecuteDelegateCallFromExecutor(\n address account,\n address msgSender,\n address target,\n bytes calldata callData\n )\n internal\n virtual\n returns (bytes memory hookData)\n { }\n\n /*//////////////////////////////////////////////////////////////////////////\n CONFIG\n //////////////////////////////////////////////////////////////////////////*/\n\n function onInstallModule(\n address account,\n address msgSender,\n uint256 moduleType,\n address module,\n bytes calldata initData\n )\n internal\n virtual\n returns (bytes memory hookData)\n { }\n\n function onUninstallModule(\n address account,\n address msgSender,\n uint256 moduleType,\n address module,\n bytes calldata deInitData\n )\n internal\n virtual\n returns (bytes memory hookData)\n { }\n\n /*//////////////////////////////////////////////////////////////////////////\n UNKNOWN FUNCTION\n //////////////////////////////////////////////////////////////////////////*/\n\n function onUnknownFunction(\n address account,\n address msgSender,\n uint256 msgValue,\n bytes calldata msgData\n )\n internal\n virtual\n returns (bytes memory hookData)\n { }\n\n /*//////////////////////////////////////////////////////////////////////////\n POSTCHECK\n //////////////////////////////////////////////////////////////////////////*/\n\n function onPostCheck(address account, bytes calldata hookData) internal virtual { }\n}\n"},"node_modules/@rhinestone/modulekit/src/module-bases/ERC7579FallbackBase.sol":{"content":"// SPDX-License-Identifier: AGPL-3.0-only\npragma solidity >=0.8.0 <0.9.0;\n\nimport { IFallback as IERC7579Fallback } from \"../accounts/common/interfaces/IERC7579Module.sol\";\nimport { ERC7579ModuleBase } from \"./ERC7579ModuleBase.sol\";\n\nabstract contract ERC7579FallbackBase is IERC7579Fallback, ERC7579ModuleBase {\n /**\n * @notice Allows fetching the original caller address.\n * @dev This is only reliable in combination with a FallbackManager that supports this (e.g. Safe\n * contract >=1.3.0).\n * When using this functionality make sure that the linked _manager (aka msg.sender)\n * supports this.\n * This function does not rely on a trusted forwarder. Use the returned value only to\n * check information against the calling manager.\n * @return sender Original caller address.\n */\n function _msgSender() internal pure returns (address sender) {\n // The assembly code is more direct than the Solidity version using `abi.decode`.\n /* solhint-disable no-inline-assembly */\n /// @solidity memory-safe-assembly\n assembly {\n sender := shr(96, calldataload(sub(calldatasize(), 20)))\n }\n /* solhint-enable no-inline-assembly */\n }\n}\n"},"node_modules/@rhinestone/modulekit/src/module-bases/SchedulingBase.sol":{"content":"// SPDX-License-Identifier: AGPL-3.0-only\npragma solidity >=0.8.0 <0.9.0;\n\nimport { ERC7579ExecutorBase } from \"./ERC7579ExecutorBase.sol\";\n\nabstract contract SchedulingBase is ERC7579ExecutorBase {\n /*//////////////////////////////////////////////////////////////////////////\n CONSTANTS & STORAGE\n //////////////////////////////////////////////////////////////////////////*/\n\n error InvalidExecution();\n\n event ExecutionAdded(address indexed smartAccount, uint256 indexed jobId);\n event ExecutionTriggered(address indexed smartAccount, uint256 indexed jobId);\n event ExecutionStatusUpdated(address indexed smartAccount, uint256 indexed jobId);\n event ExecutionsCancelled(address indexed smartAccount);\n\n mapping(address smartAccount => mapping(uint256 jobId => ExecutionConfig)) public executionLog;\n\n mapping(address smartAccount => uint256 jobCount) public accountJobCount;\n\n struct ExecutionConfig {\n uint48 executeInterval;\n uint16 numberOfExecutions;\n uint16 numberOfExecutionsCompleted;\n uint48 startDate;\n bool isEnabled;\n uint48 lastExecutionTime;\n bytes executionData;\n }\n\n struct ExecutorAccess {\n uint256 jobId;\n }\n\n /*//////////////////////////////////////////////////////////////////////////\n CONFIG\n //////////////////////////////////////////////////////////////////////////*/\n\n function _onInstall(bytes calldata packedSchedulingData) internal {\n address account = msg.sender;\n if (isInitialized(account)) {\n revert ModuleAlreadyInitialized(account);\n }\n\n _createExecution({ orderData: packedSchedulingData });\n }\n\n function _onUninstall() internal {\n address account = msg.sender;\n\n uint256 count = accountJobCount[account];\n for (uint256 i = 1; i <= count; i++) {\n delete executionLog[account][i];\n }\n accountJobCount[account] = 0;\n\n emit ExecutionsCancelled(account);\n }\n\n function isInitialized(address smartAccount) public view returns (bool) {\n return accountJobCount[smartAccount] != 0;\n }\n\n function addOrder(bytes calldata orderData) external {\n address account = msg.sender;\n if (!isInitialized(account)) revert NotInitialized(account);\n\n _createExecution({ orderData: orderData });\n }\n\n function toggleOrder(uint256 jobId) external {\n address account = msg.sender;\n\n ExecutionConfig storage executionConfig = executionLog[account][jobId];\n\n if (executionConfig.numberOfExecutions == 0) {\n revert InvalidExecution();\n }\n\n executionConfig.isEnabled = !executionConfig.isEnabled;\n\n emit ExecutionStatusUpdated(account, jobId);\n }\n\n /*//////////////////////////////////////////////////////////////////////////\n INTERNAL\n //////////////////////////////////////////////////////////////////////////*/\n\n function _createExecution(bytes calldata orderData) internal {\n address account = msg.sender;\n\n uint256 jobId = accountJobCount[account] + 1;\n accountJobCount[account]++;\n\n // prevent user from supplying an invalid number of execution (0)\n uint16 nrOfExecutions = uint16(bytes2(orderData[6:8]));\n if (nrOfExecutions == 0) revert InvalidExecution();\n\n executionLog[account][jobId] = ExecutionConfig({\n numberOfExecutionsCompleted: 0,\n isEnabled: true,\n lastExecutionTime: 0,\n executeInterval: uint48(bytes6(orderData[0:6])),\n numberOfExecutions: nrOfExecutions,\n startDate: uint48(bytes6(orderData[8:14])),\n executionData: orderData[14:]\n });\n\n emit ExecutionAdded(account, jobId);\n }\n\n function _isExecutionValid(uint256 jobId) internal view {\n ExecutionConfig storage executionConfig = executionLog[msg.sender][jobId];\n\n if (!executionConfig.isEnabled) {\n revert InvalidExecution();\n }\n\n if (executionConfig.lastExecutionTime + executionConfig.executeInterval > block.timestamp) {\n revert InvalidExecution();\n }\n\n if (executionConfig.numberOfExecutionsCompleted >= executionConfig.numberOfExecutions) {\n revert InvalidExecution();\n }\n\n if (executionConfig.startDate > block.timestamp) {\n revert InvalidExecution();\n }\n }\n\n modifier canExecute(uint256 jobId) {\n _isExecutionValid(jobId);\n _;\n }\n\n /*//////////////////////////////////////////////////////////////////////////\n METADATA\n //////////////////////////////////////////////////////////////////////////*/\n\n function isModuleType(uint256 typeID) external pure override returns (bool) {\n return typeID == TYPE_EXECUTOR;\n }\n}\n"},"node_modules/@rhinestone/modulekit/src/module-bases/ERC7484RegistryAdapter.sol":{"content":"// SPDX-License-Identifier: AGPL-3.0-only\npragma solidity >=0.8.0 <0.9.0;\n\nimport { IERC7484 } from \"./interfaces/IERC7484.sol\";\n\nabstract contract ERC7484RegistryAdapter {\n // registry address\n IERC7484 public immutable REGISTRY;\n\n /**\n * Contract constructor\n * @dev sets the registry as an immutable variable\n *\n * @param _registry The registry address\n */\n constructor(IERC7484 _registry) {\n // set the registry\n REGISTRY = _registry;\n }\n}\n"},"node_modules/@rhinestone/modulekit/src/module-bases/ERC7579PolicyBase.sol":{"content":"// SPDX-License-Identifier: AGPL-3.0-only\npragma solidity >=0.8.0 <0.9.0;\n\nimport { ERC7579ModuleBase } from \"./ERC7579ModuleBase.sol\";\nimport { IPolicy, ConfigId } from \"./interfaces/IPolicy.sol\";\n\nabstract contract ERC7579PolicyBase is ERC7579ModuleBase, IPolicy {\n function initializeWithMultiplexer(\n address account,\n ConfigId configId,\n bytes calldata initData\n )\n external\n virtual;\n}\n"},"node_modules/@rhinestone/modulekit/src/module-bases/ERC1271Policy.sol":{"content":"// SPDX-License-Identifier: AGPL-3.0-only\npragma solidity >=0.8.0 <0.9.0;\n\nimport { ERC7579PolicyBase } from \"./ERC7579PolicyBase.sol\";\nimport { ConfigId, I1271Policy } from \"./interfaces/IPolicy.sol\";\n\nabstract contract ERC1271Policy is ERC7579PolicyBase, I1271Policy {\n function check1271SignedAction(\n ConfigId id,\n address requestSender,\n address account,\n bytes32 hash,\n bytes calldata signature\n )\n external\n view\n virtual\n returns (bool);\n}\n"},"node_modules/@rhinestone/modulekit/src/module-bases/ERC7579ActionPolicy.sol":{"content":"// SPDX-License-Identifier: AGPL-3.0-only\npragma solidity >=0.8.0 <0.9.0;\n\nimport { ERC7579PolicyBase } from \"./ERC7579PolicyBase.sol\";\nimport { ConfigId, IActionPolicy } from \"./interfaces/IPolicy.sol\";\n\nabstract contract ERC7579ActionPolicy is ERC7579PolicyBase, IActionPolicy {\n function checkAction(\n ConfigId id,\n address account,\n address target,\n uint256 value,\n bytes calldata data\n )\n external\n virtual\n returns (uint256);\n}\n"},"node_modules/@rhinestone/modulekit/src/module-bases/ERC7579UserOpPolicy.sol":{"content":"// SPDX-License-Identifier: AGPL-3.0-only\npragma solidity >=0.8.0 <0.9.0;\n\nimport { ERC7579PolicyBase } from \"./ERC7579PolicyBase.sol\";\nimport { ConfigId, IUserOpPolicy } from \"./interfaces/IPolicy.sol\";\nimport { PackedUserOperation } from \"../external/ERC4337.sol\";\n\nabstract contract ERC7579UserOpPolicy is ERC7579PolicyBase, IUserOpPolicy {\n function checkUserOp(\n ConfigId id,\n PackedUserOperation calldata userOp\n )\n external\n virtual\n returns (uint256);\n}\n"},"node_modules/@rhinestone/modulekit/src/module-bases/utils/TrustedForwarder.sol":{"content":"// SPDX-License-Identifier: AGPL-3.0-only\npragma solidity >=0.8.0 <0.9.0;\n\nabstract contract TrustedForwarder {\n // account => trustedForwarder\n mapping(address account => address trustedForwarder) public trustedForwarder;\n\n /**\n * Set the trusted forwarder for an account\n *\n * @param forwarder The address of the trusted forwarder\n */\n function setTrustedForwarder(address forwarder) external {\n trustedForwarder[msg.sender] = forwarder;\n }\n\n /**\n * Clear the trusted forwarder for an account\n */\n function clearTrustedForwarder() public {\n trustedForwarder[msg.sender] = address(0);\n }\n\n /**\n * Check if a forwarder is trusted for an account\n *\n * @param forwarder The address of the forwarder\n * @param account The address of the account\n *\n * @return true if the forwarder is trusted for the account\n */\n function isTrustedForwarder(address forwarder, address account) public view returns (bool) {\n return forwarder == trustedForwarder[account];\n }\n\n /**\n * Get the sender of the transaction\n *\n * @return account the sender of the transaction\n */\n function _getAccount() internal view returns (address account) {\n account = msg.sender;\n address _account;\n address forwarder;\n if (msg.data.length >= 40) {\n // solhint-disable-next-line no-inline-assembly\n assembly {\n _account := shr(96, calldataload(sub(calldatasize(), 20)))\n forwarder := shr(96, calldataload(sub(calldatasize(), 40)))\n }\n if (forwarder == msg.sender && isTrustedForwarder(forwarder, _account)) {\n account = _account;\n }\n }\n }\n}\n"},"node_modules/@ERC4337/account-abstraction/contracts/interfaces/PackedUserOperation.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\npragma solidity >=0.7.5;\n\n/**\n * User Operation struct\n * @param sender - The sender account of this request.\n * @param nonce - Unique value the sender uses to verify it is not a replay.\n * @param initCode - If set, the account contract will be created by this constructor/\n * @param callData - The method call to execute on this account.\n * @param accountGasLimits - Packed gas limits for validateUserOp and gas limit passed to the callData method call.\n * @param preVerificationGas - Gas not calculated by the handleOps method, but added to the gas paid.\n * Covers batch overhead.\n * @param gasFees - packed gas fields maxPriorityFeePerGas and maxFeePerGas - Same as EIP-1559 gas parameters.\n * @param paymasterAndData - If set, this field holds the paymaster address, verification gas limit, postOp gas limit and paymaster-specific extra data\n * The paymaster will pay for the transaction instead of the sender.\n * @param signature - Sender-verified signature over the entire request, the EntryPoint address and the chain ID.\n */\nstruct PackedUserOperation {\n address sender;\n uint256 nonce;\n bytes initCode;\n bytes callData;\n bytes32 accountGasLimits;\n uint256 preVerificationGas;\n bytes32 gasFees;\n bytes paymasterAndData;\n bytes signature;\n}\n"},"node_modules/@ERC4337/account-abstraction/contracts/core/UserOperationLib.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.23;\n\n/* solhint-disable no-inline-assembly */\n\nimport \"../interfaces/PackedUserOperation.sol\";\nimport {calldataKeccak, min} from \"./Helpers.sol\";\n\n/**\n * Utility functions helpful when working with UserOperation structs.\n */\nlibrary UserOperationLib {\n\n uint256 public constant PAYMASTER_VALIDATION_GAS_OFFSET = 20;\n uint256 public constant PAYMASTER_POSTOP_GAS_OFFSET = 36;\n uint256 public constant PAYMASTER_DATA_OFFSET = 52;\n /**\n * Get sender from user operation data.\n * @param userOp - The user operation data.\n */\n function getSender(\n PackedUserOperation calldata userOp\n ) internal pure returns (address) {\n address data;\n //read sender from userOp, which is first userOp member (saves 800 gas...)\n assembly {\n data := calldataload(userOp)\n }\n return address(uint160(data));\n }\n\n /**\n * Relayer/block builder might submit the TX with higher priorityFee,\n * but the user should not pay above what he signed for.\n * @param userOp - The user operation data.\n */\n function gasPrice(\n PackedUserOperation calldata userOp\n ) internal view returns (uint256) {\n unchecked {\n (uint256 maxPriorityFeePerGas, uint256 maxFeePerGas) = unpackUints(userOp.gasFees);\n if (maxFeePerGas == maxPriorityFeePerGas) {\n //legacy mode (for networks that don't support basefee opcode)\n return maxFeePerGas;\n }\n return min(maxFeePerGas, maxPriorityFeePerGas + block.basefee);\n }\n }\n\n /**\n * Pack the user operation data into bytes for hashing.\n * @param userOp - The user operation data.\n */\n function encode(\n PackedUserOperation calldata userOp\n ) internal pure returns (bytes memory ret) {\n address sender = getSender(userOp);\n uint256 nonce = userOp.nonce;\n bytes32 hashInitCode = calldataKeccak(userOp.initCode);\n bytes32 hashCallData = calldataKeccak(userOp.callData);\n bytes32 accountGasLimits = userOp.accountGasLimits;\n uint256 preVerificationGas = userOp.preVerificationGas;\n bytes32 gasFees = userOp.gasFees;\n bytes32 hashPaymasterAndData = calldataKeccak(userOp.paymasterAndData);\n\n return abi.encode(\n sender, nonce,\n hashInitCode, hashCallData,\n accountGasLimits, preVerificationGas, gasFees,\n hashPaymasterAndData\n );\n }\n\n function unpackUints(\n bytes32 packed\n ) internal pure returns (uint256 high128, uint256 low128) {\n return (uint128(bytes16(packed)), uint128(uint256(packed)));\n }\n\n //unpack just the high 128-bits from a packed value\n function unpackHigh128(bytes32 packed) internal pure returns (uint256) {\n return uint256(packed) >> 128;\n }\n\n // unpack just the low 128-bits from a packed value\n function unpackLow128(bytes32 packed) internal pure returns (uint256) {\n return uint128(uint256(packed));\n }\n\n function unpackMaxPriorityFeePerGas(PackedUserOperation calldata userOp)\n internal pure returns (uint256) {\n return unpackHigh128(userOp.gasFees);\n }\n\n function unpackMaxFeePerGas(PackedUserOperation calldata userOp)\n internal pure returns (uint256) {\n return unpackLow128(userOp.gasFees);\n }\n\n function unpackVerificationGasLimit(PackedUserOperation calldata userOp)\n internal pure returns (uint256) {\n return unpackHigh128(userOp.accountGasLimits);\n }\n\n function unpackCallGasLimit(PackedUserOperation calldata userOp)\n internal pure returns (uint256) {\n return unpackLow128(userOp.accountGasLimits);\n }\n\n function unpackPaymasterVerificationGasLimit(PackedUserOperation calldata userOp)\n internal pure returns (uint256) {\n return uint128(bytes16(userOp.paymasterAndData[PAYMASTER_VALIDATION_GAS_OFFSET : PAYMASTER_POSTOP_GAS_OFFSET]));\n }\n\n function unpackPostOpGasLimit(PackedUserOperation calldata userOp)\n internal pure returns (uint256) {\n return uint128(bytes16(userOp.paymasterAndData[PAYMASTER_POSTOP_GAS_OFFSET : PAYMASTER_DATA_OFFSET]));\n }\n\n function unpackPaymasterStaticFields(\n bytes calldata paymasterAndData\n ) internal pure returns (address paymaster, uint256 validationGasLimit, uint256 postOpGasLimit) {\n return (\n address(bytes20(paymasterAndData[: PAYMASTER_VALIDATION_GAS_OFFSET])),\n uint128(bytes16(paymasterAndData[PAYMASTER_VALIDATION_GAS_OFFSET : PAYMASTER_POSTOP_GAS_OFFSET])),\n uint128(bytes16(paymasterAndData[PAYMASTER_POSTOP_GAS_OFFSET : PAYMASTER_DATA_OFFSET]))\n );\n }\n\n /**\n * Hash the user operation data.\n * @param userOp - The user operation data.\n */\n function hash(\n PackedUserOperation calldata userOp\n ) internal pure returns (bytes32) {\n return keccak256(encode(userOp));\n }\n}\n"},"node_modules/@ERC4337/account-abstraction/contracts/core/EntryPointSimulations.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.23;\n\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable no-inline-assembly */\n\nimport \"./EntryPoint.sol\";\nimport \"../interfaces/IEntryPointSimulations.sol\";\n\n/*\n * This contract inherits the EntryPoint and extends it with the view-only methods that are executed by\n * the bundler in order to check UserOperation validity and estimate its gas consumption.\n * This contract should never be deployed on-chain and is only used as a parameter for the \"eth_call\" request.\n */\ncontract EntryPointSimulations is EntryPoint, IEntryPointSimulations {\n // solhint-disable-next-line var-name-mixedcase\n AggregatorStakeInfo private NOT_AGGREGATED = AggregatorStakeInfo(address(0), StakeInfo(0, 0));\n\n SenderCreator private _senderCreator;\n\n function initSenderCreator() internal virtual {\n //this is the address of the first contract created with CREATE by this address.\n address createdObj = address(uint160(uint256(keccak256(abi.encodePacked(hex\"d694\", address(this), hex\"01\")))));\n _senderCreator = SenderCreator(createdObj);\n }\n\n function senderCreator() internal view virtual override returns (SenderCreator) {\n // return the same senderCreator as real EntryPoint.\n // this call is slightly (100) more expensive than EntryPoint's access to immutable member\n return _senderCreator;\n }\n\n /**\n * simulation contract should not be deployed, and specifically, accounts should not trust\n * it as entrypoint, since the simulation functions don't check the signatures\n */\n constructor() {\n // THIS CONTRACT SHOULD NOT BE DEPLOYED\n // however, the line of code below is commented to allow this entryPoint to be used in fork tests\n // require(block.number < 100, \"should not be deployed\");\n }\n\n /// @inheritdoc IEntryPointSimulations\n function simulateValidation(\n PackedUserOperation calldata userOp\n )\n external\n returns (\n ValidationResult memory\n ){\n UserOpInfo memory outOpInfo;\n\n _simulationOnlyValidations(userOp);\n (\n uint256 validationData,\n uint256 paymasterValidationData\n ) = _validatePrepayment(0, userOp, outOpInfo);\n StakeInfo memory paymasterInfo = _getStakeInfo(\n outOpInfo.mUserOp.paymaster\n );\n StakeInfo memory senderInfo = _getStakeInfo(outOpInfo.mUserOp.sender);\n StakeInfo memory factoryInfo;\n {\n bytes calldata initCode = userOp.initCode;\n address factory = initCode.length >= 20\n ? address(bytes20(initCode[0 : 20]))\n : address(0);\n factoryInfo = _getStakeInfo(factory);\n }\n\n address aggregator = address(uint160(validationData));\n ReturnInfo memory returnInfo = ReturnInfo(\n outOpInfo.preOpGas,\n outOpInfo.prefund,\n validationData,\n paymasterValidationData,\n getMemoryBytesFromOffset(outOpInfo.contextOffset)\n );\n\n AggregatorStakeInfo memory aggregatorInfo = NOT_AGGREGATED;\n if (uint160(aggregator) != SIG_VALIDATION_SUCCESS && uint160(aggregator) != SIG_VALIDATION_FAILED) {\n aggregatorInfo = AggregatorStakeInfo(\n aggregator,\n _getStakeInfo(aggregator)\n );\n }\n return ValidationResult(\n returnInfo,\n senderInfo,\n factoryInfo,\n paymasterInfo,\n aggregatorInfo\n );\n }\n\n /// @inheritdoc IEntryPointSimulations\n function simulateHandleOp(\n PackedUserOperation calldata op,\n address target,\n bytes calldata targetCallData\n )\n external nonReentrant\n returns (\n ExecutionResult memory\n ){\n UserOpInfo memory opInfo;\n _simulationOnlyValidations(op);\n (\n uint256 validationData,\n uint256 paymasterValidationData\n ) = _validatePrepayment(0, op, opInfo);\n\n uint256 paid = _executeUserOp(0, op, opInfo);\n bool targetSuccess;\n bytes memory targetResult;\n if (target != address(0)) {\n (targetSuccess, targetResult) = target.call(targetCallData);\n }\n return ExecutionResult(\n opInfo.preOpGas,\n paid,\n validationData,\n paymasterValidationData,\n targetSuccess,\n targetResult\n );\n }\n\n function _simulationOnlyValidations(\n PackedUserOperation calldata userOp\n )\n internal\n {\n //initialize senderCreator(). we can't rely on constructor\n initSenderCreator();\n\n try\n this._validateSenderAndPaymaster(\n userOp.initCode,\n userOp.sender,\n userOp.paymasterAndData\n )\n // solhint-disable-next-line no-empty-blocks\n {} catch Error(string memory revertReason) {\n if (bytes(revertReason).length != 0) {\n revert FailedOp(0, revertReason);\n }\n }\n }\n\n /**\n * Called only during simulation.\n * This function always reverts to prevent warm/cold storage differentiation in simulation vs execution.\n * @param initCode - The smart account constructor code.\n * @param sender - The sender address.\n * @param paymasterAndData - The paymaster address (followed by other params, ignored by this method)\n */\n function _validateSenderAndPaymaster(\n bytes calldata initCode,\n address sender,\n bytes calldata paymasterAndData\n ) external view {\n if (initCode.length == 0 && sender.code.length == 0) {\n // it would revert anyway. but give a meaningful message\n revert(\"AA20 account not deployed\");\n }\n if (paymasterAndData.length >= 20) {\n address paymaster = address(bytes20(paymasterAndData[0 : 20]));\n if (paymaster.code.length == 0) {\n // It would revert anyway. but give a meaningful message.\n revert(\"AA30 paymaster not deployed\");\n }\n }\n // always revert\n revert(\"\");\n }\n\n //make sure depositTo cost is more than normal EntryPoint's cost,\n // to mitigate DoS vector on the bundler\n // empiric test showed that without this wrapper, simulation depositTo costs less..\n function depositTo(address account) public override(IStakeManager, StakeManager) payable {\n unchecked{\n // silly code, to waste some gas to make sure depositTo is always little more\n // expensive than on-chain call\n uint256 x = 1;\n while (x < 5) {\n x++;\n }\n StakeManager.depositTo(account);\n }\n }\n}\n"},"node_modules/@ERC4337/account-abstraction/contracts/core/Helpers.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.23;\n\n/* solhint-disable no-inline-assembly */\n\n\n /*\n * For simulation purposes, validateUserOp (and validatePaymasterUserOp)\n * must return this value in case of signature failure, instead of revert.\n */\nuint256 constant SIG_VALIDATION_FAILED = 1;\n\n\n/*\n * For simulation purposes, validateUserOp (and validatePaymasterUserOp)\n * return this value on success.\n */\nuint256 constant SIG_VALIDATION_SUCCESS = 0;\n\n\n/**\n * Returned data from validateUserOp.\n * validateUserOp returns a uint256, which is created by `_packedValidationData` and\n * parsed by `_parseValidationData`.\n * @param aggregator - address(0) - The account validated the signature by itself.\n * address(1) - The account failed to validate the signature.\n * otherwise - This is an address of a signature aggregator that must\n * be used to validate the signature.\n * @param validAfter - This UserOp is valid only after this timestamp.\n * @param validaUntil - This UserOp is valid only up to this timestamp.\n */\nstruct ValidationData {\n address aggregator;\n uint48 validAfter;\n uint48 validUntil;\n}\n\n/**\n * Extract sigFailed, validAfter, validUntil.\n * Also convert zero validUntil to type(uint48).max.\n * @param validationData - The packed validation data.\n */\nfunction _parseValidationData(\n uint256 validationData\n) pure returns (ValidationData memory data) {\n address aggregator = address(uint160(validationData));\n uint48 validUntil = uint48(validationData >> 160);\n if (validUntil == 0) {\n validUntil = type(uint48).max;\n }\n uint48 validAfter = uint48(validationData >> (48 + 160));\n return ValidationData(aggregator, validAfter, validUntil);\n}\n\n/**\n * Helper to pack the return value for validateUserOp.\n * @param data - The ValidationData to pack.\n */\nfunction _packValidationData(\n ValidationData memory data\n) pure returns (uint256) {\n return\n uint160(data.aggregator) |\n (uint256(data.validUntil) << 160) |\n (uint256(data.validAfter) << (160 + 48));\n}\n\n/**\n * Helper to pack the return value for validateUserOp, when not using an aggregator.\n * @param sigFailed - True for signature failure, false for success.\n * @param validUntil - Last timestamp this UserOperation is valid (or zero for infinite).\n * @param validAfter - First timestamp this UserOperation is valid.\n */\nfunction _packValidationData(\n bool sigFailed,\n uint48 validUntil,\n uint48 validAfter\n) pure returns (uint256) {\n return\n (sigFailed ? 1 : 0) |\n (uint256(validUntil) << 160) |\n (uint256(validAfter) << (160 + 48));\n}\n\n/**\n * keccak function over calldata.\n * @dev copy calldata into memory, do keccak and drop allocated memory. Strangely, this is more efficient than letting solidity do it.\n */\n function calldataKeccak(bytes calldata data) pure returns (bytes32 ret) {\n assembly (\"memory-safe\") {\n let mem := mload(0x40)\n let len := data.length\n calldatacopy(mem, data.offset, len)\n ret := keccak256(mem, len)\n }\n }\n\n\n/**\n * The minimum of two numbers.\n * @param a - First number.\n * @param b - Second number.\n */\n function min(uint256 a, uint256 b) pure returns (uint256) {\n return a < b ? a : b;\n }\n"},"node_modules/@ERC4337/account-abstraction/contracts/interfaces/IStakeManager.sol":{"content":"// SPDX-License-Identifier: GPL-3.0-only\npragma solidity >=0.7.5;\n\n/**\n * Manage deposits and stakes.\n * Deposit is just a balance used to pay for UserOperations (either by a paymaster or an account).\n * Stake is value locked for at least \"unstakeDelay\" by the staked entity.\n */\ninterface IStakeManager {\n event Deposited(address indexed account, uint256 totalDeposit);\n\n event Withdrawn(\n address indexed account,\n address withdrawAddress,\n uint256 amount\n );\n\n // Emitted when stake or unstake delay are modified.\n event StakeLocked(\n address indexed account,\n uint256 totalStaked,\n uint256 unstakeDelaySec\n );\n\n // Emitted once a stake is scheduled for withdrawal.\n event StakeUnlocked(address indexed account, uint256 withdrawTime);\n\n event StakeWithdrawn(\n address indexed account,\n address withdrawAddress,\n uint256 amount\n );\n\n /**\n * @param deposit - The entity's deposit.\n * @param staked - True if this entity is staked.\n * @param stake - Actual amount of ether staked for this entity.\n * @param unstakeDelaySec - Minimum delay to withdraw the stake.\n * @param withdrawTime - First block timestamp where 'withdrawStake' will be callable, or zero if already locked.\n * @dev Sizes were chosen so that deposit fits into one cell (used during handleOp)\n * and the rest fit into a 2nd cell (used during stake/unstake)\n * - 112 bit allows for 10^15 eth\n * - 48 bit for full timestamp\n * - 32 bit allows 150 years for unstake delay\n */\n struct DepositInfo {\n uint256 deposit;\n bool staked;\n uint112 stake;\n uint32 unstakeDelaySec;\n uint48 withdrawTime;\n }\n\n // API struct used by getStakeInfo and simulateValidation.\n struct StakeInfo {\n uint256 stake;\n uint256 unstakeDelaySec;\n }\n\n /**\n * Get deposit info.\n * @param account - The account to query.\n * @return info - Full deposit information of given account.\n */\n function getDepositInfo(\n address account\n ) external view returns (DepositInfo memory info);\n\n /**\n * Get account balance.\n * @param account - The account to query.\n * @return - The deposit (for gas payment) of the account.\n */\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * Add to the deposit of the given account.\n * @param account - The account to add to.\n */\n function depositTo(address account) external payable;\n\n /**\n * Add to the account's stake - amount and delay\n * any pending unstake is first cancelled.\n * @param _unstakeDelaySec - The new lock duration before the deposit can be withdrawn.\n */\n function addStake(uint32 _unstakeDelaySec) external payable;\n\n /**\n * Attempt to unlock the stake.\n * The value can be withdrawn (using withdrawStake) after the unstake delay.\n */\n function unlockStake() external;\n\n /**\n * Withdraw from the (unlocked) stake.\n * Must first call unlockStake and wait for the unstakeDelay to pass.\n * @param withdrawAddress - The address to send withdrawn value.\n */\n function withdrawStake(address payable withdrawAddress) external;\n\n /**\n * Withdraw from the deposit.\n * @param withdrawAddress - The address to send withdrawn value.\n * @param withdrawAmount - The amount to withdraw.\n */\n function withdrawTo(\n address payable withdrawAddress,\n uint256 withdrawAmount\n ) external;\n}\n"},"node_modules/@ERC4337/account-abstraction/contracts/interfaces/IAccount.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\npragma solidity >=0.7.5;\n\nimport \"./PackedUserOperation.sol\";\n\ninterface IAccount {\n /**\n * Validate user's signature and nonce\n * the entryPoint will make the call to the recipient only if this validation call returns successfully.\n * signature failure should be reported by returning SIG_VALIDATION_FAILED (1).\n * This allows making a \"simulation call\" without a valid signature\n * Other failures (e.g. nonce mismatch, or invalid signature format) should still revert to signal failure.\n *\n * @dev Must validate caller is the entryPoint.\n * Must validate the signature and nonce\n * @param userOp - The operation that is about to be executed.\n * @param userOpHash - Hash of the user's request data. can be used as the basis for signature.\n * @param missingAccountFunds - Missing funds on the account's deposit in the entrypoint.\n * This is the minimum amount to transfer to the sender(entryPoint) to be\n * able to make the call. The excess is left as a deposit in the entrypoint\n * for future calls. Can be withdrawn anytime using \"entryPoint.withdrawTo()\".\n * In case there is a paymaster in the request (or the current deposit is high\n * enough), this value will be zero.\n * @return validationData - Packaged ValidationData structure. use `_packValidationData` and\n * `_unpackValidationData` to encode and decode.\n * <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure,\n * otherwise, an address of an \"authorizer\" contract.\n * <6-byte> validUntil - Last timestamp this operation is valid. 0 for \"indefinite\"\n * <6-byte> validAfter - First timestamp this operation is valid\n * If an account doesn't use time-range, it is enough to\n * return SIG_VALIDATION_FAILED value (1) for signature failure.\n * Note that the validation code cannot use block.timestamp (or block.number) directly.\n */\n function validateUserOp(\n PackedUserOperation calldata userOp,\n bytes32 userOpHash,\n uint256 missingAccountFunds\n ) external returns (uint256 validationData);\n}\n"},"node_modules/@ERC4337/account-abstraction/contracts/interfaces/IAccountExecute.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\npragma solidity >=0.7.5;\n\nimport \"./PackedUserOperation.sol\";\n\ninterface IAccountExecute {\n /**\n * Account may implement this execute method.\n * passing this methodSig at the beginning of callData will cause the entryPoint to pass the full UserOp (and hash)\n * to the account.\n * The account should skip the methodSig, and use the callData (and optionally, other UserOp fields)\n *\n * @param userOp - The operation that was just validated.\n * @param userOpHash - Hash of the user's request data.\n */\n function executeUserOp(\n PackedUserOperation calldata userOp,\n bytes32 userOpHash\n ) external;\n}\n"},"node_modules/@ERC4337/account-abstraction/contracts/interfaces/IEntryPoint.sol":{"content":"/**\n ** Account-Abstraction (EIP-4337) singleton EntryPoint implementation.\n ** Only one instance required on each chain.\n **/\n// SPDX-License-Identifier: GPL-3.0\npragma solidity >=0.7.5;\n\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable no-inline-assembly */\n/* solhint-disable reason-string */\n\nimport \"./PackedUserOperation.sol\";\nimport \"./IStakeManager.sol\";\nimport \"./IAggregator.sol\";\nimport \"./INonceManager.sol\";\n\ninterface IEntryPoint is IStakeManager, INonceManager {\n /***\n * An event emitted after each successful request.\n * @param userOpHash - Unique identifier for the request (hash its entire content, except signature).\n * @param sender - The account that generates this request.\n * @param paymaster - If non-null, the paymaster that pays for this request.\n * @param nonce - The nonce value from the request.\n * @param success - True if the sender transaction succeeded, false if reverted.\n * @param actualGasCost - Actual amount paid (by account or paymaster) for this UserOperation.\n * @param actualGasUsed - Total gas used by this UserOperation (including preVerification, creation,\n * validation and execution).\n */\n event UserOperationEvent(\n bytes32 indexed userOpHash,\n address indexed sender,\n address indexed paymaster,\n uint256 nonce,\n bool success,\n uint256 actualGasCost,\n uint256 actualGasUsed\n );\n\n /**\n * Account \"sender\" was deployed.\n * @param userOpHash - The userOp that deployed this account. UserOperationEvent will follow.\n * @param sender - The account that is deployed\n * @param factory - The factory used to deploy this account (in the initCode)\n * @param paymaster - The paymaster used by this UserOp\n */\n event AccountDeployed(\n bytes32 indexed userOpHash,\n address indexed sender,\n address factory,\n address paymaster\n );\n\n /**\n * An event emitted if the UserOperation \"callData\" reverted with non-zero length.\n * @param userOpHash - The request unique identifier.\n * @param sender - The sender of this request.\n * @param nonce - The nonce used in the request.\n * @param revertReason - The return bytes from the (reverted) call to \"callData\".\n */\n event UserOperationRevertReason(\n bytes32 indexed userOpHash,\n address indexed sender,\n uint256 nonce,\n bytes revertReason\n );\n\n /**\n * An event emitted if the UserOperation Paymaster's \"postOp\" call reverted with non-zero length.\n * @param userOpHash - The request unique identifier.\n * @param sender - The sender of this request.\n * @param nonce - The nonce used in the request.\n * @param revertReason - The return bytes from the (reverted) call to \"callData\".\n */\n event PostOpRevertReason(\n bytes32 indexed userOpHash,\n address indexed sender,\n uint256 nonce,\n bytes revertReason\n );\n\n /**\n * UserOp consumed more than prefund. The UserOperation is reverted, and no refund is made.\n * @param userOpHash - The request unique identifier.\n * @param sender - The sender of this request.\n * @param nonce - The nonce used in the request.\n */\n event UserOperationPrefundTooLow(\n bytes32 indexed userOpHash,\n address indexed sender,\n uint256 nonce\n );\n\n /**\n * An event emitted by handleOps(), before starting the execution loop.\n * Any event emitted before this event, is part of the validation.\n */\n event BeforeExecution();\n\n /**\n * Signature aggregator used by the following UserOperationEvents within this bundle.\n * @param aggregator - The aggregator used for the following UserOperationEvents.\n */\n event SignatureAggregatorChanged(address indexed aggregator);\n\n /**\n * A custom revert error of handleOps, to identify the offending op.\n * Should be caught in off-chain handleOps simulation and not happen on-chain.\n * Useful for mitigating DoS attempts against batchers or for troubleshooting of factory/account/paymaster reverts.\n * NOTE: If simulateValidation passes successfully, there should be no reason for handleOps to fail on it.\n * @param opIndex - Index into the array of ops to the failed one (in simulateValidation, this is always zero).\n * @param reason - Revert reason. The string starts with a unique code \"AAmn\",\n * where \"m\" is \"1\" for factory, \"2\" for account and \"3\" for paymaster issues,\n * so a failure can be attributed to the correct entity.\n */\n error FailedOp(uint256 opIndex, string reason);\n\n /**\n * A custom revert error of handleOps, to report a revert by account or paymaster.\n * @param opIndex - Index into the array of ops to the failed one (in simulateValidation, this is always zero).\n * @param reason - Revert reason. see FailedOp(uint256,string), above\n * @param inner - data from inner cought revert reason\n * @dev note that inner is truncated to 2048 bytes\n */\n error FailedOpWithRevert(uint256 opIndex, string reason, bytes inner);\n\n error PostOpReverted(bytes returnData);\n\n /**\n * Error case when a signature aggregator fails to verify the aggregated signature it had created.\n * @param aggregator The aggregator that failed to verify the signature\n */\n error SignatureValidationFailed(address aggregator);\n\n // Return value of getSenderAddress.\n error SenderAddressResult(address sender);\n\n // UserOps handled, per aggregator.\n struct UserOpsPerAggregator {\n PackedUserOperation[] userOps;\n // Aggregator address\n IAggregator aggregator;\n // Aggregated signature\n bytes signature;\n }\n\n /**\n * Execute a batch of UserOperations.\n * No signature aggregator is used.\n * If any account requires an aggregator (that is, it returned an aggregator when\n * performing simulateValidation), then handleAggregatedOps() must be used instead.\n * @param ops - The operations to execute.\n * @param beneficiary - The address to receive the fees.\n */\n function handleOps(\n PackedUserOperation[] calldata ops,\n address payable beneficiary\n ) external;\n\n /**\n * Execute a batch of UserOperation with Aggregators\n * @param opsPerAggregator - The operations to execute, grouped by aggregator (or address(0) for no-aggregator accounts).\n * @param beneficiary - The address to receive the fees.\n */\n function handleAggregatedOps(\n UserOpsPerAggregator[] calldata opsPerAggregator,\n address payable beneficiary\n ) external;\n\n /**\n * Generate a request Id - unique identifier for this request.\n * The request ID is a hash over the content of the userOp (except the signature), the entrypoint and the chainid.\n * @param userOp - The user operation to generate the request ID for.\n * @return hash the hash of this UserOperation\n */\n function getUserOpHash(\n PackedUserOperation calldata userOp\n ) external view returns (bytes32);\n\n /**\n * Gas and return values during simulation.\n * @param preOpGas - The gas used for validation (including preValidationGas)\n * @param prefund - The required prefund for this operation\n * @param accountValidationData - returned validationData from account.\n * @param paymasterValidationData - return validationData from paymaster.\n * @param paymasterContext - Returned by validatePaymasterUserOp (to be passed into postOp)\n */\n struct ReturnInfo {\n uint256 preOpGas;\n uint256 prefund;\n uint256 accountValidationData;\n uint256 paymasterValidationData;\n bytes paymasterContext;\n }\n\n /**\n * Returned aggregated signature info:\n * The aggregator returned by the account, and its current stake.\n */\n struct AggregatorStakeInfo {\n address aggregator;\n StakeInfo stakeInfo;\n }\n\n /**\n * Get counterfactual sender address.\n * Calculate the sender contract address that will be generated by the initCode and salt in the UserOperation.\n * This method always revert, and returns the address in SenderAddressResult error\n * @param initCode - The constructor code to be passed into the UserOperation.\n */\n function getSenderAddress(bytes memory initCode) external;\n\n error DelegateAndRevert(bool success, bytes ret);\n\n /**\n * Helper method for dry-run testing.\n * @dev calling this method, the EntryPoint will make a delegatecall to the given data, and report (via revert) the result.\n * The method always revert, so is only useful off-chain for dry run calls, in cases where state-override to replace\n * actual EntryPoint code is less convenient.\n * @param target a target contract to make a delegatecall from entrypoint\n * @param data data to pass to target in a delegatecall\n */\n function delegateAndRevert(address target, bytes calldata data) external;\n}\n"},"node_modules/@ERC4337/account-abstraction/contracts/interfaces/IEntryPointSimulations.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\npragma solidity >=0.7.5;\n\nimport \"./PackedUserOperation.sol\";\nimport \"./IEntryPoint.sol\";\n\ninterface IEntryPointSimulations is IEntryPoint {\n // Return value of simulateHandleOp.\n struct ExecutionResult {\n uint256 preOpGas;\n uint256 paid;\n uint256 accountValidationData;\n uint256 paymasterValidationData;\n bool targetSuccess;\n bytes targetResult;\n }\n\n /**\n * Successful result from simulateValidation.\n * If the account returns a signature aggregator the \"aggregatorInfo\" struct is filled in as well.\n * @param returnInfo Gas and time-range returned values\n * @param senderInfo Stake information about the sender\n * @param factoryInfo Stake information about the factory (if any)\n * @param paymasterInfo Stake information about the paymaster (if any)\n * @param aggregatorInfo Signature aggregation info (if the account requires signature aggregator)\n * Bundler MUST use it to verify the signature, or reject the UserOperation.\n */\n struct ValidationResult {\n ReturnInfo returnInfo;\n StakeInfo senderInfo;\n StakeInfo factoryInfo;\n StakeInfo paymasterInfo;\n AggregatorStakeInfo aggregatorInfo;\n }\n\n /**\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage\n * outside the account's data.\n * @param userOp - The user operation to validate.\n * @return the validation result structure\n */\n function simulateValidation(\n PackedUserOperation calldata userOp\n )\n external\n returns (\n ValidationResult memory\n );\n\n /**\n * Simulate full execution of a UserOperation (including both validation and target execution)\n * It performs full validation of the UserOperation, but ignores signature error.\n * An optional target address is called after the userop succeeds,\n * and its value is returned (before the entire call is reverted).\n * Note that in order to collect the the success/failure of the target call, it must be executed\n * with trace enabled to track the emitted events.\n * @param op The UserOperation to simulate.\n * @param target - If nonzero, a target address to call after userop simulation. If called,\n * the targetSuccess and targetResult are set to the return from that call.\n * @param targetCallData - CallData to pass to target address.\n * @return the execution result structure\n */\n function simulateHandleOp(\n PackedUserOperation calldata op,\n address target,\n bytes calldata targetCallData\n )\n external\n returns (\n ExecutionResult memory\n );\n}\n"},"node_modules/@rhinestone/modulekit/src/module-bases/utils/ERC7579Constants.sol":{"content":"// SPDX-License-Identifier: AGPL-3.0-only\npragma solidity >=0.8.0 <0.9.0;\n\nuint256 constant MODULE_TYPE_VALIDATOR = 1;\nuint256 constant MODULE_TYPE_EXECUTOR = 2;\nuint256 constant MODULE_TYPE_FALLBACK = 3;\nuint256 constant MODULE_TYPE_HOOK = 4;\nuint256 constant MODULE_TYPE_POLICY = 5;\nuint256 constant MODULE_TYPE_SIGNER = 6;\nuint256 constant MODULE_TYPE_STATELESS_VALIDATOR = 7;\n"},"node_modules/@rhinestone/modulekit/src/module-bases/interfaces/IStatelessValidator.sol":{"content":"// SPDX-License-Identifier: AGPL-3.0-only\npragma solidity >=0.8.0 <0.9.0;\n\ninterface IStatelessValidator {\n function validateSignatureWithData(\n bytes32 hash,\n bytes calldata signature,\n bytes calldata data\n )\n external\n view\n returns (bool);\n}\n"},"node_modules/@rhinestone/modulekit/src/accounts/common/interfaces/IERC7579Account.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity >=0.8.23 <0.9.0;\n\n/* solhint-disable no-unused-import */\n\n// Types\nimport { CallType, ExecType, ModeCode } from \"../lib/ModeLib.sol\";\n\n// Structs\nstruct Execution {\n address target;\n uint256 value;\n bytes callData;\n}\n\ninterface IERC7579Account {\n event ModuleInstalled(uint256 moduleTypeId, address module);\n event ModuleUninstalled(uint256 moduleTypeId, address module);\n\n /**\n * @dev Executes a transaction on behalf of the account.\n * This function is intended to be called by ERC-4337 EntryPoint.sol\n * @dev Ensure adequate authorization control: i.e. onlyEntryPointOrSelf\n *\n * @dev MSA MUST implement this function signature.\n * If a mode is requested that is not supported by the Account, it MUST revert\n * @param mode The encoded execution mode of the transaction. See ModeLib.sol for details\n * @param executionCalldata The encoded execution call data\n */\n function execute(ModeCode mode, bytes calldata executionCalldata) external payable;\n\n /**\n * @dev Executes a transaction on behalf of the account.\n * This function is intended to be called by Executor Modules\n * @dev Ensure adequate authorization control: i.e. onlyExecutorModule\n *\n * @dev MSA MUST implement this function signature.\n * If a mode is requested that is not supported by the Account, it MUST revert\n * @param mode The encoded execution mode of the transaction. See ModeLib.sol for details\n * @param executionCalldata The encoded execution call data\n */\n function executeFromExecutor(\n ModeCode mode,\n bytes calldata executionCalldata\n )\n external\n payable\n returns (bytes[] memory returnData);\n\n /**\n * @dev ERC-1271 isValidSignature\n * This function is intended to be used to validate a smart account signature\n * and may forward the call to a validator module\n *\n * @param hash The hash of the data that is signed\n * @param data The data that is signed\n */\n function isValidSignature(bytes32 hash, bytes calldata data) external view returns (bytes4);\n\n /**\n * @dev installs a Module of a certain type on the smart account\n * @dev Implement Authorization control of your chosing\n * @param moduleTypeId the module type ID according the ERC-7579 spec\n * @param module the module address\n * @param initData arbitrary data that may be required on the module during `onInstall`\n * initialization.\n */\n function installModule(\n uint256 moduleTypeId,\n address module,\n bytes calldata initData\n )\n external\n payable;\n\n /**\n * @dev uninstalls a Module of a certain type on the smart account\n * @dev Implement Authorization control of your chosing\n * @param moduleTypeId the module type ID according the ERC-7579 spec\n * @param module the module address\n * @param deInitData arbitrary data that may be required on the module during `onUninstall`\n * de-initialization.\n */\n function uninstallModule(\n uint256 moduleTypeId,\n address module,\n bytes calldata deInitData\n )\n external\n payable;\n\n /**\n * Function to check if the account supports a certain CallType or ExecType (see ModeLib.sol)\n * @param encodedMode the encoded mode\n */\n function supportsExecutionMode(ModeCode encodedMode) external view returns (bool);\n\n /**\n * Function to check if the account supports installation of a certain module type Id\n * @param moduleTypeId the module type ID according the ERC-7579 spec\n */\n function supportsModule(uint256 moduleTypeId) external view returns (bool);\n\n /**\n * Function to check if the account has a certain module installed\n * @param moduleTypeId the module type ID according the ERC-7579 spec\n * Note: keep in mind that some contracts can be multiple module types at the same time. It\n * thus may be necessary to query multiple module types\n * @param module the module address\n * @param additionalContext additional context data that the smart account may interpret to\n * identifiy conditions under which the module is installed.\n * usually this is not necessary, but for some special hooks that\n * are stored in mappings, this param might be needed\n */\n function isModuleInstalled(\n uint256 moduleTypeId,\n address module,\n bytes calldata additionalContext\n )\n external\n view\n returns (bool);\n\n /**\n * @dev Returns the account id of the smart account\n * @return accountImplementationId the account id of the smart account\n * the accountId should be structured like so:\n * \"vendorname.accountname.semver\"\n */\n function accountId() external view returns (string memory accountImplementationId);\n}\n"},"node_modules/@rhinestone/modulekit/src/accounts/erc7579/lib/ExecutionLib.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity >=0.8.23 <0.9.0;\n\n// Types\nimport { Execution } from \"../../common/interfaces/IERC7579Account.sol\";\n\n/**\n * Helper Library for decoding Execution calldata\n * malloc for memory allocation is bad for gas. use this assembly instead\n */\nlibrary ExecutionLib {\n error ERC7579DecodingError();\n\n /**\n * @notice Decode a batch of `Execution` executionBatch from a `bytes` calldata.\n * @dev code is copied from solady's LibERC7579.sol\n * https://github.com/Vectorized/solady/blob/740812cedc9a1fc11e17cb3d4569744367dedf19/src/accounts/LibERC7579.sol#L146\n * Credits to Vectorized and the Solady Team\n */\n function decodeBatch(bytes calldata executionCalldata)\n internal\n pure\n returns (Execution[] calldata executionBatch)\n {\n /// @solidity memory-safe-assembly\n assembly {\n let u := calldataload(executionCalldata.offset)\n let s := add(executionCalldata.offset, u)\n let e := sub(add(executionCalldata.offset, executionCalldata.length), 0x20)\n executionBatch.offset := add(s, 0x20)\n executionBatch.length := calldataload(s)\n if or(shr(64, u), gt(add(s, shl(5, executionBatch.length)), e)) {\n mstore(0x00, 0xba597e7e) // `DecodingError()`.\n revert(0x1c, 0x04)\n }\n if executionBatch.length {\n // Perform bounds checks on the decoded `executionBatch`.\n // Loop runs out-of-gas if `executionBatch.length` is big enough to cause overflows.\n for { let i := executionBatch.length } 1 { } {\n i := sub(i, 1)\n let p := calldataload(add(executionBatch.offset, shl(5, i)))\n let c := add(executionBatch.offset, p)\n let q := calldataload(add(c, 0x40))\n let o := add(c, q)\n // forgefmt: disable-next-item\n if or(shr(64, or(calldataload(o), or(p, q))),\n or(gt(add(c, 0x40), e), gt(add(o, calldataload(o)), e))) {\n mstore(0x00, 0xba597e7e) // `DecodingError()`.\n revert(0x1c, 0x04)\n }\n if iszero(i) { break }\n }\n }\n }\n }\n\n function encodeBatch(Execution[] memory executions)\n internal\n pure\n returns (bytes memory callData)\n {\n callData = abi.encode(executions);\n }\n\n function decodeSingle(bytes calldata executionCalldata)\n internal\n pure\n returns (address target, uint256 value, bytes calldata callData)\n {\n target = address(bytes20(executionCalldata[0:20]));\n value = uint256(bytes32(executionCalldata[20:52]));\n callData = executionCalldata[52:];\n }\n\n function encodeSingle(\n address target,\n uint256 value,\n bytes memory callData\n )\n internal\n pure\n returns (bytes memory userOpCalldata)\n {\n userOpCalldata = abi.encodePacked(target, value, callData);\n }\n}\n"},"node_modules/@rhinestone/modulekit/src/accounts/common/lib/ModeLib.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\npragma solidity >=0.8.0 <0.9.0;\n\n/**\n * @title ModeLib\n * @author rhinestone | zeroknots.eth, Konrad Kopp (@kopy-kat)\n * To allow smart accounts to be very simple, but allow for more complex execution, A custom mode\n * encoding is used.\n * Function Signature of execute function:\n * function execute(ModeCode mode, bytes calldata executionCalldata) external payable;\n * This allows for a single bytes32 to be used to encode the execution mode, calltype, execType and\n * context.\n * NOTE: Simple Account implementations only have to scope for the most significant byte. Account that\n * implement\n * more complex execution modes may use the entire bytes32.\n *\n * |--------------------------------------------------------------------|\n * | CALLTYPE | EXECTYPE | UNUSED | ModeSelector | ModePayload |\n * |--------------------------------------------------------------------|\n * | 1 byte | 1 byte | 4 bytes | 4 bytes | 22 bytes |\n * |--------------------------------------------------------------------|\n *\n * CALLTYPE: 1 byte\n * CallType is used to determine how the executeCalldata paramter of the execute function has to be\n * decoded.\n * It can be either single, batch or delegatecall. In the future different calls could be added.\n * CALLTYPE can be used by a validation module to determine how to decode .\n *\n * EXECTYPE: 1 byte\n * ExecType is used to determine how the account should handle the execution.\n * It can indicate if the execution should revert on failure or continue execution.\n * In the future more execution modes may be added.\n * Default Behavior (EXECTYPE = 0x00) is to revert on a single failed execution. If one execution in\n * a batch fails, the entire batch is reverted\n *\n * UNUSED: 4 bytes\n * Unused bytes are reserved for future use.\n *\n * ModeSelector: bytes4\n * The \"optional\" mode selector can be used by account vendors, to implement custom behavior in\n * their accounts.\n * the way a ModeSelector is to be calculated is bytes4(keccak256(\"vendorname.featurename\"))\n * this is to prevent collisions between different vendors, while allowing innovation and the\n * development of new features without coordination between ERC-7579 implementing accounts\n *\n * ModePayload: 22 bytes\n * Mode payload is used to pass additional data to the smart account execution, this may be\n * interpreted depending on the ModeSelector\n *\n * ExecutionCallData: n bytes\n * single, delegatecall or batch exec abi.encoded as bytes\n */\n\n// Custom type for improved developer experience\ntype ModeCode is bytes32;\n\ntype CallType is bytes1;\n\ntype ExecType is bytes1;\n\ntype ModeSelector is bytes4;\n\ntype ModePayload is bytes22;\n\n// Default CallType\nCallType constant CALLTYPE_SINGLE = CallType.wrap(0x00);\n// Batched CallType\nCallType constant CALLTYPE_BATCH = CallType.wrap(0x01);\nCallType constant CALLTYPE_STATIC = CallType.wrap(0xFE);\n// @dev Implementing delegatecall is OPTIONAL!\n// implement delegatecall with extreme care.\nCallType constant CALLTYPE_DELEGATECALL = CallType.wrap(0xFF);\n\n// @dev default behavior is to revert on failure\n// To allow very simple accounts to use mode encoding, the default behavior is to revert on failure\n// Since this is value 0x00, no additional encoding is required for simple accounts\nExecType constant EXECTYPE_DEFAULT = ExecType.wrap(0x00);\n// @dev account may elect to change execution behavior. For example \"try exec\" / \"allow fail\"\nExecType constant EXECTYPE_TRY = ExecType.wrap(0x01);\n\nModeSelector constant MODE_DEFAULT = ModeSelector.wrap(bytes4(0x00000000));\n// Example declaration of a custom mode selector\nModeSelector constant MODE_OFFSET = ModeSelector.wrap(bytes4(keccak256(\"default.mode.offset\")));\n\n/**\n * @dev ModeLib is a helper library to encode/decode ModeCodes\n */\nlibrary ModeLib {\n function decode(ModeCode mode)\n internal\n pure\n returns (\n CallType _calltype,\n ExecType _execType,\n ModeSelector _modeSelector,\n ModePayload _modePayload\n )\n {\n // solhint-disable-next-line no-inline-assembly\n assembly {\n _calltype := mode\n _execType := shl(8, mode)\n _modeSelector := shl(48, mode)\n _modePayload := shl(80, mode)\n }\n }\n\n function encode(\n CallType callType,\n ExecType execType,\n ModeSelector mode,\n ModePayload payload\n )\n internal\n pure\n returns (ModeCode)\n {\n return ModeCode.wrap(\n bytes32(\n abi.encodePacked(callType, execType, bytes4(0), ModeSelector.unwrap(mode), payload)\n )\n );\n }\n\n function encodeSimpleBatch() internal pure returns (ModeCode mode) {\n mode = encode(CALLTYPE_BATCH, EXECTYPE_DEFAULT, MODE_DEFAULT, ModePayload.wrap(0x00));\n }\n\n function encodeSimpleSingle() internal pure returns (ModeCode mode) {\n mode = encode(CALLTYPE_SINGLE, EXECTYPE_DEFAULT, MODE_DEFAULT, ModePayload.wrap(0x00));\n }\n\n function getCallType(ModeCode mode) internal pure returns (CallType calltype) {\n // solhint-disable-next-line no-inline-assembly\n assembly {\n calltype := mode\n }\n }\n}\n\nusing { eqModeSelector as == } for ModeSelector global;\nusing { eqCallType as == } for CallType global;\nusing { neqCallType as != } for CallType global;\nusing { eqExecType as == } for ExecType global;\n\nfunction eqCallType(CallType a, CallType b) pure returns (bool) {\n return CallType.unwrap(a) == CallType.unwrap(b);\n}\n\nfunction neqCallType(CallType a, CallType b) pure returns (bool) {\n return CallType.unwrap(a) == CallType.unwrap(b);\n}\n\nfunction eqExecType(ExecType a, ExecType b) pure returns (bool) {\n return ExecType.unwrap(a) == ExecType.unwrap(b);\n}\n\nfunction eqModeSelector(ModeSelector a, ModeSelector b) pure returns (bool) {\n return ModeSelector.unwrap(a) == ModeSelector.unwrap(b);\n}\n"},"node_modules/@rhinestone/modulekit/src/module-bases/interfaces/IERC7484.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\ninterface IERC7484 {\n event NewTrustedAttesters();\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* Check with Registry internal attesters */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n function check(address module) external view;\n\n function checkForAccount(address smartAccount, address module) external view;\n\n function check(address module, uint256 moduleType) external view;\n\n function checkForAccount(\n address smartAccount,\n address module,\n uint256 moduleType\n )\n external\n view;\n\n /**\n * Allows Smart Accounts - the end users of the registry - to appoint\n * one or many attesters as trusted.\n * @dev this function reverts, if address(0), or duplicates are provided in attesters[]\n *\n * @param threshold The minimum number of attestations required for a module\n * to be considered secure.\n * @param attesters The addresses of the attesters to be trusted.\n */\n function trustAttesters(uint8 threshold, address[] calldata attesters) external;\n\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* Check with external attester(s) */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n function check(address module, address[] calldata attesters, uint256 threshold) external view;\n\n function check(\n address module,\n uint256 moduleType,\n address[] calldata attesters,\n uint256 threshold\n )\n external\n view;\n}\n"},"node_modules/@rhinestone/modulekit/src/module-bases/interfaces/IPolicy.sol":{"content":"// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity >=0.8.0 <0.9.0;\n\n// solhint-disable no-unused-import\nimport { PackedUserOperation, _packValidationData } from \"../../external/ERC4337.sol\";\nimport {\n IModule as IERC7579Module,\n VALIDATION_SUCCESS,\n VALIDATION_FAILED\n} from \"../../accounts/common/interfaces/IERC7579Module.sol\";\nimport { IERC165 } from \"forge-std/interfaces/IERC165.sol\";\n\ntype ConfigId is bytes32;\n\n/**\n * IPolicy are external contracts that enforce policies / permission on 4337/7579 executions\n * Since it's not the account calling into this contract, and check functions are called during the\n * ERC4337 validation\n * phase, IPolicy implementations MUST follow ERC4337 storage and opcode restrictions\n * A recommend storage layout to store policy related data:\n * mapping(id => msg.sender => userOp.sender(account) => state)\n * ^ smartSession ^ smart account (associated storage)\n */\ninterface IPolicy is IERC165, IERC7579Module {\n function isInitialized(address account, ConfigId configId) external view returns (bool);\n function isInitialized(\n address account,\n address mulitplexer,\n ConfigId configId\n )\n external\n view\n returns (bool);\n\n /**\n * This function may be called by the multiplexer (SmartSessions) without deinitializing first.\n * Policies MUST overwrite the current state when this happens\n */\n function initializeWithMultiplexer(\n address account,\n ConfigId configId,\n bytes calldata initData\n )\n external;\n}\n\n/**\n * IUserOpPolicy is a policy that enforces restrictions on user operations. It is called during the\n * validation phase\n * of the ERC4337 execution.\n * Use this policy to enforce restrictions on user operations (userOp.gas, Time based restrictions).\n * The checkUserOpPolicy function should return a uint256 value that represents the policy's\n * decision.\n * The policy's decision should be one of the following:\n * - VALIDATION_SUCCESS: The user operation is allowed.\n * - VALIDATION_FAILED: The user operation is not allowed.\n */\ninterface IUserOpPolicy is IPolicy {\n function checkUserOpPolicy(\n ConfigId id,\n PackedUserOperation calldata userOp\n )\n external\n returns (uint256);\n}\n\n/**\n * IActionPolicy is a policy that enforces restrictions on actions. It is called during the\n * validation phase\n * of the ERC4337 execution.\n * ERC7579 accounts natively support batched executions. So in one userOp, multiple actions can be\n * executed.\n * SmartSession will destruct the execution batch, and call the policy for each action, if the\n * policy is installed for\n * the actionId for the account.\n * Use this policy to enforce restrictions on individual actions (i.e. transfers, approvals, etc).\n * The checkAction function should return a uint256 value that represents the policy's decision.\n * The policy's decision should be one of the following:\n * - VALIDATION_SUCCESS: The action is allowed.\n * - VALIDATION_FAILED: The action is not allowed.\n */\ninterface IActionPolicy is IPolicy {\n function checkAction(\n ConfigId id,\n address account,\n address target,\n uint256 value,\n bytes calldata data\n )\n external\n returns (uint256);\n}\n\n/**\n * I1271Policy is a policy that enforces restrictions on 1271 signed actions. It is called during an\n * ERC1271 signature\n * validation\n */\ninterface I1271Policy is IPolicy {\n // request sender is probably protocol, so can introduce policies based on it.\n function check1271SignedAction(\n ConfigId id,\n address requestSender,\n address account,\n bytes32 hash,\n bytes calldata signature\n )\n external\n view\n returns (bool);\n}\n"},"node_modules/@ERC4337/account-abstraction/contracts/core/EntryPoint.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.23;\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable no-inline-assembly */\n\nimport \"../interfaces/IAccount.sol\";\nimport \"../interfaces/IAccountExecute.sol\";\nimport \"../interfaces/IPaymaster.sol\";\nimport \"../interfaces/IEntryPoint.sol\";\n\nimport \"../utils/Exec.sol\";\nimport \"./StakeManager.sol\";\nimport \"./SenderCreator.sol\";\nimport \"./Helpers.sol\";\nimport \"./NonceManager.sol\";\nimport \"./UserOperationLib.sol\";\nimport \"./GasDebug.sol\";\n\nimport \"@openzeppelin/contracts/utils/introspection/ERC165.sol\";\nimport \"@openzeppelin/contracts/utils/ReentrancyGuard.sol\";\n\n/*\n * Account-Abstraction (EIP-4337) singleton EntryPoint implementation.\n * Only one instance required on each chain.\n */\n\n/// @custom:security-contact https://bounty.ethereum.org\ncontract EntryPoint is IEntryPoint, StakeManager, NonceManager, ReentrancyGuard, ERC165, GasDebug {\n using UserOperationLib for PackedUserOperation;\n\n SenderCreator private immutable _senderCreator = new SenderCreator();\n\n function senderCreator() internal view virtual returns (SenderCreator) {\n return _senderCreator;\n }\n\n //compensate for innerHandleOps' emit message and deposit refund.\n // allow some slack for future gas price changes.\n uint256 private constant INNER_GAS_OVERHEAD = 10000;\n\n // Marker for inner call revert on out of gas\n bytes32 private constant INNER_OUT_OF_GAS = hex\"deaddead\";\n bytes32 private constant INNER_REVERT_LOW_PREFUND = hex\"deadaa51\";\n\n uint256 private constant REVERT_REASON_MAX_LEN = 2048;\n uint256 private constant PENALTY_PERCENT = 10;\n\n /// @inheritdoc IERC165\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n // note: solidity \"type(IEntryPoint).interfaceId\" is without inherited methods but we want to check everything\n return interfaceId\n == (type(IEntryPoint).interfaceId ^ type(IStakeManager).interfaceId ^ type(INonceManager).interfaceId)\n || interfaceId == type(IEntryPoint).interfaceId || interfaceId == type(IStakeManager).interfaceId\n || interfaceId == type(INonceManager).interfaceId || super.supportsInterface(interfaceId);\n }\n\n /**\n * Compensate the caller's beneficiary address with the collected fees of all UserOperations.\n * @param beneficiary - The address to receive the fees.\n * @param amount - Amount to transfer.\n */\n function _compensate(address payable beneficiary, uint256 amount) internal {\n require(beneficiary != address(0), \"AA90 invalid beneficiary\");\n (bool success,) = beneficiary.call{value: amount}(\"\");\n require(success, \"AA91 failed send to beneficiary\");\n }\n\n /**\n * Execute a user operation.\n * @param opIndex - Index into the opInfo array.\n * @param userOp - The userOp to execute.\n * @param opInfo - The opInfo filled by validatePrepayment for this userOp.\n * @return collected - The total amount this userOp paid.\n */\n function _executeUserOp(uint256 opIndex, PackedUserOperation calldata userOp, UserOpInfo memory opInfo)\n internal\n returns (uint256 collected)\n {\n uint256 preGas = gasleft();\n bytes memory context = getMemoryBytesFromOffset(opInfo.contextOffset);\n bool success;\n {\n uint256 saveFreePtr;\n assembly (\"memory-safe\") {\n saveFreePtr := mload(0x40)\n }\n bytes calldata callData = userOp.callData;\n bytes memory innerCall;\n bytes4 methodSig;\n assembly {\n let len := callData.length\n if gt(len, 3) { methodSig := calldataload(callData.offset) }\n }\n if (methodSig == IAccountExecute.executeUserOp.selector) {\n bytes memory executeUserOp = abi.encodeCall(IAccountExecute.executeUserOp, (userOp, opInfo.userOpHash));\n innerCall = abi.encodeCall(this.innerHandleOp, (executeUserOp, opInfo, context));\n } else {\n innerCall = abi.encodeCall(this.innerHandleOp, (callData, opInfo, context));\n }\n assembly (\"memory-safe\") {\n success := call(gas(), address(), 0, add(innerCall, 0x20), mload(innerCall), 0, 32)\n collected := mload(0)\n mstore(0x40, saveFreePtr)\n }\n }\n if (!success) {\n bytes32 innerRevertCode;\n assembly (\"memory-safe\") {\n let len := returndatasize()\n if eq(32, len) {\n returndatacopy(0, 0, 32)\n innerRevertCode := mload(0)\n }\n }\n if (innerRevertCode == INNER_OUT_OF_GAS) {\n // handleOps was called with gas limit too low. abort entire bundle.\n //can only be caused by bundler (leaving not enough gas for inner call)\n revert FailedOp(opIndex, \"AA95 out of gas\");\n } else if (innerRevertCode == INNER_REVERT_LOW_PREFUND) {\n // innerCall reverted on prefund too low. treat entire prefund as \"gas cost\"\n uint256 actualGas = preGas - gasleft() + opInfo.preOpGas;\n uint256 actualGasCost = opInfo.prefund;\n emitPrefundTooLow(opInfo);\n emitUserOperationEvent(opInfo, false, actualGasCost, actualGas);\n collected = actualGasCost;\n } else {\n emit PostOpRevertReason(\n opInfo.userOpHash,\n opInfo.mUserOp.sender,\n opInfo.mUserOp.nonce,\n Exec.getReturnData(REVERT_REASON_MAX_LEN)\n );\n\n uint256 actualGas = preGas - gasleft() + opInfo.preOpGas;\n collected = _postExecution(IPaymaster.PostOpMode.postOpReverted, opInfo, context, actualGas);\n }\n }\n }\n\n function emitUserOperationEvent(UserOpInfo memory opInfo, bool success, uint256 actualGasCost, uint256 actualGas)\n internal\n virtual\n {\n emit UserOperationEvent(\n opInfo.userOpHash,\n opInfo.mUserOp.sender,\n opInfo.mUserOp.paymaster,\n opInfo.mUserOp.nonce,\n success,\n actualGasCost,\n actualGas\n );\n }\n\n function emitPrefundTooLow(UserOpInfo memory opInfo) internal virtual {\n emit UserOperationPrefundTooLow(opInfo.userOpHash, opInfo.mUserOp.sender, opInfo.mUserOp.nonce);\n }\n\n /// @inheritdoc IEntryPoint\n function handleOps(PackedUserOperation[] calldata ops, address payable beneficiary) public nonReentrant {\n uint256 opslen = ops.length;\n UserOpInfo[] memory opInfos = new UserOpInfo[](opslen);\n\n unchecked {\n for (uint256 i = 0; i < opslen; i++) {\n UserOpInfo memory opInfo = opInfos[i];\n (uint256 validationData, uint256 pmValidationData) = _validatePrepayment(i, ops[i], opInfo);\n _validateAccountAndPaymasterValidationData(i, validationData, pmValidationData, address(0));\n }\n\n uint256 collected = 0;\n emit BeforeExecution();\n\n for (uint256 i = 0; i < opslen; i++) {\n collected += _executeUserOp(i, ops[i], opInfos[i]);\n }\n\n _compensate(beneficiary, collected);\n }\n }\n\n /// @inheritdoc IEntryPoint\n function handleAggregatedOps(UserOpsPerAggregator[] calldata opsPerAggregator, address payable beneficiary)\n public\n nonReentrant\n {\n uint256 opasLen = opsPerAggregator.length;\n uint256 totalOps = 0;\n for (uint256 i = 0; i < opasLen; i++) {\n UserOpsPerAggregator calldata opa = opsPerAggregator[i];\n PackedUserOperation[] calldata ops = opa.userOps;\n IAggregator aggregator = opa.aggregator;\n\n //address(1) is special marker of \"signature error\"\n require(address(aggregator) != address(1), \"AA96 invalid aggregator\");\n\n if (address(aggregator) != address(0)) {\n // solhint-disable-next-line no-empty-blocks\n try aggregator.validateSignatures(ops, opa.signature) {}\n catch {\n revert SignatureValidationFailed(address(aggregator));\n }\n }\n\n totalOps += ops.length;\n }\n\n UserOpInfo[] memory opInfos = new UserOpInfo[](totalOps);\n\n uint256 opIndex = 0;\n for (uint256 a = 0; a < opasLen; a++) {\n UserOpsPerAggregator calldata opa = opsPerAggregator[a];\n PackedUserOperation[] calldata ops = opa.userOps;\n IAggregator aggregator = opa.aggregator;\n\n uint256 opslen = ops.length;\n for (uint256 i = 0; i < opslen; i++) {\n UserOpInfo memory opInfo = opInfos[opIndex];\n (uint256 validationData, uint256 paymasterValidationData) = _validatePrepayment(opIndex, ops[i], opInfo);\n _validateAccountAndPaymasterValidationData(\n i, validationData, paymasterValidationData, address(aggregator)\n );\n opIndex++;\n }\n }\n\n emit BeforeExecution();\n\n uint256 collected = 0;\n opIndex = 0;\n for (uint256 a = 0; a < opasLen; a++) {\n UserOpsPerAggregator calldata opa = opsPerAggregator[a];\n emit SignatureAggregatorChanged(address(opa.aggregator));\n PackedUserOperation[] calldata ops = opa.userOps;\n uint256 opslen = ops.length;\n\n for (uint256 i = 0; i < opslen; i++) {\n collected += _executeUserOp(opIndex, ops[i], opInfos[opIndex]);\n opIndex++;\n }\n }\n emit SignatureAggregatorChanged(address(0));\n\n _compensate(beneficiary, collected);\n }\n\n /**\n * A memory copy of UserOp static fields only.\n * Excluding: callData, initCode and signature. Replacing paymasterAndData with paymaster.\n */\n struct MemoryUserOp {\n address sender;\n uint256 nonce;\n uint256 verificationGasLimit;\n uint256 callGasLimit;\n uint256 paymasterVerificationGasLimit;\n uint256 paymasterPostOpGasLimit;\n uint256 preVerificationGas;\n address paymaster;\n uint256 maxFeePerGas;\n uint256 maxPriorityFeePerGas;\n }\n\n struct UserOpInfo {\n MemoryUserOp mUserOp;\n bytes32 userOpHash;\n uint256 prefund;\n uint256 contextOffset;\n uint256 preOpGas;\n }\n\n /**\n * Inner function to handle a UserOperation.\n * Must be declared \"external\" to open a call context, but it can only be called by handleOps.\n * @param callData - The callData to execute.\n * @param opInfo - The UserOpInfo struct.\n * @param context - The context bytes.\n * @return actualGasCost - the actual cost in eth this UserOperation paid for gas\n */\n function innerHandleOp(bytes memory callData, UserOpInfo memory opInfo, bytes calldata context)\n external\n returns (uint256 actualGasCost)\n {\n uint256 preGas = gasleft();\n require(msg.sender == address(this), \"AA92 internal call only\");\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\n\n uint256 callGasLimit = mUserOp.callGasLimit;\n unchecked {\n // handleOps was called with gas limit too low. abort entire bundle.\n if (gasleft() * 63 / 64 < callGasLimit + mUserOp.paymasterPostOpGasLimit + INNER_GAS_OVERHEAD) {\n assembly (\"memory-safe\") {\n mstore(0, INNER_OUT_OF_GAS)\n revert(0, 32)\n }\n }\n }\n\n IPaymaster.PostOpMode mode = IPaymaster.PostOpMode.opSucceeded;\n if (callData.length > 0) {\n uint256 _execGas = gasleft();\n bool success = Exec.call(mUserOp.sender, 0, callData, callGasLimit);\n setGasConsumed(mUserOp.sender, 2, _execGas - gasleft());\n if (!success) {\n bytes memory result = Exec.getReturnData(REVERT_REASON_MAX_LEN);\n if (result.length > 0) {\n emit UserOperationRevertReason(opInfo.userOpHash, mUserOp.sender, mUserOp.nonce, result);\n }\n mode = IPaymaster.PostOpMode.opReverted;\n }\n }\n\n unchecked {\n uint256 actualGas = preGas - gasleft() + opInfo.preOpGas;\n return _postExecution(mode, opInfo, context, actualGas);\n }\n }\n\n /// @inheritdoc IEntryPoint\n function getUserOpHash(PackedUserOperation calldata userOp) public view returns (bytes32) {\n return keccak256(abi.encode(userOp.hash(), address(this), block.chainid));\n }\n\n /**\n * Copy general fields from userOp into the memory opInfo structure.\n * @param userOp - The user operation.\n * @param mUserOp - The memory user operation.\n */\n function _copyUserOpToMemory(PackedUserOperation calldata userOp, MemoryUserOp memory mUserOp) internal pure {\n mUserOp.sender = userOp.sender;\n mUserOp.nonce = userOp.nonce;\n (mUserOp.verificationGasLimit, mUserOp.callGasLimit) = UserOperationLib.unpackUints(userOp.accountGasLimits);\n mUserOp.preVerificationGas = userOp.preVerificationGas;\n (mUserOp.maxPriorityFeePerGas, mUserOp.maxFeePerGas) = UserOperationLib.unpackUints(userOp.gasFees);\n bytes calldata paymasterAndData = userOp.paymasterAndData;\n if (paymasterAndData.length > 0) {\n require(paymasterAndData.length >= UserOperationLib.PAYMASTER_DATA_OFFSET, \"AA93 invalid paymasterAndData\");\n (mUserOp.paymaster, mUserOp.paymasterVerificationGasLimit, mUserOp.paymasterPostOpGasLimit) =\n UserOperationLib.unpackPaymasterStaticFields(paymasterAndData);\n } else {\n mUserOp.paymaster = address(0);\n mUserOp.paymasterVerificationGasLimit = 0;\n mUserOp.paymasterPostOpGasLimit = 0;\n }\n }\n\n /**\n * Get the required prefunded gas fee amount for an operation.\n * @param mUserOp - The user operation in memory.\n */\n function _getRequiredPrefund(MemoryUserOp memory mUserOp) internal pure returns (uint256 requiredPrefund) {\n unchecked {\n uint256 requiredGas = mUserOp.verificationGasLimit + mUserOp.callGasLimit\n + mUserOp.paymasterVerificationGasLimit + mUserOp.paymasterPostOpGasLimit + mUserOp.preVerificationGas;\n\n requiredPrefund = requiredGas * mUserOp.maxFeePerGas;\n }\n }\n\n /**\n * Create sender smart contract account if init code is provided.\n * @param opIndex - The operation index.\n * @param opInfo - The operation info.\n * @param initCode - The init code for the smart contract account.\n */\n function _createSenderIfNeeded(uint256 opIndex, UserOpInfo memory opInfo, bytes calldata initCode) internal {\n if (initCode.length != 0) {\n address sender = opInfo.mUserOp.sender;\n if (sender.code.length != 0) {\n revert FailedOp(opIndex, \"AA10 sender already constructed\");\n }\n uint256 _creationGas = gasleft();\n address sender1 = senderCreator().createSender{gas: opInfo.mUserOp.verificationGasLimit}(initCode);\n setGasConsumed(sender, 0, _creationGas - gasleft());\n if (sender1 == address(0)) {\n revert FailedOp(opIndex, \"AA13 initCode failed or OOG\");\n }\n if (sender1 != sender) {\n revert FailedOp(opIndex, \"AA14 initCode must return sender\");\n }\n if (sender1.code.length == 0) {\n revert FailedOp(opIndex, \"AA15 initCode must create sender\");\n }\n address factory = address(bytes20(initCode[0:20]));\n emit AccountDeployed(opInfo.userOpHash, sender, factory, opInfo.mUserOp.paymaster);\n }\n }\n\n /// @inheritdoc IEntryPoint\n function getSenderAddress(bytes calldata initCode) public {\n address sender = senderCreator().createSender(initCode);\n revert SenderAddressResult(sender);\n }\n\n /**\n * Call account.validateUserOp.\n * Revert (with FailedOp) in case validateUserOp reverts, or account didn't send required prefund.\n * Decrement account's deposit if needed.\n * @param opIndex - The operation index.\n * @param op - The user operation.\n * @param opInfo - The operation info.\n * @param requiredPrefund - The required prefund amount.\n */\n function _validateAccountPrepayment(\n uint256 opIndex,\n PackedUserOperation calldata op,\n UserOpInfo memory opInfo,\n uint256 requiredPrefund,\n uint256 verificationGasLimit\n ) internal returns (uint256 validationData) {\n unchecked {\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\n address sender = mUserOp.sender;\n _createSenderIfNeeded(opIndex, opInfo, op.initCode);\n address paymaster = mUserOp.paymaster;\n uint256 missingAccountFunds = 0;\n if (paymaster == address(0)) {\n uint256 bal = balanceOf(sender);\n missingAccountFunds = bal > requiredPrefund ? 0 : requiredPrefund - bal;\n }\n uint256 _verificationGas = gasleft();\n try IAccount(sender).validateUserOp{gas: verificationGasLimit}(op, opInfo.userOpHash, missingAccountFunds)\n returns (uint256 _validationData) {\n validationData = _validationData;\n setGasConsumed(sender, 1, _verificationGas - gasleft());\n } catch {\n revert FailedOpWithRevert(opIndex, \"AA23 reverted\", Exec.getReturnData(REVERT_REASON_MAX_LEN));\n }\n if (paymaster == address(0)) {\n DepositInfo storage senderInfo = deposits[sender];\n uint256 deposit = senderInfo.deposit;\n if (requiredPrefund > deposit) {\n revert FailedOp(opIndex, \"AA21 didn't pay prefund\");\n }\n senderInfo.deposit = deposit - requiredPrefund;\n }\n }\n }\n\n /**\n * In case the request has a paymaster:\n * - Validate paymaster has enough deposit.\n * - Call paymaster.validatePaymasterUserOp.\n * - Revert with proper FailedOp in case paymaster reverts.\n * - Decrement paymaster's deposit.\n * @param opIndex - The operation index.\n * @param op - The user operation.\n * @param opInfo - The operation info.\n * @param requiredPreFund - The required prefund amount.\n */\n function _validatePaymasterPrepayment(\n uint256 opIndex,\n PackedUserOperation calldata op,\n UserOpInfo memory opInfo,\n uint256 requiredPreFund\n ) internal returns (bytes memory context, uint256 validationData) {\n unchecked {\n uint256 preGas = gasleft();\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\n address paymaster = mUserOp.paymaster;\n DepositInfo storage paymasterInfo = deposits[paymaster];\n uint256 deposit = paymasterInfo.deposit;\n if (deposit < requiredPreFund) {\n revert FailedOp(opIndex, \"AA31 paymaster deposit too low\");\n }\n paymasterInfo.deposit = deposit - requiredPreFund;\n uint256 pmVerificationGasLimit = mUserOp.paymasterVerificationGasLimit;\n try IPaymaster(paymaster).validatePaymasterUserOp{gas: pmVerificationGasLimit}(\n op, opInfo.userOpHash, requiredPreFund\n ) returns (bytes memory _context, uint256 _validationData) {\n context = _context;\n validationData = _validationData;\n } catch {\n revert FailedOpWithRevert(opIndex, \"AA33 reverted\", Exec.getReturnData(REVERT_REASON_MAX_LEN));\n }\n if (preGas - gasleft() > pmVerificationGasLimit) {\n revert FailedOp(opIndex, \"AA36 over paymasterVerificationGasLimit\");\n }\n }\n }\n\n /**\n * Revert if either account validationData or paymaster validationData is expired.\n * @param opIndex - The operation index.\n * @param validationData - The account validationData.\n * @param paymasterValidationData - The paymaster validationData.\n * @param expectedAggregator - The expected aggregator.\n */\n function _validateAccountAndPaymasterValidationData(\n uint256 opIndex,\n uint256 validationData,\n uint256 paymasterValidationData,\n address expectedAggregator\n ) internal view {\n (address aggregator, bool outOfTimeRange) = _getValidationData(validationData);\n if (expectedAggregator != aggregator) {\n revert FailedOp(opIndex, \"AA24 signature error\");\n }\n if (outOfTimeRange) {\n revert FailedOp(opIndex, \"AA22 expired or not due\");\n }\n // pmAggregator is not a real signature aggregator: we don't have logic to handle it as address.\n // Non-zero address means that the paymaster fails due to some signature check (which is ok only during estimation).\n address pmAggregator;\n (pmAggregator, outOfTimeRange) = _getValidationData(paymasterValidationData);\n if (pmAggregator != address(0)) {\n revert FailedOp(opIndex, \"AA34 signature error\");\n }\n if (outOfTimeRange) {\n revert FailedOp(opIndex, \"AA32 paymaster expired or not due\");\n }\n }\n\n /**\n * Parse validationData into its components.\n * @param validationData - The packed validation data (sigFailed, validAfter, validUntil).\n * @return aggregator the aggregator of the validationData\n * @return outOfTimeRange true if current time is outside the time range of this validationData.\n */\n function _getValidationData(uint256 validationData)\n internal\n view\n returns (address aggregator, bool outOfTimeRange)\n {\n if (validationData == 0) {\n return (address(0), false);\n }\n ValidationData memory data = _parseValidationData(validationData);\n // solhint-disable-next-line not-rely-on-time\n outOfTimeRange = block.timestamp > data.validUntil || block.timestamp < data.validAfter;\n aggregator = data.aggregator;\n }\n\n /**\n * Validate account and paymaster (if defined) and\n * also make sure total validation doesn't exceed verificationGasLimit.\n * This method is called off-chain (simulateValidation()) and on-chain (from handleOps)\n * @param opIndex - The index of this userOp into the \"opInfos\" array.\n * @param userOp - The userOp to validate.\n */\n function _validatePrepayment(uint256 opIndex, PackedUserOperation calldata userOp, UserOpInfo memory outOpInfo)\n internal\n returns (uint256 validationData, uint256 paymasterValidationData)\n {\n uint256 preGas = gasleft();\n MemoryUserOp memory mUserOp = outOpInfo.mUserOp;\n _copyUserOpToMemory(userOp, mUserOp);\n outOpInfo.userOpHash = getUserOpHash(userOp);\n\n // Validate all numeric values in userOp are well below 128 bit, so they can safely be added\n // and multiplied without causing overflow.\n uint256 verificationGasLimit = mUserOp.verificationGasLimit;\n uint256 maxGasValues = mUserOp.preVerificationGas | verificationGasLimit | mUserOp.callGasLimit\n | mUserOp.paymasterVerificationGasLimit | mUserOp.paymasterPostOpGasLimit | mUserOp.maxFeePerGas\n | mUserOp.maxPriorityFeePerGas;\n require(maxGasValues <= type(uint120).max, \"AA94 gas values overflow\");\n\n uint256 requiredPreFund = _getRequiredPrefund(mUserOp);\n validationData = _validateAccountPrepayment(opIndex, userOp, outOpInfo, requiredPreFund, verificationGasLimit);\n\n if (!_validateAndUpdateNonce(mUserOp.sender, mUserOp.nonce)) {\n revert FailedOp(opIndex, \"AA25 invalid account nonce\");\n }\n\n unchecked {\n if (preGas - gasleft() > verificationGasLimit) {\n revert FailedOp(opIndex, \"AA26 over verificationGasLimit\");\n }\n }\n\n bytes memory context;\n if (mUserOp.paymaster != address(0)) {\n (context, paymasterValidationData) =\n _validatePaymasterPrepayment(opIndex, userOp, outOpInfo, requiredPreFund);\n }\n unchecked {\n outOpInfo.prefund = requiredPreFund;\n outOpInfo.contextOffset = getOffsetOfMemoryBytes(context);\n outOpInfo.preOpGas = preGas - gasleft() + userOp.preVerificationGas;\n }\n }\n\n /**\n * Process post-operation, called just after the callData is executed.\n * If a paymaster is defined and its validation returned a non-empty context, its postOp is called.\n * The excess amount is refunded to the account (or paymaster - if it was used in the request).\n * @param mode - Whether is called from innerHandleOp, or outside (postOpReverted).\n * @param opInfo - UserOp fields and info collected during validation.\n * @param context - The context returned in validatePaymasterUserOp.\n * @param actualGas - The gas used so far by this user operation.\n */\n function _postExecution(\n IPaymaster.PostOpMode mode,\n UserOpInfo memory opInfo,\n bytes memory context,\n uint256 actualGas\n ) private returns (uint256 actualGasCost) {\n uint256 preGas = gasleft();\n unchecked {\n address refundAddress;\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\n uint256 gasPrice = getUserOpGasPrice(mUserOp);\n\n address paymaster = mUserOp.paymaster;\n if (paymaster == address(0)) {\n refundAddress = mUserOp.sender;\n } else {\n refundAddress = paymaster;\n if (context.length > 0) {\n actualGasCost = actualGas * gasPrice;\n if (mode != IPaymaster.PostOpMode.postOpReverted) {\n try IPaymaster(paymaster).postOp{gas: mUserOp.paymasterPostOpGasLimit}(\n mode, context, actualGasCost, gasPrice\n ) {\n // solhint-disable-next-line no-empty-blocks\n } catch {\n bytes memory reason = Exec.getReturnData(REVERT_REASON_MAX_LEN);\n revert PostOpReverted(reason);\n }\n }\n }\n }\n actualGas += preGas - gasleft();\n\n // Calculating a penalty for unused execution gas\n {\n uint256 executionGasLimit = mUserOp.callGasLimit + mUserOp.paymasterPostOpGasLimit;\n uint256 executionGasUsed = actualGas - opInfo.preOpGas;\n // this check is required for the gas used within EntryPoint and not covered by explicit gas limits\n if (executionGasLimit > executionGasUsed) {\n uint256 unusedGas = executionGasLimit - executionGasUsed;\n uint256 unusedGasPenalty = (unusedGas * PENALTY_PERCENT) / 100;\n actualGas += unusedGasPenalty;\n }\n }\n\n actualGasCost = actualGas * gasPrice;\n uint256 prefund = opInfo.prefund;\n if (prefund < actualGasCost) {\n if (mode == IPaymaster.PostOpMode.postOpReverted) {\n actualGasCost = prefund;\n emitPrefundTooLow(opInfo);\n emitUserOperationEvent(opInfo, false, actualGasCost, actualGas);\n } else {\n assembly (\"memory-safe\") {\n mstore(0, INNER_REVERT_LOW_PREFUND)\n revert(0, 32)\n }\n }\n } else {\n uint256 refund = prefund - actualGasCost;\n _incrementDeposit(refundAddress, refund);\n bool success = mode == IPaymaster.PostOpMode.opSucceeded;\n emitUserOperationEvent(opInfo, success, actualGasCost, actualGas);\n }\n } // unchecked\n }\n\n /**\n * The gas price this UserOp agrees to pay.\n * Relayer/block builder might submit the TX with higher priorityFee, but the user should not.\n * @param mUserOp - The userOp to get the gas price from.\n */\n function getUserOpGasPrice(MemoryUserOp memory mUserOp) internal view returns (uint256) {\n unchecked {\n uint256 maxFeePerGas = mUserOp.maxFeePerGas;\n uint256 maxPriorityFeePerGas = mUserOp.maxPriorityFeePerGas;\n if (maxFeePerGas == maxPriorityFeePerGas) {\n //legacy mode (for networks that don't support basefee opcode)\n return maxFeePerGas;\n }\n return min(maxFeePerGas, maxPriorityFeePerGas + block.basefee);\n }\n }\n\n /**\n * The offset of the given bytes in memory.\n * @param data - The bytes to get the offset of.\n */\n function getOffsetOfMemoryBytes(bytes memory data) internal pure returns (uint256 offset) {\n assembly {\n offset := data\n }\n }\n\n /**\n * The bytes in memory at the given offset.\n * @param offset - The offset to get the bytes from.\n */\n function getMemoryBytesFromOffset(uint256 offset) internal pure returns (bytes memory data) {\n assembly (\"memory-safe\") {\n data := offset\n }\n }\n\n /// @inheritdoc IEntryPoint\n function delegateAndRevert(address target, bytes calldata data) external {\n (bool success, bytes memory ret) = target.delegatecall(data);\n revert DelegateAndRevert(success, ret);\n }\n}\n"},"node_modules/@ERC4337/account-abstraction/contracts/interfaces/IAggregator.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\npragma solidity >=0.7.5;\n\nimport \"./PackedUserOperation.sol\";\n\n/**\n * Aggregated Signatures validator.\n */\ninterface IAggregator {\n /**\n * Validate aggregated signature.\n * Revert if the aggregated signature does not match the given list of operations.\n * @param userOps - Array of UserOperations to validate the signature for.\n * @param signature - The aggregated signature.\n */\n function validateSignatures(\n PackedUserOperation[] calldata userOps,\n bytes calldata signature\n ) external view;\n\n /**\n * Validate signature of a single userOp.\n * This method should be called by bundler after EntryPointSimulation.simulateValidation() returns\n * the aggregator this account uses.\n * First it validates the signature over the userOp. Then it returns data to be used when creating the handleOps.\n * @param userOp - The userOperation received from the user.\n * @return sigForUserOp - The value to put into the signature field of the userOp when calling handleOps.\n * (usually empty, unless account and aggregator support some kind of \"multisig\".\n */\n function validateUserOpSignature(\n PackedUserOperation calldata userOp\n ) external view returns (bytes memory sigForUserOp);\n\n /**\n * Aggregate multiple signatures into a single value.\n * This method is called off-chain to calculate the signature to pass with handleOps()\n * bundler MAY use optimized custom code perform this aggregation.\n * @param userOps - Array of UserOperations to collect the signatures from.\n * @return aggregatedSignature - The aggregated signature.\n */\n function aggregateSignatures(\n PackedUserOperation[] calldata userOps\n ) external view returns (bytes memory aggregatedSignature);\n}\n"},"node_modules/@ERC4337/account-abstraction/contracts/interfaces/INonceManager.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\npragma solidity >=0.7.5;\n\ninterface INonceManager {\n\n /**\n * Return the next nonce for this sender.\n * Within a given key, the nonce values are sequenced (starting with zero, and incremented by one on each userop)\n * But UserOp with different keys can come with arbitrary order.\n *\n * @param sender the account address\n * @param key the high 192 bit of the nonce\n * @return nonce a full nonce to pass for next UserOp with this sender.\n */\n function getNonce(address sender, uint192 key)\n external view returns (uint256 nonce);\n\n /**\n * Manually increment the nonce of the sender.\n * This method is exposed just for completeness..\n * Account does NOT need to call it, neither during validation, nor elsewhere,\n * as the EntryPoint will update the nonce regardless.\n * Possible use-case is call it with various keys to \"initialize\" their nonces to one, so that future\n * UserOperations will not pay extra for the first transaction with a given key.\n */\n function incrementNonce(uint192 key) external;\n}\n"},"node_modules/forge-std/src/interfaces/IERC165.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity >=0.6.2;\n\ninterface IERC165 {\n /// @notice Query if a contract implements an interface\n /// @param interfaceID The interface identifier, as specified in ERC-165\n /// @dev Interface identification is specified in ERC-165. This function\n /// uses less than 30,000 gas.\n /// @return `true` if the contract implements `interfaceID` and\n /// `interfaceID` is not 0xffffffff, `false` otherwise\n function supportsInterface(bytes4 interfaceID) external view returns (bool);\n}\n"},"node_modules/@ERC4337/account-abstraction/contracts/interfaces/IPaymaster.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\npragma solidity >=0.7.5;\n\nimport \"./PackedUserOperation.sol\";\n\n/**\n * The interface exposed by a paymaster contract, who agrees to pay the gas for user's operations.\n * A paymaster must hold a stake to cover the required entrypoint stake and also the gas for the transaction.\n */\ninterface IPaymaster {\n enum PostOpMode {\n // User op succeeded.\n opSucceeded,\n // User op reverted. Still has to pay for gas.\n opReverted,\n // Only used internally in the EntryPoint (cleanup after postOp reverts). Never calling paymaster with this value\n postOpReverted\n }\n\n /**\n * Payment validation: check if paymaster agrees to pay.\n * Must verify sender is the entryPoint.\n * Revert to reject this request.\n * Note that bundlers will reject this method if it changes the state, unless the paymaster is trusted (whitelisted).\n * The paymaster pre-pays using its deposit, and receive back a refund after the postOp method returns.\n * @param userOp - The user operation.\n * @param userOpHash - Hash of the user's request data.\n * @param maxCost - The maximum cost of this transaction (based on maximum gas and gas price from userOp).\n * @return context - Value to send to a postOp. Zero length to signify postOp is not required.\n * @return validationData - Signature and time-range of this operation, encoded the same as the return\n * value of validateUserOperation.\n * <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure,\n * other values are invalid for paymaster.\n * <6-byte> validUntil - last timestamp this operation is valid. 0 for \"indefinite\"\n * <6-byte> validAfter - first timestamp this operation is valid\n * Note that the validation code cannot use block.timestamp (or block.number) directly.\n */\n function validatePaymasterUserOp(\n PackedUserOperation calldata userOp,\n bytes32 userOpHash,\n uint256 maxCost\n ) external returns (bytes memory context, uint256 validationData);\n\n /**\n * Post-operation handler.\n * Must verify sender is the entryPoint.\n * @param mode - Enum with the following options:\n * opSucceeded - User operation succeeded.\n * opReverted - User op reverted. The paymaster still has to pay for gas.\n * postOpReverted - never passed in a call to postOp().\n * @param context - The context value returned by validatePaymasterUserOp\n * @param actualGasCost - Actual gas used so far (without this postOp call).\n * @param actualUserOpFeePerGas - the gas price this UserOp pays. This value is based on the UserOp's maxFeePerGas\n * and maxPriorityFee (and basefee)\n * It is not the same as tx.gasprice, which is what the bundler pays.\n */\n function postOp(\n PostOpMode mode,\n bytes calldata context,\n uint256 actualGasCost,\n uint256 actualUserOpFeePerGas\n ) external;\n}\n"},"node_modules/@ERC4337/account-abstraction/contracts/utils/Exec.sol":{"content":"// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity ^0.8.23;\n\n// solhint-disable no-inline-assembly\n\n/**\n * Utility functions helpful when making different kinds of contract calls in Solidity.\n */\nlibrary Exec {\n\n function call(\n address to,\n uint256 value,\n bytes memory data,\n uint256 txGas\n ) internal returns (bool success) {\n assembly (\"memory-safe\") {\n success := call(txGas, to, value, add(data, 0x20), mload(data), 0, 0)\n }\n }\n\n function staticcall(\n address to,\n bytes memory data,\n uint256 txGas\n ) internal view returns (bool success) {\n assembly (\"memory-safe\") {\n success := staticcall(txGas, to, add(data, 0x20), mload(data), 0, 0)\n }\n }\n\n function delegateCall(\n address to,\n bytes memory data,\n uint256 txGas\n ) internal returns (bool success) {\n assembly (\"memory-safe\") {\n success := delegatecall(txGas, to, add(data, 0x20), mload(data), 0, 0)\n }\n }\n\n // get returned data from last call or calldelegate\n function getReturnData(uint256 maxLen) internal pure returns (bytes memory returnData) {\n assembly (\"memory-safe\") {\n let len := returndatasize()\n if gt(len, maxLen) {\n len := maxLen\n }\n let ptr := mload(0x40)\n mstore(0x40, add(ptr, add(len, 0x20)))\n mstore(ptr, len)\n returndatacopy(add(ptr, 0x20), 0, len)\n returnData := ptr\n }\n }\n\n // revert with explicit byte array (probably reverted info from call)\n function revertWithData(bytes memory returnData) internal pure {\n assembly (\"memory-safe\") {\n revert(add(returnData, 32), mload(returnData))\n }\n }\n\n function callAndRevert(address to, bytes memory data, uint256 maxLen) internal {\n bool success = call(to,0,data,gasleft());\n if (!success) {\n revertWithData(getReturnData(maxLen));\n }\n }\n}\n"},"node_modules/@ERC4337/account-abstraction/contracts/core/StakeManager.sol":{"content":"// SPDX-License-Identifier: GPL-3.0-only\npragma solidity ^0.8.23;\n\nimport \"../interfaces/IStakeManager.sol\";\n\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable not-rely-on-time */\n\n/**\n * Manage deposits and stakes.\n * Deposit is just a balance used to pay for UserOperations (either by a paymaster or an account).\n * Stake is value locked for at least \"unstakeDelay\" by a paymaster.\n */\nabstract contract StakeManager is IStakeManager {\n /// maps paymaster to their deposits and stakes\n mapping(address => DepositInfo) public deposits;\n\n /// @inheritdoc IStakeManager\n function getDepositInfo(\n address account\n ) public view returns (DepositInfo memory info) {\n return deposits[account];\n }\n\n /**\n * Internal method to return just the stake info.\n * @param addr - The account to query.\n */\n function _getStakeInfo(\n address addr\n ) internal view returns (StakeInfo memory info) {\n DepositInfo storage depositInfo = deposits[addr];\n info.stake = depositInfo.stake;\n info.unstakeDelaySec = depositInfo.unstakeDelaySec;\n }\n\n /// @inheritdoc IStakeManager\n function balanceOf(address account) public view returns (uint256) {\n return deposits[account].deposit;\n }\n\n receive() external payable {\n depositTo(msg.sender);\n }\n\n /**\n * Increments an account's deposit.\n * @param account - The account to increment.\n * @param amount - The amount to increment by.\n * @return the updated deposit of this account\n */\n function _incrementDeposit(address account, uint256 amount) internal returns (uint256) {\n DepositInfo storage info = deposits[account];\n uint256 newAmount = info.deposit + amount;\n info.deposit = newAmount;\n return newAmount;\n }\n\n /**\n * Add to the deposit of the given account.\n * @param account - The account to add to.\n */\n function depositTo(address account) public virtual payable {\n uint256 newDeposit = _incrementDeposit(account, msg.value);\n emit Deposited(account, newDeposit);\n }\n\n /**\n * Add to the account's stake - amount and delay\n * any pending unstake is first cancelled.\n * @param unstakeDelaySec The new lock duration before the deposit can be withdrawn.\n */\n function addStake(uint32 unstakeDelaySec) public payable {\n DepositInfo storage info = deposits[msg.sender];\n require(unstakeDelaySec > 0, \"must specify unstake delay\");\n require(\n unstakeDelaySec >= info.unstakeDelaySec,\n \"cannot decrease unstake time\"\n );\n uint256 stake = info.stake + msg.value;\n require(stake > 0, \"no stake specified\");\n require(stake <= type(uint112).max, \"stake overflow\");\n deposits[msg.sender] = DepositInfo(\n info.deposit,\n true,\n uint112(stake),\n unstakeDelaySec,\n 0\n );\n emit StakeLocked(msg.sender, stake, unstakeDelaySec);\n }\n\n /**\n * Attempt to unlock the stake.\n * The value can be withdrawn (using withdrawStake) after the unstake delay.\n */\n function unlockStake() external {\n DepositInfo storage info = deposits[msg.sender];\n require(info.unstakeDelaySec != 0, \"not staked\");\n require(info.staked, \"already unstaking\");\n uint48 withdrawTime = uint48(block.timestamp) + info.unstakeDelaySec;\n info.withdrawTime = withdrawTime;\n info.staked = false;\n emit StakeUnlocked(msg.sender, withdrawTime);\n }\n\n /**\n * Withdraw from the (unlocked) stake.\n * Must first call unlockStake and wait for the unstakeDelay to pass.\n * @param withdrawAddress - The address to send withdrawn value.\n */\n function withdrawStake(address payable withdrawAddress) external {\n DepositInfo storage info = deposits[msg.sender];\n uint256 stake = info.stake;\n require(stake > 0, \"No stake to withdraw\");\n require(info.withdrawTime > 0, \"must call unlockStake() first\");\n require(\n info.withdrawTime <= block.timestamp,\n \"Stake withdrawal is not due\"\n );\n info.unstakeDelaySec = 0;\n info.withdrawTime = 0;\n info.stake = 0;\n emit StakeWithdrawn(msg.sender, withdrawAddress, stake);\n (bool success,) = withdrawAddress.call{value: stake}(\"\");\n require(success, \"failed to withdraw stake\");\n }\n\n /**\n * Withdraw from the deposit.\n * @param withdrawAddress - The address to send withdrawn value.\n * @param withdrawAmount - The amount to withdraw.\n */\n function withdrawTo(\n address payable withdrawAddress,\n uint256 withdrawAmount\n ) external {\n DepositInfo storage info = deposits[msg.sender];\n require(withdrawAmount <= info.deposit, \"Withdraw amount too large\");\n info.deposit = info.deposit - withdrawAmount;\n emit Withdrawn(msg.sender, withdrawAddress, withdrawAmount);\n (bool success,) = withdrawAddress.call{value: withdrawAmount}(\"\");\n require(success, \"failed to withdraw\");\n }\n}\n"},"node_modules/@ERC4337/account-abstraction/contracts/core/SenderCreator.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.23;\n\n/**\n * Helper contract for EntryPoint, to call userOp.initCode from a \"neutral\" address,\n * which is explicitly not the entryPoint itself.\n */\ncontract SenderCreator {\n /**\n * Call the \"initCode\" factory to create and return the sender account address.\n * @param initCode - The initCode value from a UserOp. contains 20 bytes of factory address,\n * followed by calldata.\n * @return sender - The returned address of the created account, or zero address on failure.\n */\n function createSender(\n bytes calldata initCode\n ) external returns (address sender) {\n address factory = address(bytes20(initCode[0:20]));\n bytes memory initCallData = initCode[20:];\n bool success;\n /* solhint-disable no-inline-assembly */\n assembly (\"memory-safe\") {\n success := call(\n gas(),\n factory,\n 0,\n add(initCallData, 0x20),\n mload(initCallData),\n 0,\n 32\n )\n sender := mload(0)\n }\n if (!success) {\n sender = address(0);\n }\n }\n}\n"},"node_modules/@ERC4337/account-abstraction/contracts/core/NonceManager.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.23;\n\nimport \"../interfaces/INonceManager.sol\";\n\n/**\n * nonce management functionality\n */\nabstract contract NonceManager is INonceManager {\n\n /**\n * The next valid sequence number for a given nonce key.\n */\n mapping(address => mapping(uint192 => uint256)) public nonceSequenceNumber;\n\n /// @inheritdoc INonceManager\n function getNonce(address sender, uint192 key)\n public view override returns (uint256 nonce) {\n return nonceSequenceNumber[sender][key] | (uint256(key) << 64);\n }\n\n // allow an account to manually increment its own nonce.\n // (mainly so that during construction nonce can be made non-zero,\n // to \"absorb\" the gas cost of first nonce increment to 1st transaction (construction),\n // not to 2nd transaction)\n function incrementNonce(uint192 key) public override {\n nonceSequenceNumber[msg.sender][key]++;\n }\n\n /**\n * validate nonce uniqueness for this account.\n * called just after validateUserOp()\n * @return true if the nonce was incremented successfully.\n * false if the current nonce doesn't match the given one.\n */\n function _validateAndUpdateNonce(address sender, uint256 nonce) internal returns (bool) {\n\n uint192 key = uint192(nonce >> 64);\n uint64 seq = uint64(nonce);\n return nonceSequenceNumber[sender][key]++ == seq;\n }\n\n}\n"},"node_modules/@ERC4337/account-abstraction/contracts/core/GasDebug.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.23;\n\ncontract GasDebug {\n // Phase 0: account creation\n // Phase 1: validation\n // Phase 2: execution\n mapping(address account => mapping(uint256 phase => uint256 gas)) gasConsumed;\n\n function setGasConsumed(address account, uint256 phase, uint256 gas) internal {\n gasConsumed[account][phase] = gas;\n }\n\n function getGasConsumed(address account, uint256 phase) public view returns (uint256) {\n return gasConsumed[account][phase];\n }\n}\n"},"node_modules/@openzeppelin/contracts/utils/introspection/ERC165.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/introspection/ERC165.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC165} from \"./IERC165.sol\";\n\n/**\n * @dev Implementation of the {IERC165} interface.\n *\n * Contracts that want to implement ERC-165 should inherit from this contract and override {supportsInterface} to check\n * for the additional interface id that will be supported. For example:\n *\n * ```solidity\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\n * }\n * ```\n */\nabstract contract ERC165 is IERC165 {\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {\n return interfaceId == type(IERC165).interfaceId;\n }\n}\n"},"node_modules/@openzeppelin/contracts/utils/ReentrancyGuard.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/ReentrancyGuard.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Contract module that helps prevent reentrant calls to a function.\n *\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\n * available, which can be applied to functions to make sure there are no nested\n * (reentrant) calls to them.\n *\n * Note that because there is a single `nonReentrant` guard, functions marked as\n * `nonReentrant` may not call one another. This can be worked around by making\n * those functions `private`, and then adding `external` `nonReentrant` entry\n * points to them.\n *\n * TIP: If EIP-1153 (transient storage) is available on the chain you're deploying at,\n * consider using {ReentrancyGuardTransient} instead.\n *\n * TIP: If you would like to learn more about reentrancy and alternative ways\n * to protect against it, check out our blog post\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\n */\nabstract contract ReentrancyGuard {\n // Booleans are more expensive than uint256 or any type that takes up a full\n // word because each write operation emits an extra SLOAD to first read the\n // slot's contents, replace the bits taken up by the boolean, and then write\n // back. This is the compiler's defense against contract upgrades and\n // pointer aliasing, and it cannot be disabled.\n\n // The values being non-zero value makes deployment a bit more expensive,\n // but in exchange the refund on every call to nonReentrant will be lower in\n // amount. Since refunds are capped to a percentage of the total\n // transaction's gas, it is best to keep them low in cases like this one, to\n // increase the likelihood of the full refund coming into effect.\n uint256 private constant NOT_ENTERED = 1;\n uint256 private constant ENTERED = 2;\n\n uint256 private _status;\n\n /**\n * @dev Unauthorized reentrant call.\n */\n error ReentrancyGuardReentrantCall();\n\n constructor() {\n _status = NOT_ENTERED;\n }\n\n /**\n * @dev Prevents a contract from calling itself, directly or indirectly.\n * Calling a `nonReentrant` function from another `nonReentrant`\n * function is not supported. It is possible to prevent this from happening\n * by making the `nonReentrant` function external, and making it call a\n * `private` function that does the actual work.\n */\n modifier nonReentrant() {\n _nonReentrantBefore();\n _;\n _nonReentrantAfter();\n }\n\n function _nonReentrantBefore() private {\n // On the first call to nonReentrant, _status will be NOT_ENTERED\n if (_status == ENTERED) {\n revert ReentrancyGuardReentrantCall();\n }\n\n // Any calls to nonReentrant after this point will fail\n _status = ENTERED;\n }\n\n function _nonReentrantAfter() private {\n // By storing the original value once again, a refund is triggered (see\n // https://eips.ethereum.org/EIPS/eip-2200)\n _status = NOT_ENTERED;\n }\n\n /**\n * @dev Returns true if the reentrancy guard is currently set to \"entered\", which indicates there is a\n * `nonReentrant` function in the call stack.\n */\n function _reentrancyGuardEntered() internal view returns (bool) {\n return _status == ENTERED;\n }\n}\n"},"node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/introspection/IERC165.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Interface of the ERC-165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[ERC].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165 {\n /**\n * @dev Returns true if this contract implements the interface defined by\n * `interfaceId`. See the corresponding\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section]\n * to learn more about how these ids are created.\n *\n * This function call must use less than 30 000 gas.\n */\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n"}},"settings":{"remappings":["@rhinestone/=node_modules/@rhinestone/","sentinellist/=node_modules/@rhinestone/sentinellist/src/","erc4337-validation/=node_modules/@rhinestone/erc4337-validation/src/","modulekit/=node_modules/@rhinestone/modulekit/src/","checknsignatures/=node_modules/@rhinestone/checknsignatures/src/","flatbytes/=node_modules/@rhinestone/flatbytes/src/","@ERC4337/=node_modules/@ERC4337/","account-abstraction/=node_modules/@ERC4337/account-abstraction/contracts/","account-abstraction-v0.6/=node_modules/@ERC4337/account-abstraction-v0.6/contracts/","@openzeppelin/=node_modules/@openzeppelin/","@safe-global/=node_modules/@safe-global/","ds-test/=node_modules/ds-test/src/","forge-std/=node_modules/forge-std/src/","solady/=node_modules/solady/src/","solarray/=node_modules/solarray/src/","@prb/math/=node_modules/@prb/math/src/","solmate/=node_modules/solmate/src/","ExcessivelySafeCall/=node_modules/excessively-safe-call/src/","@webauthn/=node_modules/webauthn-sol/src/","@erc7579/enumerablemap4337/=node_modules/@erc7579/enumerablemap4337/src/","FreshCryptoLib/=node_modules/FreshCryptoLib/solidity/src/","node_modules/webauthn-sol/src/:openzeppelin-contracts/=node_modules/@openzeppelin/","@gnosis.pm/=node_modules/@gnosis.pm/","excessively-safe-call/=node_modules/excessively-safe-call/","hardhat-deploy/=node_modules/hardhat-deploy/","hardhat/=node_modules/hardhat/","webauthn-sol/=node_modules/webauthn-sol/"],"optimizer":{"enabled":false,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode.object","evm.bytecode.sourceMap","evm.bytecode.linkReferences","evm.deployedBytecode.object","evm.deployedBytecode.sourceMap","evm.deployedBytecode.linkReferences","evm.deployedBytecode.immutableReferences","evm.methodIdentifiers","metadata"]}},"evmVersion":"cancun","viaIR":false,"libraries":{}}} +{"language":"Solidity","sources":{"src/OwnableValidator/OwnableValidator.sol":{"content":"// SPDX-License-Identifier: AGPL-3.0-only\npragma solidity ^0.8.25;\n\nimport { ERC7579ValidatorBase } from \"modulekit/Modules.sol\";\nimport { PackedUserOperation } from \"modulekit/external/ERC4337.sol\";\nimport { SignatureCheckerLib } from \"solady/utils/SignatureCheckerLib.sol\";\nimport { SentinelList4337Lib, SENTINEL } from \"sentinellist/SentinelList4337.sol\";\nimport { LibSort } from \"solady/utils/LibSort.sol\";\nimport { CheckSignatures } from \"checknsignatures/CheckNSignatures.sol\";\nimport { ECDSA } from \"solady/utils/ECDSA.sol\";\n\nuint256 constant TYPE_STATELESS_VALIDATOR = 7;\n/**\n * @title OwnableValidator\n * @dev Module that allows users to designate EOA owners that can validate transactions using a\n * threshold\n * @author Rhinestone\n */\n\ncontract OwnableValidator is ERC7579ValidatorBase {\n using LibSort for *;\n using SentinelList4337Lib for SentinelList4337Lib.SentinelList;\n\n /*//////////////////////////////////////////////////////////////////////////\n CONSTANTS & STORAGE\n //////////////////////////////////////////////////////////////////////////*/\n\n event ModuleInitialized(address indexed account);\n event ModuleUninitialized(address indexed account);\n event ThresholdSet(address indexed account, uint256 threshold);\n event OwnerAdded(address indexed account, address indexed owner);\n event OwnerRemoved(address indexed account, address indexed owner);\n\n error ThresholdNotSet();\n error InvalidThreshold();\n error NotSortedAndUnique();\n error MaxOwnersReached();\n error InvalidOwner(address owner);\n error CannotRemoveOwner();\n\n // maximum number of owners per account\n uint256 constant MAX_OWNERS = 32;\n\n // account => owners\n SentinelList4337Lib.SentinelList owners;\n // account => threshold\n mapping(address account => uint256) public threshold;\n // account => ownerCount\n mapping(address => uint256) public ownerCount;\n\n /*//////////////////////////////////////////////////////////////////////////\n CONFIG\n //////////////////////////////////////////////////////////////////////////*/\n\n /**\n * Initializes the module with the threshold and owners\n * @dev data is encoded as follows: abi.encode(threshold, owners)\n *\n * @param data encoded data containing the threshold and owners\n */\n function onInstall(bytes calldata data) external override {\n // decode the threshold and owners\n (uint256 _threshold, address[] memory _owners) = abi.decode(data, (uint256, address[]));\n\n // check that owners are sorted and uniquified\n if (!_owners.isSortedAndUniquified()) {\n revert NotSortedAndUnique();\n }\n\n // make sure the threshold is set\n if (_threshold == 0) {\n revert ThresholdNotSet();\n }\n\n // make sure the threshold is less than the number of owners\n uint256 ownersLength = _owners.length;\n if (ownersLength < _threshold) {\n revert InvalidThreshold();\n }\n\n // cache the account address\n address account = msg.sender;\n\n // set threshold\n threshold[account] = _threshold;\n\n // check if max owners is reached\n if (ownersLength > MAX_OWNERS) {\n revert MaxOwnersReached();\n }\n\n // set owner count\n ownerCount[account] = ownersLength;\n\n // initialize the owner list\n owners.init(account);\n\n // add owners to the list\n for (uint256 i = 0; i < ownersLength; i++) {\n address _owner = _owners[i];\n if (_owner == address(0)) {\n revert InvalidOwner(_owner);\n }\n owners.push(account, _owner);\n emit OwnerAdded(account, _owner);\n }\n\n emit ModuleInitialized(account);\n }\n\n /**\n * Handles the uninstallation of the module and clears the threshold and owners\n * @dev the data parameter is not used\n */\n function onUninstall(bytes calldata) external override {\n // cache the account address\n address account = msg.sender;\n\n // clear the owners\n address[] memory ownersArray;\n (ownersArray,) = owners.getEntriesPaginated(account, SENTINEL, MAX_OWNERS);\n for (uint256 i = 0; i < ownersArray.length; i++) {\n address owner = ownersArray[i];\n // remove the owner from the list\n owners.pop(account, SENTINEL, owner);\n emit OwnerRemoved(account, owner);\n }\n\n // remove the threshold\n threshold[account] = 0;\n\n // remove the owner count\n ownerCount[account] = 0;\n\n emit ModuleUninitialized(account);\n }\n\n /**\n * Checks if the module is initialized\n *\n * @param smartAccount address of the smart account\n * @return true if the module is initialized, false otherwise\n */\n function isInitialized(address smartAccount) public view returns (bool) {\n return threshold[smartAccount] != 0;\n }\n\n /**\n * Sets the threshold for the account\n * @dev the function will revert if the module is not initialized\n *\n * @param _threshold uint256 threshold to set\n */\n function setThreshold(uint256 _threshold) external {\n // cache the account address\n address account = msg.sender;\n // check if the module is initialized and revert if it is not\n if (!isInitialized(account)) revert NotInitialized(account);\n\n // make sure that the threshold is set\n if (_threshold == 0) {\n revert InvalidThreshold();\n }\n\n // make sure the threshold is less than the number of owners\n if (ownerCount[account] < _threshold) {\n revert InvalidThreshold();\n }\n\n // set the threshold\n threshold[account] = _threshold;\n\n emit ThresholdSet(account, _threshold);\n }\n\n /**\n * Adds an owner to the account\n * @dev will revert if the owner is already added\n *\n * @param owner address of the owner to add\n */\n function addOwner(address owner) external {\n // cache the account address\n address account = msg.sender;\n // check if the module is initialized and revert if it is not\n if (!isInitialized(account)) revert NotInitialized(account);\n\n // revert if the owner is address(0)\n if (owner == address(0)) {\n revert InvalidOwner(owner);\n }\n\n // check if max owners is reached\n if (ownerCount[account] >= MAX_OWNERS) {\n revert MaxOwnersReached();\n }\n\n // increment the owner count\n ownerCount[account]++;\n\n // add the owner to the linked list\n owners.push(account, owner);\n\n emit OwnerAdded(account, owner);\n }\n\n /**\n * Removes an owner from the account\n * @dev will revert if the owner is not added or the previous owner is invalid\n *\n * @param prevOwner address of the previous owner\n * @param owner address of the owner to remove\n */\n function removeOwner(address prevOwner, address owner) external {\n // cache the account address\n address account = msg.sender;\n\n // check if an owner can be removed\n if (ownerCount[account] == threshold[account]) {\n // if the owner count is equal to the threshold, revert\n // this means that removing an owner would make the threshold unreachable\n revert CannotRemoveOwner();\n }\n\n // remove the owner\n owners.pop(account, prevOwner, owner);\n\n // decrement the owner count\n ownerCount[account]--;\n\n emit OwnerRemoved(account, owner);\n }\n\n /**\n * Returns the owners of the account\n *\n * @param account address of the account\n *\n * @return ownersArray array of owners\n */\n function getOwners(address account) external view returns (address[] memory ownersArray) {\n // get the owners from the linked list\n (ownersArray,) = owners.getEntriesPaginated(account, SENTINEL, MAX_OWNERS);\n }\n\n /*//////////////////////////////////////////////////////////////////////////\n MODULE LOGIC\n //////////////////////////////////////////////////////////////////////////*/\n\n /**\n * Validates a user operation\n *\n * @param userOp PackedUserOperation struct containing the UserOperation\n * @param userOpHash bytes32 hash of the UserOperation\n *\n * @return ValidationData the UserOperation validation result\n */\n function validateUserOp(\n PackedUserOperation calldata userOp,\n bytes32 userOpHash\n )\n external\n view\n override\n returns (ValidationData)\n {\n // validate the signature with the config\n bool isValid = _validateSignatureWithConfig(\n userOp.sender, ECDSA.toEthSignedMessageHash(userOpHash), userOp.signature\n );\n\n // return the result\n if (isValid) {\n return VALIDATION_SUCCESS;\n }\n return VALIDATION_FAILED;\n }\n\n /**\n * Validates an ERC-1271 signature with the sender\n *\n * @param hash bytes32 hash of the data\n * @param data bytes data containing the signatures\n *\n * @return bytes4 EIP1271_SUCCESS if the signature is valid, EIP1271_FAILED otherwise\n */\n function isValidSignatureWithSender(\n address,\n bytes32 hash,\n bytes calldata data\n )\n external\n view\n override\n returns (bytes4)\n {\n // validate the signature with the config\n bool isValid = _validateSignatureWithConfig(msg.sender, hash, data);\n\n // return the result\n if (isValid) {\n return EIP1271_SUCCESS;\n }\n return EIP1271_FAILED;\n }\n\n /**\n * Validates a signature with the data (stateless validation)\n *\n * @param hash bytes32 hash of the data\n * @param signature bytes data containing the signatures\n * @param data bytes data containing the data\n *\n * @return bool true if the signature is valid, false otherwise\n */\n function validateSignatureWithData(\n bytes32 hash,\n bytes calldata signature,\n bytes calldata data\n )\n external\n view\n returns (bool)\n {\n // decode the threshold and owners\n (uint256 _threshold, address[] memory _owners) = abi.decode(data, (uint256, address[]));\n\n // check that owners are sorted and uniquified\n if (!_owners.isSortedAndUniquified()) {\n return false;\n }\n\n // check that threshold is set\n if (_threshold == 0) {\n return false;\n }\n\n // recover the signers from the signatures\n address[] memory signers = CheckSignatures.recoverNSignatures(hash, signature, _threshold);\n\n // sort and uniquify the signers to make sure a signer is not reused\n signers.sort();\n signers.uniquifySorted();\n\n // check if the signers are owners\n uint256 validSigners;\n uint256 signersLength = signers.length;\n for (uint256 i = 0; i < signersLength; i++) {\n (bool found,) = _owners.searchSorted(signers[i]);\n if (found) {\n validSigners++;\n }\n }\n\n // check if the threshold is met and return the result\n if (validSigners >= _threshold) {\n // if the threshold is met, return true\n return true;\n }\n // if the threshold is not met, false\n return false;\n }\n\n /*//////////////////////////////////////////////////////////////////////////\n INTERNAL\n //////////////////////////////////////////////////////////////////////////*/\n\n function _validateSignatureWithConfig(\n address account,\n bytes32 hash,\n bytes calldata data\n )\n internal\n view\n returns (bool)\n {\n // get the threshold and check that its set\n uint256 _threshold = threshold[account];\n if (_threshold == 0) {\n return false;\n }\n\n // recover the signers from the signatures\n address[] memory signers = CheckSignatures.recoverNSignatures(hash, data, _threshold);\n\n // sort and uniquify the signers to make sure a signer is not reused\n signers.sort();\n signers.uniquifySorted();\n\n // check if the signers are owners\n uint256 validSigners;\n uint256 signersLength = signers.length;\n for (uint256 i = 0; i < signersLength; i++) {\n if (owners.contains(account, signers[i])) {\n validSigners++;\n }\n }\n\n // check if the threshold is met and return the result\n if (validSigners >= _threshold) {\n // if the threshold is met, return true\n return true;\n }\n // if the threshold is not met, return false\n return false;\n }\n\n /*//////////////////////////////////////////////////////////////////////////\n METADATA\n //////////////////////////////////////////////////////////////////////////*/\n\n /**\n * Returns the type of the module\n *\n * @param typeID type of the module\n *\n * @return true if the type is a module type, false otherwise\n */\n function isModuleType(uint256 typeID) external pure override returns (bool) {\n return typeID == TYPE_VALIDATOR || typeID == TYPE_STATELESS_VALIDATOR;\n }\n\n /**\n * Returns the name of the module\n *\n * @return name of the module\n */\n function name() external pure virtual returns (string memory) {\n return \"OwnableValidator\";\n }\n\n /**\n * Returns the version of the module\n *\n * @return version of the module\n */\n function version() external pure virtual returns (string memory) {\n return \"1.0.0\";\n }\n}\n"},"node_modules/@rhinestone/modulekit/src/Modules.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity >=0.8.23 <0.9.0;\n\n/* solhint-disable no-unused-import */\n\n/*//////////////////////////////////////////////////////////////\n INTERFACES\n//////////////////////////////////////////////////////////////*/\n\nimport {\n IValidator as IERC7579Validator,\n IExecutor as IERC7579Executor,\n IFallback as IERC7579Fallback,\n IHook as IERC7579Hook,\n IModule as IERC7579Module\n} from \"./accounts/common/interfaces/IERC7579Module.sol\";\n\n/*//////////////////////////////////////////////////////////////\n BASES\n//////////////////////////////////////////////////////////////*/\n\n// Core\nimport { ERC7579ModuleBase } from \"./module-bases/ERC7579ModuleBase.sol\";\n\n// Validators\nimport { ERC7579ValidatorBase } from \"./module-bases/ERC7579ValidatorBase.sol\";\nimport { ERC7579StatelessValidatorBase } from \"./module-bases/ERC7579StatelessValidatorBase.sol\";\nimport { ERC7579HybridValidatorBase } from \"./module-bases/ERC7579HybridValidatorBase.sol\";\n\n// Executors\nimport { ERC7579ExecutorBase } from \"./module-bases/ERC7579ExecutorBase.sol\";\n\n// Hooks\nimport { ERC7579HookBase } from \"./module-bases/ERC7579HookBase.sol\";\nimport { ERC7579HookDestruct } from \"./module-bases/ERC7579HookDestruct.sol\";\n\n// Fallbacks\nimport { ERC7579FallbackBase } from \"./module-bases/ERC7579FallbackBase.sol\";\n\n// Misc\nimport { SchedulingBase } from \"./module-bases/SchedulingBase.sol\";\nimport { ERC7484RegistryAdapter } from \"./module-bases/ERC7484RegistryAdapter.sol\";\n\n// Policies\nimport { ERC7579PolicyBase } from \"./module-bases/ERC7579PolicyBase.sol\";\nimport { ERC1271Policy } from \"./module-bases/ERC1271Policy.sol\";\nimport { ERC7579ActionPolicy } from \"./module-bases/ERC7579ActionPolicy.sol\";\nimport { ERC7579UserOpPolicy } from \"./module-bases/ERC7579UserOpPolicy.sol\";\n\n/*//////////////////////////////////////////////////////////////\n UTIL\n//////////////////////////////////////////////////////////////*/\n\nimport { TrustedForwarder } from \"./module-bases/utils/TrustedForwarder.sol\";\n"},"node_modules/@rhinestone/modulekit/src/external/ERC4337.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity >=0.8.23 <0.9.0;\n\n/* solhint-disable no-unused-import */\n\n/*//////////////////////////////////////////////////////////////\n USEROP\n//////////////////////////////////////////////////////////////*/\n\nimport { PackedUserOperation } from\n \"@ERC4337/account-abstraction/contracts/interfaces/PackedUserOperation.sol\";\nimport { UserOperationLib } from \"@ERC4337/account-abstraction/contracts/core/UserOperationLib.sol\";\n\n/*//////////////////////////////////////////////////////////////\n ENTRYPOINT\n//////////////////////////////////////////////////////////////*/\n\nimport { EntryPointSimulations } from\n \"@ERC4337/account-abstraction/contracts/core/EntryPointSimulations.sol\";\n\n/*//////////////////////////////////////////////////////////////\n VALIDATION\n//////////////////////////////////////////////////////////////*/\n\nimport {\n ValidationData,\n _packValidationData\n} from \"@ERC4337/account-abstraction/contracts/core/Helpers.sol\";\n\n/*//////////////////////////////////////////////////////////////\n INTERFACES\n//////////////////////////////////////////////////////////////*/\n\nimport { IStakeManager } from \"@ERC4337/account-abstraction/contracts/interfaces/IStakeManager.sol\";\nimport { IAccount as IERC4337 } from\n \"@ERC4337/account-abstraction/contracts/interfaces/IAccount.sol\";\nimport { IAccountExecute } from\n \"@ERC4337/account-abstraction/contracts/interfaces/IAccountExecute.sol\";\nimport { IEntryPoint } from \"@ERC4337/account-abstraction/contracts/interfaces/IEntryPoint.sol\";\nimport { IEntryPointSimulations } from\n \"@ERC4337/account-abstraction/contracts/interfaces/IEntryPointSimulations.sol\";\n"},"node_modules/solady/src/utils/SignatureCheckerLib.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.4;\n\n/// @notice Signature verification helper that supports both ECDSA signatures from EOAs\n/// and ERC1271 signatures from smart contract wallets like Argent and Gnosis safe.\n/// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/SignatureCheckerLib.sol)\n/// @author Modified from OpenZeppelin (https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/cryptography/SignatureChecker.sol)\n///\n/// @dev Note:\n/// - The signature checking functions use the ecrecover precompile (0x1).\n/// - The `bytes memory signature` variants use the identity precompile (0x4)\n/// to copy memory internally.\n/// - Unlike ECDSA signatures, contract signatures are revocable.\n/// - As of Solady version 0.0.134, all `bytes signature` variants accept both\n/// regular 65-byte `(r, s, v)` and EIP-2098 `(r, vs)` short form signatures.\n/// See: https://eips.ethereum.org/EIPS/eip-2098\n/// This is for calldata efficiency on smart accounts prevalent on L2s.\n///\n/// WARNING! Do NOT use signatures as unique identifiers:\n/// - Use a nonce in the digest to prevent replay attacks on the same contract.\n/// - Use EIP-712 for the digest to prevent replay attacks across different chains and contracts.\n/// EIP-712 also enables readable signing of typed data for better user safety.\n/// This implementation does NOT check if a signature is non-malleable.\nlibrary SignatureCheckerLib {\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* SIGNATURE CHECKING OPERATIONS */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n /// @dev Returns whether `signature` is valid for `signer` and `hash`.\n /// If `signer.code.length == 0`, then validate with `ecrecover`, else\n /// it will validate with ERC1271 on `signer`.\n function isValidSignatureNow(address signer, bytes32 hash, bytes memory signature)\n internal\n view\n returns (bool isValid)\n {\n if (signer == address(0)) return isValid;\n /// @solidity memory-safe-assembly\n assembly {\n let m := mload(0x40)\n for {} 1 {} {\n if iszero(extcodesize(signer)) {\n switch mload(signature)\n case 64 {\n let vs := mload(add(signature, 0x40))\n mstore(0x20, add(shr(255, vs), 27)) // `v`.\n mstore(0x60, shr(1, shl(1, vs))) // `s`.\n }\n case 65 {\n mstore(0x20, byte(0, mload(add(signature, 0x60)))) // `v`.\n mstore(0x60, mload(add(signature, 0x40))) // `s`.\n }\n default { break }\n mstore(0x00, hash)\n mstore(0x40, mload(add(signature, 0x20))) // `r`.\n let recovered := mload(staticcall(gas(), 1, 0x00, 0x80, 0x01, 0x20))\n isValid := gt(returndatasize(), shl(96, xor(signer, recovered)))\n mstore(0x60, 0) // Restore the zero slot.\n mstore(0x40, m) // Restore the free memory pointer.\n break\n }\n let f := shl(224, 0x1626ba7e)\n mstore(m, f) // `bytes4(keccak256(\"isValidSignature(bytes32,bytes)\"))`.\n mstore(add(m, 0x04), hash)\n let d := add(m, 0x24)\n mstore(d, 0x40) // The offset of the `signature` in the calldata.\n // Copy the `signature` over.\n let n := add(0x20, mload(signature))\n let copied := staticcall(gas(), 4, signature, n, add(m, 0x44), n)\n isValid := staticcall(gas(), signer, m, add(returndatasize(), 0x44), d, 0x20)\n isValid := and(eq(mload(d), f), and(isValid, copied))\n break\n }\n }\n }\n\n /// @dev Returns whether `signature` is valid for `signer` and `hash`.\n /// If `signer.code.length == 0`, then validate with `ecrecover`, else\n /// it will validate with ERC1271 on `signer`.\n function isValidSignatureNowCalldata(address signer, bytes32 hash, bytes calldata signature)\n internal\n view\n returns (bool isValid)\n {\n if (signer == address(0)) return isValid;\n /// @solidity memory-safe-assembly\n assembly {\n let m := mload(0x40)\n for {} 1 {} {\n if iszero(extcodesize(signer)) {\n switch signature.length\n case 64 {\n let vs := calldataload(add(signature.offset, 0x20))\n mstore(0x20, add(shr(255, vs), 27)) // `v`.\n mstore(0x40, calldataload(signature.offset)) // `r`.\n mstore(0x60, shr(1, shl(1, vs))) // `s`.\n }\n case 65 {\n mstore(0x20, byte(0, calldataload(add(signature.offset, 0x40)))) // `v`.\n calldatacopy(0x40, signature.offset, 0x40) // `r`, `s`.\n }\n default { break }\n mstore(0x00, hash)\n let recovered := mload(staticcall(gas(), 1, 0x00, 0x80, 0x01, 0x20))\n isValid := gt(returndatasize(), shl(96, xor(signer, recovered)))\n mstore(0x60, 0) // Restore the zero slot.\n mstore(0x40, m) // Restore the free memory pointer.\n break\n }\n let f := shl(224, 0x1626ba7e)\n mstore(m, f) // `bytes4(keccak256(\"isValidSignature(bytes32,bytes)\"))`.\n mstore(add(m, 0x04), hash)\n let d := add(m, 0x24)\n mstore(d, 0x40) // The offset of the `signature` in the calldata.\n mstore(add(m, 0x44), signature.length)\n // Copy the `signature` over.\n calldatacopy(add(m, 0x64), signature.offset, signature.length)\n isValid := staticcall(gas(), signer, m, add(signature.length, 0x64), d, 0x20)\n isValid := and(eq(mload(d), f), isValid)\n break\n }\n }\n }\n\n /// @dev Returns whether the signature (`r`, `vs`) is valid for `signer` and `hash`.\n /// If `signer.code.length == 0`, then validate with `ecrecover`, else\n /// it will validate with ERC1271 on `signer`.\n function isValidSignatureNow(address signer, bytes32 hash, bytes32 r, bytes32 vs)\n internal\n view\n returns (bool isValid)\n {\n if (signer == address(0)) return isValid;\n /// @solidity memory-safe-assembly\n assembly {\n let m := mload(0x40)\n for {} 1 {} {\n if iszero(extcodesize(signer)) {\n mstore(0x00, hash)\n mstore(0x20, add(shr(255, vs), 27)) // `v`.\n mstore(0x40, r) // `r`.\n mstore(0x60, shr(1, shl(1, vs))) // `s`.\n let recovered := mload(staticcall(gas(), 1, 0x00, 0x80, 0x01, 0x20))\n isValid := gt(returndatasize(), shl(96, xor(signer, recovered)))\n mstore(0x60, 0) // Restore the zero slot.\n mstore(0x40, m) // Restore the free memory pointer.\n break\n }\n let f := shl(224, 0x1626ba7e)\n mstore(m, f) // `bytes4(keccak256(\"isValidSignature(bytes32,bytes)\"))`.\n mstore(add(m, 0x04), hash)\n let d := add(m, 0x24)\n mstore(d, 0x40) // The offset of the `signature` in the calldata.\n mstore(add(m, 0x44), 65) // Length of the signature.\n mstore(add(m, 0x64), r) // `r`.\n mstore(add(m, 0x84), shr(1, shl(1, vs))) // `s`.\n mstore8(add(m, 0xa4), add(shr(255, vs), 27)) // `v`.\n isValid := staticcall(gas(), signer, m, 0xa5, d, 0x20)\n isValid := and(eq(mload(d), f), isValid)\n break\n }\n }\n }\n\n /// @dev Returns whether the signature (`v`, `r`, `s`) is valid for `signer` and `hash`.\n /// If `signer.code.length == 0`, then validate with `ecrecover`, else\n /// it will validate with ERC1271 on `signer`.\n function isValidSignatureNow(address signer, bytes32 hash, uint8 v, bytes32 r, bytes32 s)\n internal\n view\n returns (bool isValid)\n {\n if (signer == address(0)) return isValid;\n /// @solidity memory-safe-assembly\n assembly {\n let m := mload(0x40)\n for {} 1 {} {\n if iszero(extcodesize(signer)) {\n mstore(0x00, hash)\n mstore(0x20, and(v, 0xff)) // `v`.\n mstore(0x40, r) // `r`.\n mstore(0x60, s) // `s`.\n let recovered := mload(staticcall(gas(), 1, 0x00, 0x80, 0x01, 0x20))\n isValid := gt(returndatasize(), shl(96, xor(signer, recovered)))\n mstore(0x60, 0) // Restore the zero slot.\n mstore(0x40, m) // Restore the free memory pointer.\n break\n }\n let f := shl(224, 0x1626ba7e)\n mstore(m, f) // `bytes4(keccak256(\"isValidSignature(bytes32,bytes)\"))`.\n mstore(add(m, 0x04), hash)\n let d := add(m, 0x24)\n mstore(d, 0x40) // The offset of the `signature` in the calldata.\n mstore(add(m, 0x44), 65) // Length of the signature.\n mstore(add(m, 0x64), r) // `r`.\n mstore(add(m, 0x84), s) // `s`.\n mstore8(add(m, 0xa4), v) // `v`.\n isValid := staticcall(gas(), signer, m, 0xa5, d, 0x20)\n isValid := and(eq(mload(d), f), isValid)\n break\n }\n }\n }\n\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* ERC1271 OPERATIONS */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n // Note: These ERC1271 operations do NOT have an ECDSA fallback.\n\n /// @dev Returns whether `signature` is valid for `hash` for an ERC1271 `signer` contract.\n function isValidERC1271SignatureNow(address signer, bytes32 hash, bytes memory signature)\n internal\n view\n returns (bool isValid)\n {\n /// @solidity memory-safe-assembly\n assembly {\n let m := mload(0x40)\n let f := shl(224, 0x1626ba7e)\n mstore(m, f) // `bytes4(keccak256(\"isValidSignature(bytes32,bytes)\"))`.\n mstore(add(m, 0x04), hash)\n let d := add(m, 0x24)\n mstore(d, 0x40) // The offset of the `signature` in the calldata.\n // Copy the `signature` over.\n let n := add(0x20, mload(signature))\n let copied := staticcall(gas(), 4, signature, n, add(m, 0x44), n)\n isValid := staticcall(gas(), signer, m, add(returndatasize(), 0x44), d, 0x20)\n isValid := and(eq(mload(d), f), and(isValid, copied))\n }\n }\n\n /// @dev Returns whether `signature` is valid for `hash` for an ERC1271 `signer` contract.\n function isValidERC1271SignatureNowCalldata(\n address signer,\n bytes32 hash,\n bytes calldata signature\n ) internal view returns (bool isValid) {\n /// @solidity memory-safe-assembly\n assembly {\n let m := mload(0x40)\n let f := shl(224, 0x1626ba7e)\n mstore(m, f) // `bytes4(keccak256(\"isValidSignature(bytes32,bytes)\"))`.\n mstore(add(m, 0x04), hash)\n let d := add(m, 0x24)\n mstore(d, 0x40) // The offset of the `signature` in the calldata.\n mstore(add(m, 0x44), signature.length)\n // Copy the `signature` over.\n calldatacopy(add(m, 0x64), signature.offset, signature.length)\n isValid := staticcall(gas(), signer, m, add(signature.length, 0x64), d, 0x20)\n isValid := and(eq(mload(d), f), isValid)\n }\n }\n\n /// @dev Returns whether the signature (`r`, `vs`) is valid for `hash`\n /// for an ERC1271 `signer` contract.\n function isValidERC1271SignatureNow(address signer, bytes32 hash, bytes32 r, bytes32 vs)\n internal\n view\n returns (bool isValid)\n {\n /// @solidity memory-safe-assembly\n assembly {\n let m := mload(0x40)\n let f := shl(224, 0x1626ba7e)\n mstore(m, f) // `bytes4(keccak256(\"isValidSignature(bytes32,bytes)\"))`.\n mstore(add(m, 0x04), hash)\n let d := add(m, 0x24)\n mstore(d, 0x40) // The offset of the `signature` in the calldata.\n mstore(add(m, 0x44), 65) // Length of the signature.\n mstore(add(m, 0x64), r) // `r`.\n mstore(add(m, 0x84), shr(1, shl(1, vs))) // `s`.\n mstore8(add(m, 0xa4), add(shr(255, vs), 27)) // `v`.\n isValid := staticcall(gas(), signer, m, 0xa5, d, 0x20)\n isValid := and(eq(mload(d), f), isValid)\n }\n }\n\n /// @dev Returns whether the signature (`v`, `r`, `s`) is valid for `hash`\n /// for an ERC1271 `signer` contract.\n function isValidERC1271SignatureNow(address signer, bytes32 hash, uint8 v, bytes32 r, bytes32 s)\n internal\n view\n returns (bool isValid)\n {\n /// @solidity memory-safe-assembly\n assembly {\n let m := mload(0x40)\n let f := shl(224, 0x1626ba7e)\n mstore(m, f) // `bytes4(keccak256(\"isValidSignature(bytes32,bytes)\"))`.\n mstore(add(m, 0x04), hash)\n let d := add(m, 0x24)\n mstore(d, 0x40) // The offset of the `signature` in the calldata.\n mstore(add(m, 0x44), 65) // Length of the signature.\n mstore(add(m, 0x64), r) // `r`.\n mstore(add(m, 0x84), s) // `s`.\n mstore8(add(m, 0xa4), v) // `v`.\n isValid := staticcall(gas(), signer, m, 0xa5, d, 0x20)\n isValid := and(eq(mload(d), f), isValid)\n }\n }\n\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* ERC6492 OPERATIONS */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n // Note: These ERC6492 operations now include an ECDSA fallback at the very end.\n // The calldata variants are excluded for brevity.\n\n /// @dev Returns whether `signature` is valid for `hash`.\n /// If the signature is postfixed with the ERC6492 magic number, it will attempt to\n /// deploy / prepare the `signer` smart account before doing a regular ERC1271 check.\n /// Note: This function is NOT reentrancy safe.\n /// The verifier must be deployed.\n /// Otherwise, the function will return false if `signer` is not yet deployed / prepared.\n /// See: https://gist.github.com/Vectorized/011d6becff6e0a73e42fe100f8d7ef04\n /// With a dedicated verifier, this function is safe to use in contracts\n /// that have been granted special permissions.\n function isValidERC6492SignatureNowAllowSideEffects(\n address signer,\n bytes32 hash,\n bytes memory signature\n ) internal returns (bool isValid) {\n /// @solidity memory-safe-assembly\n assembly {\n function callIsValidSignature(signer_, hash_, signature_) -> _isValid {\n let m_ := mload(0x40)\n let f_ := shl(224, 0x1626ba7e)\n mstore(m_, f_) // `bytes4(keccak256(\"isValidSignature(bytes32,bytes)\"))`.\n mstore(add(m_, 0x04), hash_)\n let d_ := add(m_, 0x24)\n mstore(d_, 0x40) // The offset of the `signature` in the calldata.\n let n_ := add(0x20, mload(signature_))\n let copied_ := staticcall(gas(), 4, signature_, n_, add(m_, 0x44), n_)\n _isValid := staticcall(gas(), signer_, m_, add(returndatasize(), 0x44), d_, 0x20)\n _isValid := and(eq(mload(d_), f_), and(_isValid, copied_))\n }\n let noCode := iszero(extcodesize(signer))\n let n := mload(signature)\n for {} 1 {} {\n if iszero(eq(mload(add(signature, n)), mul(0x6492, div(not(isValid), 0xffff)))) {\n if iszero(noCode) { isValid := callIsValidSignature(signer, hash, signature) }\n break\n }\n if iszero(noCode) {\n let o := add(signature, 0x20) // Signature bytes.\n isValid := callIsValidSignature(signer, hash, add(o, mload(add(o, 0x40))))\n if isValid { break }\n }\n let m := mload(0x40)\n mstore(m, signer)\n mstore(add(m, 0x20), hash)\n pop(\n call(\n gas(), // Remaining gas.\n 0x0000bc370E4DC924F427d84e2f4B9Ec81626ba7E, // Non-reverting verifier.\n 0, // Send zero ETH.\n m, // Start of memory.\n add(returndatasize(), 0x40), // Length of calldata in memory.\n staticcall(gas(), 4, add(signature, 0x20), n, add(m, 0x40), n), // 1.\n 0x00 // Length of returndata to write.\n )\n )\n isValid := returndatasize()\n break\n }\n // Do `ecrecover` fallback if `noCode && !isValid`.\n for {} gt(noCode, isValid) {} {\n switch n\n case 64 {\n let vs := mload(add(signature, 0x40))\n mstore(0x20, add(shr(255, vs), 27)) // `v`.\n mstore(0x60, shr(1, shl(1, vs))) // `s`.\n }\n case 65 {\n mstore(0x20, byte(0, mload(add(signature, 0x60)))) // `v`.\n mstore(0x60, mload(add(signature, 0x40))) // `s`.\n }\n default { break }\n let m := mload(0x40)\n mstore(0x00, hash)\n mstore(0x40, mload(add(signature, 0x20))) // `r`.\n let recovered := mload(staticcall(gas(), 1, 0x00, 0x80, 0x01, 0x20))\n isValid := gt(returndatasize(), shl(96, xor(signer, recovered)))\n mstore(0x60, 0) // Restore the zero slot.\n mstore(0x40, m) // Restore the free memory pointer.\n break\n }\n }\n }\n\n /// @dev Returns whether `signature` is valid for `hash`.\n /// If the signature is postfixed with the ERC6492 magic number, it will attempt\n /// to use a reverting verifier to deploy / prepare the `signer` smart account\n /// and do a `isValidSignature` check via the reverting verifier.\n /// Note: This function is reentrancy safe.\n /// The reverting verifier must be deployed.\n /// Otherwise, the function will return false if `signer` is not yet deployed / prepared.\n /// See: https://gist.github.com/Vectorized/846a474c855eee9e441506676800a9ad\n function isValidERC6492SignatureNow(address signer, bytes32 hash, bytes memory signature)\n internal\n returns (bool isValid)\n {\n /// @solidity memory-safe-assembly\n assembly {\n function callIsValidSignature(signer_, hash_, signature_) -> _isValid {\n let m_ := mload(0x40)\n let f_ := shl(224, 0x1626ba7e)\n mstore(m_, f_) // `bytes4(keccak256(\"isValidSignature(bytes32,bytes)\"))`.\n mstore(add(m_, 0x04), hash_)\n let d_ := add(m_, 0x24)\n mstore(d_, 0x40) // The offset of the `signature` in the calldata.\n let n_ := add(0x20, mload(signature_))\n let copied_ := staticcall(gas(), 4, signature_, n_, add(m_, 0x44), n_)\n _isValid := staticcall(gas(), signer_, m_, add(returndatasize(), 0x44), d_, 0x20)\n _isValid := and(eq(mload(d_), f_), and(_isValid, copied_))\n }\n let noCode := iszero(extcodesize(signer))\n let n := mload(signature)\n for {} 1 {} {\n if iszero(eq(mload(add(signature, n)), mul(0x6492, div(not(isValid), 0xffff)))) {\n if iszero(noCode) { isValid := callIsValidSignature(signer, hash, signature) }\n break\n }\n if iszero(noCode) {\n let o := add(signature, 0x20) // Signature bytes.\n isValid := callIsValidSignature(signer, hash, add(o, mload(add(o, 0x40))))\n if isValid { break }\n }\n let m := mload(0x40)\n mstore(m, signer)\n mstore(add(m, 0x20), hash)\n let willBeZeroIfRevertingVerifierExists :=\n call(\n gas(), // Remaining gas.\n 0x00007bd799e4A591FeA53f8A8a3E9f931626Ba7e, // Reverting verifier.\n 0, // Send zero ETH.\n m, // Start of memory.\n add(returndatasize(), 0x40), // Length of calldata in memory.\n staticcall(gas(), 4, add(signature, 0x20), n, add(m, 0x40), n), // 1.\n 0x00 // Length of returndata to write.\n )\n isValid := gt(returndatasize(), willBeZeroIfRevertingVerifierExists)\n break\n }\n // Do `ecrecover` fallback if `noCode && !isValid`.\n for {} gt(noCode, isValid) {} {\n switch n\n case 64 {\n let vs := mload(add(signature, 0x40))\n mstore(0x20, add(shr(255, vs), 27)) // `v`.\n mstore(0x60, shr(1, shl(1, vs))) // `s`.\n }\n case 65 {\n mstore(0x20, byte(0, mload(add(signature, 0x60)))) // `v`.\n mstore(0x60, mload(add(signature, 0x40))) // `s`.\n }\n default { break }\n let m := mload(0x40)\n mstore(0x00, hash)\n mstore(0x40, mload(add(signature, 0x20))) // `r`.\n let recovered := mload(staticcall(gas(), 1, 0x00, 0x80, 0x01, 0x20))\n isValid := gt(returndatasize(), shl(96, xor(signer, recovered)))\n mstore(0x60, 0) // Restore the zero slot.\n mstore(0x40, m) // Restore the free memory pointer.\n break\n }\n }\n }\n\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* HASHING OPERATIONS */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n /// @dev Returns an Ethereum Signed Message, created from a `hash`.\n /// This produces a hash corresponding to the one signed with the\n /// [`eth_sign`](https://eth.wiki/json-rpc/API#eth_sign)\n /// JSON-RPC method as part of EIP-191.\n function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32 result) {\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x20, hash) // Store into scratch space for keccak256.\n mstore(0x00, \"\\x00\\x00\\x00\\x00\\x19Ethereum Signed Message:\\n32\") // 28 bytes.\n result := keccak256(0x04, 0x3c) // `32 * 2 - (32 - 28) = 60 = 0x3c`.\n }\n }\n\n /// @dev Returns an Ethereum Signed Message, created from `s`.\n /// This produces a hash corresponding to the one signed with the\n /// [`eth_sign`](https://eth.wiki/json-rpc/API#eth_sign)\n /// JSON-RPC method as part of EIP-191.\n /// Note: Supports lengths of `s` up to 999999 bytes.\n function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32 result) {\n /// @solidity memory-safe-assembly\n assembly {\n let sLength := mload(s)\n let o := 0x20\n mstore(o, \"\\x19Ethereum Signed Message:\\n\") // 26 bytes, zero-right-padded.\n mstore(0x00, 0x00)\n // Convert the `s.length` to ASCII decimal representation: `base10(s.length)`.\n for { let temp := sLength } 1 {} {\n o := sub(o, 1)\n mstore8(o, add(48, mod(temp, 10)))\n temp := div(temp, 10)\n if iszero(temp) { break }\n }\n let n := sub(0x3a, o) // Header length: `26 + 32 - o`.\n // Throw an out-of-offset error (consumes all gas) if the header exceeds 32 bytes.\n returndatacopy(returndatasize(), returndatasize(), gt(n, 0x20))\n mstore(s, or(mload(0x00), mload(n))) // Temporarily store the header.\n result := keccak256(add(s, sub(0x20, n)), add(n, sLength))\n mstore(s, sLength) // Restore the length.\n }\n }\n\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* EMPTY CALLDATA HELPERS */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n /// @dev Returns an empty calldata bytes.\n function emptySignature() internal pure returns (bytes calldata signature) {\n /// @solidity memory-safe-assembly\n assembly {\n signature.length := 0\n }\n }\n}\n"},"node_modules/@rhinestone/sentinellist/src/SentinelList4337.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n// Sentinel address\naddress constant SENTINEL = address(0x1);\n// Zero address\naddress constant ZERO_ADDRESS = address(0x0);\n\n/**\n * @title SentinelListLib\n * @dev Library for managing a linked list of addresses that is compliant with the ERC-4337\n * validation rules\n * @author Rhinestone\n */\nlibrary SentinelList4337Lib {\n // Struct to hold the linked list\n // This linked list has the account address as the inner key so it is ERC-4337 compliant\n struct SentinelList {\n mapping(address key => mapping(address account => address entry)) entries;\n }\n\n error LinkedList_AlreadyInitialized();\n error LinkedList_InvalidPage();\n error LinkedList_InvalidEntry(address entry);\n error LinkedList_EntryAlreadyInList(address entry);\n\n /**\n * Initialize the linked list\n *\n * @param self The linked list\n * @param account The account to initialize the linked list for\n */\n function init(SentinelList storage self, address account) internal {\n if (alreadyInitialized(self, account)) revert LinkedList_AlreadyInitialized();\n self.entries[SENTINEL][account] = SENTINEL;\n }\n\n /**\n * Check if the linked list is already initialized\n *\n * @param self The linked list\n * @param account The account to check if the linked list is initialized for\n *\n * @return bool True if the linked list is already initialized\n */\n function alreadyInitialized(\n SentinelList storage self,\n address account\n )\n internal\n view\n returns (bool)\n {\n return self.entries[SENTINEL][account] != ZERO_ADDRESS;\n }\n\n /**\n * Get the next entry in the linked list\n *\n * @param self The linked list\n * @param account The account to get the next entry for\n * @param entry The current entry\n *\n * @return address The next entry\n */\n function getNext(\n SentinelList storage self,\n address account,\n address entry\n )\n internal\n view\n returns (address)\n {\n if (entry == ZERO_ADDRESS) {\n revert LinkedList_InvalidEntry(entry);\n }\n return self.entries[entry][account];\n }\n\n /**\n * Push a new entry to the linked list\n *\n * @param self The linked list\n * @param account The account to push the new entry for\n * @param newEntry The new entry\n */\n function push(SentinelList storage self, address account, address newEntry) internal {\n if (newEntry == ZERO_ADDRESS || newEntry == SENTINEL) {\n revert LinkedList_InvalidEntry(newEntry);\n }\n if (self.entries[newEntry][account] != ZERO_ADDRESS) {\n revert LinkedList_EntryAlreadyInList(newEntry);\n }\n self.entries[newEntry][account] = self.entries[SENTINEL][account];\n self.entries[SENTINEL][account] = newEntry;\n }\n\n /**\n * Safe push a new entry to the linked list\n * @dev This ensures that the linked list is initialized and initializes it if it is not\n *\n * @param self The linked list\n * @param account The account to push the new entry for\n * @param newEntry The new entry\n */\n function safePush(SentinelList storage self, address account, address newEntry) internal {\n if (!alreadyInitialized(self, account)) {\n init({ self: self, account: account });\n }\n push({ self: self, account: account, newEntry: newEntry });\n }\n\n /**\n * Pop an entry from the linked list\n *\n * @param self The linked list\n * @param account The account to pop the entry for\n * @param prevEntry The entry before the entry to pop\n * @param popEntry The entry to pop\n */\n function pop(\n SentinelList storage self,\n address account,\n address prevEntry,\n address popEntry\n )\n internal\n {\n if (popEntry == ZERO_ADDRESS || popEntry == SENTINEL) {\n revert LinkedList_InvalidEntry(prevEntry);\n }\n if (self.entries[prevEntry][account] != popEntry) {\n revert LinkedList_InvalidEntry(popEntry);\n }\n self.entries[prevEntry][account] = self.entries[popEntry][account];\n self.entries[popEntry][account] = ZERO_ADDRESS;\n }\n\n /**\n * Pop all entries from the linked list\n *\n * @param self The linked list\n * @param account The account to pop all entries for\n */\n function popAll(SentinelList storage self, address account) internal {\n address next = self.entries[SENTINEL][account];\n while (next != ZERO_ADDRESS) {\n address current = next;\n next = self.entries[next][account];\n self.entries[current][account] = ZERO_ADDRESS;\n }\n }\n\n /**\n * Check if the linked list contains an entry\n *\n * @param self The linked list\n * @param account The account to check if the entry is in the linked list for\n * @param entry The entry to check for\n *\n * @return bool True if the linked list contains the entry\n */\n function contains(\n SentinelList storage self,\n address account,\n address entry\n )\n internal\n view\n returns (bool)\n {\n return SENTINEL != entry && self.entries[entry][account] != ZERO_ADDRESS;\n }\n\n /**\n * Get all entries in the linked list\n *\n * @param self The linked list\n * @param account The account to get the entries for\n * @param start The start entry\n * @param pageSize The page size\n *\n * @return array All entries in the linked list\n * @return next The next entry\n */\n function getEntriesPaginated(\n SentinelList storage self,\n address account,\n address start,\n uint256 pageSize\n )\n internal\n view\n returns (address[] memory array, address next)\n {\n if (start != SENTINEL && !contains(self, account, start)) {\n revert LinkedList_InvalidEntry(start);\n }\n if (pageSize == 0) revert LinkedList_InvalidPage();\n // Init array with max page size\n array = new address[](pageSize);\n\n // Populate return array\n uint256 entryCount = 0;\n next = self.entries[start][account];\n while (next != ZERO_ADDRESS && next != SENTINEL && entryCount < pageSize) {\n array[entryCount] = next;\n next = self.entries[next][account];\n entryCount++;\n }\n\n /**\n * Because of the argument validation, we can assume that the loop will always iterate over\n * the valid entry list values\n * and the `next` variable will either be an enabled entry or a sentinel address\n * (signalling the end).\n *\n * If we haven't reached the end inside the loop, we need to set the next pointer to\n * the last element of the entry array\n * because the `next` variable (which is a entry by itself) acting as a pointer to the\n * start of the next page is neither\n * incSENTINELrent page, nor will it be included in the next one if you pass it as a\n * start.\n */\n if (next != SENTINEL && entryCount > 0) {\n next = array[entryCount - 1];\n }\n // Set correct size of returned array\n // solhint-disable-next-line no-inline-assembly\n /// @solidity memory-safe-assembly\n assembly {\n mstore(array, entryCount)\n }\n }\n}\n"},"node_modules/solady/src/utils/LibSort.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.4;\n\n/// @notice Optimized sorts and operations for sorted arrays.\n/// @author Solady (https://github.com/Vectorized/solady/blob/main/src/utils/LibSort.sol)\nlibrary LibSort {\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* INSERTION SORT */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n // - Faster on small arrays (32 or lesser elements).\n // - Faster on almost sorted arrays.\n // - Smaller bytecode (about 300 bytes smaller than sort, which uses intro-quicksort).\n // - May be suitable for view functions intended for off-chain querying.\n\n /// @dev Sorts the array in-place with insertion sort.\n function insertionSort(uint256[] memory a) internal pure {\n /// @solidity memory-safe-assembly\n assembly {\n let n := mload(a) // Length of `a`.\n mstore(a, 0) // For insertion sort's inner loop to terminate.\n let h := add(a, shl(5, n)) // High slot.\n let w := not(0x1f)\n for { let i := add(a, 0x20) } 1 {} {\n i := add(i, 0x20)\n if gt(i, h) { break }\n let k := mload(i) // Key.\n let j := add(i, w) // The slot before the current slot.\n let v := mload(j) // The value of `j`.\n if iszero(gt(v, k)) { continue }\n for {} 1 {} {\n mstore(add(j, 0x20), v)\n j := add(j, w) // `sub(j, 0x20)`.\n v := mload(j)\n if iszero(gt(v, k)) { break }\n }\n mstore(add(j, 0x20), k)\n }\n mstore(a, n) // Restore the length of `a`.\n }\n }\n\n /// @dev Sorts the array in-place with insertion sort.\n function insertionSort(int256[] memory a) internal pure {\n _flipSign(a);\n insertionSort(_toUints(a));\n _flipSign(a);\n }\n\n /// @dev Sorts the array in-place with insertion sort.\n function insertionSort(address[] memory a) internal pure {\n insertionSort(_toUints(a));\n }\n\n /// @dev Sorts the array in-place with insertion sort.\n function insertionSort(bytes32[] memory a) internal pure {\n insertionSort(_toUints(a));\n }\n\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* INTRO-QUICKSORT */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n // - Faster on larger arrays (more than 32 elements).\n // - Robust performance.\n // - Larger bytecode.\n\n /// @dev Sorts the array in-place with intro-quicksort.\n function sort(uint256[] memory a) internal pure {\n /// @solidity memory-safe-assembly\n assembly {\n function swap(a_, b_) -> _a, _b {\n _b := a_\n _a := b_\n }\n function mswap(i_, j_) {\n let t_ := mload(i_)\n mstore(i_, mload(j_))\n mstore(j_, t_)\n }\n function sortInner(w_, l_, h_) {\n // Do insertion sort if `h_ - l_ <= 0x20 * 12`.\n // Threshold is fine-tuned via trial and error.\n if iszero(gt(sub(h_, l_), 0x180)) {\n // Hardcode sort the first 2 elements.\n let i_ := add(l_, 0x20)\n if iszero(lt(mload(l_), mload(i_))) { mswap(i_, l_) }\n for {} 1 {} {\n i_ := add(i_, 0x20)\n if gt(i_, h_) { break }\n let k_ := mload(i_) // Key.\n let j_ := add(i_, w_) // The slot before the current slot.\n let v_ := mload(j_) // The value of `j_`.\n if iszero(gt(v_, k_)) { continue }\n for {} 1 {} {\n mstore(add(j_, 0x20), v_)\n j_ := add(j_, w_)\n v_ := mload(j_)\n if iszero(gt(v_, k_)) { break }\n }\n mstore(add(j_, 0x20), k_)\n }\n leave\n }\n // Pivot slot is the average of `l_` and `h_`.\n let p_ := add(shl(5, shr(6, add(l_, h_))), and(31, l_))\n // Median of 3 with sorting.\n {\n let e0_ := mload(l_)\n let e1_ := mload(p_)\n if iszero(lt(e0_, e1_)) { e0_, e1_ := swap(e0_, e1_) }\n let e2_ := mload(h_)\n if iszero(lt(e1_, e2_)) {\n e1_, e2_ := swap(e1_, e2_)\n if iszero(lt(e0_, e1_)) { e0_, e1_ := swap(e0_, e1_) }\n }\n mstore(h_, e2_)\n mstore(p_, e1_)\n mstore(l_, e0_)\n }\n // Hoare's partition.\n {\n // The value of the pivot slot.\n let x_ := mload(p_)\n p_ := h_\n for { let i_ := l_ } 1 {} {\n for {} 1 {} {\n i_ := add(0x20, i_)\n if iszero(gt(x_, mload(i_))) { break }\n }\n let j_ := p_\n for {} 1 {} {\n j_ := add(w_, j_)\n if iszero(lt(x_, mload(j_))) { break }\n }\n p_ := j_\n if iszero(lt(i_, p_)) { break }\n mswap(i_, p_)\n }\n }\n if iszero(eq(add(p_, 0x20), h_)) { sortInner(w_, add(p_, 0x20), h_) }\n if iszero(eq(p_, l_)) { sortInner(w_, l_, p_) }\n }\n\n for { let n := mload(a) } iszero(lt(n, 2)) {} {\n let w := not(0x1f) // `-0x20`.\n let l := add(a, 0x20) // Low slot.\n let h := add(a, shl(5, n)) // High slot.\n let j := h\n // While `mload(j - 0x20) <= mload(j): j -= 0x20`.\n for {} iszero(gt(mload(add(w, j)), mload(j))) {} { j := add(w, j) }\n // If the array is already sorted, break.\n if iszero(gt(j, l)) { break }\n // While `mload(j - 0x20) >= mload(j): j -= 0x20`.\n for { j := h } iszero(lt(mload(add(w, j)), mload(j))) {} { j := add(w, j) }\n // If the array is reversed sorted.\n if iszero(gt(j, l)) {\n for {} 1 {} {\n let t := mload(l)\n mstore(l, mload(h))\n mstore(h, t)\n h := add(w, h)\n l := add(l, 0x20)\n if iszero(lt(l, h)) { break }\n }\n break\n }\n mstore(a, 0) // For insertion sort's inner loop to terminate.\n sortInner(w, l, h)\n mstore(a, n) // Restore the length of `a`.\n break\n }\n }\n }\n\n /// @dev Sorts the array in-place with intro-quicksort.\n function sort(int256[] memory a) internal pure {\n _flipSign(a);\n sort(_toUints(a));\n _flipSign(a);\n }\n\n /// @dev Sorts the array in-place with intro-quicksort.\n function sort(address[] memory a) internal pure {\n sort(_toUints(a));\n }\n\n /// @dev Sorts the array in-place with intro-quicksort.\n function sort(bytes32[] memory a) internal pure {\n sort(_toUints(a));\n }\n\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* OTHER USEFUL OPERATIONS */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n // For performance, the `uniquifySorted` methods will not revert if the\n // array is not sorted -- it will simply remove consecutive duplicate elements.\n\n /// @dev Removes duplicate elements from a ascendingly sorted memory array.\n function uniquifySorted(uint256[] memory a) internal pure {\n /// @solidity memory-safe-assembly\n assembly {\n // If the length of `a` is greater than 1.\n if iszero(lt(mload(a), 2)) {\n let x := add(a, 0x20)\n let y := add(a, 0x40)\n let end := add(a, shl(5, add(mload(a), 1)))\n for {} 1 {} {\n if iszero(eq(mload(x), mload(y))) {\n x := add(x, 0x20)\n mstore(x, mload(y))\n }\n y := add(y, 0x20)\n if eq(y, end) { break }\n }\n mstore(a, shr(5, sub(x, a)))\n }\n }\n }\n\n /// @dev Removes duplicate elements from a ascendingly sorted memory array.\n function uniquifySorted(int256[] memory a) internal pure {\n uniquifySorted(_toUints(a));\n }\n\n /// @dev Removes duplicate elements from a ascendingly sorted memory array.\n function uniquifySorted(address[] memory a) internal pure {\n uniquifySorted(_toUints(a));\n }\n\n /// @dev Removes duplicate elements from a ascendingly sorted memory array.\n function uniquifySorted(bytes32[] memory a) internal pure {\n uniquifySorted(_toUints(a));\n }\n\n /// @dev Returns whether `a` contains `needle`, and the index of `needle`.\n /// `index` precedence: equal to > nearest before > nearest after.\n function searchSorted(uint256[] memory a, uint256 needle)\n internal\n pure\n returns (bool found, uint256 index)\n {\n (found, index) = _searchSorted(a, needle, 0);\n }\n\n /// @dev Returns whether `a` contains `needle`, and the index of `needle`.\n /// `index` precedence: equal to > nearest before > nearest after.\n function searchSorted(int256[] memory a, int256 needle)\n internal\n pure\n returns (bool found, uint256 index)\n {\n (found, index) = _searchSorted(_toUints(a), uint256(needle), 1 << 255);\n }\n\n /// @dev Returns whether `a` contains `needle`, and the index of `needle`.\n /// `index` precedence: equal to > nearest before > nearest after.\n function searchSorted(address[] memory a, address needle)\n internal\n pure\n returns (bool found, uint256 index)\n {\n (found, index) = _searchSorted(_toUints(a), uint160(needle), 0);\n }\n\n /// @dev Returns whether `a` contains `needle`, and the index of `needle`.\n /// `index` precedence: equal to > nearest before > nearest after.\n function searchSorted(bytes32[] memory a, bytes32 needle)\n internal\n pure\n returns (bool found, uint256 index)\n {\n (found, index) = _searchSorted(_toUints(a), uint256(needle), 0);\n }\n\n /// @dev Returns whether `a` contains `needle`.\n function inSorted(uint256[] memory a, uint256 needle) internal pure returns (bool found) {\n (found,) = searchSorted(a, needle);\n }\n\n /// @dev Returns whether `a` contains `needle`.\n function inSorted(int256[] memory a, int256 needle) internal pure returns (bool found) {\n (found,) = searchSorted(a, needle);\n }\n\n /// @dev Returns whether `a` contains `needle`.\n function inSorted(address[] memory a, address needle) internal pure returns (bool found) {\n (found,) = searchSorted(a, needle);\n }\n\n /// @dev Returns whether `a` contains `needle`.\n function inSorted(bytes32[] memory a, bytes32 needle) internal pure returns (bool found) {\n (found,) = searchSorted(a, needle);\n }\n\n /// @dev Reverses the array in-place.\n function reverse(uint256[] memory a) internal pure {\n /// @solidity memory-safe-assembly\n assembly {\n if iszero(lt(mload(a), 2)) {\n let s := 0x20\n let w := not(0x1f)\n let h := add(a, shl(5, mload(a)))\n for { a := add(a, s) } 1 {} {\n let t := mload(a)\n mstore(a, mload(h))\n mstore(h, t)\n h := add(h, w)\n a := add(a, s)\n if iszero(lt(a, h)) { break }\n }\n }\n }\n }\n\n /// @dev Reverses the array in-place.\n function reverse(int256[] memory a) internal pure {\n reverse(_toUints(a));\n }\n\n /// @dev Reverses the array in-place.\n function reverse(address[] memory a) internal pure {\n reverse(_toUints(a));\n }\n\n /// @dev Reverses the array in-place.\n function reverse(bytes32[] memory a) internal pure {\n reverse(_toUints(a));\n }\n\n /// @dev Returns a copy of the array.\n function copy(uint256[] memory a) internal pure returns (uint256[] memory result) {\n /// @solidity memory-safe-assembly\n assembly {\n result := mload(0x40)\n let end := add(add(result, 0x20), shl(5, mload(a)))\n let o := result\n for { let d := sub(a, result) } 1 {} {\n mstore(o, mload(add(o, d)))\n o := add(0x20, o)\n if eq(o, end) { break }\n }\n mstore(0x40, o)\n }\n }\n\n /// @dev Returns a copy of the array.\n function copy(int256[] memory a) internal pure returns (int256[] memory result) {\n result = _toInts(copy(_toUints(a)));\n }\n\n /// @dev Returns a copy of the array.\n function copy(address[] memory a) internal pure returns (address[] memory result) {\n result = _toAddresses(copy(_toUints(a)));\n }\n\n /// @dev Returns a copy of the array.\n function copy(bytes32[] memory a) internal pure returns (bytes32[] memory result) {\n result = _toBytes32s(copy(_toUints(a)));\n }\n\n /// @dev Returns whether the array is sorted in ascending order.\n function isSorted(uint256[] memory a) internal pure returns (bool result) {\n /// @solidity memory-safe-assembly\n assembly {\n result := 1\n if iszero(lt(mload(a), 2)) {\n let end := add(a, shl(5, mload(a)))\n for { a := add(a, 0x20) } 1 {} {\n let p := mload(a)\n a := add(a, 0x20)\n result := iszero(gt(p, mload(a)))\n if iszero(mul(result, xor(a, end))) { break }\n }\n }\n }\n }\n\n /// @dev Returns whether the array is sorted in ascending order.\n function isSorted(int256[] memory a) internal pure returns (bool result) {\n /// @solidity memory-safe-assembly\n assembly {\n result := 1\n if iszero(lt(mload(a), 2)) {\n let end := add(a, shl(5, mload(a)))\n for { a := add(a, 0x20) } 1 {} {\n let p := mload(a)\n a := add(a, 0x20)\n result := iszero(sgt(p, mload(a)))\n if iszero(mul(result, xor(a, end))) { break }\n }\n }\n }\n }\n\n /// @dev Returns whether the array is sorted in ascending order.\n function isSorted(address[] memory a) internal pure returns (bool result) {\n result = isSorted(_toUints(a));\n }\n\n /// @dev Returns whether the array is sorted in ascending order.\n function isSorted(bytes32[] memory a) internal pure returns (bool result) {\n result = isSorted(_toUints(a));\n }\n\n /// @dev Returns whether the array is strictly ascending (sorted and uniquified).\n function isSortedAndUniquified(uint256[] memory a) internal pure returns (bool result) {\n /// @solidity memory-safe-assembly\n assembly {\n result := 1\n if iszero(lt(mload(a), 2)) {\n let end := add(a, shl(5, mload(a)))\n for { a := add(a, 0x20) } 1 {} {\n let p := mload(a)\n a := add(a, 0x20)\n result := lt(p, mload(a))\n if iszero(mul(result, xor(a, end))) { break }\n }\n }\n }\n }\n\n /// @dev Returns whether the array is strictly ascending (sorted and uniquified).\n function isSortedAndUniquified(int256[] memory a) internal pure returns (bool result) {\n /// @solidity memory-safe-assembly\n assembly {\n result := 1\n if iszero(lt(mload(a), 2)) {\n let end := add(a, shl(5, mload(a)))\n for { a := add(a, 0x20) } 1 {} {\n let p := mload(a)\n a := add(a, 0x20)\n result := slt(p, mload(a))\n if iszero(mul(result, xor(a, end))) { break }\n }\n }\n }\n }\n\n /// @dev Returns whether the array is strictly ascending (sorted and uniquified).\n function isSortedAndUniquified(address[] memory a) internal pure returns (bool result) {\n result = isSortedAndUniquified(_toUints(a));\n }\n\n /// @dev Returns whether the array is strictly ascending (sorted and uniquified).\n function isSortedAndUniquified(bytes32[] memory a) internal pure returns (bool result) {\n result = isSortedAndUniquified(_toUints(a));\n }\n\n /// @dev Returns the sorted set difference of `a` and `b`.\n /// Note: Behaviour is undefined if inputs are not sorted and uniquified.\n function difference(uint256[] memory a, uint256[] memory b)\n internal\n pure\n returns (uint256[] memory c)\n {\n c = _difference(a, b, 0);\n }\n\n /// @dev Returns the sorted set difference between `a` and `b`.\n /// Note: Behaviour is undefined if inputs are not sorted and uniquified.\n function difference(int256[] memory a, int256[] memory b)\n internal\n pure\n returns (int256[] memory c)\n {\n c = _toInts(_difference(_toUints(a), _toUints(b), 1 << 255));\n }\n\n /// @dev Returns the sorted set difference between `a` and `b`.\n /// Note: Behaviour is undefined if inputs are not sorted and uniquified.\n function difference(address[] memory a, address[] memory b)\n internal\n pure\n returns (address[] memory c)\n {\n c = _toAddresses(_difference(_toUints(a), _toUints(b), 0));\n }\n\n /// @dev Returns the sorted set difference between `a` and `b`.\n /// Note: Behaviour is undefined if inputs are not sorted and uniquified.\n function difference(bytes32[] memory a, bytes32[] memory b)\n internal\n pure\n returns (bytes32[] memory c)\n {\n c = _toBytes32s(_difference(_toUints(a), _toUints(b), 0));\n }\n\n /// @dev Returns the sorted set intersection between `a` and `b`.\n /// Note: Behaviour is undefined if inputs are not sorted and uniquified.\n function intersection(uint256[] memory a, uint256[] memory b)\n internal\n pure\n returns (uint256[] memory c)\n {\n c = _intersection(a, b, 0);\n }\n\n /// @dev Returns the sorted set intersection between `a` and `b`.\n /// Note: Behaviour is undefined if inputs are not sorted and uniquified.\n function intersection(int256[] memory a, int256[] memory b)\n internal\n pure\n returns (int256[] memory c)\n {\n c = _toInts(_intersection(_toUints(a), _toUints(b), 1 << 255));\n }\n\n /// @dev Returns the sorted set intersection between `a` and `b`.\n /// Note: Behaviour is undefined if inputs are not sorted and uniquified.\n function intersection(address[] memory a, address[] memory b)\n internal\n pure\n returns (address[] memory c)\n {\n c = _toAddresses(_intersection(_toUints(a), _toUints(b), 0));\n }\n\n /// @dev Returns the sorted set intersection between `a` and `b`.\n /// Note: Behaviour is undefined if inputs are not sorted and uniquified.\n function intersection(bytes32[] memory a, bytes32[] memory b)\n internal\n pure\n returns (bytes32[] memory c)\n {\n c = _toBytes32s(_intersection(_toUints(a), _toUints(b), 0));\n }\n\n /// @dev Returns the sorted set union of `a` and `b`.\n /// Note: Behaviour is undefined if inputs are not sorted and uniquified.\n function union(uint256[] memory a, uint256[] memory b)\n internal\n pure\n returns (uint256[] memory c)\n {\n c = _union(a, b, 0);\n }\n\n /// @dev Returns the sorted set union of `a` and `b`.\n /// Note: Behaviour is undefined if inputs are not sorted and uniquified.\n function union(int256[] memory a, int256[] memory b)\n internal\n pure\n returns (int256[] memory c)\n {\n c = _toInts(_union(_toUints(a), _toUints(b), 1 << 255));\n }\n\n /// @dev Returns the sorted set union between `a` and `b`.\n /// Note: Behaviour is undefined if inputs are not sorted and uniquified.\n function union(address[] memory a, address[] memory b)\n internal\n pure\n returns (address[] memory c)\n {\n c = _toAddresses(_union(_toUints(a), _toUints(b), 0));\n }\n\n /// @dev Returns the sorted set union between `a` and `b`.\n /// Note: Behaviour is undefined if inputs are not sorted and uniquified.\n function union(bytes32[] memory a, bytes32[] memory b)\n internal\n pure\n returns (bytes32[] memory c)\n {\n c = _toBytes32s(_union(_toUints(a), _toUints(b), 0));\n }\n\n /// @dev Cleans the upper 96 bits of the addresses.\n /// In case `a` is produced via assembly and might have dirty upper bits.\n function clean(address[] memory a) internal pure {\n /// @solidity memory-safe-assembly\n assembly {\n let addressMask := shr(96, not(0))\n for { let end := add(a, shl(5, mload(a))) } iszero(eq(a, end)) {} {\n a := add(a, 0x20)\n mstore(a, and(mload(a), addressMask))\n }\n }\n }\n\n /// @dev Sorts and uniquifies `keys`. Updates `values` with the grouped sums by key.\n function groupSum(uint256[] memory keys, uint256[] memory values) internal pure {\n uint256 m;\n /// @solidity memory-safe-assembly\n assembly {\n m := mload(0x40) // Cache the free memory pointer, for freeing the memory.\n if iszero(eq(mload(keys), mload(values))) {\n mstore(0x00, 0x4e487b71)\n mstore(0x20, 0x32) // Array out of bounds panic if the arrays lengths differ.\n revert(0x1c, 0x24)\n }\n }\n if (keys.length == uint256(0)) return;\n (uint256[] memory oriKeys, uint256[] memory oriValues) = (copy(keys), copy(values));\n insertionSort(keys); // Optimize for small `n` and bytecode size.\n uniquifySorted(keys);\n /// @solidity memory-safe-assembly\n assembly {\n let d := sub(values, keys)\n let w := not(0x1f)\n let s := add(keys, 0x20) // Location of `keys[0]`.\n mstore(values, mload(keys)) // Truncate.\n calldatacopy(add(s, d), calldatasize(), shl(5, mload(keys))) // Zeroize.\n for { let i := shl(5, mload(oriKeys)) } 1 {} {\n let k := mload(add(oriKeys, i))\n let v := mload(add(oriValues, i))\n let j := s // Just do a linear scan to optimize for small `n` and bytecode size.\n for {} iszero(eq(mload(j), k)) {} { j := add(j, 0x20) }\n j := add(j, d) // Convert `j` to point into `values`.\n mstore(j, add(mload(j), v))\n if lt(mload(j), v) {\n mstore(0x00, 0x4e487b71)\n mstore(0x20, 0x11) // Overflow panic if the addition overflows.\n revert(0x1c, 0x24)\n }\n i := add(i, w) // `sub(i, 0x20)`.\n if iszero(i) { break }\n }\n mstore(0x40, m) // Frees the memory allocated for the temporary copies.\n }\n }\n\n /// @dev Sorts and uniquifies `keys`. Updates `values` with the grouped sums by key.\n function groupSum(address[] memory keys, uint256[] memory values) internal pure {\n groupSum(_toUints(keys), values);\n }\n\n /// @dev Sorts and uniquifies `keys`. Updates `values` with the grouped sums by key.\n function groupSum(bytes32[] memory keys, uint256[] memory values) internal pure {\n groupSum(_toUints(keys), values);\n }\n\n /// @dev Sorts and uniquifies `keys`. Updates `values` with the grouped sums by key.\n function groupSum(int256[] memory keys, uint256[] memory values) internal pure {\n groupSum(_toUints(keys), values);\n }\n\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* PRIVATE HELPERS */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n /// @dev Reinterpret cast to an uint256 array.\n function _toUints(int256[] memory a) private pure returns (uint256[] memory casted) {\n /// @solidity memory-safe-assembly\n assembly {\n casted := a\n }\n }\n\n /// @dev Reinterpret cast to an uint256 array.\n function _toUints(address[] memory a) private pure returns (uint256[] memory casted) {\n /// @solidity memory-safe-assembly\n assembly {\n // As any address written to memory will have the upper 96 bits\n // of the word zeroized (as per Solidity spec), we can directly\n // compare these addresses as if they are whole uint256 words.\n casted := a\n }\n }\n\n /// @dev Reinterpret cast to an uint256 array.\n function _toUints(bytes32[] memory a) private pure returns (uint256[] memory casted) {\n /// @solidity memory-safe-assembly\n assembly {\n casted := a\n }\n }\n\n /// @dev Reinterpret cast to an int array.\n function _toInts(uint256[] memory a) private pure returns (int256[] memory casted) {\n /// @solidity memory-safe-assembly\n assembly {\n casted := a\n }\n }\n\n /// @dev Reinterpret cast to an address array.\n function _toAddresses(uint256[] memory a) private pure returns (address[] memory casted) {\n /// @solidity memory-safe-assembly\n assembly {\n casted := a\n }\n }\n\n /// @dev Reinterpret cast to an bytes32 array.\n function _toBytes32s(uint256[] memory a) private pure returns (bytes32[] memory casted) {\n /// @solidity memory-safe-assembly\n assembly {\n casted := a\n }\n }\n\n /// @dev Converts an array of signed integers to unsigned\n /// integers suitable for sorting or vice versa.\n function _flipSign(int256[] memory a) private pure {\n /// @solidity memory-safe-assembly\n assembly {\n let w := shl(255, 1)\n for { let end := add(a, shl(5, mload(a))) } iszero(eq(a, end)) {} {\n a := add(a, 0x20)\n mstore(a, add(mload(a), w))\n }\n }\n }\n\n /// @dev Returns whether `a` contains `needle`, and the index of `needle`.\n /// `index` precedence: equal to > nearest before > nearest after.\n function _searchSorted(uint256[] memory a, uint256 needle, uint256 signed)\n private\n pure\n returns (bool found, uint256 index)\n {\n /// @solidity memory-safe-assembly\n assembly {\n let w := not(0)\n let l := 1\n let h := mload(a)\n let t := 0\n for { needle := add(signed, needle) } 1 {} {\n index := shr(1, add(l, h))\n t := add(signed, mload(add(a, shl(5, index))))\n if or(gt(l, h), eq(t, needle)) { break }\n // Decide whether to search the left or right half.\n if iszero(gt(needle, t)) {\n h := add(index, w)\n continue\n }\n l := add(index, 1)\n }\n // `index` will be zero in the case of an empty array,\n // or when the value is less than the smallest value in the array.\n found := eq(t, needle)\n t := iszero(iszero(index))\n index := mul(add(index, w), t)\n found := and(found, t)\n }\n }\n\n /// @dev Returns the sorted set difference of `a` and `b`.\n /// Note: Behaviour is undefined if inputs are not sorted and uniquified.\n function _difference(uint256[] memory a, uint256[] memory b, uint256 signed)\n private\n pure\n returns (uint256[] memory c)\n {\n /// @solidity memory-safe-assembly\n assembly {\n let s := 0x20\n let aEnd := add(a, shl(5, mload(a)))\n let bEnd := add(b, shl(5, mload(b)))\n c := mload(0x40) // Set `c` to the free memory pointer.\n a := add(a, s)\n b := add(b, s)\n let k := c\n for {} iszero(or(gt(a, aEnd), gt(b, bEnd))) {} {\n let u := mload(a)\n let v := mload(b)\n if iszero(xor(u, v)) {\n a := add(a, s)\n b := add(b, s)\n continue\n }\n if iszero(lt(add(u, signed), add(v, signed))) {\n b := add(b, s)\n continue\n }\n k := add(k, s)\n mstore(k, u)\n a := add(a, s)\n }\n for {} iszero(gt(a, aEnd)) {} {\n k := add(k, s)\n mstore(k, mload(a))\n a := add(a, s)\n }\n mstore(c, shr(5, sub(k, c))) // Store the length of `c`.\n mstore(0x40, add(k, s)) // Allocate the memory for `c`.\n }\n }\n\n /// @dev Returns the sorted set intersection between `a` and `b`.\n /// Note: Behaviour is undefined if inputs are not sorted and uniquified.\n function _intersection(uint256[] memory a, uint256[] memory b, uint256 signed)\n private\n pure\n returns (uint256[] memory c)\n {\n /// @solidity memory-safe-assembly\n assembly {\n let s := 0x20\n let aEnd := add(a, shl(5, mload(a)))\n let bEnd := add(b, shl(5, mload(b)))\n c := mload(0x40) // Set `c` to the free memory pointer.\n a := add(a, s)\n b := add(b, s)\n let k := c\n for {} iszero(or(gt(a, aEnd), gt(b, bEnd))) {} {\n let u := mload(a)\n let v := mload(b)\n if iszero(xor(u, v)) {\n k := add(k, s)\n mstore(k, u)\n a := add(a, s)\n b := add(b, s)\n continue\n }\n if iszero(lt(add(u, signed), add(v, signed))) {\n b := add(b, s)\n continue\n }\n a := add(a, s)\n }\n mstore(c, shr(5, sub(k, c))) // Store the length of `c`.\n mstore(0x40, add(k, s)) // Allocate the memory for `c`.\n }\n }\n\n /// @dev Returns the sorted set union of `a` and `b`.\n /// Note: Behaviour is undefined if inputs are not sorted and uniquified.\n function _union(uint256[] memory a, uint256[] memory b, uint256 signed)\n private\n pure\n returns (uint256[] memory c)\n {\n /// @solidity memory-safe-assembly\n assembly {\n let s := 0x20\n let aEnd := add(a, shl(5, mload(a)))\n let bEnd := add(b, shl(5, mload(b)))\n c := mload(0x40) // Set `c` to the free memory pointer.\n a := add(a, s)\n b := add(b, s)\n let k := c\n for {} iszero(or(gt(a, aEnd), gt(b, bEnd))) {} {\n let u := mload(a)\n let v := mload(b)\n if iszero(xor(u, v)) {\n k := add(k, s)\n mstore(k, u)\n a := add(a, s)\n b := add(b, s)\n continue\n }\n if iszero(lt(add(u, signed), add(v, signed))) {\n k := add(k, s)\n mstore(k, v)\n b := add(b, s)\n continue\n }\n k := add(k, s)\n mstore(k, u)\n a := add(a, s)\n }\n for {} iszero(gt(a, aEnd)) {} {\n k := add(k, s)\n mstore(k, mload(a))\n a := add(a, s)\n }\n for {} iszero(gt(b, bEnd)) {} {\n k := add(k, s)\n mstore(k, mload(b))\n b := add(b, s)\n }\n mstore(c, shr(5, sub(k, c))) // Store the length of `c`.\n mstore(0x40, add(k, s)) // Allocate the memory for `c`.\n }\n }\n}\n"},"node_modules/@rhinestone/checknsignatures/src/CheckNSignatures.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.19;\n\nimport { ECDSA } from \"solady/utils/ECDSA.sol\";\n\n// EIP1271 magic value\nbytes4 constant EIP1271_MAGIC_VALUE = 0x1626ba7e;\n\nerror InvalidSignature();\nerror WrongContractSignatureFormat(uint256 s, uint256 contractSignatureLen, uint256 signaturesLen);\nerror WrongContractSignature(bytes contractSignature);\nerror WrongSignature(bytes signature);\n\n/**\n * @title CheckSignatures\n * @dev Library for recovering n signatures\n * @author Rhinestone\n * @notice This library is based on the Gnosis Safe signature recovery library\n */\nlibrary CheckSignatures {\n /**\n * Recover n signatures from a data hash\n *\n * @param dataHash The hash of the data\n * @param signatures The concatenated signatures\n * @param requiredSignatures The number of signatures required\n *\n * @return recoveredSigners The recovered signers\n */\n function recoverNSignatures(\n bytes32 dataHash,\n bytes memory signatures,\n uint256 requiredSignatures\n )\n internal\n view\n returns (address[] memory recoveredSigners)\n {\n uint256 signaturesLength = signatures.length;\n uint256 totalSignatures = signaturesLength / 65;\n recoveredSigners = new address[](totalSignatures);\n if (totalSignatures < requiredSignatures) revert InvalidSignature();\n uint256 validSigCount;\n for (uint256 i; i < totalSignatures; i++) {\n // split v,r,s from signatures\n address _signer;\n (uint8 v, bytes32 r, bytes32 s) = signatureSplit({ signatures: signatures, pos: i });\n\n if (v == 0) {\n // If v is 0 then it is a contract signature\n _signer = isValidContractSignature(dataHash, signatures, r, s, signaturesLength);\n } else if (v > 30) {\n // If v > 30 then default va (27,28) has been adjusted for eth_sign flow\n // To support eth_sign and similar we adjust v and hash the messageHash with the\n // Ethereum message prefix before applying ecrecover\n _signer = ECDSA.tryRecover({\n hash: ECDSA.toEthSignedMessageHash(dataHash),\n v: v - 4,\n r: r,\n s: s\n });\n } else {\n _signer = ECDSA.tryRecover({ hash: dataHash, v: v, r: r, s: s });\n }\n if (_signer != address(0)) {\n validSigCount++;\n }\n recoveredSigners[i] = _signer;\n }\n if (validSigCount < requiredSignatures) revert InvalidSignature();\n }\n\n /**\n * @notice Validates a contract signature following the ERC-1271 standard\n * @param dataHash Hash of the data that has been signed\n * @param signatures The concatenated signatures\n * @param r Signature r value\n * @param s Signature s value\n * @param signaturesLength The length of the signatures\n */\n function isValidContractSignature(\n bytes32 dataHash,\n bytes memory signatures,\n bytes32 r,\n bytes32 s,\n uint256 signaturesLength\n )\n internal\n view\n returns (address _signer)\n {\n // When handling contract signatures the address of the signer contract is encoded\n // into r\n _signer = address(uint160(uint256(r)));\n\n // Check if the contract signature is in bounds: start of data is s + 32 and end is\n // start + signature length\n uint256 contractSignatureLen;\n // solhint-disable-next-line no-inline-assembly\n assembly {\n contractSignatureLen := mload(add(add(signatures, s), 0x20))\n }\n\n // Check if the contract signature is in bounds\n if (contractSignatureLen + uint256(s) + 32 > signaturesLength) {\n return address(0);\n }\n\n // Check signature\n bytes memory contractSignature;\n // solhint-disable-next-line no-inline-assembly\n assembly {\n // The signature data for contract signatures is appended to the concatenated\n // signatures and the offset is stored in s\n contractSignature := add(add(signatures, s), 0x20)\n }\n if (\n ISignatureValidator(_signer).isValidSignature(dataHash, contractSignature)\n != EIP1271_MAGIC_VALUE\n ) return address(0);\n }\n\n /**\n * @notice Splits signature bytes into `uint8 v, bytes32 r, bytes32 s`.\n * @dev Make sure to perform a bounds check for @param pos, to avoid out of bounds access on\n * @param signatures The signature format is a compact form of {bytes32 r}{bytes32 s}{uint8 v}\n * Compact means uint8 is not padded to 32 bytes.\n * @param pos Which signature to read. A prior bounds check of this parameter should be\n * performed, to avoid out of bounds access.\n * @param signatures Concatenated {r, s, v} signatures.\n * @return v Recovery ID or Safe signature type.\n * @return r Output value r of the signature.\n * @return s Output value s of the signature.\n *\n * @ author Gnosis Team /rmeissner\n */\n function signatureSplit(\n bytes memory signatures,\n uint256 pos\n )\n internal\n pure\n returns (uint8 v, bytes32 r, bytes32 s)\n {\n // solhint-disable-next-line no-inline-assembly\n /// @solidity memory-safe-assembly\n assembly {\n let signaturePos := mul(0x41, pos)\n r := mload(add(signatures, add(signaturePos, 0x20)))\n s := mload(add(signatures, add(signaturePos, 0x40)))\n v := byte(0, mload(add(signatures, add(signaturePos, 0x60))))\n }\n }\n}\n\nabstract contract ISignatureValidator {\n /**\n * @dev Should return whether the signature provided is valid for the provided data\n * @param _dataHash Arbitrary length data signed on behalf of address(this)\n * @param _signature Signature byte array associated with _data\n *\n * MUST return the bytes4 magic value when function passes.\n * MUST NOT modify state (using STATICCALL for solc < 0.5, view modifier for solc > 0.5)\n * MUST allow external calls\n */\n function isValidSignature(\n bytes32 _dataHash,\n bytes memory _signature\n )\n public\n view\n virtual\n returns (bytes4);\n}\n"},"node_modules/solady/src/utils/ECDSA.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.4;\n\n/// @notice Gas optimized ECDSA wrapper.\n/// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/ECDSA.sol)\n/// @author Modified from Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/ECDSA.sol)\n/// @author Modified from OpenZeppelin (https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/cryptography/ECDSA.sol)\n///\n/// @dev Note:\n/// - The recovery functions use the ecrecover precompile (0x1).\n/// - As of Solady version 0.0.68, the `recover` variants will revert upon recovery failure.\n/// This is for more safety by default.\n/// Use the `tryRecover` variants if you need to get the zero address back\n/// upon recovery failure instead.\n/// - As of Solady version 0.0.134, all `bytes signature` variants accept both\n/// regular 65-byte `(r, s, v)` and EIP-2098 `(r, vs)` short form signatures.\n/// See: https://eips.ethereum.org/EIPS/eip-2098\n/// This is for calldata efficiency on smart accounts prevalent on L2s.\n///\n/// WARNING! Do NOT directly use signatures as unique identifiers:\n/// - The recovery operations do NOT check if a signature is non-malleable.\n/// - Use a nonce in the digest to prevent replay attacks on the same contract.\n/// - Use EIP-712 for the digest to prevent replay attacks across different chains and contracts.\n/// EIP-712 also enables readable signing of typed data for better user safety.\n/// - If you need a unique hash from a signature, please use the `canonicalHash` functions.\nlibrary ECDSA {\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* CONSTANTS */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n /// @dev The order of the secp256k1 elliptic curve.\n uint256 internal constant N = 0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141;\n\n /// @dev `N/2 + 1`. Used for checking the malleability of the signature.\n uint256 private constant _HALF_N_PLUS_1 =\n 0x7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a1;\n\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* CUSTOM ERRORS */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n /// @dev The signature is invalid.\n error InvalidSignature();\n\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* RECOVERY OPERATIONS */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n /// @dev Recovers the signer's address from a message digest `hash`, and the `signature`.\n function recover(bytes32 hash, bytes memory signature) internal view returns (address result) {\n /// @solidity memory-safe-assembly\n assembly {\n for { let m := mload(0x40) } 1 {\n mstore(0x00, 0x8baa579f) // `InvalidSignature()`.\n revert(0x1c, 0x04)\n } {\n switch mload(signature)\n case 64 {\n let vs := mload(add(signature, 0x40))\n mstore(0x20, add(shr(255, vs), 27)) // `v`.\n mstore(0x60, shr(1, shl(1, vs))) // `s`.\n }\n case 65 {\n mstore(0x20, byte(0, mload(add(signature, 0x60)))) // `v`.\n mstore(0x60, mload(add(signature, 0x40))) // `s`.\n }\n default { continue }\n mstore(0x00, hash)\n mstore(0x40, mload(add(signature, 0x20))) // `r`.\n result := mload(staticcall(gas(), 1, 0x00, 0x80, 0x01, 0x20))\n mstore(0x60, 0) // Restore the zero slot.\n mstore(0x40, m) // Restore the free memory pointer.\n // `returndatasize()` will be `0x20` upon success, and `0x00` otherwise.\n if returndatasize() { break }\n }\n }\n }\n\n /// @dev Recovers the signer's address from a message digest `hash`, and the `signature`.\n function recoverCalldata(bytes32 hash, bytes calldata signature)\n internal\n view\n returns (address result)\n {\n /// @solidity memory-safe-assembly\n assembly {\n for { let m := mload(0x40) } 1 {\n mstore(0x00, 0x8baa579f) // `InvalidSignature()`.\n revert(0x1c, 0x04)\n } {\n switch signature.length\n case 64 {\n let vs := calldataload(add(signature.offset, 0x20))\n mstore(0x20, add(shr(255, vs), 27)) // `v`.\n mstore(0x40, calldataload(signature.offset)) // `r`.\n mstore(0x60, shr(1, shl(1, vs))) // `s`.\n }\n case 65 {\n mstore(0x20, byte(0, calldataload(add(signature.offset, 0x40)))) // `v`.\n calldatacopy(0x40, signature.offset, 0x40) // Copy `r` and `s`.\n }\n default { continue }\n mstore(0x00, hash)\n result := mload(staticcall(gas(), 1, 0x00, 0x80, 0x01, 0x20))\n mstore(0x60, 0) // Restore the zero slot.\n mstore(0x40, m) // Restore the free memory pointer.\n // `returndatasize()` will be `0x20` upon success, and `0x00` otherwise.\n if returndatasize() { break }\n }\n }\n }\n\n /// @dev Recovers the signer's address from a message digest `hash`,\n /// and the EIP-2098 short form signature defined by `r` and `vs`.\n function recover(bytes32 hash, bytes32 r, bytes32 vs) internal view returns (address result) {\n /// @solidity memory-safe-assembly\n assembly {\n let m := mload(0x40) // Cache the free memory pointer.\n mstore(0x00, hash)\n mstore(0x20, add(shr(255, vs), 27)) // `v`.\n mstore(0x40, r)\n mstore(0x60, shr(1, shl(1, vs))) // `s`.\n result := mload(staticcall(gas(), 1, 0x00, 0x80, 0x01, 0x20))\n // `returndatasize()` will be `0x20` upon success, and `0x00` otherwise.\n if iszero(returndatasize()) {\n mstore(0x00, 0x8baa579f) // `InvalidSignature()`.\n revert(0x1c, 0x04)\n }\n mstore(0x60, 0) // Restore the zero slot.\n mstore(0x40, m) // Restore the free memory pointer.\n }\n }\n\n /// @dev Recovers the signer's address from a message digest `hash`,\n /// and the signature defined by `v`, `r`, `s`.\n function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s)\n internal\n view\n returns (address result)\n {\n /// @solidity memory-safe-assembly\n assembly {\n let m := mload(0x40) // Cache the free memory pointer.\n mstore(0x00, hash)\n mstore(0x20, and(v, 0xff))\n mstore(0x40, r)\n mstore(0x60, s)\n result := mload(staticcall(gas(), 1, 0x00, 0x80, 0x01, 0x20))\n // `returndatasize()` will be `0x20` upon success, and `0x00` otherwise.\n if iszero(returndatasize()) {\n mstore(0x00, 0x8baa579f) // `InvalidSignature()`.\n revert(0x1c, 0x04)\n }\n mstore(0x60, 0) // Restore the zero slot.\n mstore(0x40, m) // Restore the free memory pointer.\n }\n }\n\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* TRY-RECOVER OPERATIONS */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n // WARNING!\n // These functions will NOT revert upon recovery failure.\n // Instead, they will return the zero address upon recovery failure.\n // It is critical that the returned address is NEVER compared against\n // a zero address (e.g. an uninitialized address variable).\n\n /// @dev Recovers the signer's address from a message digest `hash`, and the `signature`.\n function tryRecover(bytes32 hash, bytes memory signature)\n internal\n view\n returns (address result)\n {\n /// @solidity memory-safe-assembly\n assembly {\n for { let m := mload(0x40) } 1 {} {\n switch mload(signature)\n case 64 {\n let vs := mload(add(signature, 0x40))\n mstore(0x20, add(shr(255, vs), 27)) // `v`.\n mstore(0x60, shr(1, shl(1, vs))) // `s`.\n }\n case 65 {\n mstore(0x20, byte(0, mload(add(signature, 0x60)))) // `v`.\n mstore(0x60, mload(add(signature, 0x40))) // `s`.\n }\n default { break }\n mstore(0x00, hash)\n mstore(0x40, mload(add(signature, 0x20))) // `r`.\n pop(staticcall(gas(), 1, 0x00, 0x80, 0x40, 0x20))\n mstore(0x60, 0) // Restore the zero slot.\n // `returndatasize()` will be `0x20` upon success, and `0x00` otherwise.\n result := mload(xor(0x60, returndatasize()))\n mstore(0x40, m) // Restore the free memory pointer.\n break\n }\n }\n }\n\n /// @dev Recovers the signer's address from a message digest `hash`, and the `signature`.\n function tryRecoverCalldata(bytes32 hash, bytes calldata signature)\n internal\n view\n returns (address result)\n {\n /// @solidity memory-safe-assembly\n assembly {\n for { let m := mload(0x40) } 1 {} {\n switch signature.length\n case 64 {\n let vs := calldataload(add(signature.offset, 0x20))\n mstore(0x20, add(shr(255, vs), 27)) // `v`.\n mstore(0x40, calldataload(signature.offset)) // `r`.\n mstore(0x60, shr(1, shl(1, vs))) // `s`.\n }\n case 65 {\n mstore(0x20, byte(0, calldataload(add(signature.offset, 0x40)))) // `v`.\n calldatacopy(0x40, signature.offset, 0x40) // Copy `r` and `s`.\n }\n default { break }\n mstore(0x00, hash)\n pop(staticcall(gas(), 1, 0x00, 0x80, 0x40, 0x20))\n mstore(0x60, 0) // Restore the zero slot.\n // `returndatasize()` will be `0x20` upon success, and `0x00` otherwise.\n result := mload(xor(0x60, returndatasize()))\n mstore(0x40, m) // Restore the free memory pointer.\n break\n }\n }\n }\n\n /// @dev Recovers the signer's address from a message digest `hash`,\n /// and the EIP-2098 short form signature defined by `r` and `vs`.\n function tryRecover(bytes32 hash, bytes32 r, bytes32 vs)\n internal\n view\n returns (address result)\n {\n /// @solidity memory-safe-assembly\n assembly {\n let m := mload(0x40) // Cache the free memory pointer.\n mstore(0x00, hash)\n mstore(0x20, add(shr(255, vs), 27)) // `v`.\n mstore(0x40, r)\n mstore(0x60, shr(1, shl(1, vs))) // `s`.\n pop(staticcall(gas(), 1, 0x00, 0x80, 0x40, 0x20))\n mstore(0x60, 0) // Restore the zero slot.\n // `returndatasize()` will be `0x20` upon success, and `0x00` otherwise.\n result := mload(xor(0x60, returndatasize()))\n mstore(0x40, m) // Restore the free memory pointer.\n }\n }\n\n /// @dev Recovers the signer's address from a message digest `hash`,\n /// and the signature defined by `v`, `r`, `s`.\n function tryRecover(bytes32 hash, uint8 v, bytes32 r, bytes32 s)\n internal\n view\n returns (address result)\n {\n /// @solidity memory-safe-assembly\n assembly {\n let m := mload(0x40) // Cache the free memory pointer.\n mstore(0x00, hash)\n mstore(0x20, and(v, 0xff))\n mstore(0x40, r)\n mstore(0x60, s)\n pop(staticcall(gas(), 1, 0x00, 0x80, 0x40, 0x20))\n mstore(0x60, 0) // Restore the zero slot.\n // `returndatasize()` will be `0x20` upon success, and `0x00` otherwise.\n result := mload(xor(0x60, returndatasize()))\n mstore(0x40, m) // Restore the free memory pointer.\n }\n }\n\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* HASHING OPERATIONS */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n /// @dev Returns an Ethereum Signed Message, created from a `hash`.\n /// This produces a hash corresponding to the one signed with the\n /// [`eth_sign`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_sign)\n /// JSON-RPC method as part of EIP-191.\n function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32 result) {\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x20, hash) // Store into scratch space for keccak256.\n mstore(0x00, \"\\x00\\x00\\x00\\x00\\x19Ethereum Signed Message:\\n32\") // 28 bytes.\n result := keccak256(0x04, 0x3c) // `32 * 2 - (32 - 28) = 60 = 0x3c`.\n }\n }\n\n /// @dev Returns an Ethereum Signed Message, created from `s`.\n /// This produces a hash corresponding to the one signed with the\n /// [`eth_sign`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_sign)\n /// JSON-RPC method as part of EIP-191.\n /// Note: Supports lengths of `s` up to 999999 bytes.\n function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32 result) {\n /// @solidity memory-safe-assembly\n assembly {\n let sLength := mload(s)\n let o := 0x20\n mstore(o, \"\\x19Ethereum Signed Message:\\n\") // 26 bytes, zero-right-padded.\n mstore(0x00, 0x00)\n // Convert the `s.length` to ASCII decimal representation: `base10(s.length)`.\n for { let temp := sLength } 1 {} {\n o := sub(o, 1)\n mstore8(o, add(48, mod(temp, 10)))\n temp := div(temp, 10)\n if iszero(temp) { break }\n }\n let n := sub(0x3a, o) // Header length: `26 + 32 - o`.\n // Throw an out-of-offset error (consumes all gas) if the header exceeds 32 bytes.\n returndatacopy(returndatasize(), returndatasize(), gt(n, 0x20))\n mstore(s, or(mload(0x00), mload(n))) // Temporarily store the header.\n result := keccak256(add(s, sub(0x20, n)), add(n, sLength))\n mstore(s, sLength) // Restore the length.\n }\n }\n\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* CANONICAL HASH FUNCTIONS */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n // The following functions return the hash of the signature in its canonicalized format,\n // which is the 65-byte `abi.encodePacked(r, s, uint8(v))`, where `v` is either 27 or 28.\n // If `s` is greater than `N / 2` then it will be converted to `N - s`\n // and the `v` value will be flipped.\n // If the signature has an invalid length, or if `v` is invalid,\n // a uniquely corrupt hash will be returned.\n // These functions are useful for \"poor-mans-VRF\".\n\n /// @dev Returns the canonical hash of `signature`.\n function canonicalHash(bytes memory signature) internal pure returns (bytes32 result) {\n /// @solidity memory-safe-assembly\n assembly {\n let l := mload(signature)\n for {} 1 {} {\n mstore(0x00, mload(add(signature, 0x20))) // `r`.\n let s := mload(add(signature, 0x40))\n let v := mload(add(signature, 0x41))\n if eq(l, 64) {\n v := add(shr(255, s), 27)\n s := shr(1, shl(1, s))\n }\n if iszero(lt(s, _HALF_N_PLUS_1)) {\n v := xor(v, 7)\n s := sub(N, s)\n }\n mstore(0x21, v)\n mstore(0x20, s)\n result := keccak256(0x00, 0x41)\n mstore(0x21, 0) // Restore the overwritten part of the free memory pointer.\n break\n }\n\n // If the length is neither 64 nor 65, return a uniquely corrupted hash.\n if iszero(lt(sub(l, 64), 2)) {\n // `bytes4(keccak256(\"InvalidSignatureLength\"))`.\n result := xor(keccak256(add(signature, 0x20), l), 0xd62f1ab2)\n }\n }\n }\n\n /// @dev Returns the canonical hash of `signature`.\n function canonicalHashCalldata(bytes calldata signature)\n internal\n pure\n returns (bytes32 result)\n {\n /// @solidity memory-safe-assembly\n assembly {\n for {} 1 {} {\n mstore(0x00, calldataload(signature.offset)) // `r`.\n let s := calldataload(add(signature.offset, 0x20))\n let v := calldataload(add(signature.offset, 0x21))\n if eq(signature.length, 64) {\n v := add(shr(255, s), 27)\n s := shr(1, shl(1, s))\n }\n if iszero(lt(s, _HALF_N_PLUS_1)) {\n v := xor(v, 7)\n s := sub(N, s)\n }\n mstore(0x21, v)\n mstore(0x20, s)\n result := keccak256(0x00, 0x41)\n mstore(0x21, 0) // Restore the overwritten part of the free memory pointer.\n break\n }\n // If the length is neither 64 nor 65, return a uniquely corrupted hash.\n if iszero(lt(sub(signature.length, 64), 2)) {\n calldatacopy(mload(0x40), signature.offset, signature.length)\n // `bytes4(keccak256(\"InvalidSignatureLength\"))`.\n result := xor(keccak256(mload(0x40), signature.length), 0xd62f1ab2)\n }\n }\n }\n\n /// @dev Returns the canonical hash of `signature`.\n function canonicalHash(bytes32 r, bytes32 vs) internal pure returns (bytes32 result) {\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, r) // `r`.\n let v := add(shr(255, vs), 27)\n let s := shr(1, shl(1, vs))\n mstore(0x21, v)\n mstore(0x20, s)\n result := keccak256(0x00, 0x41)\n mstore(0x21, 0) // Restore the overwritten part of the free memory pointer.\n }\n }\n\n /// @dev Returns the canonical hash of `signature`.\n function canonicalHash(uint8 v, bytes32 r, bytes32 s) internal pure returns (bytes32 result) {\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, r) // `r`.\n if iszero(lt(s, _HALF_N_PLUS_1)) {\n v := xor(v, 7)\n s := sub(N, s)\n }\n mstore(0x21, v)\n mstore(0x20, s)\n result := keccak256(0x00, 0x41)\n mstore(0x21, 0) // Restore the overwritten part of the free memory pointer.\n }\n }\n\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* EMPTY CALLDATA HELPERS */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n /// @dev Returns an empty calldata bytes.\n function emptySignature() internal pure returns (bytes calldata signature) {\n /// @solidity memory-safe-assembly\n assembly {\n signature.length := 0\n }\n }\n}\n"},"node_modules/@rhinestone/modulekit/src/accounts/common/interfaces/IERC7579Module.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity >=0.8.23 <0.9.0;\n\n// Types\nimport { PackedUserOperation } from\n \"@ERC4337/account-abstraction/contracts/core/UserOperationLib.sol\";\n\n// Constants\nuint256 constant VALIDATION_SUCCESS = 0;\nuint256 constant VALIDATION_FAILED = 1;\nuint256 constant MODULE_TYPE_VALIDATOR = 1;\nuint256 constant MODULE_TYPE_EXECUTOR = 2;\nuint256 constant MODULE_TYPE_FALLBACK = 3;\nuint256 constant MODULE_TYPE_HOOK = 4;\nuint256 constant MODULE_TYPE_PREVALIDATION_HOOK_ERC1271 = 8;\nuint256 constant MODULE_TYPE_PREVALIDATION_HOOK_ERC4337 = 9;\n\ninterface IModule {\n error ModuleAlreadyInitialized(address smartAccount);\n error NotInitialized(address smartAccount);\n\n /**\n * @dev This function is called by the smart account during installation of the module\n * @param data arbitrary data that may be required on the module during `onInstall`\n * initialization\n *\n * MUST revert on error (i.e. if module is already enabled)\n */\n function onInstall(bytes calldata data) external;\n\n /**\n * @dev This function is called by the smart account during uninstallation of the module\n * @param data arbitrary data that may be required on the module during `onUninstall`\n * de-initialization\n *\n * MUST revert on error\n */\n function onUninstall(bytes calldata data) external;\n\n /**\n * @dev Returns boolean value if module is a certain type\n * @param moduleTypeId the module type ID according the ERC-7579 spec\n *\n * MUST return true if the module is of the given type and false otherwise\n */\n function isModuleType(uint256 moduleTypeId) external view returns (bool);\n\n /**\n * @dev Returns if the module was already initialized for a provided smartaccount\n */\n function isInitialized(address smartAccount) external view returns (bool);\n}\n\ninterface IValidator is IModule {\n error InvalidTargetAddress(address target);\n\n /**\n * @dev Validates a transaction on behalf of the account.\n * This function is intended to be called by the MSA during the ERC-4337 validaton phase\n * Note: solely relying on bytes32 hash and signature is not sufficient for some\n * validation implementations (i.e. SessionKeys often need access to userOp.calldata)\n * @param userOp The user operation to be validated. The userOp MUST NOT contain any metadata.\n * The MSA MUST clean up the userOp before sending it to the validator.\n * @param userOpHash The hash of the user operation to be validated\n * @return return value according to ERC-4337\n */\n function validateUserOp(\n PackedUserOperation calldata userOp,\n bytes32 userOpHash\n )\n external\n payable\n returns (uint256);\n\n /**\n * Validator can be used for ERC-1271 validation\n */\n function isValidSignatureWithSender(\n address sender,\n bytes32 hash,\n bytes calldata data\n )\n external\n view\n returns (bytes4);\n}\n\ninterface IExecutor is IModule { }\n\ninterface IHook is IModule {\n function preCheck(\n address msgSender,\n uint256 msgValue,\n bytes calldata msgData\n )\n external\n returns (bytes memory hookData);\n\n function postCheck(bytes calldata hookData) external;\n}\n\ninterface IFallback is IModule { }\n\ninterface IPolicy is IModule {\n function checkUserOpPolicy(\n bytes32 id,\n PackedUserOperation calldata userOp\n )\n external\n payable\n returns (uint256);\n function checkSignaturePolicy(\n bytes32 id,\n address sender,\n bytes32 hash,\n bytes calldata sig\n )\n external\n view\n returns (uint256);\n}\n\ninterface ISigner is IModule {\n function checkUserOpSignature(\n bytes32 id,\n PackedUserOperation calldata userOp,\n bytes32 userOpHash\n )\n external\n payable\n returns (uint256);\n function checkSignature(\n bytes32 id,\n address sender,\n bytes32 hash,\n bytes calldata sig\n )\n external\n view\n returns (bytes4);\n}\n\ninterface IPreValidationHookERC1271 is IModule {\n function preValidationHookERC1271(\n address sender,\n bytes32 hash,\n bytes calldata data\n )\n external\n view\n returns (bytes32 hookHash, bytes memory hookSignature);\n}\n\ninterface IPreValidationHookERC4337 is IModule {\n function preValidationHookERC4337(\n PackedUserOperation calldata userOp,\n uint256 missingAccountFunds,\n bytes32 userOpHash\n )\n external\n returns (bytes32 hookHash, bytes memory hookSignature);\n}\n"},"node_modules/@rhinestone/modulekit/src/module-bases/ERC7579ModuleBase.sol":{"content":"// SPDX-License-Identifier: AGPL-3.0-only\npragma solidity >=0.8.0 <0.9.0;\n\nimport { IModule as IERC7579Module } from \"../accounts/common/interfaces/IERC7579Module.sol\";\nimport {\n MODULE_TYPE_VALIDATOR,\n MODULE_TYPE_EXECUTOR,\n MODULE_TYPE_FALLBACK,\n MODULE_TYPE_HOOK,\n MODULE_TYPE_POLICY,\n MODULE_TYPE_SIGNER,\n MODULE_TYPE_STATELESS_VALIDATOR\n} from \"./utils/ERC7579Constants.sol\";\n\nabstract contract ERC7579ModuleBase is IERC7579Module {\n uint256 internal constant TYPE_VALIDATOR = MODULE_TYPE_VALIDATOR;\n uint256 internal constant TYPE_EXECUTOR = MODULE_TYPE_EXECUTOR;\n uint256 internal constant TYPE_FALLBACK = MODULE_TYPE_FALLBACK;\n uint256 internal constant TYPE_HOOK = MODULE_TYPE_HOOK;\n uint256 internal constant TYPE_POLICY = MODULE_TYPE_POLICY;\n uint256 internal constant TYPE_SIGNER = MODULE_TYPE_SIGNER;\n uint256 internal constant TYPE_STATELESS_VALIDATOR = MODULE_TYPE_STATELESS_VALIDATOR;\n}\n"},"node_modules/@rhinestone/modulekit/src/module-bases/ERC7579ValidatorBase.sol":{"content":"// SPDX-License-Identifier: AGPL-3.0-only\npragma solidity >=0.8.0 <0.9.0;\n\nimport {\n PackedUserOperation,\n _packValidationData as _packValidationData4337\n} from \"../external/ERC4337.sol\";\nimport { ERC7579ModuleBase } from \"./ERC7579ModuleBase.sol\";\n\nabstract contract ERC7579ValidatorBase is ERC7579ModuleBase {\n type ValidationData is uint256;\n\n ValidationData internal constant VALIDATION_SUCCESS = ValidationData.wrap(0);\n ValidationData internal constant VALIDATION_FAILED = ValidationData.wrap(1);\n bytes4 internal constant EIP1271_SUCCESS = 0x1626ba7e;\n bytes4 internal constant EIP1271_FAILED = 0xFFFFFFFF;\n\n /**\n * Helper to pack the return value for validateUserOp, when not using an aggregator.\n * @param sigFailed - True for signature failure, false for success.\n * @param validUntil - Last timestamp this UserOperation is valid (or zero for\n * infinite).\n * @param validAfter - First timestamp this UserOperation is valid.\n */\n function _packValidationData(\n bool sigFailed,\n uint48 validUntil,\n uint48 validAfter\n )\n internal\n pure\n returns (ValidationData)\n {\n return ValidationData.wrap(_packValidationData4337(sigFailed, validUntil, validAfter));\n }\n\n function _unpackValidationData(ValidationData _packedData)\n internal\n pure\n returns (bool sigFailed, uint48 validUntil, uint48 validAfter)\n {\n uint256 packedData = ValidationData.unwrap(_packedData);\n sigFailed = (packedData & 1) == 1;\n validUntil = uint48((packedData >> 160) & ((1 << 48) - 1));\n validAfter = uint48((packedData >> (160 + 48)) & ((1 << 48) - 1));\n }\n\n function validateUserOp(\n PackedUserOperation calldata userOp,\n bytes32 userOpHash\n )\n external\n virtual\n returns (ValidationData);\n\n function isValidSignatureWithSender(\n address sender,\n bytes32 hash,\n bytes calldata data\n )\n external\n view\n virtual\n returns (bytes4);\n}\n"},"node_modules/@rhinestone/modulekit/src/module-bases/ERC7579StatelessValidatorBase.sol":{"content":"// SPDX-License-Identifier: AGPL-3.0-only\npragma solidity >=0.8.0 <0.9.0;\n\nimport { ERC7579ModuleBase } from \"./ERC7579ModuleBase.sol\";\nimport { IStatelessValidator } from \"./interfaces/IStatelessValidator.sol\";\n\nabstract contract ERC7579StatelessValidatorBase is ERC7579ModuleBase, IStatelessValidator {\n function validateSignatureWithData(\n bytes32,\n bytes calldata,\n bytes calldata\n )\n external\n view\n virtual\n returns (bool validSig);\n}\n"},"node_modules/@rhinestone/modulekit/src/module-bases/ERC7579HybridValidatorBase.sol":{"content":"// SPDX-License-Identifier: AGPL-3.0-only\npragma solidity >=0.8.0 <0.9.0;\n\n/* solhint-disable no-unused-import */\n\nimport {\n PackedUserOperation,\n _packValidationData as _packValidationData4337\n} from \"../external/ERC4337.sol\";\nimport { ERC7579ValidatorBase } from \"./ERC7579ValidatorBase.sol\";\nimport { ERC7579StatelessValidatorBase } from \"./ERC7579StatelessValidatorBase.sol\";\n\n/// @notice Base contract for hybrid validators, which are both stateful and stateless.\nabstract contract ERC7579HybridValidatorBase is\n ERC7579ValidatorBase,\n ERC7579StatelessValidatorBase\n{ }\n"},"node_modules/@rhinestone/modulekit/src/module-bases/ERC7579ExecutorBase.sol":{"content":"// SPDX-License-Identifier: AGPL-3.0-only\npragma solidity >=0.8.0 <0.9.0;\n\nimport { IExecutor as IERC7579Executor } from \"../accounts/common/interfaces/IERC7579Module.sol\";\nimport { IERC7579Account } from \"../accounts/common/interfaces/IERC7579Account.sol\";\nimport {\n Execution,\n ExecutionLib as ERC7579ExecutionLib\n} from \"../accounts/erc7579/lib/ExecutionLib.sol\";\nimport {\n ModeCode,\n ModeLib as ERC7579ModeLib,\n CALLTYPE_SINGLE,\n EXECTYPE_DEFAULT,\n MODE_DEFAULT,\n ModePayload,\n CALLTYPE_BATCH,\n EXECTYPE_DEFAULT,\n MODE_DEFAULT,\n CALLTYPE_DELEGATECALL\n} from \"../accounts/common/lib/ModeLib.sol\";\nimport { ERC7579ModuleBase } from \"./ERC7579ModuleBase.sol\";\n\nabstract contract ERC7579ExecutorBase is IERC7579Executor, ERC7579ModuleBase {\n function _execute(\n address account,\n address to,\n uint256 value,\n bytes memory data\n )\n internal\n returns (bytes memory result)\n {\n ModeCode modeCode = ERC7579ModeLib.encode({\n callType: CALLTYPE_SINGLE,\n execType: EXECTYPE_DEFAULT,\n mode: MODE_DEFAULT,\n payload: ModePayload.wrap(bytes22(0))\n });\n\n return IERC7579Account(account).executeFromExecutor(\n modeCode, ERC7579ExecutionLib.encodeSingle(to, value, data)\n )[0];\n }\n\n function _execute(\n address to,\n uint256 value,\n bytes memory data\n )\n internal\n returns (bytes memory result)\n {\n return _execute(msg.sender, to, value, data);\n }\n\n function _execute(\n address account,\n Execution[] memory execs\n )\n internal\n returns (bytes[] memory results)\n {\n ModeCode modeCode = ERC7579ModeLib.encode({\n callType: CALLTYPE_BATCH,\n execType: EXECTYPE_DEFAULT,\n mode: MODE_DEFAULT,\n payload: ModePayload.wrap(bytes22(0))\n });\n results = IERC7579Account(account).executeFromExecutor(\n modeCode, ERC7579ExecutionLib.encodeBatch(execs)\n );\n }\n\n function _execute(Execution[] memory execs) internal returns (bytes[] memory results) {\n return _execute(msg.sender, execs);\n }\n\n // Note: Not every account will support delegatecalls\n function _executeDelegateCall(\n address account,\n address delegateTarget,\n bytes memory callData\n )\n internal\n returns (bytes[] memory results)\n {\n ModeCode modeCode = ERC7579ModeLib.encode({\n callType: CALLTYPE_DELEGATECALL,\n execType: EXECTYPE_DEFAULT,\n mode: MODE_DEFAULT,\n payload: ModePayload.wrap(bytes22(0))\n });\n results = IERC7579Account(account).executeFromExecutor(\n modeCode, abi.encodePacked(delegateTarget, callData)\n );\n }\n\n // Note: Not every account will support delegatecalls\n function _executeDelegateCall(\n address delegateTarget,\n bytes memory callData\n )\n internal\n returns (bytes[] memory results)\n {\n return _executeDelegateCall(msg.sender, delegateTarget, callData);\n }\n}\n"},"node_modules/@rhinestone/modulekit/src/module-bases/ERC7579HookBase.sol":{"content":"// SPDX-License-Identifier: AGPL-3.0-only\npragma solidity >=0.8.0 <0.9.0;\n\nimport { IHook as IERC7579Hook } from \"../accounts/common/interfaces/IERC7579Module.sol\";\nimport { ERC7579ModuleBase } from \"./ERC7579ModuleBase.sol\";\nimport { TrustedForwarder } from \"./utils/TrustedForwarder.sol\";\n\nabstract contract ERC7579HookBase is IERC7579Hook, ERC7579ModuleBase, TrustedForwarder {\n /**\n * Precheck hook\n *\n * @param msgSender sender of the transaction\n * @param msgValue value of the transaction\n * @param msgData data of the transaction\n *\n * @return hookData data for the postcheck hook\n */\n function preCheck(\n address msgSender,\n uint256 msgValue,\n bytes calldata msgData\n )\n external\n virtual\n returns (bytes memory hookData)\n {\n // route to internal function\n return _preCheck(_getAccount(), msgSender, msgValue, msgData);\n }\n\n /**\n * Postcheck hook\n *\n * @param hookData data from the precheck hook\n */\n function postCheck(bytes calldata hookData) external virtual {\n // route to internal function\n _postCheck(_getAccount(), hookData);\n }\n\n /**\n * Precheck hook\n *\n * @param account account of the transaction\n * @param msgSender sender of the transaction\n * @param msgValue value of the transaction\n * @param msgData data of the transaction\n *\n * @return hookData data for the postcheck hook\n */\n function _preCheck(\n address account,\n address msgSender,\n uint256 msgValue,\n bytes calldata msgData\n )\n internal\n virtual\n returns (bytes memory hookData);\n\n /**\n * Postcheck hook\n *\n * @param account account of the transaction\n * @param hookData data from the precheck hook\n */\n function _postCheck(address account, bytes calldata hookData) internal virtual;\n}\n"},"node_modules/@rhinestone/modulekit/src/module-bases/ERC7579HookDestruct.sol":{"content":"// SPDX-License-Identifier: AGPL-3.0-only\npragma solidity >=0.8.0 <0.9.0;\n\nimport { IERC7579Account } from \"../accounts/common/interfaces/IERC7579Account.sol\";\nimport { IHook as IERC7579Hook } from \"../accounts/common/interfaces/IERC7579Module.sol\";\nimport { ExecutionLib, Execution } from \"../accounts/erc7579/lib/ExecutionLib.sol\";\nimport {\n ModeLib,\n CallType,\n ModeCode,\n CALLTYPE_SINGLE,\n CALLTYPE_BATCH,\n CALLTYPE_DELEGATECALL\n} from \"../accounts/common/lib/ModeLib.sol\";\nimport { IAccountExecute } from \"../external/ERC4337.sol\";\nimport { ERC7579ModuleBase } from \"./ERC7579ModuleBase.sol\";\nimport { TrustedForwarder } from \"./utils/TrustedForwarder.sol\";\n\nuint256 constant EXECUSEROP_OFFSET = 164;\nuint256 constant EXEC_OFFSET = 100;\nuint256 constant INSTALL_OFFSET = 132;\n\nabstract contract ERC7579HookDestruct is IERC7579Hook, ERC7579ModuleBase, TrustedForwarder {\n error HookInvalidSelector();\n error InvalidCallType();\n\n /*//////////////////////////////////////////////////////////////////////////\n CALLDATA DECODING\n //////////////////////////////////////////////////////////////////////////*/\n\n function preCheck(\n address msgSender,\n uint256 msgValue,\n bytes calldata msgData\n )\n external\n virtual\n override\n returns (bytes memory hookData)\n {\n bytes4 selector = bytes4(msgData[0:4]);\n\n if (selector == IAccountExecute.executeUserOp.selector) {\n uint256 offset =\n uint256(bytes32(msgData[EXECUSEROP_OFFSET:EXECUSEROP_OFFSET + 32])) + 68;\n uint256 paramLen = uint256(bytes32(msgData[offset:offset + 32]));\n offset += 32;\n bytes calldata _msgData = msgData[offset:offset + paramLen];\n return _decodeCallData(msgSender, msgValue, _msgData);\n } else {\n return _decodeCallData(msgSender, msgValue, msgData);\n }\n }\n\n function _decodeCallData(\n address msgSender,\n uint256 msgValue,\n bytes calldata msgData\n )\n internal\n returns (bytes memory hookData)\n {\n bytes4 selector = bytes4(msgData[0:4]);\n if (selector == IERC7579Account.execute.selector) {\n return _handle4337Executions(msgSender, msgData);\n } else if (selector == IERC7579Account.executeFromExecutor.selector) {\n return _handleExecutorExecutions(msgSender, msgData);\n } else if (selector == IERC7579Account.installModule.selector) {\n uint256 paramLen = msgData.length > INSTALL_OFFSET\n ? uint256(bytes32(msgData[INSTALL_OFFSET - 32:INSTALL_OFFSET]))\n : uint256(0);\n bytes calldata initData = msgData.length > INSTALL_OFFSET\n ? msgData[INSTALL_OFFSET:INSTALL_OFFSET + paramLen]\n : msgData[0:0];\n uint256 moduleType = uint256(bytes32(msgData[4:36]));\n address module = address(bytes20((msgData[48:68])));\n return onInstallModule(_getAccount(), msgSender, moduleType, module, initData);\n } else if (selector == IERC7579Account.uninstallModule.selector) {\n uint256 paramLen = msgData.length > INSTALL_OFFSET\n ? uint256(bytes32(msgData[INSTALL_OFFSET - 32:INSTALL_OFFSET]))\n : uint256(0);\n bytes calldata initData = msgData.length > INSTALL_OFFSET\n ? msgData[INSTALL_OFFSET:INSTALL_OFFSET + paramLen]\n : msgData[0:0];\n\n uint256 moduleType = uint256(bytes32(msgData[4:36]));\n address module = address(bytes20((msgData[48:68])));\n\n return onUninstallModule(_getAccount(), msgSender, moduleType, module, initData);\n } else {\n return onUnknownFunction(_getAccount(), msgSender, msgValue, msgData);\n }\n }\n\n function _handle4337Executions(\n address msgSender,\n bytes calldata msgData\n )\n internal\n returns (bytes memory hookData)\n {\n uint256 paramLen = uint256(bytes32(msgData[EXEC_OFFSET - 32:EXEC_OFFSET]));\n bytes calldata encodedExecutions = msgData[EXEC_OFFSET:EXEC_OFFSET + paramLen];\n\n ModeCode mode = ModeCode.wrap(bytes32(msgData[4:36]));\n CallType calltype = ModeLib.getCallType(mode);\n\n if (calltype == CALLTYPE_SINGLE) {\n (address to, uint256 value, bytes calldata callData) =\n ExecutionLib.decodeSingle(encodedExecutions);\n return onExecute(_getAccount(), msgSender, to, value, callData);\n } else if (calltype == CALLTYPE_BATCH) {\n Execution[] calldata execs = ExecutionLib.decodeBatch(encodedExecutions);\n return onExecuteBatch(_getAccount(), msgSender, execs);\n } else if (calltype == CALLTYPE_DELEGATECALL) {\n address to = address(bytes20(encodedExecutions[0:20]));\n bytes calldata callData = encodedExecutions[20:];\n return onExecuteDelegateCall(_getAccount(), msgSender, to, callData);\n } else {\n revert InvalidCallType();\n }\n }\n\n function _handleExecutorExecutions(\n address msgSender,\n bytes calldata msgData\n )\n internal\n returns (bytes memory hookData)\n {\n uint256 paramLen = uint256(bytes32(msgData[EXEC_OFFSET - 32:EXEC_OFFSET]));\n bytes calldata encodedExecutions = msgData[EXEC_OFFSET:EXEC_OFFSET + paramLen];\n\n ModeCode mode = ModeCode.wrap(bytes32(msgData[4:36]));\n CallType calltype = ModeLib.getCallType(mode);\n\n if (calltype == CALLTYPE_SINGLE) {\n (address to, uint256 value, bytes calldata callData) =\n ExecutionLib.decodeSingle(encodedExecutions);\n return onExecuteFromExecutor(_getAccount(), msgSender, to, value, callData);\n } else if (calltype == CALLTYPE_BATCH) {\n Execution[] calldata execs = ExecutionLib.decodeBatch(encodedExecutions);\n return onExecuteBatchFromExecutor(_getAccount(), msgSender, execs);\n } else if (calltype == CALLTYPE_DELEGATECALL) {\n address to = address(bytes20(encodedExecutions[0:20]));\n bytes calldata callData = encodedExecutions[20:];\n return onExecuteDelegateCallFromExecutor(_getAccount(), msgSender, to, callData);\n } else {\n revert InvalidCallType();\n }\n }\n\n function postCheck(bytes calldata hookData) external virtual override {\n onPostCheck(_getAccount(), hookData);\n }\n\n /*//////////////////////////////////////////////////////////////////////////\n EXECUTION\n //////////////////////////////////////////////////////////////////////////*/\n\n function onExecute(\n address account,\n address msgSender,\n address target,\n uint256 value,\n bytes calldata callData\n )\n internal\n virtual\n returns (bytes memory hookData)\n { }\n\n function onExecuteBatch(\n address account,\n address msgSender,\n Execution[] calldata\n )\n internal\n virtual\n returns (bytes memory hookData)\n { }\n\n function onExecuteDelegateCall(\n address account,\n address msgSender,\n address target,\n bytes calldata callData\n )\n internal\n virtual\n returns (bytes memory hookData)\n { }\n\n function onExecuteFromExecutor(\n address account,\n address msgSender,\n address target,\n uint256 value,\n bytes calldata callData\n )\n internal\n virtual\n returns (bytes memory hookData)\n { }\n\n function onExecuteBatchFromExecutor(\n address account,\n address msgSender,\n Execution[] calldata\n )\n internal\n virtual\n returns (bytes memory hookData)\n { }\n\n function onExecuteDelegateCallFromExecutor(\n address account,\n address msgSender,\n address target,\n bytes calldata callData\n )\n internal\n virtual\n returns (bytes memory hookData)\n { }\n\n /*//////////////////////////////////////////////////////////////////////////\n CONFIG\n //////////////////////////////////////////////////////////////////////////*/\n\n function onInstallModule(\n address account,\n address msgSender,\n uint256 moduleType,\n address module,\n bytes calldata initData\n )\n internal\n virtual\n returns (bytes memory hookData)\n { }\n\n function onUninstallModule(\n address account,\n address msgSender,\n uint256 moduleType,\n address module,\n bytes calldata deInitData\n )\n internal\n virtual\n returns (bytes memory hookData)\n { }\n\n /*//////////////////////////////////////////////////////////////////////////\n UNKNOWN FUNCTION\n //////////////////////////////////////////////////////////////////////////*/\n\n function onUnknownFunction(\n address account,\n address msgSender,\n uint256 msgValue,\n bytes calldata msgData\n )\n internal\n virtual\n returns (bytes memory hookData)\n { }\n\n /*//////////////////////////////////////////////////////////////////////////\n POSTCHECK\n //////////////////////////////////////////////////////////////////////////*/\n\n function onPostCheck(address account, bytes calldata hookData) internal virtual { }\n}\n"},"node_modules/@rhinestone/modulekit/src/module-bases/ERC7579FallbackBase.sol":{"content":"// SPDX-License-Identifier: AGPL-3.0-only\npragma solidity >=0.8.0 <0.9.0;\n\nimport { IFallback as IERC7579Fallback } from \"../accounts/common/interfaces/IERC7579Module.sol\";\nimport { ERC7579ModuleBase } from \"./ERC7579ModuleBase.sol\";\n\nabstract contract ERC7579FallbackBase is IERC7579Fallback, ERC7579ModuleBase {\n /**\n * @notice Allows fetching the original caller address.\n * @dev This is only reliable in combination with a FallbackManager that supports this (e.g. Safe\n * contract >=1.3.0).\n * When using this functionality make sure that the linked _manager (aka msg.sender)\n * supports this.\n * This function does not rely on a trusted forwarder. Use the returned value only to\n * check information against the calling manager.\n * @return sender Original caller address.\n */\n function _msgSender() internal pure returns (address sender) {\n // The assembly code is more direct than the Solidity version using `abi.decode`.\n /* solhint-disable no-inline-assembly */\n /// @solidity memory-safe-assembly\n assembly {\n sender := shr(96, calldataload(sub(calldatasize(), 20)))\n }\n /* solhint-enable no-inline-assembly */\n }\n}\n"},"node_modules/@rhinestone/modulekit/src/module-bases/SchedulingBase.sol":{"content":"// SPDX-License-Identifier: AGPL-3.0-only\npragma solidity >=0.8.0 <0.9.0;\n\nimport { ERC7579ExecutorBase } from \"./ERC7579ExecutorBase.sol\";\n\nabstract contract SchedulingBase is ERC7579ExecutorBase {\n /*//////////////////////////////////////////////////////////////////////////\n CONSTANTS & STORAGE\n //////////////////////////////////////////////////////////////////////////*/\n\n error InvalidExecution();\n\n event ExecutionAdded(address indexed smartAccount, uint256 indexed jobId);\n event ExecutionTriggered(address indexed smartAccount, uint256 indexed jobId);\n event ExecutionStatusUpdated(address indexed smartAccount, uint256 indexed jobId);\n event ExecutionsCancelled(address indexed smartAccount);\n\n mapping(address smartAccount => mapping(uint256 jobId => ExecutionConfig)) public executionLog;\n\n mapping(address smartAccount => uint256 jobCount) public accountJobCount;\n\n struct ExecutionConfig {\n uint48 executeInterval;\n uint16 numberOfExecutions;\n uint16 numberOfExecutionsCompleted;\n uint48 startDate;\n bool isEnabled;\n uint48 lastExecutionTime;\n bytes executionData;\n }\n\n struct ExecutorAccess {\n uint256 jobId;\n }\n\n /*//////////////////////////////////////////////////////////////////////////\n CONFIG\n //////////////////////////////////////////////////////////////////////////*/\n\n function _onInstall(bytes calldata packedSchedulingData) internal {\n address account = msg.sender;\n if (isInitialized(account)) {\n revert ModuleAlreadyInitialized(account);\n }\n\n _createExecution({ orderData: packedSchedulingData });\n }\n\n function _onUninstall() internal {\n address account = msg.sender;\n\n uint256 count = accountJobCount[account];\n for (uint256 i = 1; i <= count; i++) {\n delete executionLog[account][i];\n }\n accountJobCount[account] = 0;\n\n emit ExecutionsCancelled(account);\n }\n\n function isInitialized(address smartAccount) public view returns (bool) {\n return accountJobCount[smartAccount] != 0;\n }\n\n function addOrder(bytes calldata orderData) external {\n address account = msg.sender;\n if (!isInitialized(account)) revert NotInitialized(account);\n\n _createExecution({ orderData: orderData });\n }\n\n function toggleOrder(uint256 jobId) external {\n address account = msg.sender;\n\n ExecutionConfig storage executionConfig = executionLog[account][jobId];\n\n if (executionConfig.numberOfExecutions == 0) {\n revert InvalidExecution();\n }\n\n executionConfig.isEnabled = !executionConfig.isEnabled;\n\n emit ExecutionStatusUpdated(account, jobId);\n }\n\n /*//////////////////////////////////////////////////////////////////////////\n INTERNAL\n //////////////////////////////////////////////////////////////////////////*/\n\n function _createExecution(bytes calldata orderData) internal {\n address account = msg.sender;\n\n uint256 jobId = accountJobCount[account] + 1;\n accountJobCount[account]++;\n\n // prevent user from supplying an invalid number of execution (0)\n uint16 nrOfExecutions = uint16(bytes2(orderData[6:8]));\n if (nrOfExecutions == 0) revert InvalidExecution();\n\n executionLog[account][jobId] = ExecutionConfig({\n numberOfExecutionsCompleted: 0,\n isEnabled: true,\n lastExecutionTime: 0,\n executeInterval: uint48(bytes6(orderData[0:6])),\n numberOfExecutions: nrOfExecutions,\n startDate: uint48(bytes6(orderData[8:14])),\n executionData: orderData[14:]\n });\n\n emit ExecutionAdded(account, jobId);\n }\n\n function _isExecutionValid(uint256 jobId) internal view {\n ExecutionConfig storage executionConfig = executionLog[msg.sender][jobId];\n\n if (!executionConfig.isEnabled) {\n revert InvalidExecution();\n }\n\n if (executionConfig.lastExecutionTime + executionConfig.executeInterval > block.timestamp) {\n revert InvalidExecution();\n }\n\n if (executionConfig.numberOfExecutionsCompleted >= executionConfig.numberOfExecutions) {\n revert InvalidExecution();\n }\n\n if (executionConfig.startDate > block.timestamp) {\n revert InvalidExecution();\n }\n }\n\n modifier canExecute(uint256 jobId) {\n _isExecutionValid(jobId);\n _;\n }\n\n /*//////////////////////////////////////////////////////////////////////////\n METADATA\n //////////////////////////////////////////////////////////////////////////*/\n\n function isModuleType(uint256 typeID) external pure override returns (bool) {\n return typeID == TYPE_EXECUTOR;\n }\n}\n"},"node_modules/@rhinestone/modulekit/src/module-bases/ERC7484RegistryAdapter.sol":{"content":"// SPDX-License-Identifier: AGPL-3.0-only\npragma solidity >=0.8.0 <0.9.0;\n\nimport { IERC7484 } from \"./interfaces/IERC7484.sol\";\n\nabstract contract ERC7484RegistryAdapter {\n // registry address\n IERC7484 public immutable REGISTRY;\n\n /**\n * Contract constructor\n * @dev sets the registry as an immutable variable\n *\n * @param _registry The registry address\n */\n constructor(IERC7484 _registry) {\n // set the registry\n REGISTRY = _registry;\n }\n}\n"},"node_modules/@rhinestone/modulekit/src/module-bases/ERC7579PolicyBase.sol":{"content":"// SPDX-License-Identifier: AGPL-3.0-only\npragma solidity >=0.8.0 <0.9.0;\n\nimport { ERC7579ModuleBase } from \"./ERC7579ModuleBase.sol\";\nimport { IPolicy, ConfigId } from \"./interfaces/IPolicy.sol\";\n\nabstract contract ERC7579PolicyBase is ERC7579ModuleBase, IPolicy {\n function initializeWithMultiplexer(\n address account,\n ConfigId configId,\n bytes calldata initData\n )\n external\n virtual;\n}\n"},"node_modules/@rhinestone/modulekit/src/module-bases/ERC1271Policy.sol":{"content":"// SPDX-License-Identifier: AGPL-3.0-only\npragma solidity >=0.8.0 <0.9.0;\n\nimport { ERC7579PolicyBase } from \"./ERC7579PolicyBase.sol\";\nimport { ConfigId, I1271Policy } from \"./interfaces/IPolicy.sol\";\n\nabstract contract ERC1271Policy is ERC7579PolicyBase, I1271Policy {\n function check1271SignedAction(\n ConfigId id,\n address requestSender,\n address account,\n bytes32 hash,\n bytes calldata signature\n )\n external\n view\n virtual\n returns (bool);\n}\n"},"node_modules/@rhinestone/modulekit/src/module-bases/ERC7579ActionPolicy.sol":{"content":"// SPDX-License-Identifier: AGPL-3.0-only\npragma solidity >=0.8.0 <0.9.0;\n\nimport { ERC7579PolicyBase } from \"./ERC7579PolicyBase.sol\";\nimport { ConfigId, IActionPolicy } from \"./interfaces/IPolicy.sol\";\n\nabstract contract ERC7579ActionPolicy is ERC7579PolicyBase, IActionPolicy {\n function checkAction(\n ConfigId id,\n address account,\n address target,\n uint256 value,\n bytes calldata data\n )\n external\n virtual\n returns (uint256);\n}\n"},"node_modules/@rhinestone/modulekit/src/module-bases/ERC7579UserOpPolicy.sol":{"content":"// SPDX-License-Identifier: AGPL-3.0-only\npragma solidity >=0.8.0 <0.9.0;\n\nimport { ERC7579PolicyBase } from \"./ERC7579PolicyBase.sol\";\nimport { ConfigId, IUserOpPolicy } from \"./interfaces/IPolicy.sol\";\nimport { PackedUserOperation } from \"../external/ERC4337.sol\";\n\nabstract contract ERC7579UserOpPolicy is ERC7579PolicyBase, IUserOpPolicy {\n function checkUserOp(\n ConfigId id,\n PackedUserOperation calldata userOp\n )\n external\n virtual\n returns (uint256);\n}\n"},"node_modules/@rhinestone/modulekit/src/module-bases/utils/TrustedForwarder.sol":{"content":"// SPDX-License-Identifier: AGPL-3.0-only\npragma solidity >=0.8.0 <0.9.0;\n\nabstract contract TrustedForwarder {\n // account => trustedForwarder\n mapping(address account => address trustedForwarder) public trustedForwarder;\n\n /**\n * Set the trusted forwarder for an account\n *\n * @param forwarder The address of the trusted forwarder\n */\n function setTrustedForwarder(address forwarder) external {\n trustedForwarder[msg.sender] = forwarder;\n }\n\n /**\n * Clear the trusted forwarder for an account\n */\n function clearTrustedForwarder() public {\n trustedForwarder[msg.sender] = address(0);\n }\n\n /**\n * Check if a forwarder is trusted for an account\n *\n * @param forwarder The address of the forwarder\n * @param account The address of the account\n *\n * @return true if the forwarder is trusted for the account\n */\n function isTrustedForwarder(address forwarder, address account) public view returns (bool) {\n return forwarder == trustedForwarder[account];\n }\n\n /**\n * Get the sender of the transaction\n *\n * @return account the sender of the transaction\n */\n function _getAccount() internal view returns (address account) {\n account = msg.sender;\n address _account;\n address forwarder;\n if (msg.data.length >= 40) {\n // solhint-disable-next-line no-inline-assembly\n assembly {\n _account := shr(96, calldataload(sub(calldatasize(), 20)))\n forwarder := shr(96, calldataload(sub(calldatasize(), 40)))\n }\n if (forwarder == msg.sender && isTrustedForwarder(forwarder, _account)) {\n account = _account;\n }\n }\n }\n}\n"},"node_modules/@ERC4337/account-abstraction/contracts/interfaces/PackedUserOperation.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\npragma solidity >=0.7.5;\n\n/**\n * User Operation struct\n * @param sender - The sender account of this request.\n * @param nonce - Unique value the sender uses to verify it is not a replay.\n * @param initCode - If set, the account contract will be created by this constructor/\n * @param callData - The method call to execute on this account.\n * @param accountGasLimits - Packed gas limits for validateUserOp and gas limit passed to the callData method call.\n * @param preVerificationGas - Gas not calculated by the handleOps method, but added to the gas paid.\n * Covers batch overhead.\n * @param gasFees - packed gas fields maxPriorityFeePerGas and maxFeePerGas - Same as EIP-1559 gas parameters.\n * @param paymasterAndData - If set, this field holds the paymaster address, verification gas limit, postOp gas limit and paymaster-specific extra data\n * The paymaster will pay for the transaction instead of the sender.\n * @param signature - Sender-verified signature over the entire request, the EntryPoint address and the chain ID.\n */\nstruct PackedUserOperation {\n address sender;\n uint256 nonce;\n bytes initCode;\n bytes callData;\n bytes32 accountGasLimits;\n uint256 preVerificationGas;\n bytes32 gasFees;\n bytes paymasterAndData;\n bytes signature;\n}\n"},"node_modules/@ERC4337/account-abstraction/contracts/core/UserOperationLib.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.23;\n\n/* solhint-disable no-inline-assembly */\n\nimport \"../interfaces/PackedUserOperation.sol\";\nimport {calldataKeccak, min} from \"./Helpers.sol\";\n\n/**\n * Utility functions helpful when working with UserOperation structs.\n */\nlibrary UserOperationLib {\n\n uint256 public constant PAYMASTER_VALIDATION_GAS_OFFSET = 20;\n uint256 public constant PAYMASTER_POSTOP_GAS_OFFSET = 36;\n uint256 public constant PAYMASTER_DATA_OFFSET = 52;\n /**\n * Get sender from user operation data.\n * @param userOp - The user operation data.\n */\n function getSender(\n PackedUserOperation calldata userOp\n ) internal pure returns (address) {\n address data;\n //read sender from userOp, which is first userOp member (saves 800 gas...)\n assembly {\n data := calldataload(userOp)\n }\n return address(uint160(data));\n }\n\n /**\n * Relayer/block builder might submit the TX with higher priorityFee,\n * but the user should not pay above what he signed for.\n * @param userOp - The user operation data.\n */\n function gasPrice(\n PackedUserOperation calldata userOp\n ) internal view returns (uint256) {\n unchecked {\n (uint256 maxPriorityFeePerGas, uint256 maxFeePerGas) = unpackUints(userOp.gasFees);\n if (maxFeePerGas == maxPriorityFeePerGas) {\n //legacy mode (for networks that don't support basefee opcode)\n return maxFeePerGas;\n }\n return min(maxFeePerGas, maxPriorityFeePerGas + block.basefee);\n }\n }\n\n /**\n * Pack the user operation data into bytes for hashing.\n * @param userOp - The user operation data.\n */\n function encode(\n PackedUserOperation calldata userOp\n ) internal pure returns (bytes memory ret) {\n address sender = getSender(userOp);\n uint256 nonce = userOp.nonce;\n bytes32 hashInitCode = calldataKeccak(userOp.initCode);\n bytes32 hashCallData = calldataKeccak(userOp.callData);\n bytes32 accountGasLimits = userOp.accountGasLimits;\n uint256 preVerificationGas = userOp.preVerificationGas;\n bytes32 gasFees = userOp.gasFees;\n bytes32 hashPaymasterAndData = calldataKeccak(userOp.paymasterAndData);\n\n return abi.encode(\n sender, nonce,\n hashInitCode, hashCallData,\n accountGasLimits, preVerificationGas, gasFees,\n hashPaymasterAndData\n );\n }\n\n function unpackUints(\n bytes32 packed\n ) internal pure returns (uint256 high128, uint256 low128) {\n return (uint128(bytes16(packed)), uint128(uint256(packed)));\n }\n\n //unpack just the high 128-bits from a packed value\n function unpackHigh128(bytes32 packed) internal pure returns (uint256) {\n return uint256(packed) >> 128;\n }\n\n // unpack just the low 128-bits from a packed value\n function unpackLow128(bytes32 packed) internal pure returns (uint256) {\n return uint128(uint256(packed));\n }\n\n function unpackMaxPriorityFeePerGas(PackedUserOperation calldata userOp)\n internal pure returns (uint256) {\n return unpackHigh128(userOp.gasFees);\n }\n\n function unpackMaxFeePerGas(PackedUserOperation calldata userOp)\n internal pure returns (uint256) {\n return unpackLow128(userOp.gasFees);\n }\n\n function unpackVerificationGasLimit(PackedUserOperation calldata userOp)\n internal pure returns (uint256) {\n return unpackHigh128(userOp.accountGasLimits);\n }\n\n function unpackCallGasLimit(PackedUserOperation calldata userOp)\n internal pure returns (uint256) {\n return unpackLow128(userOp.accountGasLimits);\n }\n\n function unpackPaymasterVerificationGasLimit(PackedUserOperation calldata userOp)\n internal pure returns (uint256) {\n return uint128(bytes16(userOp.paymasterAndData[PAYMASTER_VALIDATION_GAS_OFFSET : PAYMASTER_POSTOP_GAS_OFFSET]));\n }\n\n function unpackPostOpGasLimit(PackedUserOperation calldata userOp)\n internal pure returns (uint256) {\n return uint128(bytes16(userOp.paymasterAndData[PAYMASTER_POSTOP_GAS_OFFSET : PAYMASTER_DATA_OFFSET]));\n }\n\n function unpackPaymasterStaticFields(\n bytes calldata paymasterAndData\n ) internal pure returns (address paymaster, uint256 validationGasLimit, uint256 postOpGasLimit) {\n return (\n address(bytes20(paymasterAndData[: PAYMASTER_VALIDATION_GAS_OFFSET])),\n uint128(bytes16(paymasterAndData[PAYMASTER_VALIDATION_GAS_OFFSET : PAYMASTER_POSTOP_GAS_OFFSET])),\n uint128(bytes16(paymasterAndData[PAYMASTER_POSTOP_GAS_OFFSET : PAYMASTER_DATA_OFFSET]))\n );\n }\n\n /**\n * Hash the user operation data.\n * @param userOp - The user operation data.\n */\n function hash(\n PackedUserOperation calldata userOp\n ) internal pure returns (bytes32) {\n return keccak256(encode(userOp));\n }\n}\n"},"node_modules/@ERC4337/account-abstraction/contracts/core/EntryPointSimulations.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.23;\n\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable no-inline-assembly */\n\nimport \"./EntryPoint.sol\";\nimport \"../interfaces/IEntryPointSimulations.sol\";\n\n/*\n * This contract inherits the EntryPoint and extends it with the view-only methods that are executed by\n * the bundler in order to check UserOperation validity and estimate its gas consumption.\n * This contract should never be deployed on-chain and is only used as a parameter for the \"eth_call\" request.\n */\ncontract EntryPointSimulations is EntryPoint, IEntryPointSimulations {\n // solhint-disable-next-line var-name-mixedcase\n AggregatorStakeInfo private NOT_AGGREGATED = AggregatorStakeInfo(address(0), StakeInfo(0, 0));\n\n SenderCreator private _senderCreator;\n\n function initSenderCreator() internal virtual {\n //this is the address of the first contract created with CREATE by this address.\n address createdObj = address(uint160(uint256(keccak256(abi.encodePacked(hex\"d694\", address(this), hex\"01\")))));\n _senderCreator = SenderCreator(createdObj);\n }\n\n function senderCreator() internal view virtual override returns (SenderCreator) {\n // return the same senderCreator as real EntryPoint.\n // this call is slightly (100) more expensive than EntryPoint's access to immutable member\n return _senderCreator;\n }\n\n /**\n * simulation contract should not be deployed, and specifically, accounts should not trust\n * it as entrypoint, since the simulation functions don't check the signatures\n */\n constructor() {\n // THIS CONTRACT SHOULD NOT BE DEPLOYED\n // however, the line of code below is commented to allow this entryPoint to be used in fork tests\n // require(block.number < 100, \"should not be deployed\");\n }\n\n /// @inheritdoc IEntryPointSimulations\n function simulateValidation(\n PackedUserOperation calldata userOp\n )\n external\n returns (\n ValidationResult memory\n ){\n UserOpInfo memory outOpInfo;\n\n _simulationOnlyValidations(userOp);\n (\n uint256 validationData,\n uint256 paymasterValidationData\n ) = _validatePrepayment(0, userOp, outOpInfo);\n StakeInfo memory paymasterInfo = _getStakeInfo(\n outOpInfo.mUserOp.paymaster\n );\n StakeInfo memory senderInfo = _getStakeInfo(outOpInfo.mUserOp.sender);\n StakeInfo memory factoryInfo;\n {\n bytes calldata initCode = userOp.initCode;\n address factory = initCode.length >= 20\n ? address(bytes20(initCode[0 : 20]))\n : address(0);\n factoryInfo = _getStakeInfo(factory);\n }\n\n address aggregator = address(uint160(validationData));\n ReturnInfo memory returnInfo = ReturnInfo(\n outOpInfo.preOpGas,\n outOpInfo.prefund,\n validationData,\n paymasterValidationData,\n getMemoryBytesFromOffset(outOpInfo.contextOffset)\n );\n\n AggregatorStakeInfo memory aggregatorInfo = NOT_AGGREGATED;\n if (uint160(aggregator) != SIG_VALIDATION_SUCCESS && uint160(aggregator) != SIG_VALIDATION_FAILED) {\n aggregatorInfo = AggregatorStakeInfo(\n aggregator,\n _getStakeInfo(aggregator)\n );\n }\n return ValidationResult(\n returnInfo,\n senderInfo,\n factoryInfo,\n paymasterInfo,\n aggregatorInfo\n );\n }\n\n /// @inheritdoc IEntryPointSimulations\n function simulateHandleOp(\n PackedUserOperation calldata op,\n address target,\n bytes calldata targetCallData\n )\n external nonReentrant\n returns (\n ExecutionResult memory\n ){\n UserOpInfo memory opInfo;\n _simulationOnlyValidations(op);\n (\n uint256 validationData,\n uint256 paymasterValidationData\n ) = _validatePrepayment(0, op, opInfo);\n\n uint256 paid = _executeUserOp(0, op, opInfo);\n bool targetSuccess;\n bytes memory targetResult;\n if (target != address(0)) {\n (targetSuccess, targetResult) = target.call(targetCallData);\n }\n return ExecutionResult(\n opInfo.preOpGas,\n paid,\n validationData,\n paymasterValidationData,\n targetSuccess,\n targetResult\n );\n }\n\n function _simulationOnlyValidations(\n PackedUserOperation calldata userOp\n )\n internal\n {\n //initialize senderCreator(). we can't rely on constructor\n initSenderCreator();\n\n try\n this._validateSenderAndPaymaster(\n userOp.initCode,\n userOp.sender,\n userOp.paymasterAndData\n )\n // solhint-disable-next-line no-empty-blocks\n {} catch Error(string memory revertReason) {\n if (bytes(revertReason).length != 0) {\n revert FailedOp(0, revertReason);\n }\n }\n }\n\n /**\n * Called only during simulation.\n * This function always reverts to prevent warm/cold storage differentiation in simulation vs execution.\n * @param initCode - The smart account constructor code.\n * @param sender - The sender address.\n * @param paymasterAndData - The paymaster address (followed by other params, ignored by this method)\n */\n function _validateSenderAndPaymaster(\n bytes calldata initCode,\n address sender,\n bytes calldata paymasterAndData\n ) external view {\n if (initCode.length == 0 && sender.code.length == 0) {\n // it would revert anyway. but give a meaningful message\n revert(\"AA20 account not deployed\");\n }\n if (paymasterAndData.length >= 20) {\n address paymaster = address(bytes20(paymasterAndData[0 : 20]));\n if (paymaster.code.length == 0) {\n // It would revert anyway. but give a meaningful message.\n revert(\"AA30 paymaster not deployed\");\n }\n }\n // always revert\n revert(\"\");\n }\n\n //make sure depositTo cost is more than normal EntryPoint's cost,\n // to mitigate DoS vector on the bundler\n // empiric test showed that without this wrapper, simulation depositTo costs less..\n function depositTo(address account) public override(IStakeManager, StakeManager) payable {\n unchecked{\n // silly code, to waste some gas to make sure depositTo is always little more\n // expensive than on-chain call\n uint256 x = 1;\n while (x < 5) {\n x++;\n }\n StakeManager.depositTo(account);\n }\n }\n}\n"},"node_modules/@ERC4337/account-abstraction/contracts/core/Helpers.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.23;\n\n/* solhint-disable no-inline-assembly */\n\n\n /*\n * For simulation purposes, validateUserOp (and validatePaymasterUserOp)\n * must return this value in case of signature failure, instead of revert.\n */\nuint256 constant SIG_VALIDATION_FAILED = 1;\n\n\n/*\n * For simulation purposes, validateUserOp (and validatePaymasterUserOp)\n * return this value on success.\n */\nuint256 constant SIG_VALIDATION_SUCCESS = 0;\n\n\n/**\n * Returned data from validateUserOp.\n * validateUserOp returns a uint256, which is created by `_packedValidationData` and\n * parsed by `_parseValidationData`.\n * @param aggregator - address(0) - The account validated the signature by itself.\n * address(1) - The account failed to validate the signature.\n * otherwise - This is an address of a signature aggregator that must\n * be used to validate the signature.\n * @param validAfter - This UserOp is valid only after this timestamp.\n * @param validaUntil - This UserOp is valid only up to this timestamp.\n */\nstruct ValidationData {\n address aggregator;\n uint48 validAfter;\n uint48 validUntil;\n}\n\n/**\n * Extract sigFailed, validAfter, validUntil.\n * Also convert zero validUntil to type(uint48).max.\n * @param validationData - The packed validation data.\n */\nfunction _parseValidationData(\n uint256 validationData\n) pure returns (ValidationData memory data) {\n address aggregator = address(uint160(validationData));\n uint48 validUntil = uint48(validationData >> 160);\n if (validUntil == 0) {\n validUntil = type(uint48).max;\n }\n uint48 validAfter = uint48(validationData >> (48 + 160));\n return ValidationData(aggregator, validAfter, validUntil);\n}\n\n/**\n * Helper to pack the return value for validateUserOp.\n * @param data - The ValidationData to pack.\n */\nfunction _packValidationData(\n ValidationData memory data\n) pure returns (uint256) {\n return\n uint160(data.aggregator) |\n (uint256(data.validUntil) << 160) |\n (uint256(data.validAfter) << (160 + 48));\n}\n\n/**\n * Helper to pack the return value for validateUserOp, when not using an aggregator.\n * @param sigFailed - True for signature failure, false for success.\n * @param validUntil - Last timestamp this UserOperation is valid (or zero for infinite).\n * @param validAfter - First timestamp this UserOperation is valid.\n */\nfunction _packValidationData(\n bool sigFailed,\n uint48 validUntil,\n uint48 validAfter\n) pure returns (uint256) {\n return\n (sigFailed ? 1 : 0) |\n (uint256(validUntil) << 160) |\n (uint256(validAfter) << (160 + 48));\n}\n\n/**\n * keccak function over calldata.\n * @dev copy calldata into memory, do keccak and drop allocated memory. Strangely, this is more efficient than letting solidity do it.\n */\n function calldataKeccak(bytes calldata data) pure returns (bytes32 ret) {\n assembly (\"memory-safe\") {\n let mem := mload(0x40)\n let len := data.length\n calldatacopy(mem, data.offset, len)\n ret := keccak256(mem, len)\n }\n }\n\n\n/**\n * The minimum of two numbers.\n * @param a - First number.\n * @param b - Second number.\n */\n function min(uint256 a, uint256 b) pure returns (uint256) {\n return a < b ? a : b;\n }\n"},"node_modules/@ERC4337/account-abstraction/contracts/interfaces/IStakeManager.sol":{"content":"// SPDX-License-Identifier: GPL-3.0-only\npragma solidity >=0.7.5;\n\n/**\n * Manage deposits and stakes.\n * Deposit is just a balance used to pay for UserOperations (either by a paymaster or an account).\n * Stake is value locked for at least \"unstakeDelay\" by the staked entity.\n */\ninterface IStakeManager {\n event Deposited(address indexed account, uint256 totalDeposit);\n\n event Withdrawn(\n address indexed account,\n address withdrawAddress,\n uint256 amount\n );\n\n // Emitted when stake or unstake delay are modified.\n event StakeLocked(\n address indexed account,\n uint256 totalStaked,\n uint256 unstakeDelaySec\n );\n\n // Emitted once a stake is scheduled for withdrawal.\n event StakeUnlocked(address indexed account, uint256 withdrawTime);\n\n event StakeWithdrawn(\n address indexed account,\n address withdrawAddress,\n uint256 amount\n );\n\n /**\n * @param deposit - The entity's deposit.\n * @param staked - True if this entity is staked.\n * @param stake - Actual amount of ether staked for this entity.\n * @param unstakeDelaySec - Minimum delay to withdraw the stake.\n * @param withdrawTime - First block timestamp where 'withdrawStake' will be callable, or zero if already locked.\n * @dev Sizes were chosen so that deposit fits into one cell (used during handleOp)\n * and the rest fit into a 2nd cell (used during stake/unstake)\n * - 112 bit allows for 10^15 eth\n * - 48 bit for full timestamp\n * - 32 bit allows 150 years for unstake delay\n */\n struct DepositInfo {\n uint256 deposit;\n bool staked;\n uint112 stake;\n uint32 unstakeDelaySec;\n uint48 withdrawTime;\n }\n\n // API struct used by getStakeInfo and simulateValidation.\n struct StakeInfo {\n uint256 stake;\n uint256 unstakeDelaySec;\n }\n\n /**\n * Get deposit info.\n * @param account - The account to query.\n * @return info - Full deposit information of given account.\n */\n function getDepositInfo(\n address account\n ) external view returns (DepositInfo memory info);\n\n /**\n * Get account balance.\n * @param account - The account to query.\n * @return - The deposit (for gas payment) of the account.\n */\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * Add to the deposit of the given account.\n * @param account - The account to add to.\n */\n function depositTo(address account) external payable;\n\n /**\n * Add to the account's stake - amount and delay\n * any pending unstake is first cancelled.\n * @param _unstakeDelaySec - The new lock duration before the deposit can be withdrawn.\n */\n function addStake(uint32 _unstakeDelaySec) external payable;\n\n /**\n * Attempt to unlock the stake.\n * The value can be withdrawn (using withdrawStake) after the unstake delay.\n */\n function unlockStake() external;\n\n /**\n * Withdraw from the (unlocked) stake.\n * Must first call unlockStake and wait for the unstakeDelay to pass.\n * @param withdrawAddress - The address to send withdrawn value.\n */\n function withdrawStake(address payable withdrawAddress) external;\n\n /**\n * Withdraw from the deposit.\n * @param withdrawAddress - The address to send withdrawn value.\n * @param withdrawAmount - The amount to withdraw.\n */\n function withdrawTo(\n address payable withdrawAddress,\n uint256 withdrawAmount\n ) external;\n}\n"},"node_modules/@ERC4337/account-abstraction/contracts/interfaces/IAccount.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\npragma solidity >=0.7.5;\n\nimport \"./PackedUserOperation.sol\";\n\ninterface IAccount {\n /**\n * Validate user's signature and nonce\n * the entryPoint will make the call to the recipient only if this validation call returns successfully.\n * signature failure should be reported by returning SIG_VALIDATION_FAILED (1).\n * This allows making a \"simulation call\" without a valid signature\n * Other failures (e.g. nonce mismatch, or invalid signature format) should still revert to signal failure.\n *\n * @dev Must validate caller is the entryPoint.\n * Must validate the signature and nonce\n * @param userOp - The operation that is about to be executed.\n * @param userOpHash - Hash of the user's request data. can be used as the basis for signature.\n * @param missingAccountFunds - Missing funds on the account's deposit in the entrypoint.\n * This is the minimum amount to transfer to the sender(entryPoint) to be\n * able to make the call. The excess is left as a deposit in the entrypoint\n * for future calls. Can be withdrawn anytime using \"entryPoint.withdrawTo()\".\n * In case there is a paymaster in the request (or the current deposit is high\n * enough), this value will be zero.\n * @return validationData - Packaged ValidationData structure. use `_packValidationData` and\n * `_unpackValidationData` to encode and decode.\n * <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure,\n * otherwise, an address of an \"authorizer\" contract.\n * <6-byte> validUntil - Last timestamp this operation is valid. 0 for \"indefinite\"\n * <6-byte> validAfter - First timestamp this operation is valid\n * If an account doesn't use time-range, it is enough to\n * return SIG_VALIDATION_FAILED value (1) for signature failure.\n * Note that the validation code cannot use block.timestamp (or block.number) directly.\n */\n function validateUserOp(\n PackedUserOperation calldata userOp,\n bytes32 userOpHash,\n uint256 missingAccountFunds\n ) external returns (uint256 validationData);\n}\n"},"node_modules/@ERC4337/account-abstraction/contracts/interfaces/IAccountExecute.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\npragma solidity >=0.7.5;\n\nimport \"./PackedUserOperation.sol\";\n\ninterface IAccountExecute {\n /**\n * Account may implement this execute method.\n * passing this methodSig at the beginning of callData will cause the entryPoint to pass the full UserOp (and hash)\n * to the account.\n * The account should skip the methodSig, and use the callData (and optionally, other UserOp fields)\n *\n * @param userOp - The operation that was just validated.\n * @param userOpHash - Hash of the user's request data.\n */\n function executeUserOp(\n PackedUserOperation calldata userOp,\n bytes32 userOpHash\n ) external;\n}\n"},"node_modules/@ERC4337/account-abstraction/contracts/interfaces/IEntryPoint.sol":{"content":"/**\n ** Account-Abstraction (EIP-4337) singleton EntryPoint implementation.\n ** Only one instance required on each chain.\n **/\n// SPDX-License-Identifier: GPL-3.0\npragma solidity >=0.7.5;\n\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable no-inline-assembly */\n/* solhint-disable reason-string */\n\nimport \"./PackedUserOperation.sol\";\nimport \"./IStakeManager.sol\";\nimport \"./IAggregator.sol\";\nimport \"./INonceManager.sol\";\n\ninterface IEntryPoint is IStakeManager, INonceManager {\n /***\n * An event emitted after each successful request.\n * @param userOpHash - Unique identifier for the request (hash its entire content, except signature).\n * @param sender - The account that generates this request.\n * @param paymaster - If non-null, the paymaster that pays for this request.\n * @param nonce - The nonce value from the request.\n * @param success - True if the sender transaction succeeded, false if reverted.\n * @param actualGasCost - Actual amount paid (by account or paymaster) for this UserOperation.\n * @param actualGasUsed - Total gas used by this UserOperation (including preVerification, creation,\n * validation and execution).\n */\n event UserOperationEvent(\n bytes32 indexed userOpHash,\n address indexed sender,\n address indexed paymaster,\n uint256 nonce,\n bool success,\n uint256 actualGasCost,\n uint256 actualGasUsed\n );\n\n /**\n * Account \"sender\" was deployed.\n * @param userOpHash - The userOp that deployed this account. UserOperationEvent will follow.\n * @param sender - The account that is deployed\n * @param factory - The factory used to deploy this account (in the initCode)\n * @param paymaster - The paymaster used by this UserOp\n */\n event AccountDeployed(\n bytes32 indexed userOpHash,\n address indexed sender,\n address factory,\n address paymaster\n );\n\n /**\n * An event emitted if the UserOperation \"callData\" reverted with non-zero length.\n * @param userOpHash - The request unique identifier.\n * @param sender - The sender of this request.\n * @param nonce - The nonce used in the request.\n * @param revertReason - The return bytes from the (reverted) call to \"callData\".\n */\n event UserOperationRevertReason(\n bytes32 indexed userOpHash,\n address indexed sender,\n uint256 nonce,\n bytes revertReason\n );\n\n /**\n * An event emitted if the UserOperation Paymaster's \"postOp\" call reverted with non-zero length.\n * @param userOpHash - The request unique identifier.\n * @param sender - The sender of this request.\n * @param nonce - The nonce used in the request.\n * @param revertReason - The return bytes from the (reverted) call to \"callData\".\n */\n event PostOpRevertReason(\n bytes32 indexed userOpHash,\n address indexed sender,\n uint256 nonce,\n bytes revertReason\n );\n\n /**\n * UserOp consumed more than prefund. The UserOperation is reverted, and no refund is made.\n * @param userOpHash - The request unique identifier.\n * @param sender - The sender of this request.\n * @param nonce - The nonce used in the request.\n */\n event UserOperationPrefundTooLow(\n bytes32 indexed userOpHash,\n address indexed sender,\n uint256 nonce\n );\n\n /**\n * An event emitted by handleOps(), before starting the execution loop.\n * Any event emitted before this event, is part of the validation.\n */\n event BeforeExecution();\n\n /**\n * Signature aggregator used by the following UserOperationEvents within this bundle.\n * @param aggregator - The aggregator used for the following UserOperationEvents.\n */\n event SignatureAggregatorChanged(address indexed aggregator);\n\n /**\n * A custom revert error of handleOps, to identify the offending op.\n * Should be caught in off-chain handleOps simulation and not happen on-chain.\n * Useful for mitigating DoS attempts against batchers or for troubleshooting of factory/account/paymaster reverts.\n * NOTE: If simulateValidation passes successfully, there should be no reason for handleOps to fail on it.\n * @param opIndex - Index into the array of ops to the failed one (in simulateValidation, this is always zero).\n * @param reason - Revert reason. The string starts with a unique code \"AAmn\",\n * where \"m\" is \"1\" for factory, \"2\" for account and \"3\" for paymaster issues,\n * so a failure can be attributed to the correct entity.\n */\n error FailedOp(uint256 opIndex, string reason);\n\n /**\n * A custom revert error of handleOps, to report a revert by account or paymaster.\n * @param opIndex - Index into the array of ops to the failed one (in simulateValidation, this is always zero).\n * @param reason - Revert reason. see FailedOp(uint256,string), above\n * @param inner - data from inner cought revert reason\n * @dev note that inner is truncated to 2048 bytes\n */\n error FailedOpWithRevert(uint256 opIndex, string reason, bytes inner);\n\n error PostOpReverted(bytes returnData);\n\n /**\n * Error case when a signature aggregator fails to verify the aggregated signature it had created.\n * @param aggregator The aggregator that failed to verify the signature\n */\n error SignatureValidationFailed(address aggregator);\n\n // Return value of getSenderAddress.\n error SenderAddressResult(address sender);\n\n // UserOps handled, per aggregator.\n struct UserOpsPerAggregator {\n PackedUserOperation[] userOps;\n // Aggregator address\n IAggregator aggregator;\n // Aggregated signature\n bytes signature;\n }\n\n /**\n * Execute a batch of UserOperations.\n * No signature aggregator is used.\n * If any account requires an aggregator (that is, it returned an aggregator when\n * performing simulateValidation), then handleAggregatedOps() must be used instead.\n * @param ops - The operations to execute.\n * @param beneficiary - The address to receive the fees.\n */\n function handleOps(\n PackedUserOperation[] calldata ops,\n address payable beneficiary\n ) external;\n\n /**\n * Execute a batch of UserOperation with Aggregators\n * @param opsPerAggregator - The operations to execute, grouped by aggregator (or address(0) for no-aggregator accounts).\n * @param beneficiary - The address to receive the fees.\n */\n function handleAggregatedOps(\n UserOpsPerAggregator[] calldata opsPerAggregator,\n address payable beneficiary\n ) external;\n\n /**\n * Generate a request Id - unique identifier for this request.\n * The request ID is a hash over the content of the userOp (except the signature), the entrypoint and the chainid.\n * @param userOp - The user operation to generate the request ID for.\n * @return hash the hash of this UserOperation\n */\n function getUserOpHash(\n PackedUserOperation calldata userOp\n ) external view returns (bytes32);\n\n /**\n * Gas and return values during simulation.\n * @param preOpGas - The gas used for validation (including preValidationGas)\n * @param prefund - The required prefund for this operation\n * @param accountValidationData - returned validationData from account.\n * @param paymasterValidationData - return validationData from paymaster.\n * @param paymasterContext - Returned by validatePaymasterUserOp (to be passed into postOp)\n */\n struct ReturnInfo {\n uint256 preOpGas;\n uint256 prefund;\n uint256 accountValidationData;\n uint256 paymasterValidationData;\n bytes paymasterContext;\n }\n\n /**\n * Returned aggregated signature info:\n * The aggregator returned by the account, and its current stake.\n */\n struct AggregatorStakeInfo {\n address aggregator;\n StakeInfo stakeInfo;\n }\n\n /**\n * Get counterfactual sender address.\n * Calculate the sender contract address that will be generated by the initCode and salt in the UserOperation.\n * This method always revert, and returns the address in SenderAddressResult error\n * @param initCode - The constructor code to be passed into the UserOperation.\n */\n function getSenderAddress(bytes memory initCode) external;\n\n error DelegateAndRevert(bool success, bytes ret);\n\n /**\n * Helper method for dry-run testing.\n * @dev calling this method, the EntryPoint will make a delegatecall to the given data, and report (via revert) the result.\n * The method always revert, so is only useful off-chain for dry run calls, in cases where state-override to replace\n * actual EntryPoint code is less convenient.\n * @param target a target contract to make a delegatecall from entrypoint\n * @param data data to pass to target in a delegatecall\n */\n function delegateAndRevert(address target, bytes calldata data) external;\n}\n"},"node_modules/@ERC4337/account-abstraction/contracts/interfaces/IEntryPointSimulations.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\npragma solidity >=0.7.5;\n\nimport \"./PackedUserOperation.sol\";\nimport \"./IEntryPoint.sol\";\n\ninterface IEntryPointSimulations is IEntryPoint {\n // Return value of simulateHandleOp.\n struct ExecutionResult {\n uint256 preOpGas;\n uint256 paid;\n uint256 accountValidationData;\n uint256 paymasterValidationData;\n bool targetSuccess;\n bytes targetResult;\n }\n\n /**\n * Successful result from simulateValidation.\n * If the account returns a signature aggregator the \"aggregatorInfo\" struct is filled in as well.\n * @param returnInfo Gas and time-range returned values\n * @param senderInfo Stake information about the sender\n * @param factoryInfo Stake information about the factory (if any)\n * @param paymasterInfo Stake information about the paymaster (if any)\n * @param aggregatorInfo Signature aggregation info (if the account requires signature aggregator)\n * Bundler MUST use it to verify the signature, or reject the UserOperation.\n */\n struct ValidationResult {\n ReturnInfo returnInfo;\n StakeInfo senderInfo;\n StakeInfo factoryInfo;\n StakeInfo paymasterInfo;\n AggregatorStakeInfo aggregatorInfo;\n }\n\n /**\n * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp.\n * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage\n * outside the account's data.\n * @param userOp - The user operation to validate.\n * @return the validation result structure\n */\n function simulateValidation(\n PackedUserOperation calldata userOp\n )\n external\n returns (\n ValidationResult memory\n );\n\n /**\n * Simulate full execution of a UserOperation (including both validation and target execution)\n * It performs full validation of the UserOperation, but ignores signature error.\n * An optional target address is called after the userop succeeds,\n * and its value is returned (before the entire call is reverted).\n * Note that in order to collect the the success/failure of the target call, it must be executed\n * with trace enabled to track the emitted events.\n * @param op The UserOperation to simulate.\n * @param target - If nonzero, a target address to call after userop simulation. If called,\n * the targetSuccess and targetResult are set to the return from that call.\n * @param targetCallData - CallData to pass to target address.\n * @return the execution result structure\n */\n function simulateHandleOp(\n PackedUserOperation calldata op,\n address target,\n bytes calldata targetCallData\n )\n external\n returns (\n ExecutionResult memory\n );\n}\n"},"node_modules/@rhinestone/modulekit/src/module-bases/utils/ERC7579Constants.sol":{"content":"// SPDX-License-Identifier: AGPL-3.0-only\npragma solidity >=0.8.0 <0.9.0;\n\nuint256 constant MODULE_TYPE_VALIDATOR = 1;\nuint256 constant MODULE_TYPE_EXECUTOR = 2;\nuint256 constant MODULE_TYPE_FALLBACK = 3;\nuint256 constant MODULE_TYPE_HOOK = 4;\nuint256 constant MODULE_TYPE_POLICY = 5;\nuint256 constant MODULE_TYPE_SIGNER = 6;\nuint256 constant MODULE_TYPE_STATELESS_VALIDATOR = 7;\n"},"node_modules/@rhinestone/modulekit/src/module-bases/interfaces/IStatelessValidator.sol":{"content":"// SPDX-License-Identifier: AGPL-3.0-only\npragma solidity >=0.8.0 <0.9.0;\n\ninterface IStatelessValidator {\n function validateSignatureWithData(\n bytes32 hash,\n bytes calldata signature,\n bytes calldata data\n )\n external\n view\n returns (bool);\n}\n"},"node_modules/@rhinestone/modulekit/src/accounts/common/interfaces/IERC7579Account.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity >=0.8.23 <0.9.0;\n\n/* solhint-disable no-unused-import */\n\n// Types\nimport { CallType, ExecType, ModeCode } from \"../lib/ModeLib.sol\";\n\n// Structs\nstruct Execution {\n address target;\n uint256 value;\n bytes callData;\n}\n\ninterface IERC7579Account {\n event ModuleInstalled(uint256 moduleTypeId, address module);\n event ModuleUninstalled(uint256 moduleTypeId, address module);\n\n /**\n * @dev Executes a transaction on behalf of the account.\n * This function is intended to be called by ERC-4337 EntryPoint.sol\n * @dev Ensure adequate authorization control: i.e. onlyEntryPointOrSelf\n *\n * @dev MSA MUST implement this function signature.\n * If a mode is requested that is not supported by the Account, it MUST revert\n * @param mode The encoded execution mode of the transaction. See ModeLib.sol for details\n * @param executionCalldata The encoded execution call data\n */\n function execute(ModeCode mode, bytes calldata executionCalldata) external payable;\n\n /**\n * @dev Executes a transaction on behalf of the account.\n * This function is intended to be called by Executor Modules\n * @dev Ensure adequate authorization control: i.e. onlyExecutorModule\n *\n * @dev MSA MUST implement this function signature.\n * If a mode is requested that is not supported by the Account, it MUST revert\n * @param mode The encoded execution mode of the transaction. See ModeLib.sol for details\n * @param executionCalldata The encoded execution call data\n */\n function executeFromExecutor(\n ModeCode mode,\n bytes calldata executionCalldata\n )\n external\n payable\n returns (bytes[] memory returnData);\n\n /**\n * @dev ERC-1271 isValidSignature\n * This function is intended to be used to validate a smart account signature\n * and may forward the call to a validator module\n *\n * @param hash The hash of the data that is signed\n * @param data The data that is signed\n */\n function isValidSignature(bytes32 hash, bytes calldata data) external view returns (bytes4);\n\n /**\n * @dev installs a Module of a certain type on the smart account\n * @dev Implement Authorization control of your chosing\n * @param moduleTypeId the module type ID according the ERC-7579 spec\n * @param module the module address\n * @param initData arbitrary data that may be required on the module during `onInstall`\n * initialization.\n */\n function installModule(\n uint256 moduleTypeId,\n address module,\n bytes calldata initData\n )\n external\n payable;\n\n /**\n * @dev uninstalls a Module of a certain type on the smart account\n * @dev Implement Authorization control of your chosing\n * @param moduleTypeId the module type ID according the ERC-7579 spec\n * @param module the module address\n * @param deInitData arbitrary data that may be required on the module during `onUninstall`\n * de-initialization.\n */\n function uninstallModule(\n uint256 moduleTypeId,\n address module,\n bytes calldata deInitData\n )\n external\n payable;\n\n /**\n * Function to check if the account supports a certain CallType or ExecType (see ModeLib.sol)\n * @param encodedMode the encoded mode\n */\n function supportsExecutionMode(ModeCode encodedMode) external view returns (bool);\n\n /**\n * Function to check if the account supports installation of a certain module type Id\n * @param moduleTypeId the module type ID according the ERC-7579 spec\n */\n function supportsModule(uint256 moduleTypeId) external view returns (bool);\n\n /**\n * Function to check if the account has a certain module installed\n * @param moduleTypeId the module type ID according the ERC-7579 spec\n * Note: keep in mind that some contracts can be multiple module types at the same time. It\n * thus may be necessary to query multiple module types\n * @param module the module address\n * @param additionalContext additional context data that the smart account may interpret to\n * identifiy conditions under which the module is installed.\n * usually this is not necessary, but for some special hooks that\n * are stored in mappings, this param might be needed\n */\n function isModuleInstalled(\n uint256 moduleTypeId,\n address module,\n bytes calldata additionalContext\n )\n external\n view\n returns (bool);\n\n /**\n * @dev Returns the account id of the smart account\n * @return accountImplementationId the account id of the smart account\n * the accountId should be structured like so:\n * \"vendorname.accountname.semver\"\n */\n function accountId() external view returns (string memory accountImplementationId);\n}\n"},"node_modules/@rhinestone/modulekit/src/accounts/erc7579/lib/ExecutionLib.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity >=0.8.23 <0.9.0;\n\n// Types\nimport { Execution } from \"../../common/interfaces/IERC7579Account.sol\";\n\n/**\n * Helper Library for decoding Execution calldata\n * malloc for memory allocation is bad for gas. use this assembly instead\n */\nlibrary ExecutionLib {\n error ERC7579DecodingError();\n\n /**\n * @notice Decode a batch of `Execution` executionBatch from a `bytes` calldata.\n * @dev code is copied from solady's LibERC7579.sol\n * https://github.com/Vectorized/solady/blob/740812cedc9a1fc11e17cb3d4569744367dedf19/src/accounts/LibERC7579.sol#L146\n * Credits to Vectorized and the Solady Team\n */\n function decodeBatch(bytes calldata executionCalldata)\n internal\n pure\n returns (Execution[] calldata executionBatch)\n {\n /// @solidity memory-safe-assembly\n assembly {\n let u := calldataload(executionCalldata.offset)\n let s := add(executionCalldata.offset, u)\n let e := sub(add(executionCalldata.offset, executionCalldata.length), 0x20)\n executionBatch.offset := add(s, 0x20)\n executionBatch.length := calldataload(s)\n if or(shr(64, u), gt(add(s, shl(5, executionBatch.length)), e)) {\n mstore(0x00, 0xba597e7e) // `DecodingError()`.\n revert(0x1c, 0x04)\n }\n if executionBatch.length {\n // Perform bounds checks on the decoded `executionBatch`.\n // Loop runs out-of-gas if `executionBatch.length` is big enough to cause overflows.\n for { let i := executionBatch.length } 1 { } {\n i := sub(i, 1)\n let p := calldataload(add(executionBatch.offset, shl(5, i)))\n let c := add(executionBatch.offset, p)\n let q := calldataload(add(c, 0x40))\n let o := add(c, q)\n // forgefmt: disable-next-item\n if or(shr(64, or(calldataload(o), or(p, q))),\n or(gt(add(c, 0x40), e), gt(add(o, calldataload(o)), e))) {\n mstore(0x00, 0xba597e7e) // `DecodingError()`.\n revert(0x1c, 0x04)\n }\n if iszero(i) { break }\n }\n }\n }\n }\n\n function encodeBatch(Execution[] memory executions)\n internal\n pure\n returns (bytes memory callData)\n {\n callData = abi.encode(executions);\n }\n\n function decodeSingle(bytes calldata executionCalldata)\n internal\n pure\n returns (address target, uint256 value, bytes calldata callData)\n {\n target = address(bytes20(executionCalldata[0:20]));\n value = uint256(bytes32(executionCalldata[20:52]));\n callData = executionCalldata[52:];\n }\n\n function encodeSingle(\n address target,\n uint256 value,\n bytes memory callData\n )\n internal\n pure\n returns (bytes memory userOpCalldata)\n {\n userOpCalldata = abi.encodePacked(target, value, callData);\n }\n}\n"},"node_modules/@rhinestone/modulekit/src/accounts/common/lib/ModeLib.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\npragma solidity >=0.8.0 <0.9.0;\n\n/**\n * @title ModeLib\n * @author rhinestone | zeroknots.eth, Konrad Kopp (@kopy-kat)\n * To allow smart accounts to be very simple, but allow for more complex execution, A custom mode\n * encoding is used.\n * Function Signature of execute function:\n * function execute(ModeCode mode, bytes calldata executionCalldata) external payable;\n * This allows for a single bytes32 to be used to encode the execution mode, calltype, execType and\n * context.\n * NOTE: Simple Account implementations only have to scope for the most significant byte. Account that\n * implement\n * more complex execution modes may use the entire bytes32.\n *\n * |--------------------------------------------------------------------|\n * | CALLTYPE | EXECTYPE | UNUSED | ModeSelector | ModePayload |\n * |--------------------------------------------------------------------|\n * | 1 byte | 1 byte | 4 bytes | 4 bytes | 22 bytes |\n * |--------------------------------------------------------------------|\n *\n * CALLTYPE: 1 byte\n * CallType is used to determine how the executeCalldata paramter of the execute function has to be\n * decoded.\n * It can be either single, batch or delegatecall. In the future different calls could be added.\n * CALLTYPE can be used by a validation module to determine how to decode .\n *\n * EXECTYPE: 1 byte\n * ExecType is used to determine how the account should handle the execution.\n * It can indicate if the execution should revert on failure or continue execution.\n * In the future more execution modes may be added.\n * Default Behavior (EXECTYPE = 0x00) is to revert on a single failed execution. If one execution in\n * a batch fails, the entire batch is reverted\n *\n * UNUSED: 4 bytes\n * Unused bytes are reserved for future use.\n *\n * ModeSelector: bytes4\n * The \"optional\" mode selector can be used by account vendors, to implement custom behavior in\n * their accounts.\n * the way a ModeSelector is to be calculated is bytes4(keccak256(\"vendorname.featurename\"))\n * this is to prevent collisions between different vendors, while allowing innovation and the\n * development of new features without coordination between ERC-7579 implementing accounts\n *\n * ModePayload: 22 bytes\n * Mode payload is used to pass additional data to the smart account execution, this may be\n * interpreted depending on the ModeSelector\n *\n * ExecutionCallData: n bytes\n * single, delegatecall or batch exec abi.encoded as bytes\n */\n\n// Custom type for improved developer experience\ntype ModeCode is bytes32;\n\ntype CallType is bytes1;\n\ntype ExecType is bytes1;\n\ntype ModeSelector is bytes4;\n\ntype ModePayload is bytes22;\n\n// Default CallType\nCallType constant CALLTYPE_SINGLE = CallType.wrap(0x00);\n// Batched CallType\nCallType constant CALLTYPE_BATCH = CallType.wrap(0x01);\nCallType constant CALLTYPE_STATIC = CallType.wrap(0xFE);\n// @dev Implementing delegatecall is OPTIONAL!\n// implement delegatecall with extreme care.\nCallType constant CALLTYPE_DELEGATECALL = CallType.wrap(0xFF);\n\n// @dev default behavior is to revert on failure\n// To allow very simple accounts to use mode encoding, the default behavior is to revert on failure\n// Since this is value 0x00, no additional encoding is required for simple accounts\nExecType constant EXECTYPE_DEFAULT = ExecType.wrap(0x00);\n// @dev account may elect to change execution behavior. For example \"try exec\" / \"allow fail\"\nExecType constant EXECTYPE_TRY = ExecType.wrap(0x01);\n\nModeSelector constant MODE_DEFAULT = ModeSelector.wrap(bytes4(0x00000000));\n// Example declaration of a custom mode selector\nModeSelector constant MODE_OFFSET = ModeSelector.wrap(bytes4(keccak256(\"default.mode.offset\")));\n\n/**\n * @dev ModeLib is a helper library to encode/decode ModeCodes\n */\nlibrary ModeLib {\n function decode(ModeCode mode)\n internal\n pure\n returns (\n CallType _calltype,\n ExecType _execType,\n ModeSelector _modeSelector,\n ModePayload _modePayload\n )\n {\n // solhint-disable-next-line no-inline-assembly\n assembly {\n _calltype := mode\n _execType := shl(8, mode)\n _modeSelector := shl(48, mode)\n _modePayload := shl(80, mode)\n }\n }\n\n function encode(\n CallType callType,\n ExecType execType,\n ModeSelector mode,\n ModePayload payload\n )\n internal\n pure\n returns (ModeCode)\n {\n return ModeCode.wrap(\n bytes32(\n abi.encodePacked(callType, execType, bytes4(0), ModeSelector.unwrap(mode), payload)\n )\n );\n }\n\n function encodeSimpleBatch() internal pure returns (ModeCode mode) {\n mode = encode(CALLTYPE_BATCH, EXECTYPE_DEFAULT, MODE_DEFAULT, ModePayload.wrap(0x00));\n }\n\n function encodeSimpleSingle() internal pure returns (ModeCode mode) {\n mode = encode(CALLTYPE_SINGLE, EXECTYPE_DEFAULT, MODE_DEFAULT, ModePayload.wrap(0x00));\n }\n\n function getCallType(ModeCode mode) internal pure returns (CallType calltype) {\n // solhint-disable-next-line no-inline-assembly\n assembly {\n calltype := mode\n }\n }\n}\n\nusing { eqModeSelector as == } for ModeSelector global;\nusing { eqCallType as == } for CallType global;\nusing { neqCallType as != } for CallType global;\nusing { eqExecType as == } for ExecType global;\n\nfunction eqCallType(CallType a, CallType b) pure returns (bool) {\n return CallType.unwrap(a) == CallType.unwrap(b);\n}\n\nfunction neqCallType(CallType a, CallType b) pure returns (bool) {\n return CallType.unwrap(a) == CallType.unwrap(b);\n}\n\nfunction eqExecType(ExecType a, ExecType b) pure returns (bool) {\n return ExecType.unwrap(a) == ExecType.unwrap(b);\n}\n\nfunction eqModeSelector(ModeSelector a, ModeSelector b) pure returns (bool) {\n return ModeSelector.unwrap(a) == ModeSelector.unwrap(b);\n}\n"},"node_modules/@rhinestone/modulekit/src/module-bases/interfaces/IERC7484.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\ninterface IERC7484 {\n event NewTrustedAttesters();\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* Check with Registry internal attesters */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n function check(address module) external view;\n\n function checkForAccount(address smartAccount, address module) external view;\n\n function check(address module, uint256 moduleType) external view;\n\n function checkForAccount(\n address smartAccount,\n address module,\n uint256 moduleType\n )\n external\n view;\n\n /**\n * Allows Smart Accounts - the end users of the registry - to appoint\n * one or many attesters as trusted.\n * @dev this function reverts, if address(0), or duplicates are provided in attesters[]\n *\n * @param threshold The minimum number of attestations required for a module\n * to be considered secure.\n * @param attesters The addresses of the attesters to be trusted.\n */\n function trustAttesters(uint8 threshold, address[] calldata attesters) external;\n\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* Check with external attester(s) */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n function check(address module, address[] calldata attesters, uint256 threshold) external view;\n\n function check(\n address module,\n uint256 moduleType,\n address[] calldata attesters,\n uint256 threshold\n )\n external\n view;\n}\n"},"node_modules/@rhinestone/modulekit/src/module-bases/interfaces/IPolicy.sol":{"content":"// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity >=0.8.0 <0.9.0;\n\n// solhint-disable no-unused-import\nimport { PackedUserOperation, _packValidationData } from \"../../external/ERC4337.sol\";\nimport {\n IModule as IERC7579Module,\n VALIDATION_SUCCESS,\n VALIDATION_FAILED\n} from \"../../accounts/common/interfaces/IERC7579Module.sol\";\nimport { IERC165 } from \"forge-std/interfaces/IERC165.sol\";\n\ntype ConfigId is bytes32;\n\n/**\n * IPolicy are external contracts that enforce policies / permission on 4337/7579 executions\n * Since it's not the account calling into this contract, and check functions are called during the\n * ERC4337 validation\n * phase, IPolicy implementations MUST follow ERC4337 storage and opcode restrictions\n * A recommend storage layout to store policy related data:\n * mapping(id => msg.sender => userOp.sender(account) => state)\n * ^ smartSession ^ smart account (associated storage)\n */\ninterface IPolicy is IERC165, IERC7579Module {\n function isInitialized(address account, ConfigId configId) external view returns (bool);\n function isInitialized(\n address account,\n address mulitplexer,\n ConfigId configId\n )\n external\n view\n returns (bool);\n\n /**\n * This function may be called by the multiplexer (SmartSessions) without deinitializing first.\n * Policies MUST overwrite the current state when this happens\n */\n function initializeWithMultiplexer(\n address account,\n ConfigId configId,\n bytes calldata initData\n )\n external;\n}\n\n/**\n * IUserOpPolicy is a policy that enforces restrictions on user operations. It is called during the\n * validation phase\n * of the ERC4337 execution.\n * Use this policy to enforce restrictions on user operations (userOp.gas, Time based restrictions).\n * The checkUserOpPolicy function should return a uint256 value that represents the policy's\n * decision.\n * The policy's decision should be one of the following:\n * - VALIDATION_SUCCESS: The user operation is allowed.\n * - VALIDATION_FAILED: The user operation is not allowed.\n */\ninterface IUserOpPolicy is IPolicy {\n function checkUserOpPolicy(\n ConfigId id,\n PackedUserOperation calldata userOp\n )\n external\n returns (uint256);\n}\n\n/**\n * IActionPolicy is a policy that enforces restrictions on actions. It is called during the\n * validation phase\n * of the ERC4337 execution.\n * ERC7579 accounts natively support batched executions. So in one userOp, multiple actions can be\n * executed.\n * SmartSession will destruct the execution batch, and call the policy for each action, if the\n * policy is installed for\n * the actionId for the account.\n * Use this policy to enforce restrictions on individual actions (i.e. transfers, approvals, etc).\n * The checkAction function should return a uint256 value that represents the policy's decision.\n * The policy's decision should be one of the following:\n * - VALIDATION_SUCCESS: The action is allowed.\n * - VALIDATION_FAILED: The action is not allowed.\n */\ninterface IActionPolicy is IPolicy {\n function checkAction(\n ConfigId id,\n address account,\n address target,\n uint256 value,\n bytes calldata data\n )\n external\n returns (uint256);\n}\n\n/**\n * I1271Policy is a policy that enforces restrictions on 1271 signed actions. It is called during an\n * ERC1271 signature\n * validation\n */\ninterface I1271Policy is IPolicy {\n // request sender is probably protocol, so can introduce policies based on it.\n function check1271SignedAction(\n ConfigId id,\n address requestSender,\n address account,\n bytes32 hash,\n bytes calldata signature\n )\n external\n view\n returns (bool);\n}\n"},"node_modules/@ERC4337/account-abstraction/contracts/core/EntryPoint.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.23;\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable no-inline-assembly */\n\nimport \"../interfaces/IAccount.sol\";\nimport \"../interfaces/IAccountExecute.sol\";\nimport \"../interfaces/IPaymaster.sol\";\nimport \"../interfaces/IEntryPoint.sol\";\n\nimport \"../utils/Exec.sol\";\nimport \"./StakeManager.sol\";\nimport \"./SenderCreator.sol\";\nimport \"./Helpers.sol\";\nimport \"./NonceManager.sol\";\nimport \"./UserOperationLib.sol\";\nimport \"./GasDebug.sol\";\n\nimport \"@openzeppelin/contracts/utils/introspection/ERC165.sol\";\nimport \"@openzeppelin/contracts/utils/ReentrancyGuard.sol\";\n\n/*\n * Account-Abstraction (EIP-4337) singleton EntryPoint implementation.\n * Only one instance required on each chain.\n */\n\n/// @custom:security-contact https://bounty.ethereum.org\ncontract EntryPoint is IEntryPoint, StakeManager, NonceManager, ReentrancyGuard, ERC165, GasDebug {\n using UserOperationLib for PackedUserOperation;\n\n SenderCreator private immutable _senderCreator = new SenderCreator();\n\n function senderCreator() internal view virtual returns (SenderCreator) {\n return _senderCreator;\n }\n\n //compensate for innerHandleOps' emit message and deposit refund.\n // allow some slack for future gas price changes.\n uint256 private constant INNER_GAS_OVERHEAD = 10000;\n\n // Marker for inner call revert on out of gas\n bytes32 private constant INNER_OUT_OF_GAS = hex\"deaddead\";\n bytes32 private constant INNER_REVERT_LOW_PREFUND = hex\"deadaa51\";\n\n uint256 private constant REVERT_REASON_MAX_LEN = 2048;\n uint256 private constant PENALTY_PERCENT = 10;\n\n /// @inheritdoc IERC165\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n // note: solidity \"type(IEntryPoint).interfaceId\" is without inherited methods but we want to check everything\n return interfaceId\n == (type(IEntryPoint).interfaceId ^ type(IStakeManager).interfaceId ^ type(INonceManager).interfaceId)\n || interfaceId == type(IEntryPoint).interfaceId || interfaceId == type(IStakeManager).interfaceId\n || interfaceId == type(INonceManager).interfaceId || super.supportsInterface(interfaceId);\n }\n\n /**\n * Compensate the caller's beneficiary address with the collected fees of all UserOperations.\n * @param beneficiary - The address to receive the fees.\n * @param amount - Amount to transfer.\n */\n function _compensate(address payable beneficiary, uint256 amount) internal {\n require(beneficiary != address(0), \"AA90 invalid beneficiary\");\n (bool success,) = beneficiary.call{value: amount}(\"\");\n require(success, \"AA91 failed send to beneficiary\");\n }\n\n /**\n * Execute a user operation.\n * @param opIndex - Index into the opInfo array.\n * @param userOp - The userOp to execute.\n * @param opInfo - The opInfo filled by validatePrepayment for this userOp.\n * @return collected - The total amount this userOp paid.\n */\n function _executeUserOp(uint256 opIndex, PackedUserOperation calldata userOp, UserOpInfo memory opInfo)\n internal\n returns (uint256 collected)\n {\n uint256 preGas = gasleft();\n bytes memory context = getMemoryBytesFromOffset(opInfo.contextOffset);\n bool success;\n {\n uint256 saveFreePtr;\n assembly (\"memory-safe\") {\n saveFreePtr := mload(0x40)\n }\n bytes calldata callData = userOp.callData;\n bytes memory innerCall;\n bytes4 methodSig;\n assembly {\n let len := callData.length\n if gt(len, 3) { methodSig := calldataload(callData.offset) }\n }\n if (methodSig == IAccountExecute.executeUserOp.selector) {\n bytes memory executeUserOp = abi.encodeCall(IAccountExecute.executeUserOp, (userOp, opInfo.userOpHash));\n innerCall = abi.encodeCall(this.innerHandleOp, (executeUserOp, opInfo, context));\n } else {\n innerCall = abi.encodeCall(this.innerHandleOp, (callData, opInfo, context));\n }\n assembly (\"memory-safe\") {\n success := call(gas(), address(), 0, add(innerCall, 0x20), mload(innerCall), 0, 32)\n collected := mload(0)\n mstore(0x40, saveFreePtr)\n }\n }\n if (!success) {\n bytes32 innerRevertCode;\n assembly (\"memory-safe\") {\n let len := returndatasize()\n if eq(32, len) {\n returndatacopy(0, 0, 32)\n innerRevertCode := mload(0)\n }\n }\n if (innerRevertCode == INNER_OUT_OF_GAS) {\n // handleOps was called with gas limit too low. abort entire bundle.\n //can only be caused by bundler (leaving not enough gas for inner call)\n revert FailedOp(opIndex, \"AA95 out of gas\");\n } else if (innerRevertCode == INNER_REVERT_LOW_PREFUND) {\n // innerCall reverted on prefund too low. treat entire prefund as \"gas cost\"\n uint256 actualGas = preGas - gasleft() + opInfo.preOpGas;\n uint256 actualGasCost = opInfo.prefund;\n emitPrefundTooLow(opInfo);\n emitUserOperationEvent(opInfo, false, actualGasCost, actualGas);\n collected = actualGasCost;\n } else {\n emit PostOpRevertReason(\n opInfo.userOpHash,\n opInfo.mUserOp.sender,\n opInfo.mUserOp.nonce,\n Exec.getReturnData(REVERT_REASON_MAX_LEN)\n );\n\n uint256 actualGas = preGas - gasleft() + opInfo.preOpGas;\n collected = _postExecution(IPaymaster.PostOpMode.postOpReverted, opInfo, context, actualGas);\n }\n }\n }\n\n function emitUserOperationEvent(UserOpInfo memory opInfo, bool success, uint256 actualGasCost, uint256 actualGas)\n internal\n virtual\n {\n emit UserOperationEvent(\n opInfo.userOpHash,\n opInfo.mUserOp.sender,\n opInfo.mUserOp.paymaster,\n opInfo.mUserOp.nonce,\n success,\n actualGasCost,\n actualGas\n );\n }\n\n function emitPrefundTooLow(UserOpInfo memory opInfo) internal virtual {\n emit UserOperationPrefundTooLow(opInfo.userOpHash, opInfo.mUserOp.sender, opInfo.mUserOp.nonce);\n }\n\n /// @inheritdoc IEntryPoint\n function handleOps(PackedUserOperation[] calldata ops, address payable beneficiary) public nonReentrant {\n uint256 opslen = ops.length;\n UserOpInfo[] memory opInfos = new UserOpInfo[](opslen);\n\n unchecked {\n for (uint256 i = 0; i < opslen; i++) {\n UserOpInfo memory opInfo = opInfos[i];\n (uint256 validationData, uint256 pmValidationData) = _validatePrepayment(i, ops[i], opInfo);\n _validateAccountAndPaymasterValidationData(i, validationData, pmValidationData, address(0));\n }\n\n uint256 collected = 0;\n emit BeforeExecution();\n\n for (uint256 i = 0; i < opslen; i++) {\n collected += _executeUserOp(i, ops[i], opInfos[i]);\n }\n\n _compensate(beneficiary, collected);\n }\n }\n\n /// @inheritdoc IEntryPoint\n function handleAggregatedOps(UserOpsPerAggregator[] calldata opsPerAggregator, address payable beneficiary)\n public\n nonReentrant\n {\n uint256 opasLen = opsPerAggregator.length;\n uint256 totalOps = 0;\n for (uint256 i = 0; i < opasLen; i++) {\n UserOpsPerAggregator calldata opa = opsPerAggregator[i];\n PackedUserOperation[] calldata ops = opa.userOps;\n IAggregator aggregator = opa.aggregator;\n\n //address(1) is special marker of \"signature error\"\n require(address(aggregator) != address(1), \"AA96 invalid aggregator\");\n\n if (address(aggregator) != address(0)) {\n // solhint-disable-next-line no-empty-blocks\n try aggregator.validateSignatures(ops, opa.signature) {}\n catch {\n revert SignatureValidationFailed(address(aggregator));\n }\n }\n\n totalOps += ops.length;\n }\n\n UserOpInfo[] memory opInfos = new UserOpInfo[](totalOps);\n\n uint256 opIndex = 0;\n for (uint256 a = 0; a < opasLen; a++) {\n UserOpsPerAggregator calldata opa = opsPerAggregator[a];\n PackedUserOperation[] calldata ops = opa.userOps;\n IAggregator aggregator = opa.aggregator;\n\n uint256 opslen = ops.length;\n for (uint256 i = 0; i < opslen; i++) {\n UserOpInfo memory opInfo = opInfos[opIndex];\n (uint256 validationData, uint256 paymasterValidationData) = _validatePrepayment(opIndex, ops[i], opInfo);\n _validateAccountAndPaymasterValidationData(\n i, validationData, paymasterValidationData, address(aggregator)\n );\n opIndex++;\n }\n }\n\n emit BeforeExecution();\n\n uint256 collected = 0;\n opIndex = 0;\n for (uint256 a = 0; a < opasLen; a++) {\n UserOpsPerAggregator calldata opa = opsPerAggregator[a];\n emit SignatureAggregatorChanged(address(opa.aggregator));\n PackedUserOperation[] calldata ops = opa.userOps;\n uint256 opslen = ops.length;\n\n for (uint256 i = 0; i < opslen; i++) {\n collected += _executeUserOp(opIndex, ops[i], opInfos[opIndex]);\n opIndex++;\n }\n }\n emit SignatureAggregatorChanged(address(0));\n\n _compensate(beneficiary, collected);\n }\n\n /**\n * A memory copy of UserOp static fields only.\n * Excluding: callData, initCode and signature. Replacing paymasterAndData with paymaster.\n */\n struct MemoryUserOp {\n address sender;\n uint256 nonce;\n uint256 verificationGasLimit;\n uint256 callGasLimit;\n uint256 paymasterVerificationGasLimit;\n uint256 paymasterPostOpGasLimit;\n uint256 preVerificationGas;\n address paymaster;\n uint256 maxFeePerGas;\n uint256 maxPriorityFeePerGas;\n }\n\n struct UserOpInfo {\n MemoryUserOp mUserOp;\n bytes32 userOpHash;\n uint256 prefund;\n uint256 contextOffset;\n uint256 preOpGas;\n }\n\n /**\n * Inner function to handle a UserOperation.\n * Must be declared \"external\" to open a call context, but it can only be called by handleOps.\n * @param callData - The callData to execute.\n * @param opInfo - The UserOpInfo struct.\n * @param context - The context bytes.\n * @return actualGasCost - the actual cost in eth this UserOperation paid for gas\n */\n function innerHandleOp(bytes memory callData, UserOpInfo memory opInfo, bytes calldata context)\n external\n returns (uint256 actualGasCost)\n {\n uint256 preGas = gasleft();\n require(msg.sender == address(this), \"AA92 internal call only\");\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\n\n uint256 callGasLimit = mUserOp.callGasLimit;\n unchecked {\n // handleOps was called with gas limit too low. abort entire bundle.\n if (gasleft() * 63 / 64 < callGasLimit + mUserOp.paymasterPostOpGasLimit + INNER_GAS_OVERHEAD) {\n assembly (\"memory-safe\") {\n mstore(0, INNER_OUT_OF_GAS)\n revert(0, 32)\n }\n }\n }\n\n IPaymaster.PostOpMode mode = IPaymaster.PostOpMode.opSucceeded;\n if (callData.length > 0) {\n uint256 _execGas = gasleft();\n bool success = Exec.call(mUserOp.sender, 0, callData, callGasLimit);\n setGasConsumed(mUserOp.sender, 2, _execGas - gasleft());\n if (!success) {\n bytes memory result = Exec.getReturnData(REVERT_REASON_MAX_LEN);\n if (result.length > 0) {\n emit UserOperationRevertReason(opInfo.userOpHash, mUserOp.sender, mUserOp.nonce, result);\n }\n mode = IPaymaster.PostOpMode.opReverted;\n }\n }\n\n unchecked {\n uint256 actualGas = preGas - gasleft() + opInfo.preOpGas;\n return _postExecution(mode, opInfo, context, actualGas);\n }\n }\n\n /// @inheritdoc IEntryPoint\n function getUserOpHash(PackedUserOperation calldata userOp) public view returns (bytes32) {\n return keccak256(abi.encode(userOp.hash(), address(this), block.chainid));\n }\n\n /**\n * Copy general fields from userOp into the memory opInfo structure.\n * @param userOp - The user operation.\n * @param mUserOp - The memory user operation.\n */\n function _copyUserOpToMemory(PackedUserOperation calldata userOp, MemoryUserOp memory mUserOp) internal pure {\n mUserOp.sender = userOp.sender;\n mUserOp.nonce = userOp.nonce;\n (mUserOp.verificationGasLimit, mUserOp.callGasLimit) = UserOperationLib.unpackUints(userOp.accountGasLimits);\n mUserOp.preVerificationGas = userOp.preVerificationGas;\n (mUserOp.maxPriorityFeePerGas, mUserOp.maxFeePerGas) = UserOperationLib.unpackUints(userOp.gasFees);\n bytes calldata paymasterAndData = userOp.paymasterAndData;\n if (paymasterAndData.length > 0) {\n require(paymasterAndData.length >= UserOperationLib.PAYMASTER_DATA_OFFSET, \"AA93 invalid paymasterAndData\");\n (mUserOp.paymaster, mUserOp.paymasterVerificationGasLimit, mUserOp.paymasterPostOpGasLimit) =\n UserOperationLib.unpackPaymasterStaticFields(paymasterAndData);\n } else {\n mUserOp.paymaster = address(0);\n mUserOp.paymasterVerificationGasLimit = 0;\n mUserOp.paymasterPostOpGasLimit = 0;\n }\n }\n\n /**\n * Get the required prefunded gas fee amount for an operation.\n * @param mUserOp - The user operation in memory.\n */\n function _getRequiredPrefund(MemoryUserOp memory mUserOp) internal pure returns (uint256 requiredPrefund) {\n unchecked {\n uint256 requiredGas = mUserOp.verificationGasLimit + mUserOp.callGasLimit\n + mUserOp.paymasterVerificationGasLimit + mUserOp.paymasterPostOpGasLimit + mUserOp.preVerificationGas;\n\n requiredPrefund = requiredGas * mUserOp.maxFeePerGas;\n }\n }\n\n /**\n * Create sender smart contract account if init code is provided.\n * @param opIndex - The operation index.\n * @param opInfo - The operation info.\n * @param initCode - The init code for the smart contract account.\n */\n function _createSenderIfNeeded(uint256 opIndex, UserOpInfo memory opInfo, bytes calldata initCode) internal {\n if (initCode.length != 0) {\n address sender = opInfo.mUserOp.sender;\n if (sender.code.length != 0) {\n revert FailedOp(opIndex, \"AA10 sender already constructed\");\n }\n uint256 _creationGas = gasleft();\n address sender1 = senderCreator().createSender{gas: opInfo.mUserOp.verificationGasLimit}(initCode);\n setGasConsumed(sender, 0, _creationGas - gasleft());\n if (sender1 == address(0)) {\n revert FailedOp(opIndex, \"AA13 initCode failed or OOG\");\n }\n if (sender1 != sender) {\n revert FailedOp(opIndex, \"AA14 initCode must return sender\");\n }\n if (sender1.code.length == 0) {\n revert FailedOp(opIndex, \"AA15 initCode must create sender\");\n }\n address factory = address(bytes20(initCode[0:20]));\n emit AccountDeployed(opInfo.userOpHash, sender, factory, opInfo.mUserOp.paymaster);\n }\n }\n\n /// @inheritdoc IEntryPoint\n function getSenderAddress(bytes calldata initCode) public {\n address sender = senderCreator().createSender(initCode);\n revert SenderAddressResult(sender);\n }\n\n /**\n * Call account.validateUserOp.\n * Revert (with FailedOp) in case validateUserOp reverts, or account didn't send required prefund.\n * Decrement account's deposit if needed.\n * @param opIndex - The operation index.\n * @param op - The user operation.\n * @param opInfo - The operation info.\n * @param requiredPrefund - The required prefund amount.\n */\n function _validateAccountPrepayment(\n uint256 opIndex,\n PackedUserOperation calldata op,\n UserOpInfo memory opInfo,\n uint256 requiredPrefund,\n uint256 verificationGasLimit\n ) internal returns (uint256 validationData) {\n unchecked {\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\n address sender = mUserOp.sender;\n _createSenderIfNeeded(opIndex, opInfo, op.initCode);\n address paymaster = mUserOp.paymaster;\n uint256 missingAccountFunds = 0;\n if (paymaster == address(0)) {\n uint256 bal = balanceOf(sender);\n missingAccountFunds = bal > requiredPrefund ? 0 : requiredPrefund - bal;\n }\n uint256 _verificationGas = gasleft();\n try IAccount(sender).validateUserOp{gas: verificationGasLimit}(op, opInfo.userOpHash, missingAccountFunds)\n returns (uint256 _validationData) {\n validationData = _validationData;\n setGasConsumed(sender, 1, _verificationGas - gasleft());\n } catch {\n revert FailedOpWithRevert(opIndex, \"AA23 reverted\", Exec.getReturnData(REVERT_REASON_MAX_LEN));\n }\n if (paymaster == address(0)) {\n DepositInfo storage senderInfo = deposits[sender];\n uint256 deposit = senderInfo.deposit;\n if (requiredPrefund > deposit) {\n revert FailedOp(opIndex, \"AA21 didn't pay prefund\");\n }\n senderInfo.deposit = deposit - requiredPrefund;\n }\n }\n }\n\n /**\n * In case the request has a paymaster:\n * - Validate paymaster has enough deposit.\n * - Call paymaster.validatePaymasterUserOp.\n * - Revert with proper FailedOp in case paymaster reverts.\n * - Decrement paymaster's deposit.\n * @param opIndex - The operation index.\n * @param op - The user operation.\n * @param opInfo - The operation info.\n * @param requiredPreFund - The required prefund amount.\n */\n function _validatePaymasterPrepayment(\n uint256 opIndex,\n PackedUserOperation calldata op,\n UserOpInfo memory opInfo,\n uint256 requiredPreFund\n ) internal returns (bytes memory context, uint256 validationData) {\n unchecked {\n uint256 preGas = gasleft();\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\n address paymaster = mUserOp.paymaster;\n DepositInfo storage paymasterInfo = deposits[paymaster];\n uint256 deposit = paymasterInfo.deposit;\n if (deposit < requiredPreFund) {\n revert FailedOp(opIndex, \"AA31 paymaster deposit too low\");\n }\n paymasterInfo.deposit = deposit - requiredPreFund;\n uint256 pmVerificationGasLimit = mUserOp.paymasterVerificationGasLimit;\n try IPaymaster(paymaster).validatePaymasterUserOp{gas: pmVerificationGasLimit}(\n op, opInfo.userOpHash, requiredPreFund\n ) returns (bytes memory _context, uint256 _validationData) {\n context = _context;\n validationData = _validationData;\n } catch {\n revert FailedOpWithRevert(opIndex, \"AA33 reverted\", Exec.getReturnData(REVERT_REASON_MAX_LEN));\n }\n if (preGas - gasleft() > pmVerificationGasLimit) {\n revert FailedOp(opIndex, \"AA36 over paymasterVerificationGasLimit\");\n }\n }\n }\n\n /**\n * Revert if either account validationData or paymaster validationData is expired.\n * @param opIndex - The operation index.\n * @param validationData - The account validationData.\n * @param paymasterValidationData - The paymaster validationData.\n * @param expectedAggregator - The expected aggregator.\n */\n function _validateAccountAndPaymasterValidationData(\n uint256 opIndex,\n uint256 validationData,\n uint256 paymasterValidationData,\n address expectedAggregator\n ) internal view {\n (address aggregator, bool outOfTimeRange) = _getValidationData(validationData);\n if (expectedAggregator != aggregator) {\n revert FailedOp(opIndex, \"AA24 signature error\");\n }\n if (outOfTimeRange) {\n revert FailedOp(opIndex, \"AA22 expired or not due\");\n }\n // pmAggregator is not a real signature aggregator: we don't have logic to handle it as address.\n // Non-zero address means that the paymaster fails due to some signature check (which is ok only during estimation).\n address pmAggregator;\n (pmAggregator, outOfTimeRange) = _getValidationData(paymasterValidationData);\n if (pmAggregator != address(0)) {\n revert FailedOp(opIndex, \"AA34 signature error\");\n }\n if (outOfTimeRange) {\n revert FailedOp(opIndex, \"AA32 paymaster expired or not due\");\n }\n }\n\n /**\n * Parse validationData into its components.\n * @param validationData - The packed validation data (sigFailed, validAfter, validUntil).\n * @return aggregator the aggregator of the validationData\n * @return outOfTimeRange true if current time is outside the time range of this validationData.\n */\n function _getValidationData(uint256 validationData)\n internal\n view\n returns (address aggregator, bool outOfTimeRange)\n {\n if (validationData == 0) {\n return (address(0), false);\n }\n ValidationData memory data = _parseValidationData(validationData);\n // solhint-disable-next-line not-rely-on-time\n outOfTimeRange = block.timestamp > data.validUntil || block.timestamp < data.validAfter;\n aggregator = data.aggregator;\n }\n\n /**\n * Validate account and paymaster (if defined) and\n * also make sure total validation doesn't exceed verificationGasLimit.\n * This method is called off-chain (simulateValidation()) and on-chain (from handleOps)\n * @param opIndex - The index of this userOp into the \"opInfos\" array.\n * @param userOp - The userOp to validate.\n */\n function _validatePrepayment(uint256 opIndex, PackedUserOperation calldata userOp, UserOpInfo memory outOpInfo)\n internal\n returns (uint256 validationData, uint256 paymasterValidationData)\n {\n uint256 preGas = gasleft();\n MemoryUserOp memory mUserOp = outOpInfo.mUserOp;\n _copyUserOpToMemory(userOp, mUserOp);\n outOpInfo.userOpHash = getUserOpHash(userOp);\n\n // Validate all numeric values in userOp are well below 128 bit, so they can safely be added\n // and multiplied without causing overflow.\n uint256 verificationGasLimit = mUserOp.verificationGasLimit;\n uint256 maxGasValues = mUserOp.preVerificationGas | verificationGasLimit | mUserOp.callGasLimit\n | mUserOp.paymasterVerificationGasLimit | mUserOp.paymasterPostOpGasLimit | mUserOp.maxFeePerGas\n | mUserOp.maxPriorityFeePerGas;\n require(maxGasValues <= type(uint120).max, \"AA94 gas values overflow\");\n\n uint256 requiredPreFund = _getRequiredPrefund(mUserOp);\n validationData = _validateAccountPrepayment(opIndex, userOp, outOpInfo, requiredPreFund, verificationGasLimit);\n\n if (!_validateAndUpdateNonce(mUserOp.sender, mUserOp.nonce)) {\n revert FailedOp(opIndex, \"AA25 invalid account nonce\");\n }\n\n unchecked {\n if (preGas - gasleft() > verificationGasLimit) {\n revert FailedOp(opIndex, \"AA26 over verificationGasLimit\");\n }\n }\n\n bytes memory context;\n if (mUserOp.paymaster != address(0)) {\n (context, paymasterValidationData) =\n _validatePaymasterPrepayment(opIndex, userOp, outOpInfo, requiredPreFund);\n }\n unchecked {\n outOpInfo.prefund = requiredPreFund;\n outOpInfo.contextOffset = getOffsetOfMemoryBytes(context);\n outOpInfo.preOpGas = preGas - gasleft() + userOp.preVerificationGas;\n }\n }\n\n /**\n * Process post-operation, called just after the callData is executed.\n * If a paymaster is defined and its validation returned a non-empty context, its postOp is called.\n * The excess amount is refunded to the account (or paymaster - if it was used in the request).\n * @param mode - Whether is called from innerHandleOp, or outside (postOpReverted).\n * @param opInfo - UserOp fields and info collected during validation.\n * @param context - The context returned in validatePaymasterUserOp.\n * @param actualGas - The gas used so far by this user operation.\n */\n function _postExecution(\n IPaymaster.PostOpMode mode,\n UserOpInfo memory opInfo,\n bytes memory context,\n uint256 actualGas\n ) private returns (uint256 actualGasCost) {\n uint256 preGas = gasleft();\n unchecked {\n address refundAddress;\n MemoryUserOp memory mUserOp = opInfo.mUserOp;\n uint256 gasPrice = getUserOpGasPrice(mUserOp);\n\n address paymaster = mUserOp.paymaster;\n if (paymaster == address(0)) {\n refundAddress = mUserOp.sender;\n } else {\n refundAddress = paymaster;\n if (context.length > 0) {\n actualGasCost = actualGas * gasPrice;\n if (mode != IPaymaster.PostOpMode.postOpReverted) {\n try IPaymaster(paymaster).postOp{gas: mUserOp.paymasterPostOpGasLimit}(\n mode, context, actualGasCost, gasPrice\n ) {\n // solhint-disable-next-line no-empty-blocks\n } catch {\n bytes memory reason = Exec.getReturnData(REVERT_REASON_MAX_LEN);\n revert PostOpReverted(reason);\n }\n }\n }\n }\n actualGas += preGas - gasleft();\n\n // Calculating a penalty for unused execution gas\n {\n uint256 executionGasLimit = mUserOp.callGasLimit + mUserOp.paymasterPostOpGasLimit;\n uint256 executionGasUsed = actualGas - opInfo.preOpGas;\n // this check is required for the gas used within EntryPoint and not covered by explicit gas limits\n if (executionGasLimit > executionGasUsed) {\n uint256 unusedGas = executionGasLimit - executionGasUsed;\n uint256 unusedGasPenalty = (unusedGas * PENALTY_PERCENT) / 100;\n actualGas += unusedGasPenalty;\n }\n }\n\n actualGasCost = actualGas * gasPrice;\n uint256 prefund = opInfo.prefund;\n if (prefund < actualGasCost) {\n if (mode == IPaymaster.PostOpMode.postOpReverted) {\n actualGasCost = prefund;\n emitPrefundTooLow(opInfo);\n emitUserOperationEvent(opInfo, false, actualGasCost, actualGas);\n } else {\n assembly (\"memory-safe\") {\n mstore(0, INNER_REVERT_LOW_PREFUND)\n revert(0, 32)\n }\n }\n } else {\n uint256 refund = prefund - actualGasCost;\n _incrementDeposit(refundAddress, refund);\n bool success = mode == IPaymaster.PostOpMode.opSucceeded;\n emitUserOperationEvent(opInfo, success, actualGasCost, actualGas);\n }\n } // unchecked\n }\n\n /**\n * The gas price this UserOp agrees to pay.\n * Relayer/block builder might submit the TX with higher priorityFee, but the user should not.\n * @param mUserOp - The userOp to get the gas price from.\n */\n function getUserOpGasPrice(MemoryUserOp memory mUserOp) internal view returns (uint256) {\n unchecked {\n uint256 maxFeePerGas = mUserOp.maxFeePerGas;\n uint256 maxPriorityFeePerGas = mUserOp.maxPriorityFeePerGas;\n if (maxFeePerGas == maxPriorityFeePerGas) {\n //legacy mode (for networks that don't support basefee opcode)\n return maxFeePerGas;\n }\n return min(maxFeePerGas, maxPriorityFeePerGas + block.basefee);\n }\n }\n\n /**\n * The offset of the given bytes in memory.\n * @param data - The bytes to get the offset of.\n */\n function getOffsetOfMemoryBytes(bytes memory data) internal pure returns (uint256 offset) {\n assembly {\n offset := data\n }\n }\n\n /**\n * The bytes in memory at the given offset.\n * @param offset - The offset to get the bytes from.\n */\n function getMemoryBytesFromOffset(uint256 offset) internal pure returns (bytes memory data) {\n assembly (\"memory-safe\") {\n data := offset\n }\n }\n\n /// @inheritdoc IEntryPoint\n function delegateAndRevert(address target, bytes calldata data) external {\n (bool success, bytes memory ret) = target.delegatecall(data);\n revert DelegateAndRevert(success, ret);\n }\n}\n"},"node_modules/@ERC4337/account-abstraction/contracts/interfaces/IAggregator.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\npragma solidity >=0.7.5;\n\nimport \"./PackedUserOperation.sol\";\n\n/**\n * Aggregated Signatures validator.\n */\ninterface IAggregator {\n /**\n * Validate aggregated signature.\n * Revert if the aggregated signature does not match the given list of operations.\n * @param userOps - Array of UserOperations to validate the signature for.\n * @param signature - The aggregated signature.\n */\n function validateSignatures(\n PackedUserOperation[] calldata userOps,\n bytes calldata signature\n ) external view;\n\n /**\n * Validate signature of a single userOp.\n * This method should be called by bundler after EntryPointSimulation.simulateValidation() returns\n * the aggregator this account uses.\n * First it validates the signature over the userOp. Then it returns data to be used when creating the handleOps.\n * @param userOp - The userOperation received from the user.\n * @return sigForUserOp - The value to put into the signature field of the userOp when calling handleOps.\n * (usually empty, unless account and aggregator support some kind of \"multisig\".\n */\n function validateUserOpSignature(\n PackedUserOperation calldata userOp\n ) external view returns (bytes memory sigForUserOp);\n\n /**\n * Aggregate multiple signatures into a single value.\n * This method is called off-chain to calculate the signature to pass with handleOps()\n * bundler MAY use optimized custom code perform this aggregation.\n * @param userOps - Array of UserOperations to collect the signatures from.\n * @return aggregatedSignature - The aggregated signature.\n */\n function aggregateSignatures(\n PackedUserOperation[] calldata userOps\n ) external view returns (bytes memory aggregatedSignature);\n}\n"},"node_modules/@ERC4337/account-abstraction/contracts/interfaces/INonceManager.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\npragma solidity >=0.7.5;\n\ninterface INonceManager {\n\n /**\n * Return the next nonce for this sender.\n * Within a given key, the nonce values are sequenced (starting with zero, and incremented by one on each userop)\n * But UserOp with different keys can come with arbitrary order.\n *\n * @param sender the account address\n * @param key the high 192 bit of the nonce\n * @return nonce a full nonce to pass for next UserOp with this sender.\n */\n function getNonce(address sender, uint192 key)\n external view returns (uint256 nonce);\n\n /**\n * Manually increment the nonce of the sender.\n * This method is exposed just for completeness..\n * Account does NOT need to call it, neither during validation, nor elsewhere,\n * as the EntryPoint will update the nonce regardless.\n * Possible use-case is call it with various keys to \"initialize\" their nonces to one, so that future\n * UserOperations will not pay extra for the first transaction with a given key.\n */\n function incrementNonce(uint192 key) external;\n}\n"},"node_modules/forge-std/src/interfaces/IERC165.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity >=0.6.2;\n\ninterface IERC165 {\n /// @notice Query if a contract implements an interface\n /// @param interfaceID The interface identifier, as specified in ERC-165\n /// @dev Interface identification is specified in ERC-165. This function\n /// uses less than 30,000 gas.\n /// @return `true` if the contract implements `interfaceID` and\n /// `interfaceID` is not 0xffffffff, `false` otherwise\n function supportsInterface(bytes4 interfaceID) external view returns (bool);\n}\n"},"node_modules/@ERC4337/account-abstraction/contracts/interfaces/IPaymaster.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\npragma solidity >=0.7.5;\n\nimport \"./PackedUserOperation.sol\";\n\n/**\n * The interface exposed by a paymaster contract, who agrees to pay the gas for user's operations.\n * A paymaster must hold a stake to cover the required entrypoint stake and also the gas for the transaction.\n */\ninterface IPaymaster {\n enum PostOpMode {\n // User op succeeded.\n opSucceeded,\n // User op reverted. Still has to pay for gas.\n opReverted,\n // Only used internally in the EntryPoint (cleanup after postOp reverts). Never calling paymaster with this value\n postOpReverted\n }\n\n /**\n * Payment validation: check if paymaster agrees to pay.\n * Must verify sender is the entryPoint.\n * Revert to reject this request.\n * Note that bundlers will reject this method if it changes the state, unless the paymaster is trusted (whitelisted).\n * The paymaster pre-pays using its deposit, and receive back a refund after the postOp method returns.\n * @param userOp - The user operation.\n * @param userOpHash - Hash of the user's request data.\n * @param maxCost - The maximum cost of this transaction (based on maximum gas and gas price from userOp).\n * @return context - Value to send to a postOp. Zero length to signify postOp is not required.\n * @return validationData - Signature and time-range of this operation, encoded the same as the return\n * value of validateUserOperation.\n * <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure,\n * other values are invalid for paymaster.\n * <6-byte> validUntil - last timestamp this operation is valid. 0 for \"indefinite\"\n * <6-byte> validAfter - first timestamp this operation is valid\n * Note that the validation code cannot use block.timestamp (or block.number) directly.\n */\n function validatePaymasterUserOp(\n PackedUserOperation calldata userOp,\n bytes32 userOpHash,\n uint256 maxCost\n ) external returns (bytes memory context, uint256 validationData);\n\n /**\n * Post-operation handler.\n * Must verify sender is the entryPoint.\n * @param mode - Enum with the following options:\n * opSucceeded - User operation succeeded.\n * opReverted - User op reverted. The paymaster still has to pay for gas.\n * postOpReverted - never passed in a call to postOp().\n * @param context - The context value returned by validatePaymasterUserOp\n * @param actualGasCost - Actual gas used so far (without this postOp call).\n * @param actualUserOpFeePerGas - the gas price this UserOp pays. This value is based on the UserOp's maxFeePerGas\n * and maxPriorityFee (and basefee)\n * It is not the same as tx.gasprice, which is what the bundler pays.\n */\n function postOp(\n PostOpMode mode,\n bytes calldata context,\n uint256 actualGasCost,\n uint256 actualUserOpFeePerGas\n ) external;\n}\n"},"node_modules/@ERC4337/account-abstraction/contracts/utils/Exec.sol":{"content":"// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity ^0.8.23;\n\n// solhint-disable no-inline-assembly\n\n/**\n * Utility functions helpful when making different kinds of contract calls in Solidity.\n */\nlibrary Exec {\n\n function call(\n address to,\n uint256 value,\n bytes memory data,\n uint256 txGas\n ) internal returns (bool success) {\n assembly (\"memory-safe\") {\n success := call(txGas, to, value, add(data, 0x20), mload(data), 0, 0)\n }\n }\n\n function staticcall(\n address to,\n bytes memory data,\n uint256 txGas\n ) internal view returns (bool success) {\n assembly (\"memory-safe\") {\n success := staticcall(txGas, to, add(data, 0x20), mload(data), 0, 0)\n }\n }\n\n function delegateCall(\n address to,\n bytes memory data,\n uint256 txGas\n ) internal returns (bool success) {\n assembly (\"memory-safe\") {\n success := delegatecall(txGas, to, add(data, 0x20), mload(data), 0, 0)\n }\n }\n\n // get returned data from last call or calldelegate\n function getReturnData(uint256 maxLen) internal pure returns (bytes memory returnData) {\n assembly (\"memory-safe\") {\n let len := returndatasize()\n if gt(len, maxLen) {\n len := maxLen\n }\n let ptr := mload(0x40)\n mstore(0x40, add(ptr, add(len, 0x20)))\n mstore(ptr, len)\n returndatacopy(add(ptr, 0x20), 0, len)\n returnData := ptr\n }\n }\n\n // revert with explicit byte array (probably reverted info from call)\n function revertWithData(bytes memory returnData) internal pure {\n assembly (\"memory-safe\") {\n revert(add(returnData, 32), mload(returnData))\n }\n }\n\n function callAndRevert(address to, bytes memory data, uint256 maxLen) internal {\n bool success = call(to,0,data,gasleft());\n if (!success) {\n revertWithData(getReturnData(maxLen));\n }\n }\n}\n"},"node_modules/@ERC4337/account-abstraction/contracts/core/StakeManager.sol":{"content":"// SPDX-License-Identifier: GPL-3.0-only\npragma solidity ^0.8.23;\n\nimport \"../interfaces/IStakeManager.sol\";\n\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable not-rely-on-time */\n\n/**\n * Manage deposits and stakes.\n * Deposit is just a balance used to pay for UserOperations (either by a paymaster or an account).\n * Stake is value locked for at least \"unstakeDelay\" by a paymaster.\n */\nabstract contract StakeManager is IStakeManager {\n /// maps paymaster to their deposits and stakes\n mapping(address => DepositInfo) public deposits;\n\n /// @inheritdoc IStakeManager\n function getDepositInfo(\n address account\n ) public view returns (DepositInfo memory info) {\n return deposits[account];\n }\n\n /**\n * Internal method to return just the stake info.\n * @param addr - The account to query.\n */\n function _getStakeInfo(\n address addr\n ) internal view returns (StakeInfo memory info) {\n DepositInfo storage depositInfo = deposits[addr];\n info.stake = depositInfo.stake;\n info.unstakeDelaySec = depositInfo.unstakeDelaySec;\n }\n\n /// @inheritdoc IStakeManager\n function balanceOf(address account) public view returns (uint256) {\n return deposits[account].deposit;\n }\n\n receive() external payable {\n depositTo(msg.sender);\n }\n\n /**\n * Increments an account's deposit.\n * @param account - The account to increment.\n * @param amount - The amount to increment by.\n * @return the updated deposit of this account\n */\n function _incrementDeposit(address account, uint256 amount) internal returns (uint256) {\n DepositInfo storage info = deposits[account];\n uint256 newAmount = info.deposit + amount;\n info.deposit = newAmount;\n return newAmount;\n }\n\n /**\n * Add to the deposit of the given account.\n * @param account - The account to add to.\n */\n function depositTo(address account) public virtual payable {\n uint256 newDeposit = _incrementDeposit(account, msg.value);\n emit Deposited(account, newDeposit);\n }\n\n /**\n * Add to the account's stake - amount and delay\n * any pending unstake is first cancelled.\n * @param unstakeDelaySec The new lock duration before the deposit can be withdrawn.\n */\n function addStake(uint32 unstakeDelaySec) public payable {\n DepositInfo storage info = deposits[msg.sender];\n require(unstakeDelaySec > 0, \"must specify unstake delay\");\n require(\n unstakeDelaySec >= info.unstakeDelaySec,\n \"cannot decrease unstake time\"\n );\n uint256 stake = info.stake + msg.value;\n require(stake > 0, \"no stake specified\");\n require(stake <= type(uint112).max, \"stake overflow\");\n deposits[msg.sender] = DepositInfo(\n info.deposit,\n true,\n uint112(stake),\n unstakeDelaySec,\n 0\n );\n emit StakeLocked(msg.sender, stake, unstakeDelaySec);\n }\n\n /**\n * Attempt to unlock the stake.\n * The value can be withdrawn (using withdrawStake) after the unstake delay.\n */\n function unlockStake() external {\n DepositInfo storage info = deposits[msg.sender];\n require(info.unstakeDelaySec != 0, \"not staked\");\n require(info.staked, \"already unstaking\");\n uint48 withdrawTime = uint48(block.timestamp) + info.unstakeDelaySec;\n info.withdrawTime = withdrawTime;\n info.staked = false;\n emit StakeUnlocked(msg.sender, withdrawTime);\n }\n\n /**\n * Withdraw from the (unlocked) stake.\n * Must first call unlockStake and wait for the unstakeDelay to pass.\n * @param withdrawAddress - The address to send withdrawn value.\n */\n function withdrawStake(address payable withdrawAddress) external {\n DepositInfo storage info = deposits[msg.sender];\n uint256 stake = info.stake;\n require(stake > 0, \"No stake to withdraw\");\n require(info.withdrawTime > 0, \"must call unlockStake() first\");\n require(\n info.withdrawTime <= block.timestamp,\n \"Stake withdrawal is not due\"\n );\n info.unstakeDelaySec = 0;\n info.withdrawTime = 0;\n info.stake = 0;\n emit StakeWithdrawn(msg.sender, withdrawAddress, stake);\n (bool success,) = withdrawAddress.call{value: stake}(\"\");\n require(success, \"failed to withdraw stake\");\n }\n\n /**\n * Withdraw from the deposit.\n * @param withdrawAddress - The address to send withdrawn value.\n * @param withdrawAmount - The amount to withdraw.\n */\n function withdrawTo(\n address payable withdrawAddress,\n uint256 withdrawAmount\n ) external {\n DepositInfo storage info = deposits[msg.sender];\n require(withdrawAmount <= info.deposit, \"Withdraw amount too large\");\n info.deposit = info.deposit - withdrawAmount;\n emit Withdrawn(msg.sender, withdrawAddress, withdrawAmount);\n (bool success,) = withdrawAddress.call{value: withdrawAmount}(\"\");\n require(success, \"failed to withdraw\");\n }\n}\n"},"node_modules/@ERC4337/account-abstraction/contracts/core/SenderCreator.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.23;\n\n/**\n * Helper contract for EntryPoint, to call userOp.initCode from a \"neutral\" address,\n * which is explicitly not the entryPoint itself.\n */\ncontract SenderCreator {\n /**\n * Call the \"initCode\" factory to create and return the sender account address.\n * @param initCode - The initCode value from a UserOp. contains 20 bytes of factory address,\n * followed by calldata.\n * @return sender - The returned address of the created account, or zero address on failure.\n */\n function createSender(\n bytes calldata initCode\n ) external returns (address sender) {\n address factory = address(bytes20(initCode[0:20]));\n bytes memory initCallData = initCode[20:];\n bool success;\n /* solhint-disable no-inline-assembly */\n assembly (\"memory-safe\") {\n success := call(\n gas(),\n factory,\n 0,\n add(initCallData, 0x20),\n mload(initCallData),\n 0,\n 32\n )\n sender := mload(0)\n }\n if (!success) {\n sender = address(0);\n }\n }\n}\n"},"node_modules/@ERC4337/account-abstraction/contracts/core/NonceManager.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.23;\n\nimport \"../interfaces/INonceManager.sol\";\n\n/**\n * nonce management functionality\n */\nabstract contract NonceManager is INonceManager {\n\n /**\n * The next valid sequence number for a given nonce key.\n */\n mapping(address => mapping(uint192 => uint256)) public nonceSequenceNumber;\n\n /// @inheritdoc INonceManager\n function getNonce(address sender, uint192 key)\n public view override returns (uint256 nonce) {\n return nonceSequenceNumber[sender][key] | (uint256(key) << 64);\n }\n\n // allow an account to manually increment its own nonce.\n // (mainly so that during construction nonce can be made non-zero,\n // to \"absorb\" the gas cost of first nonce increment to 1st transaction (construction),\n // not to 2nd transaction)\n function incrementNonce(uint192 key) public override {\n nonceSequenceNumber[msg.sender][key]++;\n }\n\n /**\n * validate nonce uniqueness for this account.\n * called just after validateUserOp()\n * @return true if the nonce was incremented successfully.\n * false if the current nonce doesn't match the given one.\n */\n function _validateAndUpdateNonce(address sender, uint256 nonce) internal returns (bool) {\n\n uint192 key = uint192(nonce >> 64);\n uint64 seq = uint64(nonce);\n return nonceSequenceNumber[sender][key]++ == seq;\n }\n\n}\n"},"node_modules/@ERC4337/account-abstraction/contracts/core/GasDebug.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\npragma solidity ^0.8.23;\n\ncontract GasDebug {\n // Phase 0: account creation\n // Phase 1: validation\n // Phase 2: execution\n mapping(address account => mapping(uint256 phase => uint256 gas)) gasConsumed;\n\n function setGasConsumed(address account, uint256 phase, uint256 gas) internal {\n gasConsumed[account][phase] = gas;\n }\n\n function getGasConsumed(address account, uint256 phase) public view returns (uint256) {\n return gasConsumed[account][phase];\n }\n}\n"},"node_modules/@openzeppelin/contracts/utils/introspection/ERC165.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/introspection/ERC165.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC165} from \"./IERC165.sol\";\n\n/**\n * @dev Implementation of the {IERC165} interface.\n *\n * Contracts that want to implement ERC-165 should inherit from this contract and override {supportsInterface} to check\n * for the additional interface id that will be supported. For example:\n *\n * ```solidity\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\n * }\n * ```\n */\nabstract contract ERC165 is IERC165 {\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {\n return interfaceId == type(IERC165).interfaceId;\n }\n}\n"},"node_modules/@openzeppelin/contracts/utils/ReentrancyGuard.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/ReentrancyGuard.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Contract module that helps prevent reentrant calls to a function.\n *\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\n * available, which can be applied to functions to make sure there are no nested\n * (reentrant) calls to them.\n *\n * Note that because there is a single `nonReentrant` guard, functions marked as\n * `nonReentrant` may not call one another. This can be worked around by making\n * those functions `private`, and then adding `external` `nonReentrant` entry\n * points to them.\n *\n * TIP: If EIP-1153 (transient storage) is available on the chain you're deploying at,\n * consider using {ReentrancyGuardTransient} instead.\n *\n * TIP: If you would like to learn more about reentrancy and alternative ways\n * to protect against it, check out our blog post\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\n */\nabstract contract ReentrancyGuard {\n // Booleans are more expensive than uint256 or any type that takes up a full\n // word because each write operation emits an extra SLOAD to first read the\n // slot's contents, replace the bits taken up by the boolean, and then write\n // back. This is the compiler's defense against contract upgrades and\n // pointer aliasing, and it cannot be disabled.\n\n // The values being non-zero value makes deployment a bit more expensive,\n // but in exchange the refund on every call to nonReentrant will be lower in\n // amount. Since refunds are capped to a percentage of the total\n // transaction's gas, it is best to keep them low in cases like this one, to\n // increase the likelihood of the full refund coming into effect.\n uint256 private constant NOT_ENTERED = 1;\n uint256 private constant ENTERED = 2;\n\n uint256 private _status;\n\n /**\n * @dev Unauthorized reentrant call.\n */\n error ReentrancyGuardReentrantCall();\n\n constructor() {\n _status = NOT_ENTERED;\n }\n\n /**\n * @dev Prevents a contract from calling itself, directly or indirectly.\n * Calling a `nonReentrant` function from another `nonReentrant`\n * function is not supported. It is possible to prevent this from happening\n * by making the `nonReentrant` function external, and making it call a\n * `private` function that does the actual work.\n */\n modifier nonReentrant() {\n _nonReentrantBefore();\n _;\n _nonReentrantAfter();\n }\n\n function _nonReentrantBefore() private {\n // On the first call to nonReentrant, _status will be NOT_ENTERED\n if (_status == ENTERED) {\n revert ReentrancyGuardReentrantCall();\n }\n\n // Any calls to nonReentrant after this point will fail\n _status = ENTERED;\n }\n\n function _nonReentrantAfter() private {\n // By storing the original value once again, a refund is triggered (see\n // https://eips.ethereum.org/EIPS/eip-2200)\n _status = NOT_ENTERED;\n }\n\n /**\n * @dev Returns true if the reentrancy guard is currently set to \"entered\", which indicates there is a\n * `nonReentrant` function in the call stack.\n */\n function _reentrancyGuardEntered() internal view returns (bool) {\n return _status == ENTERED;\n }\n}\n"},"node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/introspection/IERC165.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Interface of the ERC-165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[ERC].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165 {\n /**\n * @dev Returns true if this contract implements the interface defined by\n * `interfaceId`. See the corresponding\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section]\n * to learn more about how these ids are created.\n *\n * This function call must use less than 30 000 gas.\n */\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n"}},"settings":{"remappings":["@rhinestone/=node_modules/@rhinestone/","sentinellist/=node_modules/@rhinestone/sentinellist/src/","erc4337-validation/=node_modules/@rhinestone/erc4337-validation/src/","modulekit/=node_modules/@rhinestone/modulekit/src/","checknsignatures/=node_modules/@rhinestone/checknsignatures/src/","flatbytes/=node_modules/@rhinestone/flatbytes/src/","@ERC4337/=node_modules/@ERC4337/","account-abstraction/=node_modules/@ERC4337/account-abstraction/contracts/","account-abstraction-v0.6/=node_modules/@ERC4337/account-abstraction-v0.6/contracts/","@openzeppelin/=node_modules/@openzeppelin/","@safe-global/=node_modules/@safe-global/","ds-test/=node_modules/ds-test/src/","forge-std/=node_modules/forge-std/src/","solady/=node_modules/solady/src/","solarray/=node_modules/solarray/src/","@prb/math/=node_modules/@prb/math/src/","solmate/=node_modules/solmate/src/","ExcessivelySafeCall/=node_modules/excessively-safe-call/src/","@webauthn/=node_modules/webauthn-sol/src/","@erc7579/enumerablemap4337/=node_modules/@erc7579/enumerablemap4337/src/","FreshCryptoLib/=node_modules/FreshCryptoLib/solidity/src/","node_modules/webauthn-sol/src/:openzeppelin-contracts/=node_modules/@openzeppelin/","@gnosis.pm/=node_modules/@gnosis.pm/","excessively-safe-call/=node_modules/excessively-safe-call/","hardhat-deploy/=node_modules/hardhat-deploy/","hardhat/=node_modules/hardhat/","webauthn-sol/=node_modules/webauthn-sol/"],"optimizer":{"enabled":false,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode.object","evm.bytecode.sourceMap","evm.bytecode.linkReferences","evm.deployedBytecode.object","evm.deployedBytecode.sourceMap","evm.deployedBytecode.linkReferences","evm.deployedBytecode.immutableReferences","evm.methodIdentifiers","metadata"]}},"evmVersion":"cancun","viaIR":false,"libraries":{}}} diff --git a/src/MultiFactor/MultiFactor.sol b/src/MultiFactor/MultiFactor.sol index 6b7e72e..82e1ec6 100644 --- a/src/MultiFactor/MultiFactor.sol +++ b/src/MultiFactor/MultiFactor.sol @@ -14,6 +14,7 @@ import { } from "./DataTypes.sol"; import { MultiFactorLib } from "./MultiFactorLib.sol"; import { FlatBytesLib } from "flatbytes/BytesLib.sol"; +import { ECDSA } from "solady/utils/ECDSA.sol"; /** * @title MultiFactor @@ -354,7 +355,9 @@ contract MultiFactor is ERC7579ValidatorBase, ERC7484RegistryAdapter { Validator[] calldata validators = MultiFactorLib.decode(userOp.signature); // validate the signature - bool isValid = _validateSignatureWithConfig(userOp.sender, validators, userOpHash); + bool isValid = _validateSignatureWithConfig( + userOp.sender, validators, ECDSA.toEthSignedMessageHash(userOpHash) + ); if (isValid) { // return validation success if the signatures are valid diff --git a/src/OwnableValidator/OwnableValidator.sol b/src/OwnableValidator/OwnableValidator.sol index d0688e3..2a0cd56 100644 --- a/src/OwnableValidator/OwnableValidator.sol +++ b/src/OwnableValidator/OwnableValidator.sol @@ -265,7 +265,9 @@ contract OwnableValidator is ERC7579ValidatorBase { returns (ValidationData) { // validate the signature with the config - bool isValid = _validateSignatureWithConfig(userOp.sender, userOpHash, userOp.signature); + bool isValid = _validateSignatureWithConfig( + userOp.sender, ECDSA.toEthSignedMessageHash(userOpHash), userOp.signature + ); // return the result if (isValid) { @@ -334,9 +336,7 @@ contract OwnableValidator is ERC7579ValidatorBase { } // recover the signers from the signatures - address[] memory signers = CheckSignatures.recoverNSignatures( - ECDSA.toEthSignedMessageHash(hash), signature, _threshold - ); + address[] memory signers = CheckSignatures.recoverNSignatures(hash, signature, _threshold); // sort and uniquify the signers to make sure a signer is not reused signers.sort(); @@ -381,8 +381,7 @@ contract OwnableValidator is ERC7579ValidatorBase { } // recover the signers from the signatures - address[] memory signers = - CheckSignatures.recoverNSignatures(ECDSA.toEthSignedMessageHash(hash), data, _threshold); + address[] memory signers = CheckSignatures.recoverNSignatures(hash, data, _threshold); // sort and uniquify the signers to make sure a signer is not reused signers.sort(); diff --git a/test/DeadmanSwitch/integration/concrete/DeadmanSwitch.t.sol b/test/DeadmanSwitch/integration/concrete/DeadmanSwitch.t.sol index 73903bf..c4d2fe7 100644 --- a/test/DeadmanSwitch/integration/concrete/DeadmanSwitch.t.sol +++ b/test/DeadmanSwitch/integration/concrete/DeadmanSwitch.t.sol @@ -9,7 +9,7 @@ import { parseValidationData, ValidationData } from "test/utils/ERC4337.sol"; -import { signHash } from "test/utils/Signature.sol"; +import { signUserOpHash as signHash } from "test/utils/Signature.sol"; import { MODULE_TYPE_HOOK, MODULE_TYPE_VALIDATOR diff --git a/test/DeadmanSwitch/unit/concrete/DeadmanSwitch.t.sol b/test/DeadmanSwitch/unit/concrete/DeadmanSwitch.t.sol index 4c4eed3..48cd1ba 100644 --- a/test/DeadmanSwitch/unit/concrete/DeadmanSwitch.t.sol +++ b/test/DeadmanSwitch/unit/concrete/DeadmanSwitch.t.sol @@ -10,7 +10,7 @@ import { parseValidationData, ValidationData } from "test/utils/ERC4337.sol"; -import { signHash } from "test/utils/Signature.sol"; +import { signUserOpHash as signHash } from "test/utils/Signature.sol"; contract DeadmanSwitchTest is BaseTest { /*////////////////////////////////////////////////////////////////////////// diff --git a/test/MultiFactor/integration/concrete/MultiFactor.t.sol b/test/MultiFactor/integration/concrete/MultiFactor.t.sol index aedad5b..5d8158f 100644 --- a/test/MultiFactor/integration/concrete/MultiFactor.t.sol +++ b/test/MultiFactor/integration/concrete/MultiFactor.t.sol @@ -9,7 +9,7 @@ import { ValidatorId } from "src/MultiFactor/MultiFactor.sol"; import { OwnableValidator } from "src/OwnableValidator/OwnableValidator.sol"; -import { signHash } from "test/utils/Signature.sol"; +import { signUserOpHash, signHash } from "test/utils/Signature.sol"; import { EIP1271_MAGIC_VALUE } from "test/utils/Constants.sol"; import { MODULE_TYPE_VALIDATOR } from "modulekit/accounts/common/interfaces/IERC7579Module.sol"; import { UserOpData } from "modulekit/ModuleKit.sol"; @@ -204,8 +204,8 @@ contract MultiFactorIntegrationTest is BaseIntegrationTest { }); Validator[] memory validators = _getValidators(); - bytes memory signature1 = signHash(_ownerPks[0], userOpData.userOpHash); - bytes memory signature2 = signHash(_ownerPks[1], userOpData.userOpHash); + bytes memory signature1 = signUserOpHash(_ownerPks[0], userOpData.userOpHash); + bytes memory signature2 = signUserOpHash(_ownerPks[1], userOpData.userOpHash); bytes memory encodedSig = abi.encodePacked(signature1, signature2); validators[0].data = encodedSig; diff --git a/test/OwnableValidator/integration/concrete/OwnableValidator.t.sol b/test/OwnableValidator/integration/concrete/OwnableValidator.t.sol index 00da781..cbe953b 100644 --- a/test/OwnableValidator/integration/concrete/OwnableValidator.t.sol +++ b/test/OwnableValidator/integration/concrete/OwnableValidator.t.sol @@ -3,7 +3,7 @@ pragma solidity ^0.8.23; import { BaseIntegrationTest, ModuleKitHelpers } from "test/BaseIntegration.t.sol"; import { OwnableValidator } from "src/OwnableValidator/OwnableValidator.sol"; -import { signHash } from "test/utils/Signature.sol"; +import { signHash, signUserOpHash } from "test/utils/Signature.sol"; import { EIP1271_MAGIC_VALUE } from "test/utils/Constants.sol"; import { MODULE_TYPE_VALIDATOR } from "modulekit/accounts/common/interfaces/IERC7579Module.sol"; import { UserOpData } from "modulekit/ModuleKit.sol"; @@ -172,8 +172,8 @@ contract OwnableValidatorIntegrationTest is BaseIntegrationTest { callData: "", txValidator: address(validator) }); - bytes memory signature1 = signHash(_ownerPks[0], userOpData.userOpHash); - bytes memory signature2 = signHash(_ownerPks[1], userOpData.userOpHash); + bytes memory signature1 = signUserOpHash(_ownerPks[0], userOpData.userOpHash); + bytes memory signature2 = signUserOpHash(_ownerPks[1], userOpData.userOpHash); userOpData.userOp.signature = abi.encodePacked(signature1, signature2); userOpData.execUserOps(); diff --git a/test/OwnableValidator/unit/concrete/OwnableValidator.t.sol b/test/OwnableValidator/unit/concrete/OwnableValidator.t.sol index 43daac4..4d00ce2 100644 --- a/test/OwnableValidator/unit/concrete/OwnableValidator.t.sol +++ b/test/OwnableValidator/unit/concrete/OwnableValidator.t.sol @@ -9,7 +9,7 @@ import { } from "src/OwnableValidator/OwnableValidator.sol"; import { IModule as IERC7579Module } from "modulekit/accounts/common/interfaces/IERC7579Module.sol"; import { PackedUserOperation, getEmptyUserOperation } from "test/utils/ERC4337.sol"; -import { signHash } from "test/utils/Signature.sol"; +import { signHash, signUserOpHash } from "test/utils/Signature.sol"; import { EIP1271_MAGIC_VALUE } from "test/utils/Constants.sol"; import { LibSort } from "solady/utils/LibSort.sol"; @@ -433,8 +433,8 @@ contract OwnableValidatorTest is BaseTest { userOp.sender = address(this); bytes32 userOpHash = bytes32(keccak256("userOpHash")); - bytes memory signature1 = signHash(_ownerPks[0], userOpHash); - bytes memory signature2 = signHash(_ownerPks[1], userOpHash); + bytes memory signature1 = signUserOpHash(_ownerPks[0], userOpHash); + bytes memory signature2 = signUserOpHash(_ownerPks[1], userOpHash); userOp.signature = abi.encodePacked(signature1, signature2); uint256 validationData = diff --git a/test/SocialRecovery/integration/concrete/SocialRecovery.t.sol b/test/SocialRecovery/integration/concrete/SocialRecovery.t.sol index af20459..2620e38 100644 --- a/test/SocialRecovery/integration/concrete/SocialRecovery.t.sol +++ b/test/SocialRecovery/integration/concrete/SocialRecovery.t.sol @@ -6,7 +6,7 @@ import { SocialRecovery, ERC7579ValidatorBase } from "src/SocialRecovery/SocialR import { IERC7579Account } from "modulekit/accounts/common/interfaces/IERC7579Account.sol"; import { IModule as IERC7579Module } from "modulekit/accounts/common/interfaces/IERC7579Module.sol"; import { PackedUserOperation, getEmptyUserOperation } from "test/utils/ERC4337.sol"; -import { signHash } from "test/utils/Signature.sol"; +import { signUserOpHash as signHash } from "test/utils/Signature.sol"; import { ModeLib } from "modulekit/accounts/common/lib/ModeLib.sol"; import { ExecutionLib, Execution } from "modulekit/accounts/erc7579/lib/ExecutionLib.sol"; import { MODULE_TYPE_VALIDATOR } from "modulekit/accounts/common/interfaces/IERC7579Module.sol"; diff --git a/test/SocialRecovery/unit/concrete/SocialRecovery.t.sol b/test/SocialRecovery/unit/concrete/SocialRecovery.t.sol index 6cd2cad..eeae8fe 100644 --- a/test/SocialRecovery/unit/concrete/SocialRecovery.t.sol +++ b/test/SocialRecovery/unit/concrete/SocialRecovery.t.sol @@ -6,7 +6,7 @@ import { SocialRecovery, ERC7579ValidatorBase } from "src/SocialRecovery/SocialR import { IERC7579Account } from "modulekit/accounts/common/interfaces/IERC7579Account.sol"; import { IModule as IERC7579Module } from "modulekit/accounts/common/interfaces/IERC7579Module.sol"; import { PackedUserOperation, getEmptyUserOperation } from "test/utils/ERC4337.sol"; -import { signHash } from "test/utils/Signature.sol"; +import { signUserOpHash as signHash } from "test/utils/Signature.sol"; import { ModeLib } from "modulekit/accounts/common/lib/ModeLib.sol"; import { ExecutionLib, Execution } from "modulekit/accounts/erc7579/lib/ExecutionLib.sol"; import { MockAccount } from "test/mocks/MockAccount.sol"; diff --git a/test/utils/Signature.sol b/test/utils/Signature.sol index fefa415..1f116e0 100644 --- a/test/utils/Signature.sol +++ b/test/utils/Signature.sol @@ -7,6 +7,16 @@ import { Vm } from "forge-std/Vm.sol"; address constant VM_ADDR = 0x7109709ECfa91a80626fF3989D68f67F5b1DD12D; function signHash(uint256 privKey, bytes32 digest) returns (bytes memory) { + (uint8 v, bytes32 r, bytes32 s) = Vm(VM_ADDR).sign(privKey, digest); + + // Sanity checks + address signer = ecrecover(digest, v, r, s); + require(signer == Vm(VM_ADDR).addr(privKey), "Invalid signature"); + + return abi.encodePacked(r, s, v); +} + +function signUserOpHash(uint256 privKey, bytes32 digest) returns (bytes memory) { (uint8 v, bytes32 r, bytes32 s) = Vm(VM_ADDR).sign(privKey, ECDSA.toEthSignedMessageHash(digest));